diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-10-09 23:16:10 +0200 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-10-09 23:16:10 +0200 |
| commit | 35763c27e0dc829e89696b500ac7f0a92bbcf013 (patch) | |
| tree | 9542b4553ca787e5e52472a72b2d2036e3ea8954 | |
| parent | 62e04ff78fcacab4ab3087aff986428d9b155d3d (diff) | |
| download | hurrycurry-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.import | 6 | ||||
| -rw-r--r-- | client/audio/sound.gd | 72 | ||||
| -rw-r--r-- | client/audio/sound.tscn | 12 | ||||
| -rw-r--r-- | client/global.gd | 4 | ||||
| -rw-r--r-- | client/gui/menus/character.gd | 4 | ||||
| -rw-r--r-- | client/gui/menus/main/main.gd | 3 | ||||
| -rw-r--r-- | client/gui/menus/main/play.gd | 1 | ||||
| -rw-r--r-- | client/gui/menus/menu.gd | 4 | ||||
| -rw-r--r-- | client/gui/overlays/lobby/lobby.gd | 6 |
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 |