2015-12-21 49 views
1

爲了支持複音模式,我需要克隆源AudioNodes。這樣我就可以爲每個音符指定一個單獨的節點,並與其他音符一起播放。WebAudio:克隆源AudioNode

我想以通用的方式做到這一點,以便無論使用哪個源節點,甚至是自定義節點,都可以克隆它們。我已經檢查了規範,但沒有發現克隆或複製音頻節點的參考。

因爲這些對象通常都有本地部分,所以我猜想使用標準的JavaScript克隆節點對象是行不通的。

你有什麼建議?也許這是規範中缺少的功能?

回答

2

的確,您必須手動複製所需的節點。然而,我認爲考慮你(可能)想要複製的東西是一個相當小的工作。

例如,採取一個AudioBufferSourceNode。要複製其中之一,您只需創建一個新的AudioBufferSourceNode,然後爲您正在複製的緩衝區分配相同的緩衝區。既然你在做一個復調音樂,我會繼續前進,猜測你希望在新節點上有一個不同的頻率和失諧值,這樣可能不應該被複制。另外,如果你循環你的緩衝區,你必須複製循環屬性(loop,loopStart,loopEnd)。同樣,如果你正在處理一個振盪器節點作爲源,那麼你可能只想複製振盪器類型,因爲頻率和失諧最有可能不應該是相同的。

所以你看到了我要去的地方 - 你應該能夠掀起一個你自己的小型圖書館來複制你感興趣的節點。我懷疑複製節點的本地API方法會曾經成爲規範的一部分(但這只是我個人的猜測,所以如果你認爲這是一個好主意,你可以在https://github.com/webaudio/web-audio-api/issues做出功能請求)。

+0

謝謝!實際上,經過一番思考後,我發現我必須複製整個圖表,每個語音一次 - 所以我需要克隆每個節點及其連接。而這個問題更具哲理性:如果將來有更多的節點,我的代碼就會過時,等等。 –

+0

看不出爲什麼你需要克隆整個圖。只需將新克隆的節點連接到與原始節點相同的位置即可。 –

+0

@RaymondToy我有信封控制(ADSR),它不僅可以影響音頻源,還可以影響濾波器截止頻率等其他效果。包絡值取決於每個noteOn/noteOff事件,這對每個語音都是不同的,因此每個濾波器節點將根據語音具有不同的截止值。 –