MCIコマンドを組み合わせる事により、BGM演奏が実現できます。
MIDI演奏に使うMCIコマンドは以下の通りです。
○MIDIオープン(MCI_OPEN)
MCI_OPEN_PARMS parms;
parms.lpstrDeviceType = "sequencer"; // デバイス名
parms.lpstrElementName = "filename.mid"; // ファイル名
mciSendCommand(0,MCI_OPEN,MCI_WAIT|MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)&parms);
コマンド終了後 parms.wDeviceID には、デバイスIDが格納されます。
(以降の mciSendCommand の第1パラメータとなる)
[ヒント] デバイス名を "waveaudio" とする事により、WAVファイルの演奏も可能です。
この場合も、制御方法は全く同じだったりします。
○演奏開始(MCI_PLAY)
MCI_PLAY_PARMS parms;
parms.dwCallback = (DWORD)hwnd; // メッセージ受け取るウィンドゥハンドル(ループ演奏時に必要)
parms.dwFrom = 0; // 演奏開始位置(0:先頭)
mciSendCommand(device,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)&parms);
ループ演奏を実現するには、演奏後にウィンドゥに通知されるMM_MCINOTIFYメッセージを受け取る必要があります。
これは、MCI_NOTIFYとコールバック用のウィンドゥハンドルを与えればOKです。
そして MM_MCINOTIFYメッセージを受けとったら、再度 MCI_PLAY すればループ完了です。
○演奏停止(MCI_STOP)
MCI_GENERIC_PARMS parms;
mciSendCommand(device,MCI_STOP,MCI_WAIT,(DWORD)&parms);
○MIDIクローズ(MCI_CLOSE)
MCI_GENERIC_PARMS parms;
mciSendCommand(device,MCI_CLOSE,MCI_WAIT,(DWORD)&parms);
アプリケーションを終了させるとき、新たにMIDIをオープンするときには、この方法でクローズを行っておく必要があります。
上のほとんどのサンプルでは、MCI_WAITでコマンド送信に同期を取っていますが、無しでも制御は可能です。
ただし、MCI_NOTIFYを使って正しく送信されたかチェックする必要があるので、演奏以外ではやらない方が良いでしょう。