Wwise 2017.1中引入了3D 总线和总线辅助发送,这让模块化地使用声音引擎成为了可能,也让Wwise做到了之前从未想过的事情。我准备带你们跳出使用Wwise创作游戏音频的惯例 ,去探寻一下将Wwise用作程序化音频(procedural audio)设计平台的可能性。我们会深入研究在信号通路中创建反馈循环的可能性及其结果。我们会从一个简单的例子入手,解释一下概念,并带你实现一个完全由Wwise总线创造的完整混响效果。建议先下载我的Wwise工程,方便边看边操作,但当然不下载也是可以的。
混音器层级结构中的反馈
如果你创建辅助发送,将一个总线发送到它本身的下级总线,就可以在Wwise中创建反馈循环。Wwise将从总线层级的最底层开始混音,逐渐往上到达主音频总线。执行混音通路过程中,当声音引擎遇到一条总线输出到自身下级时,实际上这条总线在当前通道中已经进行了混音。被传递到下级总线的音频数据块需要等到下次执行混音通路时,才能再进行混音并进入父级总线;这条反馈通路会产生一帧的延迟,对于标准512采样缓冲区来说,48KHz下,一帧就是10.6毫秒。
为了演示,我们可以播放一个扫频正弦波,并输送至带有自身反馈的总线。在Advance Profiler(高级性能分析器)的Voices Graph(声部图)中,我们会看到一条红色虚线,鼠标悬停其上时会显示延时毫秒数。
当聆听扫频正弦波时,我们会听到独特的“拍音”。这是因为新的扫频正弦波与之前版本叠加(混音)时,两个信号频率不同;这会导致振幅周期性地增强或减弱。
小心!
在Wwise中创建反馈循环时有几个重要的事情需要注意——这些并非其设计本意。第一个问题是,我们不希望构建的系统不稳定。当反馈循环导致完全正增益时就会如此,它会产生非常巨大的噪声,会损坏扬声器甚至你的耳朵!请为所有返回到自身的辅助发送设置负增益。你会注意到“Interference_Patterns”总线发送到辅助总线时有-3dB的增益。如果是正数,那结果肯定不会令人愉快。
在实验时,我不止一次构建出不稳定的系统。结果通常是很大的静电声,之后就是沉寂。有时声音会缓慢增大,就像音乐会的麦克风反馈一样,而其它时候声音会瞬间爆发。声音引擎其实是在努力播放一个无限大的声音信号,但结果是什么也没播出来!
另一个问题就是当反馈循环减弱到听不到时,声音引擎中没有能清理它们的机制。即使是在稳定的反馈系统中,音量将逐渐接近零,但理论上永远达不到零。声音引擎会不断将无声(或接近无声的)缓冲区混音到其自身,并且没有机制可以查看缓冲区的实际内容来确定它是否仍在发声。
为了解决该问题,我们必须显示地断开发送——可以移除该辅助发送(点击并删除)或将发送音量调整到-96dB。
在Wwise中创建反馈延迟网络混响
扫频正弦波的自干涉是很有趣,但我们能不能做到些更酷的事?我们能不能通过将总线层级和辅助发送拼起来,在Wwise中设计出一个功能完整的混响效果器?是的!嗯…算是吧。我会解释一下,算是有点作弊,但只有一点点。我会向你展示在Wwise中如何不用混响效果器创建混响效果。希望在过程中我们都能学到些东西。
反馈延迟网络(FDN)是一种混响,它由多条延迟线组成。每条延迟线的输出都在经过增益之后,再返回至所有延迟线的输入端。示意图如下:
在该示例中,我们有三条延迟线(在上图中标注为z-Mi)和一个“qxy”值的矩阵,该值会决定延迟线X的输出将增益多少,再返回至延迟线Y的输入端。
为每个延迟线的时长(Mi)和增益矩阵设置数值时,会有多种考虑,如果你想详细了解FDN,可以在dsprelated.com阅读相关材料。我在Wwise工程中实现的FDN是比较基本的,尽管如此,用来学习基础概念还是很有效的。
FDN总线结构
在Wwise中,我为FDN创建了一条输出总线和一条输入总线。在输出总线下,我为5条延迟线创建了5条辅助总线。每条延迟线总线(如DL0、 DL1…)有四个辅助发送,发送到每条延迟线,以此形成FDN的反馈循环。每条总线最多可以有4个用户定义的发送,但总线是不能发送给自己的,这就是为什么我决定一共要五条延迟线。输入总线(FDN_Input)有四条发送总线,输出到DL0到DL3总线,依然是因为我们同时只能向四条总线发送。第5个延迟线(DL4)只会收到其他延迟线的发送,而不会到接收原始输入信号。最终在Wwise中得到的总线结构会比较类似一个经典的FDN,如上图所示。
延迟线
我想让每条延迟线的延时都不同,而不都遵守声音引擎默认的10.6 ms。所以我小小地做弊了一下,给每条“延迟线”总线都添加了延迟效果。为了让FDN混响听起来更自然,延迟线的时长最好“互为质数”,即它们的最大公约数是1。我迅速Google了一个质数表,选择了其中的5个,减去512次采样的时间(就是前面解释的“内置”延迟),然后将它们从采样转化为秒数。这就是我在Wwise延迟效果器的长度参数中输入的数字。起作用了吗?等下我会讲到详细情况。
没人能说清Matirx是什么……
接下来,必须要创建一个增益的“矩阵”,定义一条延迟线的输出有多少会返回到其它延迟线的输入端。在我的FDN中,反馈矩阵是由辅助输出总线增益(都设为-9dB)和该参数上的RTPC(不同输出的RTPC会不同)一起定义的。理想状态下,这个矩阵会尽可能减少复合信号中的相关性,从而生成平滑的输出,让Ringing Artifect(振铃负效应)最小化。不幸的是,常用的去相关矩阵都涉及负增益(比如Householder矩阵),而且Wwise中无法进行相位反转。最后我定义了一个叫“Feedback_Vol”的RTPC,对于每条延迟线总线上四个辅助发送组的输出音量,都进行了略微不同的调制。以下的截图就是我的曲线。请注意“Feedback_Vol”的0是映射到-200dB的,这样能完全断开发送并终止反馈循环。(当我几次偶然引起正反馈时,把它拉到0都发挥了作用!)
RTPC标签页中,每条延迟线总线的曲线顺序都作了随机区别。随着“Feedback_Vol”参数减少,得到的回声也更稀少,并且衰减更快。将参数增加,就会得到更密集的混响,而且衰减也很慢。
阻尼
最后,为了让高频衰减得比低频快(真实房间中的物理性质),我给每条总线的效果链都添加了低通滤波器,并将一个名为“Lowpass_Freq”的RTPC 连接到了截止值上。在Wwise的未来版本中,我们会有低通滤波器直接内置在每条混音总线中,包括辅助发送总线。但在此之前,启用只有一个频段的Wwise Parametric EQ(参数均衡器)就够了。
现在是时候播放一段声音来听听我们的劳动成果了。如果在Advanced Profiler中进行 Capture,我们就能得到最终的声部图。好乱!
好吧,听起来如何?
对于一个使用虚拟备件,靠小把戏拼起来的混响效果来说,听起来还不赖。确实,有时它会有点机械化和共鸣感,但我管这个叫数字lo-fi(低保真)的魅力。我本来希望用质数这种聪明的办法能得到更平滑的输出,但有次我想确认一下浮点延迟时间经过精确转化得到的采样个数是质数,结果发现Wwise延迟效果器内部会将延迟长度修正为4的倍数!确实,这样能允许用SIMD指令进行无比高效的处理,但这就破坏了我延迟长度互为质数的美梦。我觉得缺乏合适的去相关矩阵对于声音质量也是严重的损害。
我猜想很多人都是在手机上看这篇文章,无法下载Wwise工程,所以下面是一些可以试听的音频示例。在每个示例中我都改变了“Feedback_Vol”和“Lowpass_Freq”游戏参数。
“Hello”
“Hey”
打击乐循环
正弦扫频
喊叫
不管怎样,我鼓励你试一试。试试更改延迟长度、反馈增益等等。但是,请小心,不稳定情况是很容易出现的!把“Feedback_Vol”参数推到0就是你的“应急开关”。这样做会切断所有反馈并断开发送。
反思一下……
从某种角度来说,在Wwise中允许创建反馈循环就好比允许用户举枪打自己的脚。就像解释的那样,确实有很多东西可能出问题,而且确实也没有那么多创建循环的现实案例。但是,在Wwise中将总线作为完全的拼接模块可以提供很多诱人的机会,而我们作为音频宅,是不可能错过这种机会的。此外,允许反馈循环也符合我们让Wwise更开放并减少专用性限制的目标。我们不想制定一套简单的做法,而是想要打开创意和创新的大门。我希望这个功能会有用,也期待看到音频社区中的各位能用它创作出什么。
评论