Web音频振荡器在Chrome中意外地从一个频率滑动到另一个频率

时间:2015-08-27 02:08:25

标签: javascript web-audio

我即将描述的行为发生在Chrome 44中,但在Firefox 40中发生。

如果您创建振荡器,将其设置为220 Hz的频率,然后在一秒钟之后将频率更改为440 Hz,您可以听到明显的滑音效果:而不是立即从220更改为440,振荡器< em>从原始频率滑动到新频率。

下面的代码说明了这种现象:

&#13;
&#13;
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;
&#13;
&#13;

我已经检查了OscillatorNode对象的文档,并且没有提到这种行为。

我也在搜索谷歌,并且(令人惊讶的是)我找不到任何其他有关这种现象的提及。

发生了什么?这似乎不是正确的行为。如果我希望频率滑行,我会使用linearRampToValueAtTime()方法。将频率直接设置为特定值应该......做到这一点。

这只是一个错误吗?我知道这个API仍在不断变化,但这似乎是一个明显的错误 - 这不会通过最粗略的测试。但我也无法想象Google会以这种方式实施它故意

最重要的是:有解决方法吗?

1 个答案:

答案 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)。