簡體   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