gpt4 book ai didi

api - 网络音频 API 复音 - 使用 2 个不同的增益节点不起作用?

转载 作者:行者123 更新时间:2023-12-04 21:09:18 26 4
gpt4 key购买 nike

我似乎无法创建两个具有独立增益包络的振荡器。

下面的代码创建了两个按钮,每个按钮以不同的音高播放正弦音。当我单击第一个按钮时,我听到音量应有的增长。但是,当我单击第二个按钮时,音调的 react 就像连接到第一个音调的增益一样。例如,如果我在第一个音调为音量 1 时单击第二个按钮(打开第二个音调),则第二个音调将以音量 1 进入,即使它应该在整个过程中从 0 到 1 再到 0 包络10 秒。

每个音频上下文只能有一个增益节点吗?或者是否有其他原因将这些振荡器的增益连接起来?另外,我弹了一次之后就不能再弹了,这让我特别觉得自己做错了。 :)

谢谢。链接在下面,代码在下面。这是我在这里的第一篇文章,所以如果您需要其他任何东西,请告诉我。此代码必须在支持网络音频 api 的 Chrome 或 Safari 版本中运行。

http://whitechord.org/just_mod/poly_test.html

WAAPI tests


    <button onclick="play()">play one</button>
<button onclick="play2()">play two</button>


<script>

var context;

window.addEventListener('load', initAudio, false);

function initAudio() {
try {
context = new webkitAudioContext();
} catch(e) {
onError(e);
}
}

function play() {

var oscillator = context.createOscillator();
var gainNode = context.createGainNode();
gainNode.gain.value = 0.0;
oscillator.connect(gainNode);
gainNode.connect(context.destination);
oscillator.frequency.value = 700;

gainNode.gain.linearRampToValueAtTime(0.0, 0); // envelope
gainNode.gain.linearRampToValueAtTime(0.1, 5); // envelope
gainNode.gain.linearRampToValueAtTime(0.0, 10); // envelope

oscillator.noteOn(0);
}


function play2() {

var oscillator2 = context.createOscillator();
var gainNode2 = context.createGainNode();
gainNode2.gain.value = 0.0;
oscillator2.connect(gainNode2);
gainNode2.connect(context.destination);
oscillator2.frequency.value = 400;

gainNode2.gain.linearRampToValueAtTime(0.0, 0); // envelope
gainNode2.gain.linearRampToValueAtTime(0.1, 5); // envelope
gainNode2.gain.linearRampToValueAtTime(0.0, 10); // envelope

oscillator2.noteOn(0);
}


/* error */

function onError(e) {
alert(e);
}



</script>

</body>
</html>

最佳答案

Can I only have one gain node per audio context? Or is there some other reason that the gains of these oscillators are being connected? In addition, after I play the tones once, I cannot play them again, which makes me especially think that I am doing something wrong. : )



您可以根据需要拥有任意数量的增益节点(例如,这就是您可以实现类似总线的混合设置的方式),所以这不是问题。您的问题如下:

记住 linearRampToValueAtTime()的第二个参数是与您的 context.currentTime 在同一时间坐标系中的时间。

而你的 context.currentTime 是 总是 实时向前移动,因此应计算所有斜坡、曲线等 相对于它 .

如果您希望从现在起 4 秒后发生某些事情,您可以将 context.currentTime + 4 传递给 Web Audio API 函数。

因此,更改代码中的所有调用 linearRampToValueAtTime(),使其看起来像:
gainNode2.gain.linearRampToValueAtTime(0.0, context.currentTime); // envelope     
gainNode2.gain.linearRampToValueAtTime(0.1, context.currentTime + 5); // envelope
gainNode2.gain.linearRampToValueAtTime(0.0, context.currentTime + 10); // envelope

这应该可以解决您的问题。

顺便说一句,您的 BODY 开头标记中有一个杂散的双引号。

关于api - 网络音频 API 复音 - 使用 2 个不同的增益节点不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12252396/

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