繁体   English   中英

Web Audio API Oscillator Node对象生命周期和stop()方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM