HSPコンテスト2008も終わり、HSPを触ることとも少なくなると思うので、忘れないうちに記事にしようと思います。軽くwinmm.dllを使う方法を紹介したいと思います。
最近コンテストで、HSPTV部門なのに音が出るプログラムを見かけることがあります。私もそれがやりたくて実装してみた作品が「蟲」だったりします。
具体的にはこんな流れになります。
けっこう簡単なのですが、引数を計算する為に構造体を扱うことになります。それだけが厄介です。
文章で説明するより、ソースを弄って体験してみたほうが理解しやすい気がします。楽器などの変数を変えてみたりして遊んでください。
何が起きているのか、ちゃんと理解したいならここが参考になります。
同時に16の音を重ねられますが、チャンネル番号9だけは、ドラムメンバ専用なので、違う感じになります。ここでは、チャンネル番号0~7まで使っています。
// winmm.dll
#uselib "winmm.dll"
#func midiOutOpen "midiOutOpen" int, int, int, int, int
#func midiOutShortMsg "midiOutShortMsg" int, int
#func midiOutClose "midiOutClose" int
// 置き換え
#define ctype midi_msg(%1,%2,%3) %1 | (%2<<8) | (%3<<16)
#const 音色 $C0
#const 発音 $90
#const 停止 $80
// セットアップ
midiOutOpen varptr(midi), 0, 0, 0, 0
onexit *exit
repeat 8
// 再生
楽器 = 102; (0~127)
音階 = 60+cnt; (0~127)
音量 = 100; (0~127)
midiOutShortMsg midi, midi_msg(音色+cnt, 楽器 ,0)
midiOutShortMsg midi, midi_msg(発音+cnt, 音階 ,音量)
wait 50
loop
repeat 8
// 停止
音階 = 60+cnt
midiOutShortMsg midi, midi_msg(停止+cnt, 音階 ,音量)
wait 50
loop
stop
*exit
// 使用終了
midiOutClose varptr(midi)
end
基本的に楽器の音のみですが、爆風やレーザーっぽい音色もあります。
楽器によって、停止するまで永遠に鳴ったり、勝手に停止したりします。
// winmm.dll
#uselib "winmm.dll"
#func midiOutOpen "midiOutOpen" int, int, int, int, int
#func midiOutShortMsg "midiOutShortMsg" int, int
#func midiOutClose "midiOutClose" int
// 置き換え
#define ctype midi_msg(%1,%2,%3) %1 | (%2<<8) | (%3<<16)
#const 音色 $C0
#const 発音 $90
#const 停止 $80
// セットアップ
midiOutOpen varptr(midi), 0, 0, 0, 0
onexit *exit
; 爆音風
midiOutShortMsg midi, midi_msg(音色, 127 ,0)
midiOutShortMsg midi, midi_msg(発音, 10 ,100)
; ↓この楽器は勝手に停止するので必要なし
; midiOutShortMsg midi, midi_msg(停止, 10 ,100)
stop
*exit
// 使用終了
midiOutClose varptr(midi)
end