基本的な使い方

NKC_DAudio.cppの組み込みと初期化/開放処理ができれば、後は実際にオーディオ・データを読み込んで再生/停止させるだけである。ここでは、セグメントの生成と再生/停止の方法を解説する。

サンプルとして使用するMenu.mid click.wav hit.wav

セグメントの生成

オーディオ・データ1つに対して1つのセグメントを生成する。たとえばゲーム処理中に使用するバック・ミュージックが1つと、効果音が3つ必要な場合、作成するセグメントの数は4つとなる。

セグメントの作成は、IDirectMusicLoader8インターフェイスを使って、再生するオーディオ・データを読み込み、IDirectMusicSegment8オブジェクトを作成する。
セグメントは、「ファイルからロード」する方法と、「リソースからロード」する方法があるが、ここでは、ファイルからロードする方法を紹介する。

NKC_DAudio.cppには、セグメントを格納する変数としてg_pSeg[32]が宣言されている。見てわかるとおり、32の要素を持つ配列になっている。これは、最大32個のセグメントを作成できることになる。よって、ユーザーはどの要素にどの音を格納したかを覚えておく必要がある。

また、セグメントを簡単に生成するため、NKC_DAudio.cppファイルにLoadSeg関数を用意している。

bool LoadSeg(
    int seg,
    char* FileName,
    bool flgMIDI
);
  1. g_pSeg配列のどの要素に格納するか
  2. 読み込むファイル名
  3. MIDIファイルならtrue、WAVEファイルならfalse
  4. セグメントが生成できればtrueを、できなければfalseを返す

MIDIファイルを指定した場合、一度再生したら明示的に停止を実行するまでループし続け、WAVEファイルなら最後までなったら自動的に停止するように、セグメントが作成されるようにプログラムされている。よって、MIDIファイルはバック・ミュージック用、WAVEファイルは効果音用として、それぞれ使い分ける必要がある。

例1)、Menu.midを要素0としてセグメントを作成する

bool hr;

hr = LoadSeg(0, "Menu.mid", true);
if ( FAILED(hr) ) {
    失敗・・・
}

例2)、hit.wavを要素1としてセグメントを作成する

bool hr;

hr = LoadSeg(1, "hit.wav", false);
if ( FAILED(hr) ) {
    失敗・・・
}

セグメントの再生

セグメントの再生には、IDirectMusicPerformance8::PlaySegmentExメソッドを使う。
セグメントの再生には、「プライマリ・セグメント」として再生する方法と、「セカンダリ・セグメント」として再生する方法があり、再生の仕方もいろいろある。ここでは、最も基本的なセグメントの再生方法を解説する。

プライマリ・セグメントとして再生開始

プライマリ・セグメントは1つのパフォーマンスで同時に1つしか指定できない。BGMなどのセグメントはプライマリ・セグメントとして再生するのが普通である。
例えば、バック・ミュージック用に作成したg_pSeg[0]を再生するには、次のようにプログラムする。

g_pPerformance->PlaySegmentEx(g_pSeg[0], NULL, NULL, 0, 0, NULL, NULL, NULL);

g_pSeg[0]はMIDIデータであるため、一度再生を実行すると、停止を実行するまでBGMが流れ続ける(停止の方法は後で解説)。

セカンダリ・セグメントとして再生開始

プライマリ・セグメントは同時に1つしか再生できない。そのため、バック・ミュージックと同時に効果音のような短い音を再生するには、複数を同時に再生できるセカンダリ・セグメントとして再生する必要がある。
例えば、キャラクタ衝突時の効果音として作成したg_pSeg[0]セカンダリ・セグメントとして再生するには、次のようにプログラムする。

g_pPerformance->PlaySegmentEx(g_pSeg[1], NULL, NULL, DMUS_SEGF_SECONDARY, 0, NULL, NULL, NULL);

なお、同じセグメントを同時にいくつも再生できる。プライマリ・セグメントは1度に1つしか再生できないが、プライマリとセカンダリ、または複数のセカンダリといった感じに同時に複数再生できる。

セグメントの再生停止

セグメントが最後まで再生されて停止する前に再生を止めたい場合は、IDirectMusicPerformance8::StopメソッドまたはIDirectMusicPerformance8::StopExメソッドを使用する。このメソッドは、セグメント、セグメント状態、またはオーディオ・パスの再生を停止することができる。

すべてのセグメントの再生を停止する

すべてのセグメントの再生を一度に停止するには、IDirectMusicPerformance8::Stopメソッドを使って次のように実行する。

g_pPerformance->Stop(NULL, NULL, 0, 0);

ステージが切り替わる時やゲームを終了するときは、この方法ですべてを停止させるのがよいだろう。

特定のセグメントの再生を停止する

特定のセグメントの再生を停止させるには、IDirectMusicPerformance8::StopExメソッドを使用する。例えばg_pSeg[0]を停止させるには、次のように実行する。

g_pPerformance->StopEx(g_pSeg[0], 0, 0);

セグメントの再生を停止すると、そのセグメントのすべてのインスタンスの再生が停止される。また、オーディオ・パスを停止すると、停止したオーディオ・パスで再生されていたすべてのセグメントの再生が停止される。


BACK(NKC_DAudio.cppファイルの組み込み) NEXT(ボリューム・コントロール)