Music to my ears.

This commit is contained in:
Haze Weathers 2025-03-11 01:12:28 -04:00
parent 884f49fed3
commit 1570f6986f
15 changed files with 168 additions and 25 deletions

View file

@ -0,0 +1,46 @@
extends EditorProperty
var _dropdown_button := Button.new()
var _popup_menu := PopupMenu.new()
func _init() -> void:
_dropdown_button.pressed.connect(_show_popup)
_dropdown_button.icon = EditorInterface.get_editor_theme().get_icon("AudioStreamWAV", "EditorIcons")
_popup_menu.index_pressed.connect(_on_song_selected)
add_child(_dropdown_button)
add_child(_popup_menu)
add_focusable(_dropdown_button)
func _update_property() -> void:
var new_value: StringName = get_edited_object()[get_edited_property()]
_dropdown_button.text = new_value.capitalize()
func _show_popup() -> void:
var songs = Music.songs.keys()
_popup_menu.clear()
for sound: StringName in songs:
_popup_menu.add_icon_item(
EditorInterface.get_editor_theme().get_icon("AudioStreamWAV", "EditorIcons"),
sound.capitalize()
)
var button_rect = _dropdown_button.get_global_rect()
_popup_menu.reset_size()
var popup_pos = button_rect.position + Vector2(DisplayServer.window_get_position())
_popup_menu.position = popup_pos
_popup_menu.min_size.x = button_rect.size.x
_popup_menu.popup()
func _on_song_selected(index: int) -> void:
var sound = Music.songs.keys()[index]
_dropdown_button.grab_focus()
emit_changed(get_edited_property(), sound)

View file

@ -0,0 +1 @@
uid://uc6u3ls6jx3y

View file

@ -2,6 +2,7 @@ extends EditorInspectorPlugin
const GlobalSoundSelector = preload("global_sound_selector.gd") const GlobalSoundSelector = preload("global_sound_selector.gd")
const GlobalMusicSelector = preload("global_music_selector.gd")
func _can_handle(object: Object) -> bool: func _can_handle(object: Object) -> bool:
@ -9,8 +10,11 @@ func _can_handle(object: Object) -> bool:
func _parse_property(object: Object, type: Variant.Type, name: String, hint_type: PropertyHint, hint_string: String, usage_flags: int, wide: bool) -> bool: func _parse_property(object: Object, type: Variant.Type, name: String, hint_type: PropertyHint, hint_string: String, usage_flags: int, wide: bool) -> bool:
if type == TYPE_STRING_NAME and hint_string == "global_sound": if type == TYPE_STRING_NAME:
if hint_string == "global_sound":
add_property_editor(name, GlobalSoundSelector.new()) add_property_editor(name, GlobalSoundSelector.new())
return true return true
else: if hint_string == "global_music":
add_property_editor(name, GlobalMusicSelector.new())
return true
return false return false

BIN
assets/music/bug_music.ogg Normal file

Binary file not shown.

View file

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://dmctaba7v1rgu"
path="res://.godot/imported/bug_music.ogg-4e14ca93037a40f8bd3b8d23ee565dcc.oggvorbisstr"
[deps]
source_file="res://assets/music/bug_music.ogg"
dest_files=["res://.godot/imported/bug_music.ogg-4e14ca93037a40f8bd3b8d23ee565dcc.oggvorbisstr"]
[params]
loop=true
loop_offset=28.0
bpm=0.0
beat_count=0
bar_beats=4

View file

