马上加入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
-
- 结束
复制代码
|