aboutsummaryrefslogtreecommitdiff
path: root/client/audio/sound.gd
diff options
context:
space:
mode:
Diffstat (limited to 'client/audio/sound.gd')
-rw-r--r--client/audio/sound.gd72
1 files changed, 45 insertions, 27 deletions
diff --git a/client/audio/sound.gd b/client/audio/sound.gd
index f44710bc..37ba39e1 100644
--- a/client/audio/sound.gd
+++ b/client/audio/sound.gd
@@ -22,37 +22,55 @@ extends Node
var item_sounds: Dictionary = {}
var item_id: int = 0
-var current_song = null
-var dampen_music := false:
- set(value):
- AudioServer.set_bus_effect_enabled(1, 0, value)
- AudioServer.set_bus_effect_enabled(1, 1, value)
- AudioServer.set_bus_volume_db(1, -10. if value else 0.)
+var current_music_player: AudioStreamPlayer
+var current_music_filename = ""
+var volume_target = 0.
+var dampen_target = 0.
+var dampen_value = 0.
+const VOLUME_MIN = -30.
+const FADE_SPEED = 20.
+const EFFECT_FADE_SPEED = 1.
-func play_music(music):
- if music:
- var song = music_node.get_node_or_null(music)
- if song:
- if song != current_song:
- if current_song:
- current_song.stop()
- song.play()
- current_song = song
- else:
- push_error("Song %s does not exist" % music)
- else:
- if current_song:
- current_song.stop()
- current_song = null
+func set_music(filename, volume = 0., dampen = false):
+ if current_music_filename != filename:
+ var player = AudioStreamPlayer.new()
+ player.stream = load("res://audio/music/%s.ogg" % filename)
+ player.volume_db = VOLUME_MIN + 1.
+ player.autoplay = true
+ player.name = filename
+ player.bus = "Music"
+ current_music_player = player
+ current_music_filename = filename
+ $Music.add_child(player)
-func set_volume(bus : int, value:float):
+ volume_target = volume
+ dampen_target = 1. if dampen else 0.
+
+func _process(dt: float):
+ for c in $Music.get_children():
+ if c is AudioStreamPlayer:
+ if c == current_music_player:
+ if c.volume_db > volume_target: c.volume_db = max(volume_target, c.volume_db - dt * FADE_SPEED)
+ else: c.volume_db = min(volume_target, c.volume_db + dt * FADE_SPEED)
+ else:
+ c.volume_db -= dt * FADE_SPEED
+ if c.volume_db <= VOLUME_MIN: c.queue_free()
+
+ var prev_dampen = dampen_value
+ dampen_value = G.interpolate_linear(dampen_value, dampen_target, dt * EFFECT_FADE_SPEED)
+ AudioServer.set_bus_effect_enabled(1, 0, dampen_value > 0.)
+ AudioServer.set_bus_effect_enabled(1, 1, dampen_value > 0.)
+ if dampen_value != prev_dampen:
+ var lowpass = AudioServer.get_bus_effect(1, 0) as AudioEffectFilter
+ var reverb = AudioServer.get_bus_effect(1, 1) as AudioEffectReverb
+ lowpass.cutoff_hz = lerp(3200., 400., pow(dampen_value, 10.))
+ reverb.wet = dampen_value * 0.5
+
+func set_volume(bus: int, value: float):
AudioServer.set_bus_volume_db(bus, value)
-
- if value == -30:
- AudioServer.set_bus_mute(bus, true)
- else:
- AudioServer.set_bus_mute(bus, false)
+ if value == -30: AudioServer.set_bus_mute(bus, true)
+ else: AudioServer.set_bus_mute(bus, false)
func play_click():
click_sound.play()