TC官方合作论坛

标题: 系统声卡MIDI音乐序列调用 打鼓机源码 [打印本页]

作者: haoyuanxin    时间: 2016-9-3 15:10
标题: 系统声卡MIDI音乐序列调用 打鼓机源码
本帖最后由 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. 结束
复制代码


复制代码







欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1