MIDIファイルの一般的な演奏方法はMCIコマンドによるものです。
waveOut○○関数のような方法は殆ど使われません。
詳しくは後々解説しますが、難しいからです。
■MCIコマンド
デバイスタイプは "Sequencer" です。
一時停止解除は MCI_PLAY で行います。
通常は MCI_RESUME で行いますが、
使用中のMCIデバイスは指定されたコマンドをサポートしません。
というエラーが発生してしまいました。
リファレンスには認識するって書いてあるんだけどなあ……?
The MCI_RESUME command causes a paused device to resume the paused operation. Digital-video,
VCR, and waveform-audio devices recognize this command. Although CD audio,
MIDI sequencer, and videodisc devices also recognize this command, the MCICDA, MCISEQ, and MCIPIONR device drivers do not support it.
ちなみに、CDの場合は MCI_RESUME で正しく動作しました。
MCIコマンドについての詳細は「MCIコマンドによる音楽ファイル再生」「MCIコマンド実践」をご覧下さい。
#include<windows.h> // winmm.lib をリンクする #pragma comment(lib,"winmm") //#define BUFFERSIZE 256 LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { static MCI_OPEN_PARMS mop; //MCIERROR mciErr; //char str[BUFFERSIZE]; switch(uMsg){ case WM_CREATE: //オープン mop.lpstrDeviceType="Sequencer"; mop.lpstrElementName="flourish.mid"; mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD)&mop); //再生 mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0); return 0; case WM_LBUTTONDOWN: //一時停止 mciSendCommand(mop.wDeviceID,MCI_PAUSE,0,0); return 0; case WM_RBUTTONDOWN: //一時停止解除 mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0); /*mciErr=mciSendCommand(mop.wDeviceID,MCI_RESUME,0,0); if(mciErr){ mciGetErrorString(mciErr,str,BUFFERSIZE); MessageBox(hWnd,str,"MCI_RESUME",MB_OK); }*/ //使用中のMCIデバイスは指定されたコマンドをサポートしません。 return 0; case WM_DESTROY: //クローズ mciSendCommand(mop.wDeviceID,MCI_CLOSE,0,0); PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); }
★☆ ソースファイル表示 ☆★