Javascript 在增益包络之间切换时振荡器发出咔哒声
我正在开发一个小型的Web音频API应用程序,它从一个JSON文件读取数据,该文件包含控制单个振荡器节点频率和振幅的“提示” 这些提示可以是任意长度的,例如Javascript 在增益包络之间切换时振荡器发出咔哒声,javascript,audio,web-audio-api,Javascript,Audio,Web Audio Api,我正在开发一个小型的Web音频API应用程序,它从一个JSON文件读取数据,该文件包含控制单个振荡器节点频率和振幅的“提示” 这些提示可以是任意长度的,例如 "amplitude": [0,50,0.025,2000,0.1,2000,0.3,1500] 其中,每对的第一个值表示振幅(0–1),第二个值表示渐变到该振幅的时间(以毫秒为单位) 我将这些数组传递给一个函数,该函数使用这些数组构建增益包络: now = audioContext.currentTime; oscGainNodeVal
"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);
}
now=audioContext.currentTime;
oscGainNodeVal=oscGainNode.gain.value;
oscGainNode.gain.CancelScheduledValue(现在);
oscGainNode.gain.setValueAtTime(oscGainNodeVal,现在);
var-rampTime=0;
对于(i=0;i,根据定义,调度程序不会从当前值和当前时间开始渐变-它从上一个调度点开始渐变。如果不小心,这可能会导致不连续的跳跃-但它也会处理将调度点干净地插入未来的情况。我们已经讨论过创建“使用当前值取消计划值和检查点”方法。正确,但不调用setValueAtTime()
使用最新值的示例,将最后一个计划点设置为渐变起点?这似乎没有发生。从当前值更容易渐变的方法可能很好,但我主要想知道为什么它不能按原样工作。是否存在某种范围问题或其他问题?Reading gain.value会在某个时间为您提供该值e、 正在进行实际渲染的音频线程将从这一点开始移动,因此之后尝试设置值可能会产生故障。这是有道理的-脚本执行速度慢于采样率似乎是不可避免的。这使得@cwilso描述的方法的论点更具说服力。奇怪的是ng只在某些浏览器中出现。