音量調節

DirectSoundを扱ったことがある人なら大抵困るんじゃないかと思われる音量調節。や、そんなの困ったのは私だけかもしれないけど(^^; 
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/directx9_c/directx/htm/idirectsoundbuffer8setvolume.aspまあ見ての通り、音量の調節はデシベルで扱います。0〜100%の方が都合がいいんだけど・・・と思うのだがきっといろいろと事情があるんでしょう。偉い人にはデシベルの方がうれしいとか何かあるんですよきっと。
まあそういう仕様なら仕方が無いから自分にとってわかりやすいパーセンテージから変換してあげる式を作ればいいんですが・・・数学に弱い私には対数計算とか全然ワカリマセーン!!てなわけですね。とりあえずデシベルをググってみました。
http://www.geocities.jp/fkmtf928/dB_sound.html
どうやらデシベルって、相対評価みたいですね。つまりデシベル0が100%音量にあたるわけだ。んで対数ってことは、1/10つまり10%の場合は一桁下がるのだからデシベルも一つ下がって-1ってわけですね。しかし音の場合はエネルギーが2乗に比例するらしいから-2が正しいらしい。よくわからんけどそういうことらしい(ぉぃ まあそのあたりごにょごにょと式変形してみると・・・
20 * \log(percent / 100)

そんなわけで(どんなわけだ)関数化してみました。

long PercentToDecibel( double dPercentage )
{
	if( dPercentage <= 0.0 ){
		return DSBVOLUME_MIN;
	}
	if( 100 <= dPercentage ){
		return DSBVOLUME_MAX;
	}
	const double dd = 100 * 20 * std::log( dPercentage / 100 );
	const long ld = static_cast< long >( dd );
	if( ld < DSBVOLUME_MIN ){
		return DSBVOLUME_MIN;
	}else{
		return ld;
	}
}

DirectSound用なので100倍しています。ていうか、DirectSoundのマクロ使ってます(^^; とりあえずこれでDirectSound試してみたけどなんとなくあってそうです。間違ってたらごめんなさい(ぇー