Javascript WebAudio:设置目标时间的不规则行为?

Javascript WebAudio:设置目标时间的不规则行为?,javascript,web-audio-api,Javascript,Web Audio Api,下面的代码似乎演示了与SetTargetTime不一致的性能。。。它应该在2秒时膨胀到最大值,然后在7秒时衰减到静音,然后在12秒时终止振荡器,安全安静到足以避免振动 相反,它在2秒时膨胀到最大值,然后在12秒时开始褪色,但尚未结束,此时我们确实听到了丑陋的咔哒声 有人能解释为什么会这样吗?请注意,注释的//0.3的短值足够快地将其删除,以避免单击。我在各种情况下都尝试过这个方法,似乎当衰减到0时,第三个参数会随着值的增加按比例延伸到适当的停止时间之外 <button id = "butt

下面的代码似乎演示了与SetTargetTime不一致的性能。。。它应该在2秒时膨胀到最大值,然后在7秒时衰减到静音,然后在12秒时终止振荡器,安全安静到足以避免振动

相反,它在2秒时膨胀到最大值,然后在12秒时开始褪色,但尚未结束,此时我们确实听到了丑陋的咔哒声

有人能解释为什么会这样吗?请注意,注释的//0.3的短值足够快地将其删除,以避免单击。我在各种情况下都尝试过这个方法,似乎当衰减到0时,第三个参数会随着值的增加按比例延伸到适当的停止时间之外

<button id = "button" >
Start then stop oscillators
</button>

<script>
var audioContext = new AudioContext();
var fadeIn = 2;
var fadeOut = 5; //0.3
var gainNode = audioContext.createGain();
var osc = audioContext.createOscillator();
osc.type = "sine";
osc.frequency.value = 300;
osc.connect(gainNode);
gainNode.gain.value = 0;
gainNode.connect(audioContext.destination);

function startAndStop() {
    osc.start(audioContext.currentTime);
    gainNode.gain.setTargetAtTime(1, audioContext.currentTime, fadeIn);    
    gainNode.gain.setTargetAtTime(0, audioContext.currentTime + fadeIn, fadeOut);
    osc.stop(audioContext.currentTime + fadeIn + fadeOut + 5);
};

var button = document.getElementById("button");
button.addEventListener("click", startAndStop);

</script>
的第三个参数不是时间参数,因此不,它不应该在2秒时膨胀到最大值,然后在7秒时衰减到静音,然后在12秒时终止振荡器

此参数设置值将更改的指数衰减率

因此,值为5将创建一个非常缓慢的衰减,非常缓慢,以至于当您到达t'时,它不会完成

应在第二个参数中完成计时

通过使用0.5的固定衰减率修复代码将删除单击:

var audioContext=新的audioContext; var fadeIn=2; var衰减=5; var gainNode=audioContext.createGain; var osc=audioContext.create振荡器; osc.type=正弦; osc.frequency.value=300; osc.连接节点; gainNode.gain.value=0; gainNode.connectaudioContext.destination; 功能启动和停止{ osc.startaudioContext.currentTime; gainNode.gain.setTargetAtTime1,audioContext.currentTime+fadeIn,0.5; gainNode.gain.setTargetAtTime0,audioContext.currentTime+fadeOut,0.5; osc.stopaudioContext.currentTime+fadeIn+fadeOut+5; }; var按钮=document.getElementByIdbutton; button.AddEventListener单击、开始和停止; 启动然后停止振荡器
看,是的!好的,太好了,这更有意义。第三个参数似乎成比例地延伸,因为这正是它所做的。下次我会记得查看Moz文档,而不是我的参考/教程,了解函数的行为。非常感谢。