TC官方合作论坛

 找回密码
 立即注册
查看: 1194|回复: 0

[讨论] 系统声卡MIDI音乐序列调用 打鼓机源码

[复制链接]
发表于 2016-9-3 15:10:07 | 显示全部楼层 |阅读模式

马上加入TC

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

x
本帖最后由 haoyuanxin 于 2016-9-3 15:13 编辑

系统声卡MIDI音乐序列调用  打鼓机源码



     代码纯开源,全部使用API函数来完成。对关键代码用子程序进行了封装,方便刚入门的童鞋使用。运行环境采用最新版本的5.0,请不要使用低版本,以防出现运行不了,或错误的情况。



以下代码,直接拷贝到TC源码区,就可以运行了。

没有鼓机?又很想玩,那就认真研究一下下面的代码吧。
  1. 变量 线程ID
  2. //从这里开始执行

  3. //启动_热键操作
  4. 功能 启动_热键()
  5.     线程ID=线程开启("演奏","")
  6. 结束

  7. //终止热键操作
  8. 功能 终止_热键()
  9.     线程关闭(线程ID)
  10. 结束



  11. //对API函数不懂的同学,去查相关函数,api.ayuyan.c0m
  12. 功能 演奏()
  13.     var hmidi,i,节奏控制文本,txt
  14.     //打开设备
  15.     hmidi=打开设备(窗口获取标题(窗口获取自我句柄()))
  16.    
  17.     //赋值节奏控制文本   
  18.     节奏控制文本="1030"
  19.    
  20.     //执行节奏敲打播放   
  21.     for (var 次=0; 次<5;次++)
  22.         for (i=0;i<strlen(节奏控制文本);i++)
  23.             txt=strsub(节奏控制文本,i,i+1)
  24.             select(txt)
  25.                 case "1"
  26.                 MIDI演奏(hmidi,127,36,9)
  27.                 case "2"
  28.                 MIDI演奏(hmidi,127,42,9)
  29.                 case "3"
  30.                 MIDI演奏(hmidi,127,38,9)
  31.             end
  32.             等待(200)
  33.         end     
  34.     end
  35.    
  36.    
  37.     节奏控制文本="1230"//更改节奏控制文本. 节奏2执行
  38.     for (var 次=0; 次<5;次++)
  39.         for (i=0;i<strlen(节奏控制文本);i++)
  40.             txt=strsub(节奏控制文本,i,i+1)
  41.             select(txt)
  42.                 case "1"
  43.                 MIDI演奏(hmidi,127,36,9)
  44.                 case "2"
  45.                 MIDI演奏(hmidi,127,42,9)
  46.                 case "3"
  47.                 MIDI演奏(hmidi,127,38,9)
  48.             end
  49.             等待(200)
  50.         end     
  51.     end
  52.    
  53.    
  54.     节奏控制文本="1232"//更改节奏控制文本. 节奏3执行
  55.     for (var 次=0; 次<5;次++)
  56.         for (i=0;i<strlen(节奏控制文本);i++)
  57.             txt=strsub(节奏控制文本,i,i+1)
  58.             select(txt)
  59.                 case "1"
  60.                 MIDI演奏(hmidi,127,36,9)
  61.                 case "2"
  62.                 MIDI演奏(hmidi,127,42,9)
  63.                 case "3"
  64.                 MIDI演奏(hmidi,127,38,9)
  65.             end
  66.             等待(200)
  67.         end     
  68.     end
  69.    
  70.    
  71.     节奏控制文本="123212311232"//更改节奏控制文本. 节奏4执行
  72.     for (var 次=0; 次<5;次++)
  73.         for (i=0;i<strlen(节奏控制文本);i++)
  74.             txt=strsub(节奏控制文本,i,i+1)
  75.             select(txt)
  76.                 case "1"
  77.                 MIDI演奏(hmidi,127,36,9)
  78.                 case "2"
  79.                 MIDI演奏(hmidi,127,42,9)
  80.                 case "3"
  81.                 MIDI演奏(hmidi,127,38,9)
  82.             end
  83.             等待(200)
  84.         end     
  85.     end
  86.    
  87.    
  88.     //更改钢琴音色
  89.     for (var 次=0; 次<5;次++)
  90.         for (i=0;i<strlen(节奏控制文本);i++)
  91.             txt=strsub(节奏控制文本,i,i+1)
  92.             select(txt)
  93.                 case "1"
  94.                 MIDI演奏(hmidi,127,36,1)
  95.                 case "2"
  96.                 MIDI演奏(hmidi,127,42,1)
  97.                 case "3"
  98.                 MIDI演奏(hmidi,127,38,1)
  99.             end
  100.             等待(200)
  101.         end     
  102.     end
  103.    
  104. 结束



  105. 功能 MIDI置乐器(设备句柄,乐器值,通道)
  106.     var msg
  107.     if (乐器值>127 || 乐器值<0)
  108.         乐器值=127
  109.     end
  110.    
  111.     if (通道>15 || 通道<0)
  112.         通道=1
  113.     end   
  114.     msg=0 * 65536 + 乐器值 * 256 + 192 + 通道
  115.     dllcall("winmm.dll", "long", "midiOutShortMsg", "int",设备句柄, "int",msg )
  116. 结束


  117. 功能 MIDI演奏(设备句柄,音量,音色值,通道)
  118.     var msg
  119.     if (音量>127 || 音量<0)
  120.         音量=127
  121.     end
  122.    
  123.     if (通道>15 || 通道<0)
  124.         通道=1
  125.     end   
  126.     msg=音量 * 65536 + 音色值 * 256 + 144 + 通道  
  127.     dllcall("winmm.dll", "long", "midiOutShortMsg", "int",设备句柄, "int",msg )
  128. 结束


  129. 功能 关闭设备(设备句柄)
  130.     dllcall("winmm.dll", "long", "midiOutClose", "int",设备句柄)
  131. 结束




  132. 功能 打开设备(自身窗口标题)
  133.     var lphMidi,hp,hMidi
  134.     //申请内存
  135.     lphMidi=dllcall("kernel32.dll", "long", "LocalAlloc", "int", 64, "int", 16  )
  136.    
  137.     //打开设备内存
  138.     dllcall("winmm.dll", "long", "midiOutOpen", "wchar", lphMidi, "long", -1, "long", 0, "long", 0, "long", 0)
  139.    
  140.     //获取句柄,注意此处通过自身窗口标题获取了自身进程句柄,从而实现读自身内存
  141.     hp=进程获取句柄(自身窗口标题)
  142.    
  143.     //指针到整数,取设备句柄
  144.     hMidi=读4byte(hp,lphMidi)
  145.    
  146.     //释放内存
  147.     dllcall("kernel32.dll", "long", "LocalFree", "int", lphMidi )
  148.    
  149.     返回 hMidi
  150.    
  151. 结束
复制代码


复制代码


评分

参与人数 2威望 +20 金币 +20 收起 理由
cjxdn + 10 + 10 赞一个!
言术 + 10 + 10 支持一下

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-19 21:10 , Processed in 0.043246 second(s), 25 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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