明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1608|回复: 2

[源码] lisp+dwx midi演奏回放器2.1版更新《源码》

[复制链接]
发表于 2022-8-13 19:45 | 显示全部楼层 |阅读模式
本帖最后由 caoliu023 于 2022-8-15 06:50 编辑

2.1更新
增加保存弹奏成果,为部分功能键增加音效,修复一些bug


功能说明:
  键盘0-9 U I O为演奏按键,空格 回车及鼠标右键为退出程序
  键盘字母区域第二第三排共16个字母按键为音色调整
  其中按键Z为鼓声音色,其它为钢琴音色
  按键P为回放键,按键Q为清除之前演奏的音符
  按键+ -为回放速度调整,按键E为清除手动调整
  按键W为写出文件到"D:\midi.lsp"
退出音效没发声,欢迎帮忙捉虫
  
欢迎大家把演奏成果导出的代码发到回帖里边

这是我今天第二贴,之前基于baitang36大神的成果发了lisp版弹钢琴《源码》
然后看highflybird大神在[原创]用纯lisp播放midi音乐帖子回复了
DynamicWrapperX版本的midi演示代码,发现该方法可以调整多达16种音色,
还支持64位cad,就马上着手用highflybird大神的代码改写了本演奏回放器
本代码的and部分抄至tjuzkj【分享系列1】grread函数应用例子大汇总,源码分享!

1.0功能说明:
  键盘1-7为演奏按键,空格 回车及鼠标右键为退出程序
  键盘字母区域第二第三排共16个字母按键为音色调整
  按键P为回放键,按键Q为清除之前演奏的音符

之前以为时间函数错误,结果是少写了一个再次获取时间的代码
时间函数
  1. (defun get-time->ms(/ time8 MM SS hsec)
  2.                 (setq time8(substr(rtos(getvar "cdate")2 8)10 8))
  3.                 (setq MM(atoi(substr time8 3 2)))
  4.                 (setq SS(atoi(substr time8 5 2)))
  5.                 (setq hsec(atoi(substr time8 7 2)))
  6.                 (+(* MM 60000)(* SS 1000)(* hsec 10))               
  7.         )


