Quick answer: Use player.pitch_scale for per-sound pitch. Bus effects (PitchShift on a shared bus) affect everything routed through that bus — route only specific sounds to a dedicated bus.
A slow-motion power-up lowers sound pitch. You add an AudioEffectPitchShift to the Master bus. Now every sound — music, voice, ambient — is pitch-shifted. The effect was supposed to apply only to gameplay SFX.
Bus vs Player Pitch
Two ways to pitch in Godot:
- player.pitch_scale — per-player. Affects only that specific AudioStreamPlayer.
- Bus PitchShift effect — affects every player routed through that bus.
If you apply PitchShift to Master, everything pitches. To pitch only specific sounds, either use per-player scale or create a dedicated bus.
Per-Player Pitch
$SfxPlayer.pitch_scale = 0.7 # lower pitch on this player only
$SfxPlayer.play()
# Music player untouched, plays at normal pitch
$MusicPlayer.play()
Each player has its own pitch_scale. Simple and isolated.
Dedicated Bus for Group Effects
If you want all SFX pitched together:
- Audio bus layout → add a “SFX” bus.
- Add AudioEffectPitchShift to the SFX bus.
- Route gameplay AudioStreamPlayers to the SFX bus (bus property).
- Music players stay on Master or a Music bus — unaffected.
# Pitch only SFX bus at runtime
var bus_idx = AudioServer.get_bus_index("SFX")
var effect = AudioServer.get_bus_effect(bus_idx, 0) as AudioEffectPitchShift
effect.pitch_scale = 0.7
Slow-Mo Pattern
For a slow-motion effect:
- Set Engine.time_scale = 0.5 for visuals and physics.
- Adjust SFX bus pitch to 0.7–0.8 (matches slow-mo feel without being too low).
- Leave Music bus untouched so soundtrack continues normally — emphasizes the contrast.
Verifying
Trigger your slow-mo. Music should play normally; SFX should be slower and pitched down. If everything slows together, your effect is on Master — move it.
“Pitch goes on the bus or the player. Decide which scope; route accordingly.”
Music, Voice, and SFX should always live on separate buses — future effects target the right thing automatically.