Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Play and mix audio in Godot 4.x: AudioStreamPlayer (2D/3D variants), audio buses with volume/mute and effects, music vs SFX routing, db/linear volume, and precise sync-to-beat playback timing. Use when playing sounds or music in a Godot project, routing AudioStreamPlayer nodes to buses, adjusting bus volume via AudioServer, or syncing gameplay to the beat.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-20 | ✓→✗ | ▼ Worse | 36% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 79% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 15% | 0% |
Play SFX and music, route them through buses, control volume in decibels, and time gameplay to the beat. Targets Godot 4.3+.
adjusting volume/mute from code, adding bus effects (reverb, compressor), positional 3D audio, or syncing events to music.
When not to use: engine-agnostic audio design (adaptive music structure, mixing philosophy, ducking patterns) → audio-design; importing/encoding assets outside Godot.
AudioStreamPlayer — non-positional (music, UI, global SFX).AudioStreamPlayer2D / AudioStreamPlayer3D — positional; volume/pan from distance.AudioStream to stream (.ogg for music/loops, .wav for short SFX)and play(). Set autoplay for music that starts with the scene.
bus to a named bus (e.g. "Music", "SFX").Define buses in the Audio panel (bottom dock); each can have volume, mute, solo, and effects.
0 dB = unchanged,-80 dB ≈ silent. Convert with linear_to_db/db_to_linear.
AudioServer by bus index.gdscript@onready var sfx: AudioStreamPlayer = $Sfx # stream assigned in the editor func play_jump() -> void: sfx.pitch_scale = randf_range(0.95, 1.05) # slight variation avoids fatigue sfx.play() # For many overlapping copies, use an AudioStreamPlayer with an # AudioStreamPolyphonic stream, or spawn short-lived players and free on `finished`.
gdscriptfunc set_music_volume(linear_0_to_1: float) -> void: var bus := AudioServer.get_bus_index("Music") # Convert a 0..1 slider to decibels; clamp avoids -inf at 0. AudioServer.set_bus_volume_db(bus, linear_to_db(maxf(linear_0_to_1, 0.0001))) func toggle_sfx(muted: bool) -> void: AudioServer.set_bus_mute(AudioServer.get_bus_index("SFX"), muted)
gdscript@onready var a: AudioStreamPlayer = $MusicA @onready var b: AudioStreamPlayer = $MusicB func crossfade_to(stream: AudioStream, secs := 1.5) -> void: b.stream = stream b.volume_db = -40.0 b.play() var tw := create_tween().set_parallel(true) tw.tween_property(a, "volume_db", -40.0, secs) # fade out current tw.tween_property(b, "volume_db", 0.0, secs) # fade in next tw.chain().tween_callback(a.stop) var tmp := a; a = b; b = tmp # swap roles
gdscript@onready var music: AudioStreamPlayer = $Music func get_playback_time() -> float: # Add time since the last audio mix, subtract output latency, for sub-frame accuracy. var t := music.get_playback_position() + AudioServer.get_time_since_last_mix() return t - AudioServer.get_output_latency()
volume_db/set_bus_volume_db are decibels. Settingvolume_db = 0.5 is nearly full volume, not half. Map sliders with linear_to_db.
linear_to_db(0.0) is -inf. Clamp the linear value to a small minimum (e.g.0.0001) before converting, or special-case 0 → mute.
get_bus_index("Muisc") returns -1; calls then erroror no-op. Match the exact bus name from the Audio panel.
AudioStreamPolyphonic, or AudioStreamPlayer per-shot freed on finished.
.ogg import has aLoop option; AudioStreamWAV has loop_mode).
get_playback_position() alone is jittery — it updates per audio mix,not per frame; add get_time_since_last_mix() and subtract get_output_latency().
AudioListener3D/Camera3D to hear it, or max_distance/attenuation too tight, or wrong bus muted.
.tres), adding effects (reverb/compressor/EQ) and side-chainducking, AudioStreamPolyphonic/AudioStreamInteractive, microphone capture, and procedural audio with AudioStreamGenerator, read references/buses-and-effects.md.
audio-design — engine-agnostic adaptive music, mixing, and ducking practice.godot-animation — syncing animation/Tween to get_playback_position().godot-ui-control — volume sliders wired to AudioServer.Other measured skills in the registry, with their headline benchmark lift.