gpt4 book ai didi

javascript - 网络音频 : Irregular behavior of setTargetAtTime?

转载 作者:行者123 更新时间:2023-12-03 03:11:47 25 4
gpt4 key购买 nike

下面的代码( 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

关于javascript - 网络音频 : Irregular behavior of setTargetAtTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46923136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com