Windowsコード集 上のページ

#0002 BGM再生をMCIで作る

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を使って正しく送信されたかチェックする必要があるので、演奏以外ではやらない方が良いでしょう。


上のページ