evi*_*uin 29 apache-flex math flash audio actionscript-3
假设我有一个可以介于0和1之间的滑块.它SoundTransform.volume也介于0(静音)和1(完整音量)之间,但是如果我使用线性函数,那么说SoundTransform.volume = slider.volume,结果相当不令人满意.
我真的没有研究人耳,但是我曾经无意中听到人类的感知是对数的,或类似的东西.我应该使用哪些算法来设置SoundTransform.volume?
bac*_*dos 30
一般来说,人类的感知是对数的,当涉及到诸如光度等等时......这使我们能够对我们环境中的小"输入信号"进行微小的改变,或者用另一种方式:总是改变一种变化可感知的物理量与其价值的关系......
因此,您应该修改音量以指数方式增长,如下所示:
y = (Math.exp(x)-1)/(Math.E-1)
Run Code Online (Sandbox Code Playgroud)
你也可以尝试其他基地:
y = (Math.pow(base,x)-1)/(base-1)
Run Code Online (Sandbox Code Playgroud)
值base越大,效果越强,体积开始增长的速度越慢,最终增长的速度越快......
一个稍微简单的方法,给你类似的结果(你只在0和1之间的间隔,所以近似非常简单,实际上),是指数原始值,如
y = Math.pow(x, exp);
Run Code Online (Sandbox Code Playgroud)
对于大于1的exp,效果是,输出(即你的情况下的音量)首先上升得更慢,然后更快到达终点......这与指数函数非常相似......越大exp,越强效果......
格尔茨
back2dos
人类听觉是对数的,因此您需要将指数函数(反向)应用于滑块的线性输出.我不知道人类听觉是否更接近ln或log:
对于Ln:
e^x
Run Code Online (Sandbox Code Playgroud)
对于日志:
10^x
Run Code Online (Sandbox Code Playgroud)
你也可以尝试其他基地.然后,您需要缩放输出,使其覆盖可用的值范围.
更新
经过一些研究后,基数2似乎是合适的,因为功率与压力的平方有关.如果有人知道更好,请纠正我.
我想你想要的是:
v' = 2^v.a^v - 1
a = ( 2^(log2(m+1)/n) )/2
Run Code Online (Sandbox Code Playgroud)
v是您的线性输入值,范围为0..n v'是您的对数值,范围为0..m
第一个等式中的-1是给出一个从0而不是1的输出范围(因为k ^ 0 = 1).
m + 1是为了弥补这一点,所以你得到0..m而不是0..m + 1
您当然可以调整它以满足您的要求.
听觉复杂,感知响度根据频率,样本的持续时间以及人与人之间的差异而变化.所以这不能用数学方法解决,而是通过尝试各种控制功能并选择"感觉"最好的功能.
您是否发现此时在范围的低端改变控制对表观音量几乎没有影响,但音量在该范围的上端迅速增加?或者您是否听到相反的情况,低端的音量变化太快而高音的音量不够?或者您希望在中等水平上更好地控制音量?
增加低音量灵敏度:
SoundTransform.volume = Math.sin(x * Math.PI / 2);
Run Code Online (Sandbox Code Playgroud)
增加高音量灵敏度:
SoundTransform.volume = (Math.pow(base,x) - 1)/(base-1);
Run Code Online (Sandbox Code Playgroud)
要么
SoundTransform.volume = Math.pow(x, base);
Run Code Online (Sandbox Code Playgroud)
如果base> 1,请尝试不同的值并查看其感受.或者更严重的是,90度圆弧:
SoundTransform.volume = 1 - Math.sqrt(1-(x * x));
Run Code Online (Sandbox Code Playgroud)
其中x是slider.volume0且介于0和1之间.
请告诉我们你是怎么过的!
| 归档时间: |
|
| 查看次数: |
13225 次 |
| 最近记录: |