在增益包络之间切换时,振荡器会发出咔嗒声

时间:2016-01-31 18:42:04

标签: javascript audio web-audio

我正在开发一个小型Web Audio API应用程序,该应用程序从包含控制单个振荡器节点的频率和幅度的“提示”的JSON文件中读取。

这些提示可以是任意长度的,例如

"amplitude": [0,50,0.025,2000,0.1,2000,0.3,1500]

其中每对的第一个值表示幅度(0-1),第二个值表示斜坡到该幅度的时间(以毫秒为单位)。

我将这些数组传递给一个使用它们构建增益包络的函数:

now = audioContext.currentTime;
oscGainNodeVal = oscGainNode.gain.value;
oscGainNode.gain.cancelScheduledValues(now);
oscGainNode.gain.setValueAtTime(oscGainNodeVal, now);
var rampTime = 0;
for (i=0; i<(gainPairs.length/2); i++) {
  rampTime = rampTime + (gainPairs[2*i+1]/1000);
  oscGainNode.gain.linearRampToValueAtTime(gainPairs[2*i], now + rampTime);
}

这很有效,但是当我触发一个新的提示时,再次调用上面的函数,如果我的新振幅包络的开头与增益节点的当前幅度不匹配,则点击

我无法弄清楚为什么会这样。理论上,初始幅度对,例如, [0,50],应该通过setValueAtTime()方法设置增益节点的值,从之前的任何值开始。有谁知道发生了什么事?

如果有任何用途,整个项目就在这里:https://github.com/delucis/troglodyte-angels

此处有一个演示部署:http://organist-tar-74864.netlify.com/

编辑:我做了一些进一步的测试,点击似乎只出现在OS X(10.9.5)下的Firefox(44.0)和Chrome(48.0.2564.97)中。在Safari桌面(9.0.3),Safari(9.0)和iOS(9.2)下的Chrome(47.0.2526.107)和Android(4.2.2)下的Chrome(47.0.2526.83),它的行为符合预期。那么这可能是一个规范实施问题?

1 个答案:

答案 0 :(得分:3)

根据定义,调度程序不会从当前值和当前时间斜坡上升 - 它从上一个调度点开始斜坡上升。如果您不小心,这可能导致不连续的跳跃 - 但它也会处理您将日程安排点干净地插入未来的情况。我们谈到了创建“取消预定值和具有当前值的检查点”方法。