我正在尝试了解 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/