使用Web Audio时,您可以将创建的所有声音连接到一个全局创建的gainNode
,并使用该节点具有“主音量”属性。当您希望能够动态更改主音量并希望它立即影响所有声音时,这非常方便。
现在,我正试图实现同样的目标,但对于playbackRate
。供参考:这将是一个网页游戏,你可以使用电源来减慢时间,这也应该放慢所有的音乐和声音。
我创建的每个声音都是一个AudioBufferSourceNode
,它链接到一个处理节点链。现在我知道AudioBufferSourceNode
本身有一个playbackRate
属性可以更改。这很好,但它需要我缓存我创建的所有AudioBufferSourceNodes
,如果我想改变一个“全局播放速率”,如果我能用与全局gainNode
相同的方法来实现这一点,那就太完美了,但我找不到这样做的方法。
实现这样一个功能的正确方法是什么?你会建议缓存所有创建的AudioBufferSourceNodes
(可能有数千个)并循环它们吗?这是我在HTML5 Audio中使用的方法,但对于更高级的Web Audio来说,这似乎很麻烦。
如果您想了解更多信息,请询问,我将更新问题!
2条答案
按热度按时间x33g5p2x1#
你不能直接这样做。有些源节点没有播放速率控制-比如实时输入。在这种情况下,你最好按照你的建议做-保留一个活动声音列表以循环播放。
你可以使用一种粒度方法来重新采样和音高弯曲-就像我的音频输入效果演示(https://webaudiodemos.appspot.com/input/)中的“音高弯曲”代码一样。
pgky5nke2#
1.将每个
AudioBufferSourceNode
的playbackRate
参数设置为零。1.创建
ConstantSourceNode
。1.将常量节点连接到每个
AudioBufferSourceNode
的playbackRate
参数。1.引用常量节点的
start()
方法。1.使用常量节点的
offset
参数同时更改所有音频缓冲源的播放速率。然而,根据音频图中存在的其他节点,您可能需要使恒定节点的影响超过样本播放速率,以实现所需的效果。例如,如果你有一个
BiquadFilterNode
,那么你需要将常量节点连接到增益节点,然后将该增益节点的输出连接到滤波器的频率参数,这样当播放速率为则滤波器的截止频率相应地减半,并且一切保持一致。然而,在这方面,即使你实现了所有这些架构,当播放速率改变时,音频的音高仍然会改变,因为这就是改变播放速率的本质。如果你不希望这种情况发生,那么你就有问题了。以两倍的速度播放样本意味着音频样本中存在的每个频率的两倍周期每秒将到达扬声器,占用相同时间的两倍的周期意味着频率加倍。这就是物理学的工作原理。现代时间拉伸技术允许独立于频率操纵时间,这比仅仅以不同的速率泵送样本要复杂得多。相反,这种算法依赖于对样本数据本身的复杂编辑。基本上你要做的是:
1.将每个样本分成一系列短块。
1.对每个块进行傅立叶分析,以确定每个块中存在哪些频率以及每个频率的振幅。
1.基于在比原始块的持续时间相应地更长或更短的时间段内回放这些频率混合中的每一个来合成全新的样本。
编码的能力,以执行这种“再合成”在网络上听起来像一个很好的应用程序的一个潜在的音频工作。