下面的代码(also live here)似乎证明了setTargetAtTime的性能不一致...它“应”在2秒时膨胀到最大值,然后在7秒时逐渐消失为静音,然后在12秒时终止振荡器(安全地静默以避免"the ugly click"。)

取而代之的是,它在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>

最佳答案

setTargetAtTime的第三个参数不是时间参数,因此不可以,它不应在2秒时膨胀到最大值,而在7秒时逐渐消失至静音,然后在12秒时终止振荡器。

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

因此,值5会产生非常缓慢的衰减,如此缓慢以至于到达t'时它不会结束。

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

通过使用固定衰减率0.5修复代码,可消除以下单击:



var audioContext = new AudioContext();

var fadeIn = 2;
var fadeOut = 5;

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, 0.5);
  gainNode.gain.setTargetAtTime(0, audioContext.currentTime + fadeOut, 0.5);
  osc.stop(audioContext.currentTime + fadeIn + fadeOut + 5);
};

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

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





但是确实,您似乎想使用linearRampValueAtTime而不是setTargetAtTime

07-26 08:10