ボリューム・コントロール

前章ではデフォルトのオーディオ・パスでセグメントを再生した。DirectX Audioではオーディオ・パスを使えばボリュームの設定などを自由に変更できる。
ここでは、ゲーム実行中にボリュームをコントロールする方法を解説する。

マスター・ボリュームをコントロールする

シンセイサイザ全体のボリュームを設定するには、IDirectMusicPerformance8::SetBlobalParamメソッドを使用する。マスター・ボリュームを変更すると、シンセイサイザとパフォーマンス全体が影響を受ける。

マスター・ボリュームには増幅(または減衰)係数として、デシベル値を1/100デシベル単位で設定する。例えば、-10dbを設定したい場合、値として-1000を渡す。
シンセサイザにMicrosoft Software Synthesizerを使った場合に設定できるデシベル値の範囲は+20db〜-200dbだが、実用になる範囲は+10db〜-100dbとなっている。

デフォルト・オーディオ・パスの作成

デフォルト・オーディオ・パスはすでに作成済みなので、ここの説明は省略する。

現在のマスター・ボリュームの値を取得

ボリュームを設定する前に、現在のマスター・ボリュームの値を取得する。これは、DirectAudioの初期化の際行えばいいだろう。

long nMasterVolume;	// マスター・ボリューム

hr = g_pPerformance->SetGlobalParam(GUID_PerfMasterVolume, (void*)&nMasterVolume, sizeof(long));
if ( FAILED(hr) ) {
    // マスター・ボリュームの取得に失敗
}

IDirectMusicPerformance8::GetGlobalParamメソッドを使ってマスター・ボリュームの値を取得し、MasterVolumeにセットする。

マスター・ボリュームの設定

マスター・ボリュームを変化させるには、現在の値と違う値をシンセサイザにセットすればよい。

long nMasterVolume = -1000;	// マスター・ボリュームを設定(ここでは-10.00db)

hr = g_pPerformance->SetGlobalParam(GUID_PerfMasterVolume, (void*)&nMasterVolume, sizeof(long));
if ( FAILED(hr) ) {
    // マスター・ボリュームの変更に失敗
}

IDirectMusicPerformance8::SetGlobalParamメソッドを使ってマスター・ボリュームの値をセットする。

実際のプログラム

NKC_DAudio.cppには、マスタボリュームの値を格納するグローバル変数「g_nMasterVolume」が宣言され、初期化時に値をセットしている。よって、プログラマはマスター・ボリュームを変化させることだけを考えればよい。

例えば、カーソルキーの上を押すとマスター・ボリュームが0.05dbずつ大きくなり、下を押すと0.05dbずつ小さくなるようプログラムすると、次のようになる。

if ( KeyTbl[VK_UP] & 0x80 ) {
    g_nMasterVolume += 5;
    if ( g_nMasterVolume > VOLUME_MAX ) g_nMasterVolume = VOLUME_MAX;
    hr = g_pPerformance->SetGlobalParam(GUID_PerfMasterVolume, (void*)&g_nMasterVolume, sizeof(long));
    if ( FAILED(hr) ) OutputDebugString("マスター・ボリュームの変更に失敗\n");
} else if ( KeyTbl[VK_DOWN] & 0x80 ) {
    g_nMasterVolume -= 5;
    if ( g_nMasterVolume < VOLUME_MIN ) g_nMasterVolume = VOLUME_MIN;
    hr = g_pPerformance->SetGlobalParam(GUID_PerfMasterVolume, (void*)&g_nMasterVolume, sizeof(long));
    if ( FAILED(hr) ) OutputDebugString("マスター・ボリュームの変更に失敗\n");
}

《POINT》

特定のセグメントのボリュームをコントロールする

ゲームでは複数のセグメント(音)を同時に再生することが多い。しかし、マスター・ボリュームを変化させると、すべてのセグメントのボリュームが変化してしまう。

特定のセグメントのボリュームだけを変化させたい場合、オーディオ・パスを利用して音を再生する。オーディオ・パスは複数設定でき、ボリュームや周波数などをオーディオ・パスごとに変化させることができる。

デフォルト以外のオーディオ・パスの作成

デフォルト以外のオーディオ・パスは次のように作成する。

IDirectMusicAudioPath8* pAudioPath1;	// オーディオ・パス1

hr = g_pPerformance->CreateStandardAudioPath(
    DMUS_APATH_DYNAMIC_STEREO,  // パスの種類
    64,                         // パフォーマンス チャンネルの数
    TRUE,                       // ここでアクティブになる
    &pAudioPath1);            // オーディオパスを受け取るポインタ
if ( FAILED(hr) ) {
    // オーディオ・パス「pAudioPath1」の作成に失敗
}

オーディオ・パスを使ってセグメントを再生する

今までのプログラムでは、セグメントの再生にはデフォルト・オーディオ・パスを指定していた。作成したオーディオ・パスを指定してセグメントを再生するには、次のように行う。

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

作成したオーディオ・パスにボリュームを設定

作成したオーディオ・パスにボリュームを設定するには、次のように行う。

ling nVolume1 = -500;	// ボリュームを-5.00dbにする

hr = pAudioPath1->SetVolume(nVolume1, 0);  // ボリュームを即時変更
if (FAILED(hr)) {
    // ボリュームの変更に失敗
}

nVolume1の値を変化させてSetVolumeを実行すれば、特定のオーディオ・パスを使って再生しているすべてのセグメントのボリュームが変化し、マスタ・ボリュームは変化しない。

実際のプログラム

NKC_DAudio.cppには、デフォルト・オーディオ・パス以外に2つのオーディオ・パス「g_pAudioPath1」「g_pAudioPath2」を用意している。また、2つのオーディオ・パスのボリュームを管理するために、ボリュームの値を格納するグローバル変数「g_nVolume1」「nVolume2」を用意し、初期値としてマスター・ボリュームの値をセットしてある。

これらを使い、マスター・ボリューム以外でボリュームを変化させたいセグメントの再生に、オーディオ・パスを指定すればよい。


BACK(基本的な使い方)