[英]Web Audio API Oscillator Node object life span and stop() method
我试图了解Web Audio API时序和调度方法。
但我仍然没有完全理解振荡器节点的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中没有块范围,因此将所有vars定义放在当前执行上下文的开头可能会更清楚。
其次,你会延迟开始你的声音,但在同一时间停止它,这不是你寻求的。
第三,current循环中的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振荡器存储在阵列中,以便在需要时启动/停止它们。
- 或每次重新创建一个新的上下文+新的振荡器。
(但你不能继续在相同的环境中创建新的振荡器,否则它们会堆积起来,因为它们仍然连接在一起,并且使用太多的内存)。
我也遇到了与此类似的问题。 我发现你需要stop()
并且还 disconnect()
每个振荡器(或其他缓冲区产生节点类型)实例,否则实例将停留并将干扰任何新实例的回放。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.