马上加入TC
您需要 登录 才可以下载或查看,没有帐号?立即注册  
 
x
 
 本帖最后由 haoyuanxin 于 2016-9-3 15:13 编辑  
 
系统声卡MIDI音乐序列调用  打鼓机源码  
 
  
     代码纯开源,全部使用API函数来完成。对关键代码用子程序进行了封装,方便刚入门的童鞋使用。运行环境采用最新版本的5.0,请不要使用低版本,以防出现运行不了,或错误的情况。  
 
  
以下代码,直接拷贝到TC源码区,就可以运行了。  
没有鼓机?又很想玩,那就认真研究一下下面的代码吧。 - 变量 线程ID
 
 - //从这里开始执行
 
  
- //启动_热键操作
 
 - 功能 启动_热键()
 
 -     线程ID=线程开启("演奏","")
 
 - 结束
 
  
- //终止热键操作
 
 - 功能 终止_热键()
 
 -     线程关闭(线程ID)
 
 - 结束
 
  
 
 
- //对API函数不懂的同学,去查相关函数,api.ayuyan.c0m
 
 - 功能 演奏()
 
 -     var hmidi,i,节奏控制文本,txt
 
 -     //打开设备
 
 -     hmidi=打开设备(窗口获取标题(窗口获取自我句柄()))
 
 -     
 
 -     //赋值节奏控制文本   
 
 -     节奏控制文本="1030"
 
 -     
 
 -     //执行节奏敲打播放    
 
 -     for (var 次=0; 次<5;次++)
 
 -         for (i=0;i<strlen(节奏控制文本);i++)
 
 -             txt=strsub(节奏控制文本,i,i+1)
 
 -             select(txt)
 
 -                 case "1"
 
 -                 MIDI演奏(hmidi,127,36,9)
 
 -                 case "2"
 
 -                 MIDI演奏(hmidi,127,42,9)
 
 -                 case "3"
 
 -                 MIDI演奏(hmidi,127,38,9)
 
 -             end
 
 -             等待(200)
 
 -         end     
 
 -     end 
 
 -     
 
 -     
 
 -     节奏控制文本="1230"//更改节奏控制文本. 节奏2执行
 
 -     for (var 次=0; 次<5;次++)
 
 -         for (i=0;i<strlen(节奏控制文本);i++)
 
 -             txt=strsub(节奏控制文本,i,i+1)
 
 -             select(txt)
 
 -                 case "1"
 
 -                 MIDI演奏(hmidi,127,36,9)
 
 -                 case "2"
 
 -                 MIDI演奏(hmidi,127,42,9)
 
 -                 case "3"
 
 -                 MIDI演奏(hmidi,127,38,9)
 
 -             end
 
 -             等待(200)
 
 -         end     
 
 -     end 
 
 -     
 
 -     
 
 -     节奏控制文本="1232"//更改节奏控制文本. 节奏3执行
 
 -     for (var 次=0; 次<5;次++)
 
 -         for (i=0;i<strlen(节奏控制文本);i++)
 
 -             txt=strsub(节奏控制文本,i,i+1)
 
 -             select(txt)
 
 -                 case "1"
 
 -                 MIDI演奏(hmidi,127,36,9)
 
 -                 case "2"
 
 -                 MIDI演奏(hmidi,127,42,9)
 
 -                 case "3"
 
 -                 MIDI演奏(hmidi,127,38,9)
 
 -             end
 
 -             等待(200)
 
 -         end     
 
 -     end 
 
 -     
 
 -     
 
 -     节奏控制文本="123212311232"//更改节奏控制文本. 节奏4执行
 
 -     for (var 次=0; 次<5;次++)
 
 -         for (i=0;i<strlen(节奏控制文本);i++)
 
 -             txt=strsub(节奏控制文本,i,i+1)
 
 -             select(txt)
 
 -                 case "1"
 
 -                 MIDI演奏(hmidi,127,36,9)
 
 -                 case "2"
 
 -                 MIDI演奏(hmidi,127,42,9)
 
 -                 case "3"
 
 -                 MIDI演奏(hmidi,127,38,9)
 
 -             end
 
 -             等待(200)
 
 -         end     
 
 -     end 
 
 -     
 
 -     
 
 -     //更改钢琴音色
 
 -     for (var 次=0; 次<5;次++)
 
 -         for (i=0;i<strlen(节奏控制文本);i++)
 
 -             txt=strsub(节奏控制文本,i,i+1)
 
 -             select(txt)
 
 -                 case "1"
 
 -                 MIDI演奏(hmidi,127,36,1)
 
 -                 case "2"
 
 -                 MIDI演奏(hmidi,127,42,1)
 
 -                 case "3"
 
 -                 MIDI演奏(hmidi,127,38,1)
 
 -             end
 
 -             等待(200)
 
 -         end     
 
 -     end 
 
 -     
 
 - 结束
 
  
 
 
- 功能 MIDI置乐器(设备句柄,乐器值,通道)
 
 -     var msg
 
 -     if (乐器值>127 || 乐器值<0)
 
 -         乐器值=127
 
 -     end 
 
 -     
 
 -     if (通道>15 || 通道<0)
 
 -         通道=1
 
 -     end   
 
 -     msg=0 * 65536 + 乐器值 * 256 + 192 + 通道
 
 -     dllcall("winmm.dll", "long", "midiOutShortMsg", "int",设备句柄, "int",msg )
 
 - 结束
 
  
 
- 功能 MIDI演奏(设备句柄,音量,音色值,通道)
 
 -     var msg
 
 -     if (音量>127 || 音量<0)
 
 -         音量=127
 
 -     end 
 
 -     
 
 -     if (通道>15 || 通道<0)
 
 -         通道=1
 
 -     end   
 
 -     msg=音量 * 65536 + 音色值 * 256 + 144 + 通道  
 
 -     dllcall("winmm.dll", "long", "midiOutShortMsg", "int",设备句柄, "int",msg )
 
 - 结束
 
  
 
- 功能 关闭设备(设备句柄)
 
 -     dllcall("winmm.dll", "long", "midiOutClose", "int",设备句柄)
 
 - 结束
 
  
 
 
 
- 功能 打开设备(自身窗口标题)
 
 -     var lphMidi,hp,hMidi
 
 -     //申请内存
 
 -     lphMidi=dllcall("kernel32.dll", "long", "LocalAlloc", "int", 64, "int", 16  )
 
 -     
 
 -     //打开设备内存
 
 -     dllcall("winmm.dll", "long", "midiOutOpen", "wchar", lphMidi, "long", -1, "long", 0, "long", 0, "long", 0)
 
 -     
 
 -     //获取句柄,注意此处通过自身窗口标题获取了自身进程句柄,从而实现读自身内存
 
 -     hp=进程获取句柄(自身窗口标题)
 
 -     
 
 -     //指针到整数,取设备句柄
 
 -     hMidi=读4byte(hp,lphMidi)
 
 -     
 
 -     //释放内存
 
 -     dllcall("kernel32.dll", "long", "LocalFree", "int", lphMidi )
 
 -     
 
 -     返回 hMidi
 
 -     
 
 - 结束
 
 
  复制代码 
 
 
 |