1.0主程序
  1. (defun c:tt(/ frec lst  1H 1P 2H 2P 3H 3P 4P 5P 6P 7P DWX H JD
  2.                 JP P0 P2 P4 PHANDLE Q1 R0 ys VL X Y Z)
  3.   (setq JP 125)        ;速度
  4.   (setq P4(* 1 JP))
  5.   (setq P2(* 2 JP))
  6.   (setq Q1(* 3 JP))
  7.   (setq 1P(* 4 JP))
  8.   (setq 1H(* 6 JP))
  9.   (setq 2P(* 8 JP))
  10.   (setq 2H(* 10 JP))
  11.   (setq 3P(* 12 JP))
  12.   (setq 3H(* 14 JP))
  13.   (setq 4P(* 16 JP))
  14.   (setq 5P(* 20 JP))
  15.   (setq 6P(* 24 JP))
  16.   (setq 7P(* 28 JP))
  17.   (setq P0 0)
  18.   (setq R0 0)        ;休止
  19.   (setq ys 144)    ;钢琴
  20.   (setq vl(* 127 65536))    ;音量
  21.   (setq JD 60)
  22.   (setq dwx(vlax-create-object "DynamicWrapperX"))
  23.   (vlax-invoke dwx 'register "Kernel32" "Sleep" "i=l")
  24.   (vlax-invoke dwx 'register "winmm.dll" "midiOutOpen" "i=puuuu" "r=l")
  25.   (vlax-invoke dwx 'register "winmm.dll" "midiOutShortMsg" "i=hu" "r=l")
  26.   (vlax-invoke dwx 'register "winmm.dll" "midiOutClose" "i=h" "r=l")
  27.   ;;打开MIDI设备
  28.   (setq pHandle(vlax-invoke DWX 'MemAlloc 8))
  29.   (vlax-invoke DWX 'midiOutOpen pHandle 0 0 0 0)
  30.   (setq h(vlax-invoke DWX 'Numget phandle "h"))
  31.   (while(and(setq pt(grread t 15 0))
  32.           (not(and(= 2(car pt))
  33.                 (or(= 13(cadr pt))(= 32(cadr pt)))
  34.               )
  35.           );_Enter Space kongg
  36.           (not(or(=(car pt)11)(=(car pt)25)));_Right button
  37.         );and这段是抄的tjuzkj【分享系列1】grread函数应用例子大汇总,源码分享!
  38.     ;http://bbs.mjtd.com/forum.php?mo ... 1313&fromuid=287566
  39.     (if(=(car pt)2)
  40.       (progn
  41.         (if(and x y)
  42.           (setq lst(cons(cons x y)lst))
  43.         )
  44.         (cond
  45.           ((=(cadr pt)49)(vlax-invoke dwx 'midiOutShortMsg h(C1)));1
  46.           ((=(cadr pt)50)(vlax-invoke dwx 'midiOutShortMsg h(C2)));2
  47.           ((=(cadr pt)51)(vlax-invoke dwx 'midiOutShortMsg h(C3)));3
  48.           ((=(cadr pt)52)(vlax-invoke dwx 'midiOutShortMsg h(C4)));4
  49.           ((=(cadr pt)53)(vlax-invoke dwx 'midiOutShortMsg h(C5)));5
  50.           ((=(cadr pt)54)(vlax-invoke dwx 'midiOutShortMsg h(C6)));6
  51.           ((=(cadr pt)55)(vlax-invoke dwx 'midiOutShortMsg h(C7)));7
  52.           ((member(cadr pt)(list 65 97 ))(setq ys 144));a
  53.           ((member(cadr pt)(list 83 155))(setq ys 145));s
  54.           ((member(cadr pt)(list 68 100))(setq ys 146));d
  55.           ((member(cadr pt)(list 70 102))(setq ys 147));f
  56.           ((member(cadr pt)(list 71 103))(setq ys 148));g
  57.           ((member(cadr pt)(list 72 104))(setq ys 149));h
  58.           ((member(cadr pt)(list 74 106))(setq ys 150));j
  59.           ((member(cadr pt)(list 75 107))(setq ys 151));k
  60.           ((member(cadr pt)(list 76 108))(setq ys 152));l
  61.           ((member(cadr pt)(list 90 122))(setq ys 153));z
  62.           ((member(cadr pt)(list 88 120))(setq ys 154));x
  63.           ((member(cadr pt)(list 67 99 ))(setq ys 155));c
  64.           ((member(cadr pt)(list 86 118))(setq ys 156));v
  65.           ((member(cadr pt)(list 66 98 ))(setq ys 157));b
  66.           ((member(cadr pt)(list 78 110))(setq ys 158));n
  67.           ((member(cadr pt)(list 77 109))(setq ys 159));m
  68.           ((member(cadr pt)(list 80 112))(setq lst(cons(cons x y)lst))(play (reverse lst))(princ "\n回放完\n"));p
  69.           ((member(cadr pt)(list 81 113))(setq lst nil)(princ "\n记录已清除\n"));q
  70.         )
  71.       )
  72.     )
  73.   )
  74.   ;;关闭MIDI设备
  75.   (vlax-invoke DWX 'midiOutClose h)
  76.   (vlax-invoke DWX 'MemFree pHandle)
  77.   (vlax-release-object DWX)
  78.   (PRINC"\N完...")
  79.   (princ)
  80. )





完整的源码下载







本帖子中包含更多资源

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

x

评分

参与人数 3明经币 +3 收起 理由
bssurvey + 1 赞一个!
tigcat + 1 很给力!
baitang36 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-8-14 11:27 | 显示全部楼层
近期大家都来研究音乐了
 楼主| 发表于 2022-8-14 11:55 | 显示全部楼层
欢迎大家把演奏出来的音乐回复到下边
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-21 22:25 , Processed in 0.247587 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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