baitang36 发表于 2022-8-12 20:50:17

[原创]用纯lisp播放midi音乐

本帖最后由 baitang36 于 2022-8-12 21:06 编辑

用beep仅仅是出声,听着不像是用乐器演奏出来的。
播放midi才是专业的。

MIDI是编曲界最广泛的音乐标准格式,可称为“计算机能理解的乐谱”。它用音符的数字控制信号来记录音乐。一首完整的MIDI音乐只有几十KB大,而能包含数十条音乐轨道。几乎所有的现代音乐都是用MIDI加上音色库来制作合成的。MIDI 传输的不是声音信号, 而是音符、控制参数等指令, 它指示MIDI 设备要做什么,怎么做, 如演奏哪个音符、多大音量等。-----百度百科

syz-midi32.fas中定义了几个函数:
openmidi 打开midi设备,一般是声卡。
closemidi 关闭设备
playmidi 播放midi音符
delay   延时若干毫秒

简谱与midi音符之间的关系,请看源码中的注释。
由于使用了lsp直接调用Windows api技术,目前仅能用在32位cad中,64位研究中。



llsheng_73 发表于 2022-8-12 22:24:10

本帖最后由 llsheng_73 于 2022-8-12 23:18 编辑

我只想抄简谱的时候容易一些。。。
(LOAD "C:/00/SYZ-MIDI32.FAS");仅适用于32位ACAD
(defun play(str / strsplit jpsplit jp pai a b lst)
(defun strsplit(str splits / i a b)
    (while(<""str)
      (if(vl-remove'nil(mapcar'(lambda(x)(vl-string-search x str))splits))
      (setq i(car(vl-sort(vl-remove'nil(mapcar'(lambda(x)(if(setq l(vl-string-search x str))(cons l x)))splits))
                           '(lambda(s1 s2)(<(car s1)(car s2)))))
            a(cons(substr str 1(car i))a)b(cons(cdr i)b)
            str(substr str(+(car i)(strlen(cdr i))1)))
      (setq a(cons str a)b(cons "" b)str"")))
    (reverse b))
(defun jpsplit(str)(strsplit str'("A""0""-5""-6""-7""+1""+2""+3""1""2""3""4""5""6""7"" ""___""__.""__""_.""_""---""--.""--""-.""-")))
(setq jp'(("0"0)("-5" 4208528)("-6" 4209040)("-7" 4209552)("1" 4209808)("2" 4210320)("3" 4210832)("4" 4211088)("5" 4211600)
            ("6" 4212112)("7" 4212624)("+1" 4212880)("+2" 4213392)("+3" 4213904))
      pai'((" "500)("_"250)("__"125)("___"62.5)("-"1000)("--"1500)("---"2000)("."750)("-."1250)("--."2250)("_."375)("__."97.35))
      lst(vl-remove"A"(jpsplit str)))
(openmidi)
(while lst
    (if(setq a(car lst)lst(cdr lst)b(assoc a jp))
      (playmidi(cadr b))
      (if(setq b(assoc a pai))
      (delay(cadr b)))))
(closemidi))
(play"6_6__6__6_5_6 0_.3__5_5__5__5_3_5-2_2__2__2_2__2__2_2_2 2_2_5_4__5__3-6_6__6__6_5__6__6-5_5__5__5_5__5__5_5__6__5 0_.1__2_2__2__2_2_2_2__3__2_.-6__-7_-7 -6__-5__-6-")


来一段假行僧听听

(play"-6 6 3 3 -6 2 1 -6.-6 1 -6 1 -6 1 2_3_3--6 3 3 -6_-6_2 1 -6.-6_1 -6_-6_5 3-0_3_5_3_5 3 6_.6__5 -6-0_-6_-6_-6_2_.2__1 -6---A-6 3 3 -6 2 1 -6.-6_1 -6 1 -6 1 2_3_3-A-6 3 3 -6_-6_2 1 -6.-6_1 -6_-6_2 1 -6---0_3_5_3_5 3 6 5_5_-6-0_3_5_3_5 3 6_.6__5 3-0_3_5_3_5 3 6 5_.5__-6-0 -6 -6_-6_6 5 3---")
这玩意差调了听着不是那么回事了。。。


highflybird 发表于 2022-8-12 23:09:32

本帖最后由 highflybird 于 2022-8-13 03:54 编辑

再来一个DynamicWrapperX版本的。
如果不知道DynamicWrapperX的,请移步:
DynamicWrapperX更新说明及其高级实例
这个版本,可以用于32位CAD,也可以用于64位的。

另外补充一下:
midiOutShortMsg 函数的用法以及乐器编号
(24条消息) midiOutShortMsg 函数的用法以及乐器编号_VCACC的博客-CSDN博客


highflybird 发表于 2022-8-12 22:00:24

本帖最后由 highflybird 于 2022-8-13 03:43 编辑

我来捧个场。

发一个《上海滩》的midi版本。

命令是:SHT
附送《两只老虎》
命令是:LZLH

baitang36 发表于 2022-8-12 22:17:18

highflybird 发表于 2022-8-12 22:00
我来捧个场。

发一个《上海滩》的midi版本。


很专业!上海滩听起来很不错

xj6019 发表于 2022-8-12 22:27:06

围观大佬们施展各种绝技

tomonkey239 发表于 2022-8-12 23:00:08

大师厉害大师厉害

Bdj 发表于 2022-8-12 23:17:25

啊啊啊,你们这些大神,真的都是些老顽童了,哈哈哈

magicheno 发表于 2022-8-12 23:42:16

果然都是真大神哈

guosheyang 发表于 2022-8-13 07:23:49

感谢大佬们的分享和奉献!
页: [1] 2
查看完整版本: [原创]用纯lisp播放midi音乐