DirectMusicを使用するために「dmusici.h」をインクルードし「dxguid.lib」をリンクします。
#include <dmusici.h>
DirectMusicは使用する前にCOMを初期化しなければならないので初期化します。
CoInitialize( NULL );
セグメントを管理するIDirectMusicPerformance8を作成し、これを初期化します。
// パフォーマンスの作成 IDirectMusicPerformance8* g_lpPerformance = NULL; CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, IID_IDirectMusicPerformance8, (void**)&g_lpPerformance ); // パフォーマンスの初期化 g_lpPerformance->InitAudio( NULL, // IDirectMusicは不要 NULL, // IDirectSoundは不要 g_hWnd, // ウィンドウハンドル DMUS_APATH_SHARED_STEREOPLUSREVERB, // デフォルトのオーディオパス 32, // パフォーマンスチャンネルの数 DMUS_AUDIOF_ALL, // シンセサイザの機能 NULL ); // パラメータはデフォルト
ファイルの読み込みを管理するIDirectMusicLoader8を作成し、これを初期化します。ちなみにDirectMusicではファイル名をUNICODEで指定しなければなりません。
// ローダーの作成 IDirectMusicLoader8* g_lpLoader = NULL; CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_IDirectMusicLoader8, (void**)&g_lpLoader ); // ローダーの初期化(検索パスをカレントディレクトリに設定) CHAR strPath[ MAX_PATH ]; GetCurrentDirectory( MAX_PATH, strPath ); // マルチ・バイト文字をUNICODEに変換 WCHAR wstrSearchPath[ MAX_PATH ]; MultiByteToWideChar( CP_ACP, 0, strPath, -1, wstrSearchPath, MAX_PATH ); // ローダーに検索パスを設定 g_lpLoader->SetSearchDirectory( GUID_DirectMusicAllTypes, wstrSearchPath, FALSE );
IDirectMusicSegment8を作成します。
// 読み込むファイル CHAR szFileName[] = "bgm.mid"; // ファイル名をUNICODEへ変換 WCHAR wstrFileName[ MAX_PATH ]; MultiByteToWideChar( CP_ACP, 0, szFileName, -1, wstrFileName, MAX_PATH ); // セグメント作成 IDirectMusicSegment8* g_lpSegment = NULL; g_lpLoader->LoadObjectFromFile( CLSID_DirectMusicSegment, IID_IDirectMusicSegment8, wstrFileName, (LPVOID*)&g_lpSegment );
セグメントのタイプを指定します。ロードしたファイルがMidiファイルならこの処理を行います。(Waveの場合は必要ありません)
g_lpSegment->SetParam( GUID_StandardMIDIFile, 0xFFFFFFFF, 0, 0, NULL );
セグメントにバンドを設定します。バンドとは音色のことです。
g_lpSegment->Download( g_lpPerformance );
ここまでの処理でセグメントを再生することができるようになりました。再生するには下記の関数を使用します。
g_lpPerformance->PlaySegmentEx( g_lpSegment, NULL, NULL, 0, 0, NULL, NULL, NULL );
セグメントと停止し、各オブジェクトを解放します。
// 演奏停止 g_lpPerformance->Stop( NULL, NULL, 0, 0 ); // セグメントのアンロード g_lpSegment->Unload( g_lpPerformance ); // セグメントを開放 /* #define RELEASE(p) { if(p){(p)->Release();p=NULL;} } */ RELEASE( g_lpSegment ); // ローダを開放 RELEASE( g_lpLoader ); // パフォーマンスを解放 g_lpPerformance->CloseDown(); RELEASE( g_lpPerformance ); // COMを解放 CoUninitialize();
簡単に書いたので、説明が不十分なところがあるかもしれませんが、ここまでの作業でDirectMusicでMIDIとWAVEを再生することができます。DirectMusicの使用例のソースを置いておきますので参考にしてください。