1

我正在使用 DirectX.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));
            }
4

1 回答 1

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 需要数百分贝,您可以使用

foreGroundSound.Volume = db * 100;

这些只是基于维基百科信息的一些理论思想。它可能会或可能不会起作用。去尝试一下。

于 2013-04-08T18:52:05.750 回答