提到音频插件的开发,许多声音设计师会认为这是 程序员专属的黑魔法 ,因为通常这项工作需要参与者能够编写代码,同时要具备扎实的数学、物理及数字信号处理方面的知识。而对于使用别人提供的音频工具的声音设计师来说,这都不是工作的必备技能,因此他们常常倾向于与此类 过于技术的话题 保持距离。

当声音设计师在别人的项目中听到了某种 Wwise 没有提供过的 DSP 效果时,他们非常有可能能够迅速理解其工作原理,并有能力利用熟悉的工具做出技术原型,甚至实现一模一样的交互表现。然而,要么由于性能方面的限制,要么由于此类工具的产出物无法以插件形式部署到创作工具及引擎中去,导致声音设计师的很多想法都止步于原型阶段而未能对实际游戏产生贡献。

幸运的是,通过使用 PureData Heavy ,声音设计师现在已经有机会独立创造出具备良好性能、可以在创作工具中使用且能够在实际游戏中运行的效果器及音频源插件。

一点点科普

什么是PureData?

PureData( PD )是由美国软件工程师 Miller Puckette 于上世纪 90 年代开发的视觉化编程语言,主要用于计算机音乐及多媒体艺术的创作。由于 PD 是开源项目,自发布以来已经积累了庞大的开发者基础,并持续有新的扩展功能被添加(现在你甚至可以在 PD 里加载 VST 插件 …… )。

包含 PD 代码的文件被称为 Patch PD 支持创建 SubPatch 所以使用者可以通过抽象来创建功能复杂的 PD 项目。

由于本文不是 PD 入门教程,需要了解更多的读者请前往 https://puredata.info/

可以看作是PD版本的“Hello World” (国内视频通道)

从上面的视频中可以看到 PD 的使用方式与模块化合成器十分相似——通过连接不同的 Object (模块)来实现信号系统的设计;通过调节参数与系统进行实时交互。

我们可以将 PD 看作是声音设计师的 画图环境 ,让他们可以使用自己熟悉的设计语言来设计工具的原型,并有机会在之后 投产

image004 就像用你小时候的玩具造点“能用的”东西一样

什么是Heavy?

Heavy是由 Enzien Audio 开发的针对 PD Patch 的编译器,可将声音设计师制作的 PD Patch 转换成 C/C++ 代码。这使得声音设计师只需在 PD 环境下工作就能得到可运行于目标平台的代码,而无需自己编写。

我们可以将 Heavy 看作是依据声音设计师提供的工具设计图纸进行生产的自动化车间。

那么我们画图和建造工厂后生产的产品能做什么呢?

PD+Heavy生产的插件可以做什么

1. 根据声音设计师在 PD Patch 中的设计,进行实时的 DSP 运算;

2. 支持音频信号的输入输出,若源 Patch 中包含音频输入物件 ——adc~ 则生成效果器插件,若源 patch 中不包含 adc~ 则生成源插件(如 Wwise SoundSeed Wind Wwise SynthOne );

3. 支持控制参数的输入输出,既可以接受来自 Wwise SoundEngine Game Parameter 控制,也可以向 Game Parameter 发送数据(如作为 LFO 使用);

4. 支持 UI 事件的输入输出(仅限 Unity )。

在了解了我们作为声音设计师的 新技术权力 之后,是时候设计并生产一款产品了!

设定目标—Sample Divider

image008 就像音频版本的像素化效果

Sample Divider效果通常包含在 Bitcrusher 这样的失真插件当中,我将本文的目标设定为生产 Sample Divider 并投入实际使用。

设定这样的目标的原因很简单 ——1 Wwise 没提供 Sample Divider 2 Sample Divider 实际上很实用,尤其在 Cyberpunk 回潮的当下(想象一下如果要实现类似《Nier: Automata》中病毒入侵时以及《 Titan Fall2 》中 Titan 受创时大量出现的声音故障表现,怎么可以没有 Sample Divider !)。

无痛DSP

在开始 绘制 作为 蓝图 PD Patch 之前,我们要先了解 Sample Divider 的工作原理。

Sample Divider是通过以低于输入信号采样率的频率对输入信号进行重采样,以 较低的品质进行输出 来实现对原始信号的扭曲处理的。

下图是对我们之后用到的核心元件 ——Sample and hold (简写为 S/H )模块功能的解释,来自《电子音乐理论与技术》,作者就是 PD 的作者本人。

