aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-10-09 23:16:10 +0200
committermetamuffin <metamuffin@disroot.org>2025-10-09 23:16:10 +0200
commit35763c27e0dc829e89696b500ac7f0a92bbcf013 (patch)
tree9542b4553ca787e5e52472a72b2d2036e3ea8954
parent62e04ff78fcacab4ab3087aff986428d9b155d3d (diff)
downloadhurrycurry-35763c27e0dc829e89696b500ac7f0a92bbcf013.tar
hurrycurry-35763c27e0dc829e89696b500ac7f0a92bbcf013.tar.bz2
hurrycurry-35763c27e0dc829e89696b500ac7f0a92bbcf013.tar.zst
Music fading and filtering interpolation
-rw-r--r--client/audio/music/reflets-dans-leau.ogg.import6
-rw-r--r--client/audio/sound.gd72
-rw-r--r--client/audio/sound.tscn12
-rw-r--r--client/global.gd4
-rw-r--r--client/gui/menus/character.gd4
-rw-r--r--client/gui/menus/main/main.gd3
-rw-r--r--client/gui/menus/main/play.gd1
-rw-r--r--client/gui/menus/menu.gd4
-rw-r--r--client/gui/overlays/lobby/lobby.gd6
9 files changed, 64 insertions, 48 deletions
diff --git a/client/audio/music/reflets-dans-leau.ogg.import b/client/audio/music/reflets-dans-leau.ogg.import
index 24e77fa2..27b034c7 100644
--- a/client/audio/music/reflets-dans-leau.ogg.import
+++ b/client/audio/music/reflets-dans-leau.ogg.import
@@ -12,8 +12,8 @@ dest_files=["res://.godot/imported/reflets-dans-leau.ogg-b4a7d816b71a4043429c7dc
[params]
-loop=false
-loop_offset=0
-bpm=0
+loop=true
+loop_offset=0.0
+bpm=0.0
beat_count=0
bar_beats=4
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()
diff --git a/client/audio/sound.tscn b/client/audio/sound.tscn
index 8cb6f4bb..d408d5ed 100644
--- a/client/audio/sound.tscn
+++ b/client/audio/sound.tscn
@@ -1,10 +1,9 @@
-[gd_scene load_steps=6 format=3 uid="uid://d3h243yic44rr"]
+[gd_scene load_steps=5 format=3 uid="uid://d3h243yic44rr"]
[ext_resource type="Script" uid="uid://cho8r5m78a4ur" path="res://audio/sound.gd" id="1_b0qb1"]
[ext_resource type="AudioStream" uid="uid://cpyn511c5mtni" path="res://gui/resources/sounds/click.ogg" id="2_mhrce"]
[ext_resource type="AudioStream" uid="uid://dtr1khfyqr56o" path="res://gui/resources/sounds/hover.ogg" id="3_qft2s"]
[ext_resource type="AudioStream" uid="uid://dft3m8utnxhs7" path="res://gui/resources/sounds/game_start.ogg" id="4_le874"]
-[ext_resource type="AudioStream" uid="uid://dpgt5loaberoj" path="res://audio/music/reflets-dans-leau.ogg" id="5_j8h5s"]
[node name="Sound" type="Node3D"]
script = ExtResource("1_b0qb1")
@@ -24,12 +23,3 @@ stream = ExtResource("4_le874")
bus = &"SFX"
[node name="Music" type="Node" parent="."]
-
-[node name="MainMenu" type="AudioStreamPlayer" parent="Music"]
-stream = ExtResource("5_j8h5s")
-volume_db = 3.0
-bus = &"Music"
-
-[node name="Lobby" type="AudioStreamPlayer" parent="Music"]
-volume_db = -3.5
-bus = &"Music"
diff --git a/client/global.gd b/client/global.gd
index 35fd215e..2c876374 100644
--- a/client/global.gd
+++ b/client/global.gd
@@ -89,6 +89,10 @@ func on_vulkan() -> bool:
static func interpolate(current, target, dt):
return target + (current - target) * exp(-dt)
+static func interpolate_linear(current, target, dt):
+ if current > target: return max(target, current - dt)
+ else: return min(target, current + dt)
+
static func interpolate_angle(current, target, dt) -> float:
current = fmod(current, PI * 2)
target = fmod(target, PI * 2)
diff --git a/client/gui/menus/character.gd b/client/gui/menus/character.gd
index 217edaf9..15efe969 100644
--- a/client/gui/menus/character.gd
+++ b/client/gui/menus/character.gd
@@ -23,7 +23,8 @@ func _ready():
super()
$VBoxContainer/top_panel/a/username.text = Profile.read("username")
character.set_style(Profile.read("character_style"), "chef")
- Sound.dampen_music = true
+
+func _menu_music(): Sound.set_music("reflets-dans-leau", 0, true)
func exit():
if username_edit.text == "":
@@ -35,7 +36,6 @@ func exit():
await submenu("res://gui/menus/popup.tscn", popup_data)
return
Profile.write("username", username_edit.text)
- Sound.dampen_music = false
super()
func _on_character_back_pressed():
diff --git a/client/gui/menus/main/main.gd b/client/gui/menus/main/main.gd
index 754eddd7..4a55b761 100644
--- a/client/gui/menus/main/main.gd
+++ b/client/gui/menus/main/main.gd
@@ -24,7 +24,8 @@ func _ready():
quit_button.hide()
ServerList.one_shot()
await get_tree().create_timer(0.7).timeout
- Sound.play_music("MainMenu")
+
+func _menu_music(): Sound.set_music("reflets-dans-leau", 3, false)
func _menu_cover(state):
$side.visible = not state
diff --git a/client/gui/menus/main/play.gd b/client/gui/menus/main/play.gd
index 206b4d9f..4ae19f2f 100644
--- a/client/gui/menus/main/play.gd
+++ b/client/gui/menus/main/play.gd
@@ -35,7 +35,6 @@ func _ready():
if OS.has_feature("web"):
server.hide()
connect_uri.text = Profile.read("last_server_url")
- Sound.play_music("MainMenu")
ServerList.update_server_list.connect(update_server_list)
ServerList.update_loading.connect(update_server_list_loading)
diff --git a/client/gui/menus/menu.gd b/client/gui/menus/menu.gd
index e0d5472a..bdc64be0 100644
--- a/client/gui/menus/menu.gd
+++ b/client/gui/menus/menu.gd
@@ -41,6 +41,7 @@ func _ready():
update_parent_menu(self.get_parent())
if support_anim: anim_setup()
if auto_anim: _menu_open()
+ _menu_music()
get_tree().get_root().go_back_requested.connect(exit_maybe)
func anim_setup():
@@ -52,6 +53,8 @@ func _menu_exit():
if transition != null: await transition.fade_out()
func _menu_cover(_state: bool):
pass
+func _menu_music():
+ pass
var popup: Menu = null
var covered := false
@@ -70,6 +73,7 @@ func submenu(path: String, data_ = null):
covered = false
await _menu_cover(false)
Global.focused_menu = self
+ _menu_music()
_disable_recursive(self, false)
if prev_focus != null: prev_focus.grab_focus()
diff --git a/client/gui/overlays/lobby/lobby.gd b/client/gui/overlays/lobby/lobby.gd
index 8f7adc49..23d6036f 100644
--- a/client/gui/overlays/lobby/lobby.gd
+++ b/client/gui/overlays/lobby/lobby.gd
@@ -164,16 +164,16 @@ func _on_start_pressed():
start_msg += "\ncreate-bot %s" % k
game.mp.send_chat(game.my_player_id, start_msg)
- Sound.play_music("stop") # TODO: Game music enter
+ Sound.set_music(null) # TODO: Game music enter
func _update_visible(_state: bool):
visible = game.in_lobby and game.join_state == Game.JoinState.JOINED
func check_for_music():
if visible:
- Sound.play_music("Lobby")
+ Sound.set_music(null) # TODO: lobby music
else:
- Sound.play_music(null)
+ Sound.set_music(null)
func _on_enable_bots_toggled(toggled_on):
bots_enabled = toggled_on