gpt4 book ai didi

javascript - Web Audio API 振荡器节点对象生命周期和 stop() 方法

转载 作者:搜寻专家 更新时间:2023-10-31 08:33:24 27 4
gpt4 key购买 nike

我正在尝试了解 Web Audio API 计时和调度方法。

但是我还没有完全理解Oscillator Node的stop()方法。

我在这里尝试安排以 120 BPM 的速度播放 4 个振荡器。

但似乎一旦 stop() 方法在释放时间启动,它就会停止所有振荡器。

代码如下:

var context = new webkitAudioContext();
var now = context.currentTime;
var tempo = 120;
var releaseTime = 0.5;
var secondsPerBeat = 60.0 / tempo;

for(var i = 0; i < 4; i++){
var now = context.currentTime;
var osc = context.createOscillator();
osc.connect(context.destination);
osc.start(now + (i*secondsPerBeat));
var now = context.currentTime;
osc.stop(now + releaseTime);
}

为什么会发生这种情况,我该如何预防?

谢谢

最佳答案

首先,关于 Javascript:Js 中没有 block 作用域,所以也许它会将所有变量定义放在当前执行上下文的开头会更清楚。
其次,你确实会延迟开始你的声音,但同时停止它们,这不是你想要的。
第三,for 循环中的 currentTime 几乎相同:你不能依靠 for 循环来引起延迟。

var context = new webkitAudioContext();
var tempo = 120;
var releaseTime = 0.5;
var secondsPerBeat = 60.0 / tempo;

var now = context.currentTime;
var i = 0, startTime=0, osc = null;

for(i = 0; i < 4; i++) {
startTime = now + (i*secondsPerBeat) ;
osc = context.createOscillator();
osc.connect(context.destination);
osc.start();
osc.stop(startTime + releaseTime);
}

很快您就会想要编写一个函数来创建您的振荡器以进一步清理代码。

编辑:关于对象的生命周期,最好查看规范:
https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html
看4.2.3。终身部分。

总结一下:如果播放或连接到引用的上下文,它们将存活,否则会死亡。

你可以:
- 保持相同的上下文,并将 4 个振荡器存储在一个数组中,以便在需要时启动/停止它们。
- 或者每次都重新创建一个新的上下文 + 新的振荡器。

(但是你不能在相同的上下文中继续创建新的振荡器,否则它们会堆积起来,因为它们仍然连接,并且使用太多内存)。

关于javascript - Web Audio API 振荡器节点对象生命周期和 stop() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17610817/

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