MIDI と WAVE のミキシング

VC++ の MCI(Media Control Interface) で MIDI と WAVE をミキシングして演奏します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクトで(MidiWave)を作成します。
  2. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    キャプションとIDを次のように設定して下さい。
    BOX キャプション ID
    DialogBox MIDI & WAVE IDD_DIALOG1
    Button MIDI IDC_MIDI
    Button WAVE IDC_WAVE
    Button STOP IDC_STOP
    Button CLOSE IDCANCEL
  3. 次のファイルをプロジェクトのフォルダーに格納して、MidiWave.cpp をプロジェクトに追加して下さい。
    Chimes.wav は Windows のフォルダーに格納されています。
    MIDI ファイルは適当なものを調達してきて下さい。
    ファイル 説明
    MidiWave.cpp DialogBox のソースプログラム
    Midi.mid 演奏する MIDI ファイル
    chimes.wav 演奏する WAVE ファイル
  4. MidiWave.cpp の説明です。
    mciSendString() は mmsystem.h で定義されています。
    "winmm.lib" は #pragma を使ってリンクしています。
        #include    <windows.h>
        #include    <mmsystem.h>
        #include    "resource.h"
        #pragma     comment(lib,"winmm.lib")
        
  5. WM_INITDIALOG: で midi.mid と chimes.wav をオープンします。
        MCIERROR    rc;
        case WM_INITDIALOG:
            rc= mciSendString("open midi.mid type sequencer alias midi",NULL,0,NULL);
            if (rc)     MessageBox(hDlg,"midi.mid","OPEN ERROR",MB_OK);
            rc= mciSendString("open chimes.wav type waveaudio alias chim",NULL,0,NULL);
            if (rc)     MessageBox(hDlg,"chimes.wav","OPEN ERROR",MB_OK);
        
  6. waveOutSetVolume() は WAVE の音量設定です。
    midiOutSetVolume() は MIDI(sequencer)の音量設定です。
    この命令で WAVE と MIDI のバランスを調整して下さい。
            waveOutSetVolume(NULL,(DWORD)MAKELONG(40000,40000));
            midiOutSetVolume(NULL,(DWORD)MAKELONG(10000,10000));
            break;
        
  7. この音量設定の命令は Windows のマスタ音量と連動しています。
    [スタート][設定][コントロールパネル]を選びます。
    [サウンドとオーディオデバイス]を起動します。
    [音量][詳細設定]で表示される画面で確かめて下さい。
    ツールバーに音量設定が表示されているときは、右クリックして[オーディオプロパティの調整]から選択できます。
    説明の画像
  8. play を次のように書くと、ボタンをクリックしても一度だけしか演奏されません。
    mciSendString("play chim",NULL,0,NULL);
    繰り返し演奏するときは開始位置を start に設定して演奏します。
    mciSendString("seek chim to start",NULL,0,NULL);
    mciSendString("play chim",NULL,0,NULL);
    または from で開始位置を指定して次のように書きます。
    mciSendString("play chim from 0",NULL,0,NULL);
  9. STOP ボタンで演奏を停止します。
            case IDC_STOP:
                mciSendString("stop midi",NULL,0,NULL);
                mciSendString("stop chim",NULL,0,NULL);
                return TRUE;
          
  10. プログラムの終了時にオープンした MIDI と WAVE を Close して下さい。
            case WM_CLOSE:
                mciSendString("close midi",NULL,0,NULL);
                mciSendString("close chim",NULL,0,NULL);
                EndDialog(hDlg, TRUE); 
                return TRUE;
                break;
        
  11. ビルドに続いて実行を行います。
    MIDI と WAVE がミキシングして演奏されたら完成です。

超初心者のプログラム入門(Win32API C++)