S/H模块运作原理

如上图所示,类似正弦波的信号被送入 S/H 模块的左输入点,作为 “Sample & Hold (采样及保持) 动作触发 时钟 的锯齿波信号被送入右边的输入点,当锯齿波的值从最高处快速下落至 0 点时便会触发 S/H 物件对信号进行采样的动作,而其余时间则保持已采集的数值。这样,当锯齿波频率越接近输入信号的采样率,则输出信号越接近输入信号,也就是 越高清 ,反之则包含更多失真,也就是越 像素化

下面是一段 Sample and hold 模块在 VCVRack (我以此类比真实的物理合成器)中工作的演示。

用示波器画台阶 ( 国内视频通道

在了解了原理之后我们便可开始为生产插件准备图纸( Patch )了。

与单独使用 PD 情况不同的是,为了 Patch 能够被 Heavy 正常编译,我们只能使用 PD 当中的部分物件,否则编译时会报错。我将在本文末尾提供不可使用的 PD 物件列表。

为了让插件开放参数给目标平台(本文中是 Wwise ),我们需要按下图的格式声明参数:在 PD 中按 Ctrl+1 创建物件,填入 "r”—— 代表该物件从外部接受信息; "SampleRateDivisionL"—— 在插件界面上显示的参数名称; @hv_param—— 代表该物件将被 Heavy 编译成参数接口; 4 24000 24000 分别为参数的最小值、最大值和默认值。

1. 为了对输入信号的左右声道进行不同的处理,增加不对称性,我在此为左右声道各创建一个参数。 phasor~ 物件为用作 S/H 模块时钟的锯齿波振荡器, samphold~ 物件就是 S/H 模块, dac~ 物件为音频信号输出的地方。

Note :此 Patch adc~ 代表信号输入,当 Patch 当中存在 adc~ 时, Heavy 将会生成用于构建效果器插件的代码;若没有 adc~ 物件,则 Heavy 会生成用于构建音频源插件的代码。

2. 接下来测试 patch 的运作。

Note :我添加了控制采样频率的 hslider 物件,由于该物件在编译成插件后将不起作用,因此测试完之后可以删除。

3. 最后将 Patch 保存到 J:\HeavyAudioPlayground\bitcrusher.pd

Note :这个地址大家可随意选择,注意之后还会用到。

现在 图纸 已经画好了,下一篇将介绍我们的 自动化车间( Heavy 的建造,产品(插件)的生产以及部署!

敬请期待!

反馈的乐趣

Wwise 2017.1中引入了3D 总线和总线辅助发送,这让模块化地使用声音引擎成为了可能,也让Wwise做到了之前从未想过的事情。我准备带你们跳出使用Wwise创作游戏音频的惯例...

23.11.2017 - 作者:内森 哈里斯(NATHAN HARRIS)

Wwise 2018.1 正式发布了!彩色外观和更多…

Wwise 2018.1 发布了,您可以从 Wwise Launcher 中下载。 全新的彩色 UI 选项自透露以来已经出了不少风头!所以,虽然我们原本想写篇博客来讲讲 UI...

6.8.2018 - 作者:Audiokinetic (音频动能)

关于局部线性与联动控制在Wwise中的应用探讨

引言...

18.11.2019 - 作者:王润琦

游戏和影视行业在音频制作上的一些区别 – 第 1 部分

如果你是一名影视行业的音频工作者,那你有没有想过换作游戏行业会是什么样?当然,这个问题也可以反过来问。在过去 10...

21.7.2020 - 作者:杰斯帕.安卡菲尔德(JESPER ANKARFELDT)

利用 Wwise 设计基于循环的汽车发动机声音 | 第 2 部分

欢迎继续阅读本系列博文,了解如何在 Wwise 中配置和设计基于循环的汽车发动机声音。在第 1...

22.2.2022 - 作者:阿托•科伊维斯托 (Arto Koivisto)

早期采用者对 Strata 多音轨 SFX 库的评价

Strata 的诞生 在过去的四五十年里,SFX 库创作者都在以大致相同的方式制作和分发内容:录制、编排、混音并渲染构建的声音,然后将基于主题的数据包出售给用户。如果我们排除一些例外情况 – 比如...

2.12.2022 - 作者:西蒙.阿什比(Simon Ashby)