WAVE を演奏する

DirectX の IDirectMusicLoader8 を使って PlaySegmentEx で WAVE を演奏する最も簡単なプログラムです。

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

プロジェクトの作成

  1. プライベートライブラリを使わないで DirectX9 の標準ライブラリだけで作成します。
    [ファイル] [新規作成] [プロジェクト] から空のプロジェクト(Wave)を作成して下さい。
    プロジェクト/既存項目の追加から Wave.cpp をプロジェクトに追加して下さい。
    ソースプログラムは、このページの後に掲載しています。
  2. このプログラムは、次のフォルダーに格納されている WAVE ファイルを演奏します。
    ringin.wav がフォルダーに格納されていることを確認して、メディアプレイヤなどで演奏してみて下さい。
    何が原因かは不明ですが、WAVE ファイルの中に音が聞こえないものが格納されていました。 (^_^;)
    C:\WINDOWS\Media\ringin.wav
  3. ライブラリは #pragma でリンクしているので特に操作は不要です。
        #pragma comment(lib,"winmm.lib")
        #pragma comment(lib,"dxerr9.lib")
        #pragma comment(lib,"dxguid.lib")
        
  4. ビルドから実行を選ぶと ringin.wav が演奏されます。
    演奏が終わると終了確認の MessageBox が表示されます。

プログラムの説明

  1. Dmusici.h をインクルードすると、DirectMusic と DirectSound で必要な他のヘッダファイルもインクルードされます。
    WAVE の演奏に必要な、3つのインターフェイスポインタを宣言します。
    DirectX9 でも DirectX8 と同じインターフェイスが使われています。
    wstrFileName[] が演奏する WAVE ファイルです。
        #include <windows.h>
        #include <dmusici.h>
    
        IDirectMusicLoader8*      g_pLoader         = NULL;
        IDirectMusicPerformance8* g_pPerformance    = NULL;
        IDirectMusicSegment8*     g_pSegment        = NULL;
    
        WCHAR   wstrFileName[MAX_PATH] = L"C:\\Windows\\Media\\ringin.wav";
        
  2. WinMain() では CoInitialize() で COM を初期化して、2つのオブジェクト(ローダーとパフォーマンス)を作成します。
    作成が終わると InitAudio() でパフォーマンスを初期化します。
        INT APIENTRY WinMain( HINSTANCE hInst, HINSTANCE, LPSTR pCmdLine, INT )
        {
            CoInitialize(NULL);
            CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, 
                              IID_IDirectMusicLoader8, (void**)&g_pLoader );
            CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, 
                              IID_IDirectMusicPerformance8, (void**)&g_pPerformance );
            g_pPerformance->InitAudio( NULL, NULL, NULL, 
                                       DMUS_APATH_SHARED_STEREOPLUSREVERB, 64,
                                       DMUS_AUDIOF_ALL, NULL );
        
  3. LoadObjectFromFile() で演奏する WAVE ファイルを1つのセグメントとしてロードします。
    ロードに失敗したときは、作成したオブジェクトを開放して終了します。
        if( FAILED( g_pLoader->LoadObjectFromFile( CLSID_DirectMusicSegment,
                                                   IID_IDirectMusicSegment8,
                                                   wstrFileName,
                                                   (LPVOID*) &g_pSegment ) ) )
        {   MessageBox(NULL,"Media not found","DirectMusic",MB_OK);
            g_pPerformance->CloseDown();
            g_pLoader->Release(); 
            g_pPerformance->Release();
            CoUninitialize();
            return 0;
        }
        
  4. セグメントを演奏する前に、バンドをシンセサイザにダウンロードしておきます。
    Sleep(500) はダウンロードの時間待ちです。
    PlaySegmentEx() で WAVE を演奏します。
    演奏が終わると MessageBox で終了確認をします。
        g_pSegment->Download( g_pPerformance );
        Sleep(500);
        g_pPerformance->PlaySegmentEx(g_pSegment,NULL,NULL,0,0,NULL,NULL,NULL);
        MessageBox(NULL,"Click OK to Exit.","DirectMusic",MB_OK);
        
  5. audio アプリケーションの終了処理です。
    Stop() を呼び出して、演奏中のセグメントを停止します。
    CloseDown() でパフォーマンスの終了処理を行います。
    Release() でオブジェクトへの内部参照を解放します。
        g_pPerformance->Stop( NULL, NULL, 0, 0 );
        g_pPerformance->CloseDown();
        g_pLoader->Release(); 
        g_pPerformance->Release();
        g_pSegment->Release();
        CoUninitialize();
        return 0;
        

【NOTE】

C:\WINDOWS\Media\ のフォルダーに格納されている wav file には「音が鳴らない(音量が非常に小さい)」ものがあるようです。 (^_^;)
事前にメディアプレイヤなどで確認して下さい。

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

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

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

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