[Godot] Sound Design with AudioBus Effects: Reverb, Compressor, and EQ

Created: 2026-02-08Last updated: 2026-07-08

How to shape acoustic space by applying reverb, compressor, EQ, and other effects to Godot's AudioBus. Covers the roles of the three main effects, processing order (chains), dynamically applying reverb when entering a cave, and settings by use case, with code and diagrams.

Once you can play music and sound effects, new wants show up. You want sound to echo in caves, you want footsteps audible next to deafening explosions, you want a voice that sounds like it's coming through a radio. Shaping that sonic texture is the job of effects applied to Audio Buses.

Adding an effect to a bus applies it to every sound passing through that bus. Building on the bus setup from Audio management basics, this article covers the main effects (reverb, compressor, EQ), processing order, and an implementation that dynamically applies reverb when the player enters a cave.

A sound design image of shaping sonic texture per space, where a clean waveform passes through the knobs of an effects rack and becomes a thicker waveform

What You'll Learn

  • How effects make the same source sound different in different spaces
  • The three staple effects: Reverb, Compressor (evening out volume), and EQ (frequency shaping)
  • How the processing order (chain) changes the result
  • Dynamic control that adds reverb when entering a cave (add_bus_effect + is_instance_of + Tween)
  • A settings reference by situation

Sponsored

What Effects Can Do

At heart, effects make the same audio source sound appropriate to the space it's in . One footstep sample echoes in a cave, muffles underwater, and rings out cleanly outdoors. Effects create that difference.

A diagram showing that the same speaker's sound is heard differently in three spaces: a cave (echoing), underwater (muffled), and outdoors (clean)

The Godot way is to apply this to a bus as a group rather than to each individual source . Put one reverb on the SFX bus and every sound effect passing through it echoes at once. That's why splitting buses by purpose (BGM / SFX / Voice / Ambient) is the prerequisite for making effects useful.

The Three Staples: Reverb, Compressor, and EQ

Of the many effects available, these three come first. Their roles are clearly distinct, so let's take them in order.

AudioEffectReverb (Creating Space Through Reverberation)

Cave echo, the majestic ring of a cathedral. This is the go-to effect for conveying the size and material of a space through sound. In short, it defines how long sound reflects and lingers.

A reverb diagram contrasting a small room with a low room_size where reflections are short and settle quickly, and a large space with a high value where reflections trail on
PropertyDescriptionTypical range
room_sizeSize of the space (length of reverberation)0.2 (small room) to 0.9 (cathedral)
dampingHigh-frequency decay (roundness)0.3 to 0.8
wetHow much of the effected signal is mixed in0.1 to 0.5
dryHow much of the original signal is mixed in0.5 to 1.0

wet in particular is the "how strong" knob. In the dynamic control below, we animate wet to bring reverb in and out.

AudioEffectCompressor (Evening Out Volume)

Explosions are deafening while footsteps are too quiet to hear. That classic game audio problem is what a compressor solves. It holds down loud sounds and relatively lifts quiet ones to even out the dynamics.

A diagram contrasting the large volume gap between an explosion and footsteps before compression with their evened-out levels after
PropertyDescriptionTypical range
thresholdLevel where compression begins-20 to -10 dB
ratioStrength of compression2:1 to 4:1
attack_usHow fast it responds5000 to 20000 μs
gainMakeup gain after compression0 to 6 dB

Applied lightly to the SFX bus it makes all sound effects easier to hear, and applied to the Master bus it raises overall loudness.

AudioEffectEQ (Balancing Frequencies)

This effect adjusts volume per frequency band across lows, mids, and highs. You can add low end for impact, or cut highs for a muffled underwater sound. AudioEffectEQ6 / EQ10 / EQ21 are available, where the number is the count of bands (knobs).

An EQ diagram showing that lowering only the high fader among low, mid, and high produces a muffled underwater sound
# Boosting the low end with EQ10 (band 0 = 31Hz ... band 9 = 16kHz)
var eq := AudioEffectEQ10.new()
eq.set_band_gain_db(0, 6.0)   # +6dB at 31Hz (add deep bass)
eq.set_band_gain_db(1, 4.0)   # +4dB at 62Hz
# For an underwater feel, instead pull the high bands down into negative values
Sponsored

Other Commonly Used Effects

Beyond the big three, plenty of others help with texture.

EffectUseMain properties
AudioEffectDelayEchotap1_delay_ms, feedback_level_db
AudioEffectChorusThickness and widthvoice_count, voice_depth_ms
AudioEffectLimiterPreventing clipping (setting a ceiling)ceiling_db
AudioEffectDistortionDistortion, radio effectmode, drive, pre_gain

Applying AudioEffectDistortion lightly in MODE_OVERDRIVE and keeping only the midrange with EQ gets you a voice over a radio. A limiter sets a "no louder than this" ceiling, and the standard placement is last on the Master bus to prevent clipping.

Effect Processing Order (Chains)

You aren't limited to one effect. You can stack several on a bus, and when you do, order matters. Effects within a bus are processed in series from top to bottom , so rearranging them changes the result.

A pipeline diagram of sound processed in series through EQ, Compressor, Reverb, and Limiter. Processing runs top to bottom and order changes the result

For the Master bus in particular, the baseline order is:

  1. EQ : first balance the overall frequency content
  2. Compressor : even out the levels
  3. Limiter : finally set a ceiling to prevent clipping (ceiling_db around -0.5)

