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);
}
★☆ ソースファイル表示 ☆★