»カーブを指定してWAVEの音量を調整するはてなブックマークに追加はてなブックマークを見る

カーブを指定してWAVEの音量を調整する。 入力はPCM形式、ステレオ16bitのWAVEと仮定。

short left  = reader.ReadInt16(); // 左チャンネル
short right = reader.ReadInt16(); // 右チャンネル
double volume = 0.5; // 音量(0.0〜1.0)
double ratio; // 変化量(0.0〜1.0)

»線形カーブ(Bカーブ)

// f(x) = x
ratio = volume;

left  = (short)((double)left  * ratio);
right = (short)((double)right * ratio);

»指数カーブ(Aカーブ)

底を10とした指数カーブ

// f(x) = (n^x - 1.0) / (n - 1.0) ただしn = 10
ratio = (Math.Pow(10.0, volume) - 1.0) / 9.0;

left  = (short)((double)left  * ratio);
right = (short)((double)right * ratio);

»対数カーブ(Cカーブ)

底を10とした対数カーブ

// f(x) = log_n(x * (n - 1.0) + 1.0) ただしn = 10
ratio = Math.Log10(volume * 9.0 + 1.0);

left  = (short)((double)left  * ratio);
right = (short)((double)right * ratio);

»余弦カーブ(S字型のカーブ)

// f(x) = (1.0 - cos(x * π)) / 2.0
ratio = (1.0 - Math.Cos(volume * Math.PI)) * 0.5;

left  = (short)((double)left  * ratio);
right = (short)((double)right * ratio);

Sponsored Link