我即将描述的行为发生在Chrome 44中,但不在Firefox 40中发生。
如果您创建振荡器,将其设置为220 Hz的频率,然后在一秒钟之后将频率更改为440 Hz,您可以听到明显的滑音效果:而不是立即从220更改为440,振荡器< em>从原始频率滑动到新频率。
下面的代码说明了这种现象:
var ac = new AudioContext();
var osc = ac.createOscillator();
osc.connect( ac.destination );
osc.type = 'sawtooth';
osc.frequency.value = 220;
osc.start( 0 );
window.setTimeout( function() {
osc.frequency.value = 440;
}, 1000 );
window.setTimeout( function() {
osc.stop( 0 );
}, 2000 );
&#13;
我已经检查了OscillatorNode对象的文档,并且没有提到这种行为。
我也在搜索谷歌,并且(令人惊讶的是)我找不到任何其他有关这种现象的提及。
发生了什么?这似乎不是正确的行为。如果我希望频率滑行,我会使用linearRampToValueAtTime()方法。将频率直接设置为特定值应该......做到这一点。
这只是一个错误吗?我知道这个API仍在不断变化,但这似乎是一个明显的错误 - 这不会通过最粗略的测试。但我也无法想象Google会以这种方式实施它故意。
最重要的是:有解决方法吗?
答案 0 :(得分:4)
很确定这是一个错误。
我无法在规范中找到任何内容,即在value
上直接指定AudioParam
应该进行任何插值。
它有可能被忽视,因为通常人们可能会使用自动化方法修改价值。这让我想到了解决方法的问题......
如果你真的想要明确的延迟,你可以这样做(注意那里没有setTimeout
)。
// change the value to 440Hz 1 second from now
osc.frequency.setValueAtTime( 440, ac.currentTime + 1 );
如果您希望能够立即更改频率(例如,响应用户操作),您可以这样做:
osc.frequency.setValueAtTime( 440, 0 );
希望有所帮助。
顺便说一下,你应该考虑为此提出问题(https://code.google.com/p/chromium/issues/list)。