2012-10-27 186 views
6

當我用Web音頻振盪器(noteOn)成功創建音調時,然後調用它的noteOff函數,後續調用noteOn不會再次播放音調。我似乎不得不創建一個新的振盪器來播放新音符。爲什麼是這樣?爲什麼網絡音頻振盪器只播放一次音符?

var ctx = new webkitAudioContext(); 
var osc = ctx.createOscillator(); 
osc.connect(ctx.destination); 
osc.start(0); // tone is heard (previously noteOn(0)) 

// ... some time later 
osc.stop(0); // tone falls silent (previously noteOff(0)) 

// ... some time later 
osc.start(0); // no effect! (previously noteOn(0)) 

回答

8

簡而言之 - API的設計就是這種方式,並針對這種使用進行了優化。除了爲每個音符創建一個新的振盪器之外,沒有太多選擇。

+0

此答案由FAQ這裏證實: http://updates.html5rocks.com/2012/01/Web-Audio-FAQ – aaaidan

6

使用振盪器池和控制音符打開/關閉與增益節點。像模擬合成器一樣,振盪器一直在游泳池中運行。

儘管可以創建振盪器池,但Web Audio API已經過優化,不值得去做。我以前認爲振盪器池是一個好主意,但事實並非如此。每次需要新筆記時創建一個新的振盪器非常簡單 - 比維護一個池更簡單 - 並且這種持續創建/垃圾收集過程不會對性能造成重大影響。

如果你仔細想想,這是一個非常乾淨的編程模型。不需要維護對象的引用,然後再使用它們。維護狀態較少。

+1

感謝您的解決方案,我可能會這樣做。小心評論爲什麼API是這樣設計的(noteOff有效破壞振盪器)? – aaaidan

+1

noteOn/noteOff是一個可怕的名字,如果這真的是預期的行爲:( – UpTheCreek

+0

是的noteOn和noteOff已被棄用,並將取代開始/停止。 – fisherwebdev

5

如何將頻率更改爲0?它似乎在這個Dataflow + Web Audio API沙箱中工作。 (startstop使用斷開/重新連接模式。)

+0

Hrm ...不是一個壞主意。好的解決方案,謝謝!如果問題不是更多關於「爲什麼」,我會接受! – aaaidan

+0

如果您使用音序器安排音符並希望使用網絡音頻時鐘進行精確計時,則需要爲其創建一個新的振盪器。 – forresto

+1

真的嗎?我認爲頻率可以通過採樣精確的時間進行設置? – aaaidan