[原创]用纯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 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-13 03:54 编辑
再来一个DynamicWrapperX版本的。
如果不知道DynamicWrapperX的,请移步:
DynamicWrapperX更新说明及其高级实例
这个版本,可以用于32位CAD,也可以用于64位的。
另外补充一下:
midiOutShortMsg 函数的用法以及乐器编号
(24条消息) midiOutShortMsg 函数的用法以及乐器编号_VCACC的博客-CSDN博客
本帖最后由 highflybird 于 2022-8-13 03:43 编辑
我来捧个场。
发一个《上海滩》的midi版本。
命令是:SHT
附送《两只老虎》
命令是:LZLH
highflybird 发表于 2022-8-12 22:00
我来捧个场。
发一个《上海滩》的midi版本。
很专业!上海滩听起来很不错 围观大佬们施展各种绝技 大师厉害大师厉害 啊啊啊,你们这些大神,真的都是些老顽童了,哈哈哈 果然都是真大神哈 感谢大佬们的分享和奉献!
页:
[1]
2