Javascript WebAudio:setTargetAtTime()事件会立即触发,而不是在计划的时间触发

Javascript WebAudio:setTargetAtTime()事件会立即触发,而不是在计划的时间触发,javascript,html,web-audio-api,Javascript,Html,Web Audio Api,我有一个振荡器,它连接到一个增益节点,该节点用于创建一个音量封套,该封套随时间缓慢降低增益。大约在启动后1.5秒左右,我想在第2秒执行以下操作: 取消所有计划(未来)封套增益更改 创建新的时间表设置目标时间以“淡出”声音 问题是“淡出”setTargetTime()似乎会立即触发,这会导致卷跃。是,如果第二个参数(startTime)小于或等于audioContext.currentTime,则应为该值。但事实并非如此 函数startSound(){ //音频上下文 var audioCt

我有一个振荡器,它连接到一个增益节点,该节点用于创建一个音量封套,该封套随时间缓慢降低增益。大约在启动后1.5秒左右,我想在第2秒执行以下操作:

  • 取消所有计划(未来)封套增益更改
  • 创建新的时间表设置目标时间以“淡出”声音
问题是“淡出”setTargetTime()似乎会立即触发,这会导致卷跃。是,如果第二个参数(startTime)小于或等于audioContext.currentTime,则应为该值。但事实并非如此

函数startSound(){
//音频上下文
var audioCtx=new(window.AudioContext | | window.webkitadiocontext)();
var currentTime=audioCtx.currentTime;
//创建增益节点和振荡器
var gainNode=audioCtx.createGain();
var振荡器=audioCtx.create振荡器();
振荡器类型=“正弦”;
振荡器。频率。设定值时间(440,当前时间);
//将振荡器连接到增益节点,将增益节点连接到audioCtx.destination
振荡器。连接(增益节点);
gainNode.connect(audioCtx.destination);
振荡器。启动(当前时间);
//创建增益(卷封套)
增益节点增益设置值时间(0.5,当前时间);
增益节点增益线性平均值时间(0.5,当前时间+0.5);
增益节点增益线性平均值时间(0.25,当前时间+2);
增益节点增益线性平均值时间(0.000001,当前时间+5);
增益节点增益线性平均值时间(0.000001,当前时间+999);
//大约1.5秒后,取消第2秒及以上的所有计划封套更改,并创建FAST
//持续0.1秒的“淡出”。
var cancelAt=当前时间+2;
setTimeout(函数(){
StopEnvelope(audioCtx、gainNode、cancelAt);
}, 1500);
}
函数StopEnvelope(audioCtx、gainNode、cancelAt){
//这从来都不是真的
如果(cancelAt问题在于,它将删除所有在
cancelTime
时尚未完成的自动。在您的示例中,包括所有坡道,尽管第一个坡道实际上没有做任何事情,因为它将信号从
0.5
渐变到
0.5
。第二个坡道被删除,因为它在第二个
2处结束2
时尚未完成。这意味着只要调用
cancelScheduledValues()
增益就会恢复到
0.5
,因为这是最后一个剩余动画的结束值

这也是为什么增加一点
cancelTime
似乎会起作用的原因。这样做时,第二个渐变不会受到调用
cancelScheduledValues()
的影响,效果也不太明显


通过使用而不是
cancelScheduledValues()可以实现所需的行为
。它将保留最后一个值,下一个自动化将从那里开始。

非常感谢您的快速响应。我尝试了它,它工作了。但是有一个细节:假设有一个增益斜坡:从第二个1的值1到第二个2的值0.5…在第二个1.5我调用
取消和保持时间(2)
。现在增益不会跳跃,因为它将当前读取的值保持在1.5,尽管渐变尚未在1.5结束。但这也意味着第二个1.5到2的值将是平坦的,而不是继续渐变,对吗?非常感谢!如果调用
CancelandHoldaTime(2)
它应该在
2
秒取消自动化。如果
currentTime
低于
2
,自动化应该在
2
秒继续并冻结。我通常会仔细检查这些边缘情况。是的。如下所示:看起来像调用CancelandHoldaTime(2)虽然有一个活动的/正在进行的自动化之前就已经开始了,但是这样做了吗:自动化一直持续到第二个2,从那时起,该值在第二个2的值上保持“平坦”。同样,@chrisgutandin非常感谢!!!!