2013-07-12 29 views
4

我想了解Web音頻API時序和調度方法。網絡音頻API振盪器節點對象的生命期和停止()方法

但我還沒有完全瞭解振盪器節點的stop()方法。

在這裏,我試圖安排打4振盪器120 BPM的節奏。

但好像只要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); 
} 

這是爲什麼發生,我該如何避免這種情況?

感謝

+0

你確定他們在同一時間停止嗎?我認爲你的問題是一個循環非常快,所以你作爲一個人,看到他們在同一時刻停止,而他們不是。 – MisterJ

+0

我不明白這個問題:你問他們現在停止+ releaseTime ...所以他們這樣做。 ? – GameAlchemist

+0

@VincentPiel假設當for循環被調用時,它必須創建了四個不同的振盪器節點,但它清楚的是一個。令人困惑的是緩衝區源和振盪器節點的相似性,因爲在BufferSourceNode上執行完全相同的操作時,它會創建新的緩衝區並播放和停止,而不會干擾其他預定的音符。 – zya

回答

2

第一件事,關於JavaScript的:有JS中沒有塊範圍,所以也許它會 更清楚把所有在當前執行上下文的開始瓦爾定義。
其次,你確實延遲開始你的聲音,但在同一時間停止它們, 這不是你所尋求的。
第三,在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振盪器存儲在數組中,以便在需要時啓動/停止它們。
- 或者每次重新創建一個新的上下文+新的振盪器。

(但你不能保持在創造同樣的背景下新的振盪器或它們堆積起來,因爲他們仍然連接,並使用過多的內存)。

+0

您不能多次調用振盪器啓動。我發現,最好的方法是將振盪器掛接到增益節點,然後將增益節點從0(無音符)切換到某個非零值來播放。 – PinkElephantsOnParade

+0

我想我並不是建議不止一次地開始他們。在提供的(短)代碼中,我創建並啓動了其中的4個代碼。否則,你會確認1)音頻資源被重新收集,即使它們仍然可以從javascript中的全局對象到達(即它們不能被js-recollected /它們正在使用)並且2)連接osc。到一個連接的增益節點將保持活着? – GameAlchemist

1

我遇到了類似這樣的問題。我發現的是,你需要在兩個stop()和還disconnect()每個振盪器(或其他緩衝生產節點類型)實例或實例將縈繞,可與任何新情況的干擾回放。

相關問題