The mental shortcut is "shape, then even out, then cap." Putting reverb before the compressor crushes the reverb tail, so spatial effects (Reverb) naturally go after level effects (Compressor).

tips: Every effect adds CPU cost. If one effect on a bus does the job, don't apply it per source. Keeping it to the minimum is the key to staying light.

Sponsored

Hands-On: Dynamically Adding Reverb When Entering a Cave

Effects aren't limited to static editor setup. You can add, remove, and modulate them during gameplay . Let's build the classic version: when the player enters a cave area, reverb is applied to SFX, and it's removed on exit. This applies broadly, from dungeon RPG caves to horror basements to flooded areas in a Metroidvania.

A diagram showing that as the player walks from outdoors into a cave, the wet value is raised gradually with a Tween to strengthen the reverb

Detect area entry and exit with Area2D's body_entered / body_exited, and call the following functions from there.

# Add reverb to the SFX bus on entering the cave
func enter_cave() -> void:
    var sfx_idx := AudioServer.get_bus_index("SFX")
    var reverb := AudioEffectReverb.new()
    reverb.room_size = 0.8
    reverb.wet = 0.0                              # Start at 0, raise it with a Tween below
    AudioServer.add_bus_effect(sfx_idx, reverb)   # Append to the end of the bus
    transition_wet(0.3, 1.0)                       # Bring the reverb in over 1 second

# Remove just the reverb on leaving the cave
func exit_cave() -> void:
    var sfx_idx := AudioServer.get_bus_index("SFX")
    remove_effect_by_type(sfx_idx, AudioEffectReverb)

# Change wet smoothly with a Tween (sudden reverb sounds unnatural)
func transition_wet(target: float, duration: float) -> void:
    var sfx_idx := AudioServer.get_bus_index("SFX")
    var reverb := find_effect_by_type(sfx_idx, AudioEffectReverb)
    if reverb:
        create_tween().tween_property(reverb, "wet", target, duration)

# Find an effect of a given type by scanning (avoids hardcoded indices)
func find_effect_by_type(bus_idx: int, effect_type) -> AudioEffect:
    for i in range(AudioServer.get_bus_effect_count(bus_idx)):
        var effect := AudioServer.get_bus_effect(bus_idx, i)
        # is_instance_of compares against a type held in a variable (the is operator only takes type literals)
        if is_instance_of(effect, effect_type):
            return effect
    return null

func remove_effect_by_type(bus_idx: int, effect_type) -> void:
    for i in range(AudioServer.get_bus_effect_count(bus_idx) - 1, -1, -1):
        if is_instance_of(AudioServer.get_bus_effect(bus_idx, i), effect_type):
            AudioServer.remove_bus_effect(bus_idx, i)
            return

There are two points to take away.

  • Remove by type, not by index : hardcoding a number in remove_bus_effect(idx, number) shifts the moment another effect is added later, and you end up deleting the wrong one. Searching for the target type (AudioEffectReverb) with is_instance_of() and removing that is safe. Since the is operator only accepts type literals , passing a type as a variable requires is_instance_of().
  • Transition gradually with Tween : jumping wet straight to 0.3 slams reverb on the instant you cross the boundary, which feels unnatural. Raising it over about a second gives the sense of walking into the cave.
Sponsored

Effect Settings by Use Case

A reference for when you're unsure which effect a scene needs. Start with these values and tune by ear.

SituationEffects to useSetting notes
Cave, undergroundReverbroom_size: 0.8 / wet: 0.3 / damping: 0.4
UnderwaterEQ + ReverbCut the highs (above 4kHz) heavily, reverb on the strong side
Outdoors, grasslandReverb (light)room_size: 0.3 / wet: 0.1
Radio, commsDistortion + EQMODE_OVERDRIVE, keep only the midrange
Boss fight intensityCompressorRaise loudness on the Master bus
Menu screenEQ + LimiterPull the music back so UI sounds stand out

Bonus: Good to Know for Later

  • Fade bus volume with tween_method : effect properties like wet can be animated with tween_property, but overall bus volume (set_bus_volume_db) goes through a method, so use create_tween().tween_method(func(db): AudioServer.set_bus_volume_db(idx, db), current_db, target_db, seconds) for a smooth fade.
  • Solo and mute are your debugging friends : AudioServer.set_bus_solo(idx, true) plays only one bus, and set_bus_mute() silences one. Handy for answering "is this reverb actually doing anything?"
  • Don't forget to save your bus setup : save the buses and effects you built to audio_bus_layout.tres and set it in Project Settings (see the basics article).
  • Spatial sound belongs to 3D audio : footsteps that attenuate with distance and ambience that changes with position are 3D audio and spatial sound territory. Changing musical mood by area starts with adaptive music.

Summary

  • Effects go on buses : one effect applies to every sound passing through that bus
  • The big three : Reverb (spatial reverberation), Compressor (evening out volume), EQ (frequency balance)
  • Processing order is "shape, even out, cap", meaning EQ, Compressor, Limiter as the baseline
  • Dynamic control adds and removes with add_bus_effect(), finds the target with is_instance_of() when removing, and eases wet with Tween

Start by adding one reverb to the SFX bus and playing with room_size and wet. Your sound effects should immediately feel much more "of that place." Build from there with dynamic cave reverb and underwater EQ, and your game world gains real dimension.

Further Reading