Directsound对数体积为线性体积滑块

时间:2013-04-08 15:51:43

标签: c# directx directsound

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

1 个答案:

答案 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;

这些只是基于维基百科信息的一些理论思考。它可能会也可能不会奏效。试试吧。