音效

GameMaker提供了一系列音频效果,例如混响、延迟、bitcrusher、参数均衡器等。

声音总是通过"总线"播放。GameMaker中的所有声音均通过其主总线播放。

效果应用于总线。GameMaker允许您:

设置音频效果

音频总线

音频效果在"audio bus"上处理。

默认情况下,GameMaker有一条音频总线,即主音频总线,您可以通过内置的audio_bus_mainstruct来访问它。

您在GameMaker中播放的所有音频最终都会在此音频总线上,无论是2D 音频3D 音频还是发射器音频。这指的是所有音频都路由到主总线。

您可以创建自己的总线,以对一些声音应用效果。所有自定义总线均路由至主总线,因此对主总线的参数和效果适用于所有其他总线。

注意音频总线最多可以为其effects数组分配8个效果。将插槽设置​​为未定义以移除效果。

将效果添加到主总线

将效果应用于所有音频的最快方法是将它们添加到主总线:

var _ef_reverb = audio_effect_create(AudioEffectType.Reverb1);
_ef_reverb.size = 0.6;
_ef_reverb.mix = 0.5;
audio_bus_main.effects[0] = _ef_reverb;

此操作首先创建新的音频效果类型AudioEffectType.Reverb1。 然后,通过直接设置返回的AudioEffect Struct的成员来设置其参数。

混响效果的大小设置为0.6,混合值设置为0.5(从0-1可以听到多少效果,类似于lerp)。

然后将效果分配给主音频总线的效果阵列。将效果指定给阵列中的槽可以启用效果。

注意因为效果是从分配的那一刻开始处理的,所以最好先设置效果的参数,然后再将效果分配给效果数组。这将确保不会发生从无效果到可听效果的过渡。

绕过效果

有时您可能想关闭单个效果或关闭总线上的所有效果。通过将效果或总线的旁路设置为true,可以执行此操作:

// Bypassing an effect
audio_bus_main.effects[0].bypass = true;

// Bypassing all effects on a bus
audio_bus_main.bypass = true;

旁路设置为true意味着从总线或效果出来的与进入的相同,输入就是输出。

对于单个效果,这意味着跳过该效果,对于总线,这意味着跳过总线上的所有效果。

将效果应用到音频发射器

默认情况下,音频发射器直接输出到主总线,因此在发射器上播放的音频将在那里结束,并具有与所有其他音频相同的效果。

通过使用audio_bus_create创建新的音频总线并使用audio_emitter_bus将其分配给发射器,可以向音频发射器添加效果:

emitter = audio_emitter_create(); // Emitter is created
emitter_bus = audio_bus_create(); // Bus is created
audio_emitter_bus(emitter, emitter_bus); // Emitter is assigned to bus

将发射器分配给总线将使发射器输出到该总线。可以将任意数量的发射器指定给总线。

使用audio_bus_create创建的总线上的任何音频输出仍然在GameMaker的主音频总线上结束。

这意味着您可以将延迟效果应用于在发射器上播放的所有声音,并在主音频总线上应用混响效果。在发射器上播放的音频由分配给它的音频总线处理,因此它将与来自发射器总线的延迟效果和来自主总线的混响效果一起被听到。直接在主总线上播放的音频将应用混响效果。

要获取分配给发射器的音频总线,请使用 audio_emitter_get_bus

注意如前所述,音频只能在不同于主总线的总线上通过在发射器上播放来处理(使用audio_play_sound_on)。

音效的多重赋值

可以将 audio_effect_create 返回的单个音频效果结构分配给多个效果槽 (在同一总线上或在不同的总线上): 

ef_lpf = audio_effect_create(AudioEffectType.LPF2, {cutoff: 300, q: 1.5});

bus_1.effects[0] = ef_lpf;
bus_1.effects[4] = ef_lpf;
bus_2.effects[0] = ef_lpf;

对于这些赋值中的每一个,都会有一个新的效果被实例化。 您可以将其与对象和实例进行比较。结构返回给audio_effect_create的一个"对象",并且每个赋值都会创建它的一个新的"实例"。"实例"是指为其分配的效果槽实际处理音频的对象。每个效果槽都有自己的效果"实例"。

当您对此处的 ef_lpf 结构的任何变量进行更改时,效果的参数将在 bus_1.effects[0]bus_1.effects[4]bus_2.effects[0] 上相应地更改。

平台限制

当以 HTML5 为目标时,音频总线和特效功能在以下情况下将受到限制:

在这些情况下,仍然可以使用音频总线和效果函数、枚举和结构,而不会产生 GML 错误,但它们大多不会有声音效果(音频总线增益和总线布线除外)。

代码参考

  1. audio_bus_create
  2. audio_bus_main
  3. audio_effect_create
  4. audio_emitter_bus
  5. audio_emitter_get_bus
  6. AudioBus 结构
  7. AudioEffect 结构
  8. AudioEffectType 枚举
  9. audio_bus_get_emitters
  10. AudioLFOType 枚举
  11. audio_bus_clear_emitters