Web音频振荡器意外地滑翔从一个频率到另一个在Chrome
Web Audio oscillators unexpectedly glide from one frequency to another in Chrome
我即将描述的行为发生在Chrome 44中,但是不在Firefox 40中发生吗?
如果你创建一个振荡器,将其设置为220赫兹的频率,然后在一秒钟后将频率更改为440赫兹,你可以听到一个明显的portamento效果:而不是立即从220到440,振荡器从原始频率滑动到新的频率。
下面的代码说明了这种现象:
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 );
我已经检查了有关OscillatorNode对象的文档,没有提到这种行为。
我也搜索了谷歌,(令人惊讶的是)我找不到任何关于这种现象的其他提及。
怎么回事?这看起来不像是正确的行为。如果我想让频率滑动,我将使用linearRampToValueAtTime()方法。将频率直接设置为特定值应该只是…这样做。
这只是一个bug吗?我知道这个API仍在不断变化,但这似乎是一个非常明显的错误——这不会通过最粗略的测试。但是我也无法想象Google会故意这么做
最重要的是:是否有解决方法?
很确定这是一个bug。
我在规范中找不到任何说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)。
这是内置的" dezipppers "效果,工作组已经在这方面来回进行了几次。到了6月,WG终于决定取消去拉链(状态:https://github.com/WebAudio/web-audio-api/issues/76)。所以,是的,这是一个Chrome"bug"- https://code.google.com/p/chromium/issues/detail?id=496282)。在修复之前,请按照Kevin的建议使用setValueAtTime()。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- jQuery:循环一个具有不同超时值的循环
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 从javascript创建一个列表
- 节点导出返回一个空对象
- 使用clickToggle并在单击另一个元素时关闭元素
- 我可以在json对象中添加一个函数吗
- 使用javascript将动态表从一个html页面打印到另一个html页
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 表追加而不附加最后一个元素
- 我如何找到一个句子中的所有空格并替换忽略它们
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 使用类从一个标记中双击事件
- 根据已经给定的频率创建一个d3.js直方图
- 将频率(大致)从一个 Web 音频流“克隆”到另一个白噪声流
- 制作一个搜索引擎,并根据搜索频率得到结果
- 用JavaScript分析FFT:如何找到一个特定的频率
- Web音频振荡器意外地滑翔从一个频率到另一个在Chrome
- JavaScript:使用一个对象在数组上迭代并跟踪项目频率