commit fcce674b1cb70aa4e806732ba125b625c9e4b507 Author: Ategon Date: Tue Aug 27 17:11:45 2024 -0400 Initial Commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..31db441 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# Godot 4+ specific ignores +.godot/ + +# Removing old system +old/ +tracks/* +!tracks/base.gd +!tracks/example.gd +temp/ +thumbnails/* +!thumbnails/example.bmp +music/* +!music/example \ No newline at end of file diff --git a/art/info-overlay.png b/art/info-overlay.png new file mode 100644 index 0000000..30f474a Binary files /dev/null and b/art/info-overlay.png differ diff --git a/art/info-overlay.png.import b/art/info-overlay.png.import new file mode 100644 index 0000000..245b78c --- /dev/null +++ b/art/info-overlay.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://eagpwhcx63cx" +path="res://.godot/imported/info-overlay.png-b6cec6f320247a7cf5f2a0a4f1f042dd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/info-overlay.png" +dest_files=["res://.godot/imported/info-overlay.png-b6cec6f320247a7cf5f2a0a4f1f042dd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/art/overlay.png b/art/overlay.png new file mode 100644 index 0000000..dd2d5b6 Binary files /dev/null and b/art/overlay.png differ diff --git a/art/overlay.png.import b/art/overlay.png.import new file mode 100644 index 0000000..9394f21 --- /dev/null +++ b/art/overlay.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d4ncsckbihfnr" +path="res://.godot/imported/overlay.png-8c2a5edc5a15584060fd8f76953f4577.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/overlay.png" +dest_files=["res://.godot/imported/overlay.png-8c2a5edc5a15584060fd8f76953f4577.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/default_bus_layout.tres b/default_bus_layout.tres new file mode 100644 index 0000000..205d0f8 --- /dev/null +++ b/default_bus_layout.tres @@ -0,0 +1,9 @@ +[gd_resource type="AudioBusLayout" format=3 uid="uid://bhditfneg33ml"] + +[resource] +bus/1/name = &"Music" +bus/1/solo = false +bus/1/mute = false +bus/1/bypass_fx = false +bus/1/volume_db = -0.130497 +bus/1/send = &"Master" diff --git a/music/example/Study and Relax.mp3 b/music/example/Study and Relax.mp3 new file mode 100644 index 0000000..774984d Binary files /dev/null and b/music/example/Study and Relax.mp3 differ diff --git a/music/example/Study and Relax.mp3.import b/music/example/Study and Relax.mp3.import new file mode 100644 index 0000000..a037d36 --- /dev/null +++ b/music/example/Study and Relax.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://drnf5my5uvute" +path="res://.godot/imported/Study and Relax.mp3-46d69de7485638a01fd8a7dff9bcd796.mp3str" + +[deps] + +source_file="res://music/example/Study and Relax.mp3" +dest_files=["res://.godot/imported/Study and Relax.mp3-46d69de7485638a01fd8a7dff9bcd796.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..334f5c8 --- /dev/null +++ b/project.godot @@ -0,0 +1,108 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="StreamMusic" +run/main_scene="res://src/Main.tscn" +config/features=PackedStringArray("4.3", "Forward Plus") + +[autoload] + +TwitchGod="res://old/addons/TwitchGod.tscn" + +[display] + +window/size/viewport_width=450 +window/size/viewport_height=200 +window/size/transparent=true +window/per_pixel_transparency/allowed=true + +[editor_plugins] + +enabled=PackedStringArray() + +[input] + +Play={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":80,"key_label":0,"unicode":112,"location":0,"echo":false,"script":null) +] +} +Stop={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +Vol0={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":48,"key_label":0,"unicode":48,"location":0,"echo":false,"script":null) +] +} +Vol1={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":49,"key_label":0,"unicode":49,"location":0,"echo":false,"script":null) +] +} +Vol2={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":50,"key_label":0,"unicode":50,"location":0,"echo":false,"script":null) +] +} +Vol3={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":51,"key_label":0,"unicode":51,"location":0,"echo":false,"script":null) +] +} +Vol4={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":52,"key_label":0,"unicode":52,"location":0,"echo":false,"script":null) +] +} +Vol5={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":53,"key_label":0,"unicode":53,"location":0,"echo":false,"script":null) +] +} +Vol6={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":54,"key_label":0,"unicode":54,"location":0,"echo":false,"script":null) +] +} +Vol7={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":55,"key_label":0,"unicode":55,"location":0,"echo":false,"script":null) +] +} +Vol8={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":56,"key_label":0,"unicode":56,"location":0,"echo":false,"script":null) +] +} +Vol9={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":57,"key_label":0,"unicode":57,"location":0,"echo":false,"script":null) +] +} +Display={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +] +} + +[twitch] + +auth/broadcaster_id="977414152" +auth/client_id="6s7phhstect7oac8jxcuu94ypyei6x" +auth/client_secret="6s7phhstect7oac8jxcuu94ypyei6x" +auth/scopes/chat=3 +auth/scopes/channel=2097152 +eventsub/channel_poll_begin/subscribed=true +eventsub/channel_poll_begin/broadcaster_user_id="977414152" diff --git a/src/Main.tscn b/src/Main.tscn new file mode 100644 index 0000000..df30ea7 --- /dev/null +++ b/src/Main.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=3 format=3 uid="uid://da7wkuvgwgkib"] + +[ext_resource type="Script" path="res://src/main.gd" id="1_bmrmv"] +[ext_resource type="PackedScene" uid="uid://bgu71uk1ax8p1" path="res://src/MusicDisplay.tscn" id="2_hsyxi"] + +[node name="Main" type="CanvasLayer"] +script = ExtResource("1_bmrmv") + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +bus = &"Music" + +[node name="MusicDisplay" parent="." instance=ExtResource("2_hsyxi")] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -200.5 +offset_right = 200.5 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="MusicPicker" type="Node" parent="."] + +[connection signal="finished" from="AudioStreamPlayer" to="." method="_on_audio_stream_player_finished"] diff --git a/src/MusicDisplay.tscn b/src/MusicDisplay.tscn new file mode 100644 index 0000000..495e89d --- /dev/null +++ b/src/MusicDisplay.tscn @@ -0,0 +1,252 @@ +[gd_scene load_steps=6 format=3 uid="uid://bgu71uk1ax8p1"] + +[ext_resource type="Texture2D" uid="uid://7dlyvcd62df" path="res://old/oldthumbnails/t6wexov4.bmp" id="1_cxepj"] +[ext_resource type="Script" path="res://src/music_display.gd" id="1_g11yo"] +[ext_resource type="Texture2D" uid="uid://d4ncsckbihfnr" path="res://art/overlay.png" id="2_q8ma0"] +[ext_resource type="Texture2D" uid="uid://eagpwhcx63cx" path="res://art/info-overlay.png" id="4_64o3x"] +[ext_resource type="Script" path="res://src/music_bar.gd" id="5_rd85y"] + +[node name="MusicDisplay" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_left = -202.0 +offset_top = -49.0 +offset_right = 199.0 +offset_bottom = 49.0 +pivot_offset = Vector2(202, 49) +script = ExtResource("1_g11yo") + +[node name="Thumbnail" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -200.0 +offset_top = -50.0 +offset_right = -100.0 +offset_bottom = 50.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ThumbnailShape" type="TextureRect" parent="Thumbnail"] +clip_children = 1 +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -50.0 +offset_top = -50.0 +offset_right = 50.0 +offset_bottom = 50.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("2_q8ma0") + +[node name="ThumbnailTexture" type="TextureRect" parent="Thumbnail/ThumbnailShape"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -50.0 +offset_top = -50.0 +offset_right = 50.0 +offset_bottom = 50.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("1_cxepj") +expand_mode = 1 +stretch_mode = 6 + +[node name="Info" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -100.0 +offset_top = -35.0 +offset_right = 200.0 +offset_bottom = 35.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="InfoShape" type="TextureRect" parent="Info"] +clip_children = 1 +layout_mode = 0 +offset_right = 200.0 +offset_bottom = 50.0 +texture = ExtResource("4_64o3x") + +[node name="ColorRect" type="ColorRect" parent="Info/InfoShape"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 1) + +[node name="InfoBackground" type="TextureRect" parent="Info/InfoShape"] +modulate = Color(1, 1, 1, 0.427451) +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -157.0 +offset_top = -138.0 +offset_right = 279.0 +offset_bottom = 308.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("1_cxepj") +expand_mode = 1 +stretch_mode = 6 + +[node name="InfoTrack" type="RichTextLabel" parent="Info/InfoShape"] +layout_mode = 1 +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_left = 8.0 +offset_top = -24.0 +offset_right = 299.0 +offset_bottom = -1.0 +grow_vertical = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 0.631373) +theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.431373) +theme_override_constants/outline_size = 6 +theme_override_constants/shadow_offset_y = 2 +theme_override_constants/shadow_offset_x = 1 +text = "Example Title" + +[node name="InfoArtist" type="RichTextLabel" parent="Info/InfoShape"] +layout_mode = 1 +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_left = 8.0 +offset_top = 3.0 +offset_right = 299.0 +offset_bottom = 26.0 +grow_vertical = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 0.631373) +theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.431373) +theme_override_constants/outline_size = 6 +theme_override_constants/shadow_offset_y = 2 +theme_override_constants/shadow_offset_x = 1 +theme_override_font_sizes/normal_font_size = 12 +text = "Example Artist" + +[node name="Bars" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 6 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -55.0 +offset_top = -25.0 +offset_right = -18.0 +offset_bottom = 25.0 +grow_horizontal = 0 +grow_vertical = 2 + +[node name="ColorRect" type="ColorRect" parent="Bars"] +layout_mode = 1 +anchors_preset = 6 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -4.0 +offset_top = -24.0 +offset_bottom = 24.0 +grow_horizontal = 0 +grow_vertical = 2 +pivot_offset = Vector2(2, 48) +color = Color(0, 0, 0, 1) +script = ExtResource("5_rd85y") + +[node name="ColorRect4" type="ColorRect" parent="Bars/ColorRect"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -1.0 +offset_top = -22.0 +offset_right = 1.0 +offset_bottom = 22.0 +grow_horizontal = 2 +grow_vertical = 2 +pivot_offset = Vector2(1, 44) + +[node name="ColorRect2" type="ColorRect" parent="Bars"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -2.0 +offset_top = -24.0 +offset_right = 2.0 +offset_bottom = 24.0 +grow_horizontal = 2 +grow_vertical = 2 +pivot_offset = Vector2(2, 48) +color = Color(0, 0, 0, 1) +script = ExtResource("5_rd85y") + +[node name="ColorRect4" type="ColorRect" parent="Bars/ColorRect2"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -1.0 +offset_top = -22.0 +offset_right = 1.0 +offset_bottom = 22.0 +grow_horizontal = 2 +grow_vertical = 2 +pivot_offset = Vector2(1, 44) + +[node name="ColorRect3" type="ColorRect" parent="Bars"] +layout_mode = 1 +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_top = -24.0 +offset_right = 4.0 +offset_bottom = 24.0 +grow_vertical = 2 +pivot_offset = Vector2(2, 48) +color = Color(0, 0, 0, 1) +script = ExtResource("5_rd85y") + +[node name="ColorRect4" type="ColorRect" parent="Bars/ColorRect3"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -1.0 +offset_top = -22.0 +offset_right = 1.0 +offset_bottom = 22.0 +grow_horizontal = 2 +grow_vertical = 2 +pivot_offset = Vector2(1, 44) diff --git a/src/main.gd b/src/main.gd new file mode 100644 index 0000000..bb308cd --- /dev/null +++ b/src/main.gd @@ -0,0 +1,74 @@ +extends CanvasLayer + +@onready var music_display = $"MusicDisplay" +@onready var audio_stream_player = $"AudioStreamPlayer" + +var music_bus = AudioServer.get_bus_index("Music") + +var _tracks = [] + + +func _ready(): + get_viewport().transparent_bg = true + AudioServer.set_bus_volume_db(music_bus, linear_to_db(0.5)) + _load_tracks() + + +func _process(delta): + if Input.is_action_just_pressed("Play"): + _play() + elif Input.is_action_just_pressed("Stop"): + _stop() + elif Input.is_action_just_pressed("Display"): + _display() + + for i in range(0, 10): + if Input.is_action_just_pressed("Vol%d" % [i]): + AudioServer.set_bus_volume_db(music_bus, linear_to_db(float(i)/9)) + + +func _play(): + var song = _get_track() + audio_stream_player.stream = load(song.track) + audio_stream_player.play() + music_display.show_song(song) + + +func _stop(): + audio_stream_player.stop() + music_display.hide_song() + + +func _display(): + music_display.show_song() + + +func _get_track(): + return _tracks.pick_random() + + + +func _load_tracks(): + _load_directory("res://tracks") + print("Loaded music") + + +func _load_directory(path: String): + var dir = DirAccess.open(path) + + if dir: + dir.list_dir_begin() + var file_name = dir.get_next() + + while file_name != "": + if not dir.current_is_dir(): + var file = load("res://tracks/%s" % [file_name]) + var instance = file.new() + var new_tracks = instance.get_tracks() + + for track in new_tracks: + _tracks.push_back(track) + else: + _load_directory("res://tracks/%s" % [file_name]) + + file_name = dir.get_next() diff --git a/src/music_bar.gd b/src/music_bar.gd new file mode 100644 index 0000000..3c1cfee --- /dev/null +++ b/src/music_bar.gd @@ -0,0 +1,29 @@ +extends ColorRect + +func _ready(): + var max1 = randf_range(0.35, 1) + var max2 = randf_range(0.35, 1) + var max3 = randf_range(0.35, 1) + var max4 = randf_range(0.35, 1) + var max5 = randf_range(0.35, 1) + var time = randf_range(0.25, 1) + var min1 = randf_range(0, 0.25) + var min2 = randf_range(0, 0.25) + var min3 = randf_range(0, 0.25) + var min4 = randf_range(0, 0.25) + var min5 = randf_range(0, 0.25) + + scale.y = 0 + + var tween = create_tween() + tween.set_loops() + tween.tween_property(self, "scale:y", max1, time) + tween.tween_property(self, "scale:y", min1, time) + tween.tween_property(self, "scale:y", max2, time) + tween.tween_property(self, "scale:y", min2, time) + tween.tween_property(self, "scale:y", max3, time) + tween.tween_property(self, "scale:y", min3, time) + tween.tween_property(self, "scale:y", max4, time) + tween.tween_property(self, "scale:y", min4, time) + tween.tween_property(self, "scale:y", max5, time) + tween.tween_property(self, "scale:y", min5, time) diff --git a/src/music_display.gd b/src/music_display.gd new file mode 100644 index 0000000..61c5da3 --- /dev/null +++ b/src/music_display.gd @@ -0,0 +1,70 @@ +extends Control + +# -- References +@onready var thumbnail = $"Thumbnail" +@onready var thumbnail_texture = $"Thumbnail/ThumbnailShape/ThumbnailTexture" +@onready var info_texture = $"Info/InfoShape/InfoBackground" +@onready var info_artist = $"Info/InfoShape/InfoArtist" +@onready var info_track = $"Info/InfoShape/InfoTrack" + +# -- Onready vars +@onready var _start_position = position + +# -- Constants +const MOVE_IN_TIME = 1 +const MOVE_WAIT_TIME = 10 +const MOVE_OUT_TIME = 1 +const MOVE_AMOUNT = 160 +const MOVE_SCALE_DIFF = 0.25 + +# -- Variables +var move_tween = null + + +# -- Built in Functions + + +func _ready(): + position.y = _start_position.y + MOVE_AMOUNT + scale = Vector2.ONE * (1 - MOVE_SCALE_DIFF) + + +# -- Public Functions + + +## Show the display for a song +func show_song(song = null): + if song: + thumbnail_texture.texture = song.thumbnail + info_texture.texture = song.thumbnail + info_track.text = " " + song.name + info_artist.text = " " + song.artist + + if move_tween: + move_tween.kill() + + move_tween = create_tween() + move_tween.set_parallel() + move_tween.set_trans(Tween.TRANS_BACK) + move_tween.set_ease(Tween.EASE_OUT) + move_tween.tween_property(self, "position:y", _start_position.y, MOVE_IN_TIME) + move_tween.tween_property(self, "scale", Vector2.ONE, MOVE_IN_TIME) + move_tween.chain() + move_tween.tween_interval(MOVE_WAIT_TIME) + move_tween.chain() + move_tween.set_ease(Tween.EASE_IN) + move_tween.tween_property(self, "position:y", _start_position.y + MOVE_AMOUNT, MOVE_OUT_TIME) + move_tween.tween_property(self, "scale", Vector2.ONE * (1 - MOVE_SCALE_DIFF), MOVE_IN_TIME) + + +## Hide the display for a song +func hide_song(): + if move_tween: + move_tween.kill() + + move_tween = create_tween() + move_tween.set_parallel() + move_tween.set_trans(Tween.TRANS_BACK) + move_tween.set_ease(Tween.EASE_IN) + move_tween.tween_property(self, "position:y", _start_position.y + MOVE_AMOUNT, MOVE_OUT_TIME) + move_tween.tween_property(self, "scale", Vector2.ONE * (1 - MOVE_SCALE_DIFF), MOVE_IN_TIME) diff --git a/thumbnails/example.bmp b/thumbnails/example.bmp new file mode 100644 index 0000000..b9fa0e9 Binary files /dev/null and b/thumbnails/example.bmp differ diff --git a/tracks/base.gd b/tracks/base.gd new file mode 100644 index 0000000..53ed1e3 --- /dev/null +++ b/tracks/base.gd @@ -0,0 +1,21 @@ +extends Node +class_name BaseTrack + +var _default = null +var _tracks = null + +func get_tracks(): + if not _tracks: + return [] + + var tracks = _tracks.duplicate() + + if not _default: + return tracks + + for track in tracks: + for key in _default: + if not track.has(key): + track[key] = _default[key] + + return tracks diff --git a/tracks/example.gd b/tracks/example.gd new file mode 100644 index 0000000..6a11429 --- /dev/null +++ b/tracks/example.gd @@ -0,0 +1,17 @@ +extends BaseTrack + +func _init(): + _default = { + "artist": "Kevin MacLeod", + "thumbnail": preload("res://thumbnails/example.bmp"), + "source": "https://incompetech.com/", + } + + _tracks = [ + { + "name": "Study and Relax", + "track": "res://music/example/Study and Relax.mp3" + } + ] + +# Each track can redifine things set in _default. The two get merged giving priority to things set in tracks