前章ではデフォルトのオーディオ・パスでセグメントを再生した。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");
}
ゲームでは複数のセグメント(音)を同時に再生することが多い。しかし、マスター・ボリュームを変化させると、すべてのセグメントのボリュームが変化してしまう。
特定のセグメントのボリュームだけを変化させたい場合、オーディオ・パスを利用して音を再生する。オーディオ・パスは複数設定でき、ボリュームや周波数などをオーディオ・パスごとに変化させることができる。
デフォルト以外のオーディオ・パスは次のように作成する。
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(基本的な使い方) |