Directsound 对数音量到线性音量滑块

Posted

技术标签:

【中文标题】Directsound 对数音量到线性音量滑块【英文标题】:Directsound logarithm volume to linear volume slider 【发布时间】:2013-04-08 15:51:43 【问题描述】:

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

【问题讨论】:

trkBalance.Value 在什么范围内?如果要还原对数刻度,则必须使用反函数 (Math.Exp)。 DS.Volume.Min/Max 是什么值?您需要找到一个函数v(t) = c * Math.Exp(t),其中v(minValue) == DS.Volume.Minv(maxValue) == DS.Volume.Max @NicoSchertler 最小值为 -10000,最大值为 0,我的轨迹栏为 0-100。我正在尝试foreGroundSound.Volume = Math.Exp((trkBalance.Value * 100) - 10000),但没有运气。 【参考方案1】:

有一个经验法则可以确定感知响度:

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;

这些只是基于***信息的一些理论想法。它可能会或可能不会起作用。试试看吧。

【讨论】:

int attenuation = 1 / 1024 + trkBalance.Value / 100 * 1023 / 1024; double db = 10 * Math.Log10(attenuation) / Math.Log10(2); label8.Text = (db * 100).ToString(); 你的意思是这样的?不幸的是,这个公式给出了 -infinite。 您应该考虑特定语言的类型安全性。 IE。使用 1f 等来避免截断为 int。 不,我的问题是 ln = log with base 2.thanxs ln 是自然对数(以 e 为底)。不过,您可以使用您喜欢的任何其他对数(例如Log10)。公式给出 -infinite 的原因是截断为整数。 attenuation 应该是 float 或 double 变量,因此:double attenuation = 1.0 / 1024.0 + t / 100.0 * 1023.0 / 1024.0; 究竟什么是“doubleValue”?

以上是关于Directsound 对数音量到线性音量滑块的主要内容,如果未能解决你的问题,请参考以下文章

按下音量按钮时更改音量滑块位置

当值 = 0 时,将“静音扬声器”图标链接到音量滑块?

铃声音量滑块,快速

音量滑块没有效果

MPMoviePlayerController 自定义音量滑块问题

HTML5 和 JavaScript 中每个音频播放器的音量滑块