MIDI を演奏しながら WAVE を鳴らす



DirectX の Audio Object Class を使って MIDI を演奏しながら WAVE を鳴らします。

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

プロジェクトの作成

  1. [ファイル] [新規作成] [プロジェクト] から空のプロジェクト(MidWav)を作成して下さい。
    プロジェクトのフォルダーに次のファイルを格納して下さい。
    Audio Object Class は Object Class Library からダウンロード出来ます。
    プロジェクト/既存項目の追加からプログラムファイルとヘッダファイルをプロジェクトに追加して下さい。
    ファイル名 ファイルの説明
    MidWav.cpp 「プログラムの説明」を参考に作成して下さい
    audio.h audio Object Class ヘッダファイル
    audio.cpp audio Object Class プログラムファイル
    Midi1.mid 演奏する MIDI ファイル(適当な MIDI を調達して名前を変更)
    Midi2.mid 演奏する MIDI ファイル(適当な MIDI を調達して名前を変更)
  2. WAVE ファイルは、次のフォルダーに格納されているファイルを演奏します。
    音が鳴らない(非常に小さい?)ものがあり (^_^;) 事前にメディアプレイヤなどで確認して下さい。
    C:\WINDOWS\Media\chord.wav
    C:\WINDOWS\Media\ringin.wav
  3. ページの画像を参考にして DialogBox を作成して下さい。
    DialogBox の ID は次のように設定して下さい。
    BOX ID キャプション
    DialogBox IDD_DIALOG1 DirectMusic Segment Player
    Button IDC_LDWAV1 Load Wave-1
    Button IDC_LDWAV2 Load Wave-2
    Button IDC_LDMID1 Load MIDI-1
    Button IDC_LDMID2 Load MIDI-2
    Button IDC_PLYWAV WavePlay
    Button IDC_STPWAV WaveStop
    Button IDC_CLOSE Close
  4. ライブラリは audio.h の #pragma でリンクするので、特に操作は不要です。
  5. ビルドから実行を選ぶと、コンパイルに続いて実行が行われます。
    MIDI-1 と MIDI-2 のどちらかをクリックすると MIDI の演奏が始まります。
    WAVE-1 と WAVE-2 のどちらかをクリックすると MIDI をバックに WAVE が鳴ります。
    WAVE の音量が小さくて聞き取りにくいときは、単独で鳴らしてみて下さい。
    音量の設定はこの後のページで説明します。
    WavePlay をクリックすると WAVE が100回連続して鳴らされます。
    WaveStop をクリックすると WAVE の演奏が停止します。
    Close ボタンをクリックするとプログラムが終了します。

プログラムの説明

  1. Audio Object Class を使うので audio.h と audio.cpp をプロジェクトに組み込んで下さい。
    Audio App; が Object Class の定義です。
    Wave1, Wave2, Midi1, Midi2 で演奏するファイルを定義しています。
        #include    <windows.h>
        #include    "audio.h"
        #include    "resource.h"
    
        //☆Audio Object Class を定義する
        Audio       App;
    
        char        Wave1[64]= "c:\\windows\\media\\chord.wav";
        char        Wave2[64]= "c:\\windows\\media\\ringin.wav";
        char        Midi1[64]= "midi1.mid";
        char        Midi2[64]= "midi2.mid";
        
  2. WinMain() では DialogBox を表示するだけです。
  3. DialogBox の CALLBACK 関数に記述する Button がクリックされたときの処理です。
    IDC_LDWAV1 で Wave1 を、IDC_LDWAV2 で Wave2 をロードして演奏します。
    WAVE は演奏時間が短いので、すぐ終わります。
    IDC_LDMID1 で Midi1 を、IDC_LDMID2 で Midi2 をロードして演奏します。
    IDC_PLYWAV で WAVE を100回繰り返して演奏します。
    IDC_CLOSE で WM_CLOSE をポストします。
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {   case IDC_LDWAV1:
                    if (!FAILED(App.Load(Wave1)))   App.Play();
                    break;
                case IDC_LDWAV2:
                    if (!FAILED(App.Load(Wave2)))   App.Play();
                    break;
                case IDC_LDMID1:
                    if (!FAILED(App.Load2(Midi1)))  App.Play2();
                    break;
                case IDC_LDMID2:
                    if (!FAILED(App.Load2(Midi2)))  App.Play2();
                    break;
                case IDC_PLYWAV:
                    App.Play(100);
                    break;
                case IDC_STPWAV:
                    App.Stop();
                    break;
                case IDC_CLOSE:
                    PostMessage(hDlg,WM_CLOSE,0,0);
                    break;
            }
            break;
        
  4. Audio Object Class では Performance8 を二個用意して、MIDI を WAVE を同時に演奏できるように設計されています。
    MIDI を演奏しなければ二個の WAVE を同時に鳴らすこともできます。
    Load() と Play() が g_pPerformance に対する関数で、Load2() と Play2() が g_pPerformance2 に対する関数です。
  5. プログラムの終了処理です。
    Object Class の Constructor が全てのオブジェクトを開放してくれます。
        case WM_CLOSE:
            EndDialog(hDlg,TRUE);
            return (TRUE);
        
  6. Audio の初期化や後始末の詳細は WAVE を演奏する を参照して下さい。
    MyD3D Object Class を使うと、これらの処理は Object Class が全て面倒を見てくれます。

【演習】

  1. Audio Object Class を使わないでプログラムを作成して下さい。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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

超初心者のプログラム入門(DirectX9 game program)

超初心者のプログラム入門(DirectX10 game program)