2015-12-21 43 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事件,这对每个语音都是不同的,因此每个滤波器节点将根据语音具有不同的截止值。 –