我正在开发一个小型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);
}
当我触发一个新的提示时,效果很好,为但为ojit_rstrong,再次调用上述函数,如果我的新幅度包络的开头与增益节点的当前幅度不匹配,则单击。
我不知道为什么会这样。理论上,初始幅度对例如为
[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),iOS(9.2)上的Safari(9.0)和Chrome(47.0.2526.107)和Android(4.2.2)下的Chrome(47.0.2526.83)中,它们的运行正常。因此,这大概是规范实现问题?
最佳答案
根据定义,调度程序不会从当前值和当前时间开始倾斜,而是从最后一个调度点开始倾斜。如果您不小心的话,这可能会导致不连续的跳转-但也可以解决将日程安排点清晰地插入到将来的情况。我们曾经讨论过创建“使用当前值取消计划值和检查点”方法。
关于javascript - 在增益包络之间切换时,振荡器会发出喀哒声,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35117783/