ホーム > サンプルプログラム > MidiとWaveの再生

/*------------------------------------------------------------
    DirectMusic サンプルプログラム

    2007 Copyright(C) Toru

    ToruのDirectXプログラミング講座
        URL  : http://toruweb.web.fc2.com/
        Mail : toru_website@hotmail.com
--------------------------------------------------------------*/
#define STRICT


// インクルード
#include 
#include 
#include 


// インターフェイス解放
#define RELEASE(p)  { if(p){(p)->Release();p=NULL;} }


// アプリケーション情報
HINSTANCE   g_hInst;                                    // インスタンスハンドル
HWND        g_hWnd;                                     // ウインドウハンドル
CHAR        g_szAppName[] = "DirectMusic Sample";       // アプリケーション名


// DirectMusicの変数
IDirectMusicPerformance8*   g_lpPerformance = NULL;     // パフォーマンス
IDirectMusicLoader8*        g_lpLoader      = NULL;     // ローダー
IDirectMusicSegment8*       g_lpSegment     = NULL;     // セグメント
CHAR                        szFileName[] = "bgm.mid";   // 再生するファイル


// メッセージ関数の定義
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, UINT wParam, LONG lParam );


// アプリケーションの初期化
BOOL    InitApp( HINSTANCE hInst, INT nCmdShow )
{
    // インスタンスハンドル保存
    g_hInst = hInst;

    // COMの初期化
    HRESULT hr = CoInitialize( NULL );
    if( FAILED(hr) )
    {
        DXTRACE_ERR( "COMの初期化に失敗", hr );
        return FALSE;
    }

    // ウインドウクラスの登録
    WNDCLASS wc;
    ZeroMemory( &wc, sizeof(wc) );
    wc.hCursor          = LoadCursor( NULL, IDC_ARROW );
    wc.lpszClassName    = "Main Window";
    wc.hbrBackground    = (HBRUSH)GetStockObject( WHITE_BRUSH );
    wc.hInstance        = hInst;
    wc.style            = CS_BYTEALIGNCLIENT | CS_VREDRAW|CS_HREDRAW;
    wc.lpfnWndProc      = (WNDPROC)MainWndProc;
    if( ! RegisterClass(&wc) )
    {
        DXTRACE_MSG( "ウインドウクラスの登録に失敗" );
        return FALSE;
    }

    // メインウインドウの作成
    g_hWnd = CreateWindowEx( 0, "Main Window", g_szAppName,
                             WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION,
                             CW_USEDEFAULT, CW_USEDEFAULT, 320, 240,
                             (HWND)NULL, (HMENU)NULL, hInst, (LPSTR)NULL);
    if( g_hWnd == NULL )
    {
        DXTRACE_MSG( "メインウインドウ作成に失敗" );
        return FALSE;
    }

    // メインウインドウの表示
    ShowWindow( g_hWnd, nCmdShow );
    UpdateWindow( g_hWnd );

    return TRUE;
}


