Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在增益包络之间切换时振荡器发出咔哒声_Javascript_Audio_Web Audio Api - Fatal编程技术网

Javascript 在增益包络之间切换时振荡器发出咔哒声

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

我正在开发一个小型的Web音频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);
}
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只在某些浏览器中出现。