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