Audio

Formats: Ogg Vorbis (music, loopable), WAV (short SFX), MP3.

25.1 Players

Non-positional (music, UI) Positional 2D (attenuates with distance from the listener/camera)

Positional 3D (attenuation, doppler, area reverb) Formats: Ogg Vorbis (music, loopable), WAV (short SFX), MP3. Set loop in the import settings.

Set max_polyphony > 1 on a player to let the same player overlap sounds. AudioStreamRandomizer picks random streams/pitch automatically.

@onready var sfx: AudioStreamPlayer2D = $JumpSound

func jump() -> void:
	sfx.pitch_scale = randf_range(0.9, 1.1)   # variation
	sfx.play()

func play_one_shot(stream: AudioStream, at: Vector2) -> void:
	var p := AudioStreamPlayer2D.new()
	p.stream = stream
	p.global_position = at
	p.finished.connect(p.queue_free)
	get_tree().current_scene.add_child(p)
	p.play()

25.2 Audio buses

The Audio bottom panel defines buses (Master, Music, SFX) with effects (reverb, compressor, EQ, limiter). Players choose a bus with the bus property.

func set_bus_volume(bus_name: String, linear: float) -> void:
	var idx := AudioServer.get_bus_index(bus_name)
	AudioServer.set_bus_volume_db(idx, linear_to_db(linear))   # slider 0..1 → decibels
	AudioServer.set_bus_mute(idx, linear <= 0.001)

25.3 Music manager (autoload)

Godot 4.3 added interactive music resources (AudioStreamInteractive, AudioStreamPlaylist, AudioStreamSynchronized) for transitions and layered music.

extends Node

var _player := AudioStreamPlayer.new()

func _ready() -> void:
	_player.bus = &"Music"
	process_mode = Node.PROCESS_MODE_ALWAYS     # keep playing while paused
	add_child(_player)

func play_music(stream: AudioStream, fade := 1.0) -> void:
	if _player.stream == stream and _player.playing:
		return
	var tween := create_tween()
	if _player.playing:
		tween.tween_property(_player, "volume_db", -40.0, fade)
	tween.tween_callback(func():
		_player.stream = stream
		_player.play())
	tween.tween_property(_player, "volume_db", 0.0, fade)