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

标签 javascript html scheduling timing web-audio-api

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

相关文章:

html - 添加 Div 时单选按钮动画不起作用

javascript - 我找不到 javascript 代码在哪里

linux-kernel - 为什么线程的状态是运行但不使用任何CPU?

C:逐行读取文件

javascript - 为什么单击嵌套元素不会通过单击绑定(bind)冒泡到它的父元素?

javascript - 在控制台中有效,但在内容脚本中无效

javascript - THREE.js 网格顶点

css - 居中嵌套div

node.js - NodeJS、作业调度

javascript - 通过从 NodeJS 中执行 PHP 脚本来重新启动 NodeJS