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.Min
和v(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 对数音量到线性音量滑块的主要内容,如果未能解决你的问题,请参考以下文章