@ -14,7 +14,6 @@ sounds = {
[node name="SoggyAmbience" type="AudioStreamPlayer" parent="."] [node name="SoggyAmbience" type="AudioStreamPlayer" parent="."]
stream = ExtResource("2_3njyb") stream = ExtResource("2_3njyb")
volume_db = -10.0 volume_db = -10.0
autoplay = true
bus = &"Background Sound" bus = &"Background Sound"
[node name="WinSound" type="AudioStreamPlayer" parent="."] [node name="WinSound" type="AudioStreamPlayer" parent="."]

53
autoloads/music.gd Normal file
View file

@ -0,0 +1,53 @@
@tool
extends Node
@export_dir var songs_dir: String
@export_tool_button("Update Songs") var _update_songs_action = _update_songs
@export var songs: Dictionary[StringName, AudioStream]
@export var player_a: AudioStreamPlayer
@export var player_b: AudioStreamPlayer
@onready var _active_player: AudioStreamPlayer = player_a
@onready var _tween: Tween = null
func play_song(id: StringName, crossfade_time: float = 0.0, restart: bool = false) -> void:
var new_stream = songs.get(id) as AudioStream
if new_stream:
if not restart and _active_player.stream == new_stream:
return
var new_player = player_b if _active_player == player_a else player_a
new_player.stream = new_stream
new_player.play()
if crossfade_time > 0.0:
new_player.volume_linear = 0.0
if _tween:
_tween.kill()
_tween = create_tween().set_parallel()
_tween.tween_property(new_player, ^"volume_linear", 1.0, crossfade_time)
_tween.tween_property(_active_player, ^"volume_linear", 0.0, crossfade_time)
_tween.chain().tween_callback(_active_player.stop)
else:
new_player.volume_linear = 1.0
_active_player.stop()
_active_player = new_player
func _update_songs() -> void:
songs.clear()
var dir = DirAccess.open(songs_dir)
if dir:
dir.list_dir_begin()
var file = dir.get_next()
while file != "":
if not dir.current_is_dir() and not file.ends_with(".import"):
var stream := load(songs_dir + "/" + file) as AudioStream
if stream:
songs[file.get_basename()] = stream
file = dir.get_next()
notify_property_list_changed()

1
autoloads/music.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://dgi1v18r8dx4q

19
autoloads/music.tscn Normal file
View file

@ -0,0 +1,19 @@
[gd_scene load_steps=3 format=3 uid="uid://cxrhw5ic2vunh"]
[ext_resource type="Script" uid="uid://dgi1v18r8dx4q" path="res://autoloads/music.gd" id="1_16wm1"]
[ext_resource type="AudioStream" uid="uid://dmctaba7v1rgu" path="res://assets/music/bug_music.ogg" id="2_kl0u4"]
[node name="Music" type="Node" node_paths=PackedStringArray("player_a", "player_b")]
script = ExtResource("1_16wm1")
songs_dir = "res://assets/music"
songs = Dictionary[StringName, AudioStream]({
&"bug_music": ExtResource("2_kl0u4")
})
player_a = NodePath("MusicPlayerA")
player_b = NodePath("MusicPlayerB")
[node name="MusicPlayerA" type="AudioStreamPlayer" parent="."]
bus = &"Music"
[node name="MusicPlayerB" type="AudioStreamPlayer" parent="."]
bus = &"Music"

View file

@ -1,8 +1,6 @@
[gd_scene load_steps=4 format=3 uid="uid://ckgsfhfpg00ys"] [gd_scene load_steps=2 format=3 uid="uid://ckgsfhfpg00ys"]
[ext_resource type="Script" uid="uid://crlo6ow7fo6ca" path="res://autoloads/scene_manager.gd" id="1_1hxm1"] [ext_resource type="Script" uid="uid://crlo6ow7fo6ca" path="res://autoloads/scene_manager.gd" id="1_1hxm1"]
[ext_resource type="AudioStream" uid="uid://sci5aqar0oyx" path="res://assets/audio/bgs/amb_sog.wav" id="2_dr7pa"]
[ext_resource type="AudioStream" uid="uid://flc817bekeh6" path="res://assets/audio/sfx/level_win.ogg" id="3_8ri5f"]
[node name="SceneManager" type="Node" node_paths=PackedStringArray("viewport", "viewport_holder")] [node name="SceneManager" type="Node" node_paths=PackedStringArray("viewport", "viewport_holder")]
script = ExtResource("1_1hxm1") script = ExtResource("1_1hxm1")
@ -49,14 +47,3 @@ handle_input_locally = false
canvas_item_default_texture_filter = 0 canvas_item_default_texture_filter = 0
size = Vector2i(288, 216) size = Vector2i(288, 216)
render_target_update_mode = 4 render_target_update_mode = 4
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
stream = ExtResource("2_dr7pa")
volume_db = -10.0
autoplay = true
bus = &"Background Sound"
[node name="WinSound" type="AudioStreamPlayer" parent="."]
stream = ExtResource("3_8ri5f")
volume_db = -6.558
bus = &"Sound Effects"

View file

@ -10,23 +10,29 @@ spread = 0.3
wet = 0.1 wet = 0.1
[resource] [resource]
bus/1/name = &"Capri" bus/1/name = &"Music"
bus/1/solo = false bus/1/solo = false
bus/1/mute = false bus/1/mute = false
bus/1/bypass_fx = false bus/1/bypass_fx = false
bus/1/volume_db = 0.0 bus/1/volume_db = 0.0
bus/1/send = &"Master" bus/1/send = &"Master"
bus/1/effect/0/effect = SubResource("AudioEffectReverb_rn7sq") bus/2/name = &"Capri"
bus/1/effect/0/enabled = true
bus/2/name = &"Background Sound"
bus/2/solo = false bus/2/solo = false
bus/2/mute = false bus/2/mute = false
bus/2/bypass_fx = false bus/2/bypass_fx = false
bus/2/volume_db = 0.0 bus/2/volume_db = 0.0
bus/2/send = &"Master" bus/2/send = &"Master"
bus/3/name = &"Sound Effects" bus/2/effect/0/effect = SubResource("AudioEffectReverb_rn7sq")
bus/2/effect/0/enabled = true
bus/3/name = &"Background Sound"
bus/3/solo = false bus/3/solo = false
bus/3/mute = false bus/3/mute = false
bus/3/bypass_fx = false bus/3/bypass_fx = false
bus/3/volume_db = 0.0 bus/3/volume_db = 0.0
bus/3/send = &"Master" bus/3/send = &"Master"
bus/4/name = &"Sound Effects"
bus/4/solo = false
bus/4/mute = false
bus/4/bypass_fx = false
bus/4/volume_db = 0.0
bus/4/send = &"Master"

View file

@ -21,6 +21,7 @@ shader_parameter/fps = 15.0
script = ExtResource("1_8bygc") script = ExtResource("1_8bygc")
title = "Obligatory Tutorial Level" title = "Obligatory Tutorial Level"
id = "tutorial" id = "tutorial"
music = &"bug_music"
[node name="Sprite2D" type="Sprite2D" parent="."] [node name="Sprite2D" type="Sprite2D" parent="."]
material = SubResource("ShaderMaterial_sf5kh") material = SubResource("ShaderMaterial_sf5kh")

View file

@ -13,6 +13,7 @@ script = ExtResource("1_hcs1r")
title = "Test Level Z" title = "Test Level Z"
id = "z-level" id = "z-level"
order = 2 order = 2
music = &"bug_music"
[node name="Background" type="Sprite2D" parent="."] [node name="Background" type="Sprite2D" parent="."]
modulate = Color(0.996924, 0.421436, 0, 1) modulate = Color(0.996924, 0.421436, 0, 1)

View file

@ -20,6 +20,7 @@ config/icon="res://icon.svg"
SceneManager="*res://autoloads/scene_manager.tscn" SceneManager="*res://autoloads/scene_manager.tscn"
Levels="*res://autoloads/levels.tscn" Levels="*res://autoloads/levels.tscn"
GlobalSounds="*res://autoloads/global_sounds.tscn" GlobalSounds="*res://autoloads/global_sounds.tscn"
Music="*res://autoloads/music.tscn"
[display] [display]

View file

@ -5,3 +5,8 @@ extends Node2D
@export var title: String @export var title: String
@export var id: String @export var id: String
@export_range(0,1,1,"or_greater") var order: int @export_range(0,1,1,"or_greater") var order: int
@export_custom(0, "global_music") var music: StringName
func _ready() -> void:
Music.play_song(music)