明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1508|回复: 17

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

  [复制链接]
发表于 2022-8-12 20:50 | 显示全部楼层 |阅读模式
本帖最后由 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位研究中。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +2 金钱 +30 收起 理由
自贡黄明儒 + 1
highflybird + 1 + 30 神马都是浮云

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-8-12 22:24 | 显示全部楼层
本帖最后由 llsheng_73 于 2022-8-12 23:18 编辑

我只想抄简谱的时候容易一些。。。
  1. (LOAD "C:/00/SYZ-MIDI32.FAS");仅适用于32位ACAD
  2. (defun play(str / strsplit jpsplit jp pai a b lst)
  3.   (defun strsplit(str splits / i a b)
  4.     (while(<""str)
  5.       (if(vl-remove'nil(mapcar'(lambda(x)(vl-string-search x str))splits))
  6.         (setq i(car(vl-sort(vl-remove'nil(mapcar'(lambda(x)(if(setq l(vl-string-search x str))(cons l x)))splits))
  7.                            '(lambda(s1 s2)(<(car s1)(car s2)))))
  8.               a(cons(substr str 1(car i))a)b(cons(cdr i)b)
  9.               str(substr str(+(car i)(strlen(cdr i))1)))
  10.         (setq a(cons str a)b(cons "" b)str"")))
  11.     (reverse b))
  12.   (defun jpsplit(str)(strsplit str'("A""0""-5""-6""-7""+1""+2""+3""1""2""3""4""5""6""7"" ""___""__.""__""_.""_""---""--.""--""-.""-")))
  13.   (setq jp'(("0"0)("-5" 4208528)("-6" 4209040)("-7" 4209552)("1" 4209808)("2" 4210320)("3" 4210832)("4" 4211088)("5" 4211600)
  14.             ("6" 4212112)("7" 4212624)("+1" 4212880)("+2" 4213392)("+3" 4213904))
  15.         pai'((" "500)("_"250)("__"125)("___"62.5)("-"1000)("--"1500)("---"2000)("."750)("-."1250)("--."2250)("_."375)("__."97.35))
  16.         lst(vl-remove"A"(jpsplit str)))
  17.   (openmidi)
  18.   (while lst
  19.     (if(setq a(car lst)lst(cdr lst)b(assoc a jp))
  20.       (playmidi(cadr b))
  21.       (if(setq b(assoc a pai))
  22.         (delay(cadr b)))))
  23.   (closemidi))
  24. (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---")
这玩意差调了听着不是那么回事了。。。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-12 23:09 | 显示全部楼层
本帖最后由 highflybird 于 2022-8-13 03:54 编辑

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

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-8-12 22:00 | 显示全部楼层
本帖最后由 highflybird 于 2022-8-13 03:43 编辑

我来捧个场。

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2022-8-12 22:17 | 显示全部楼层
highflybird 发表于 2022-8-12 22:00
我来捧个场。

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

很专业!上海滩听起来很不错
发表于 2022-8-12 22:27 | 显示全部楼层
围观大佬们施展各种绝技
发表于 2022-8-12 23:00 | 显示全部楼层
大师厉害大师厉害
发表于 2022-8-12 23:17 | 显示全部楼层
啊啊啊,你们这些大神,真的都是些老顽童了,哈哈哈
发表于 2022-8-12 23:42 | 显示全部楼层
果然都是真大神哈
发表于 2022-8-13 07:23 | 显示全部楼层
感谢大佬们的分享和奉献!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-17 17:26 , Processed in 0.299568 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表