// DirectMusicの初期化
BOOL    InitDMusic()
{
    HRESULT hr;

    // パフォーマンスの作成
    hr = CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC,
                           IID_IDirectMusicPerformance8, (LPVOID*)&g_lpPerformance );
    if( FAILED(hr) )
    {
        DXTRACE_ERR( "DirectMusicPerformance8オブジェクトの作成に失敗", hr );
        return FALSE;
    }

    // パフォーマンスの初期化
    hr = g_lpPerformance->InitAudio( 
        NULL,                                   // IDirectMusicインターフェイスは不要
        NULL,                                   // IDirectSoundインターフェイスは不要
        g_hWnd,                                 // ウィンドウハンドル
        DMUS_APATH_SHARED_STEREOPLUSREVERB,     // デフォルトのオーディオパスタイプ
        64,                                     // パフォーマンスチャンネルの数
        DMUS_AUDIOF_ALL,                        // シンセサイザの機能
        NULL );                                 // オーディオパラメータにはデフォルトを使用
    if( FAILED(hr) )
    {
        DXTRACE_ERR( "DirectMusicPerformance8の初期化に失敗", hr );
        return FALSE;
    }

    // ローダーの作成
    hr = CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC,
                           IID_IDirectMusicLoader8, (LPVOID*)&g_lpLoader );
    if( FAILED(hr) )
    {
        DXTRACE_ERR( "DirectMusicLoader8オブジェクトの作成に失敗", hr );
        return FALSE;
    }

    // ローダーの初期化(検索パスをカレントディレクトリに設定)
    CHAR strPath[ MAX_PATH ];
    DWORD i = GetCurrentDirectory( MAX_PATH, strPath );
    if( i==0 || MAX_PATHSetSearchDirectory( GUID_DirectMusicAllTypes, wstrSearchPath, FALSE );
    if( FAILED(hr) )
    {
        DXTRACE_ERR( "検索パスの設定に失敗", hr );
        return FALSE;
    }

    // セグメント作成
    WCHAR wstrFileName[ MAX_PATH ];
    MultiByteToWideChar( CP_ACP, 0, szFileName, -1, wstrFileName, MAX_PATH );
    hr = g_lpLoader->LoadObjectFromFile( CLSID_DirectMusicSegment, IID_IDirectMusicSegment8,
                                         wstrFileName, (LPVOID*)&g_lpSegment );
    if( FAILED(hr) )
    {
        DXTRACE_ERR( "セグメントのロードに失敗", hr );
        return FALSE;
    }

    // MIDIファイルの場合は、パラメータを設定する
    hr = g_lpSegment->SetParam( GUID_StandardMIDIFile, 0xFFFFFFFF, 0, 0, NULL );
    if( FAILED(hr) )
    {
        DXTRACE_ERR( "セグメントのパラメータ設定に失敗", hr );
        return FALSE;
    }

    // バンドのダウンロード
    hr = g_lpSegment->Download( g_lpPerformance );
    if( FAILED(hr) )
    {
        DXTRACE_ERR("セグメント1のバンドのダウンロードに失敗", hr);
        return FALSE;
    }

    // セグメントの再生
    g_lpPerformance->PlaySegmentEx(
        g_lpSegment,    // 演奏するセグメント
        NULL,           // 使用しない
        NULL,           // トランザクション用
        0,              // フラグ
        0,              // 開始タイム、0 は即時
        NULL,           // セグメント状態を受け取るポインタ
        NULL,           // 停止するオブジェクト
        NULL            // オーディオパス、デフォルトでない場合
    );

    return TRUE;
}


// DirectMusicの終了処理
BOOL    ReleaseDMusic()
{
    HRESULT hr;

    // 演奏停止
    if( g_lpPerformance )
    {
        hr = g_lpPerformance->Stop( NULL, NULL, 0, 0 );
        if( FAILED(hr) )
            DXTRACE_ERR( "全セグメントの演奏停止に失敗", hr );
    }

    // セグメントのアンロード
    if( g_lpSegment )
    {
        hr = g_lpSegment->Unload( g_lpPerformance );
        if( FAILED(hr) )
            DXTRACE_ERR( "セグメントのアンロードに失敗", hr );
    }

    // セグメントを開放
    RELEASE( g_lpSegment );

    // ローダを開放
    RELEASE( g_lpLoader );

    // パフォーマンスを解放
    if( g_lpPerformance )
    {
        hr = g_lpPerformance->CloseDown();
        if( FAILED(hr) )
            DXTRACE_ERR( "IDirectMusicPerformance8::CloseDownに失敗", hr );
    }
    RELEASE( g_lpPerformance );

    return TRUE;
}


// アプリケーションの終了処理
BOOL    EndApp()
{
    // COMを解放
    CoUninitialize();

    return TRUE;
}


// ウインドウ処理
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, UINT wParam, LONG lParam )
{
    switch( msg )
    {
        // ウインドウが破棄される
        case WM_DESTROY:    
            PostQuitMessage( 0 );
            break;

        // その他のメッセージ
        default:            
            return DefWindowProc( hWnd, msg, wParam, lParam );
    }

    return 0L;
}


// メイン
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, INT nCmdShow)
{
    MSG msg;

    // アプリケーションの初期化
    if( InitApp( hInst, nCmdShow ) )
    {
        // DirectMusicの初期化
        if( InitDMusic() )
        {
            // メッセージループ
            while( GetMessage( &msg, 0, 0, 0 ) )
            {
                if( msg.message == WM_QUIT )
                    break;
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
        }
    }

    // DirectMusicの終了処理
    ReleaseDMusic();

    // アプリケーションの終了処理
    EndApp();

    return msg.wParam;
}


inserted by FC2 system