MCIコマンドによるMIDIファイル再生

概要:MIDIファイルの一般的な演奏方法

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);
}

★☆ ソースファイル表示 ☆★


戻る / ホーム