我正在使用DirectX.DirectSound开发音乐播放器。我的音量有问题。 directsound体积是对数。这意味着对于无声的声音,对于幅度的微小变化比对大声的声音更敏感。这也意味着使用线性音量滑块我们会有体积变化的对数感觉,这感觉不对。我的问题是:我怎样才能使它成为线性的? 我的代码直到这里是:
if (trkBalance.Value == trkBalance.Minimum)
{
foreGroundSound.Volume = (int)DS.Volume.Min;
}
else if (trkBalance.Value == trkBalance.Maximum)
{
foreGroundSound.Volume = (int)DS.Volume.Max;
}
else
{
foreGroundSound.Volume = (int)(-5000 * Math.Log10(100 - trkBalance.Value));
}
答案 0 :(得分:2)
有一个经验法则可以确定感知的响度:
10 dB(doubleValue)的差异导致声音是原始声源的两倍/一半。
考虑到这一点,我们可以创建一个将衰减映射到声压级的公式。
但首先我们必须计算实际衰减(作为分数)。 DirectSound可以将声音衰减100 dB,这是1/2^(100/doubleValue)
的衰减。这是最小轨迹栏值的值。最大值为1(无变化)。整体而言:
doubleValue = 10;
minimumAttenuation = 1/2^(100/doubleValue)
attenuation = minimumAttenuation + trkBalance.Value / 100 * (1 - minimumAttenuation);
现在我们有一个有效范围内的值。现在我们需要找到这种衰减的声压级。
我们知道每10分贝(doubleValue)的响度加倍:
attenuation = 2^(db/doubleValue) //ln
ln(attenuation) = db / doubleValue * ln(2)
db = doubleValue * ln(attenuation) / ln(2)
由于DirectSound需要几个dB,你可以使用
foreGroundSound.Volume = db * 100;
这些只是基于维基百科信息的一些理论思考。它可能会也可能不会奏效。试试吧。