ホーム > DirectMusic > MidiとWaveの再生

MidiとWaveの再生

目次

  1. 初期化
  2. 読み込み
  3. 再生
  4. 終了処理
  5. 最後に

初期化

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の使用例のソースを置いておきますので参考にしてください。



Last Update 2006/11/24.
Copyright © 2002-2004 Toru All Rights Reserved.
inserted by FC2 system