diff --git a/Audio/Midi/Song1.mid b/Audio/Midi/Song1.mid
deleted file mode 100644
index 8cabb595..00000000
Binary files a/Audio/Midi/Song1.mid and /dev/null differ
diff --git a/Audio/Midi/Song2.mid b/Audio/Midi/Song2.mid
deleted file mode 100644
index 49e3e6de..00000000
Binary files a/Audio/Midi/Song2.mid and /dev/null differ
diff --git a/Audio/Midi/Song3.mid b/Audio/Midi/Song3.mid
deleted file mode 100644
index 831fb61f..00000000
Binary files a/Audio/Midi/Song3.mid and /dev/null differ
diff --git a/Audio/Midi/florestan-subset.sf2 b/Audio/Midi/florestan-subset.sf2
deleted file mode 100644
index 56a930ac..00000000
Binary files a/Audio/Midi/florestan-subset.sf2 and /dev/null differ
diff --git a/Audio/songMaps/Song1.tres b/Audio/songMaps/Song1.tres
new file mode 100644
index 00000000..bf63d7af
--- /dev/null
+++ b/Audio/songMaps/Song1.tres
@@ -0,0 +1,216 @@
+[gd_resource type="Resource" load_steps=44 format=3 uid="uid://djm7g0svpexde"]
+
+[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_5ry1j"]
+[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_gbqfw"]
+
+[sub_resource type="Resource" id="Resource_sycg1"]
+script = ExtResource("1_5ry1j")
+Beat = 16.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_vh0lg"]
+script = ExtResource("1_5ry1j")
+Beat = 24.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_4fym7"]
+script = ExtResource("1_5ry1j")
+Beat = 32.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_mf3c7"]
+script = ExtResource("1_5ry1j")
+Beat = 5.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_5kf2q"]
+script = ExtResource("1_5ry1j")
+Beat = 9.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_f15o4"]
+script = ExtResource("1_5ry1j")
+Beat = 13.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_oert5"]
+script = ExtResource("1_5ry1j")
+Beat = 17.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_kytyf"]
+script = ExtResource("1_5ry1j")
+Beat = 21.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_kmfoh"]
+script = ExtResource("1_5ry1j")
+Beat = 25.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_hsn40"]
+script = ExtResource("1_5ry1j")
+Beat = 29.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_fdk4c"]
+script = ExtResource("1_5ry1j")
+Beat = 33.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_1aoo3"]
+script = ExtResource("1_5ry1j")
+Beat = 37.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_wlcjv"]
+script = ExtResource("1_5ry1j")
+Beat = 41.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_i1n24"]
+script = ExtResource("1_5ry1j")
+Beat = 45.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_n2wrp"]
+script = ExtResource("1_5ry1j")
+Beat = 49.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_gmg26"]
+script = ExtResource("1_5ry1j")
+Beat = 53.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_2jtmb"]
+script = ExtResource("1_5ry1j")
+Beat = 57.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_l3uo1"]
+script = ExtResource("1_5ry1j")
+Beat = 32.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ayat2"]
+script = ExtResource("1_5ry1j")
+Beat = 35.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_5hrj0"]
+script = ExtResource("1_5ry1j")
+Beat = 38.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_sbk3e"]
+script = ExtResource("1_5ry1j")
+Beat = 41.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_erw8g"]
+script = ExtResource("1_5ry1j")
+Beat = 44.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ohcnr"]
+script = ExtResource("1_5ry1j")
+Beat = 47.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_1xng4"]
+script = ExtResource("1_5ry1j")
+Beat = 50.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ullhh"]
+script = ExtResource("1_5ry1j")
+Beat = 53.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_jf4ph"]
+script = ExtResource("1_5ry1j")
+Beat = 56.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_l0ykb"]
+script = ExtResource("1_5ry1j")
+Beat = 59.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_o3ga4"]
+script = ExtResource("1_5ry1j")
+Beat = 4.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_j4bu6"]
+script = ExtResource("1_5ry1j")
+Beat = 8.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_3pmwc"]
+script = ExtResource("1_5ry1j")
+Beat = 12.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_8a8dw"]
+script = ExtResource("1_5ry1j")
+Beat = 16.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_sen1l"]
+script = ExtResource("1_5ry1j")
+Beat = 20.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_i8i3p"]
+script = ExtResource("1_5ry1j")
+Beat = 24.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_v6ql4"]
+script = ExtResource("1_5ry1j")
+Beat = 28.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_v3ixx"]
+script = ExtResource("1_5ry1j")
+Beat = 32.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_fjllr"]
+script = ExtResource("1_5ry1j")
+Beat = 36.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_kfijo"]
+script = ExtResource("1_5ry1j")
+Beat = 40.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_j42ns"]
+script = ExtResource("1_5ry1j")
+Beat = 44.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_c3aa2"]
+script = ExtResource("1_5ry1j")
+Beat = 48.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_a36fj"]
+script = ExtResource("1_5ry1j")
+Beat = 52.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_gwuir"]
+script = ExtResource("1_5ry1j")
+Beat = 56.0
+Length = 0.0
+
+[resource]
+script = ExtResource("2_gbqfw")
+UpLaneData = [SubResource("Resource_o3ga4"), SubResource("Resource_j4bu6"), SubResource("Resource_3pmwc"), SubResource("Resource_8a8dw"), SubResource("Resource_sen1l"), SubResource("Resource_i8i3p"), SubResource("Resource_v6ql4"), SubResource("Resource_v3ixx"), SubResource("Resource_fjllr"), SubResource("Resource_kfijo"), SubResource("Resource_j42ns"), SubResource("Resource_c3aa2"), SubResource("Resource_a36fj"), SubResource("Resource_gwuir")]
+DownLaneData = [SubResource("Resource_sycg1"), SubResource("Resource_vh0lg"), SubResource("Resource_4fym7")]
+LeftLaneData = [SubResource("Resource_mf3c7"), SubResource("Resource_5kf2q"), SubResource("Resource_f15o4"), SubResource("Resource_oert5"), SubResource("Resource_kytyf"), SubResource("Resource_kmfoh"), SubResource("Resource_hsn40"), SubResource("Resource_fdk4c"), SubResource("Resource_1aoo3"), SubResource("Resource_wlcjv"), SubResource("Resource_i1n24"), SubResource("Resource_n2wrp"), SubResource("Resource_gmg26"), SubResource("Resource_2jtmb")]
+RightLaneData = [SubResource("Resource_l3uo1"), SubResource("Resource_ayat2"), SubResource("Resource_5hrj0"), SubResource("Resource_sbk3e"), SubResource("Resource_erw8g"), SubResource("Resource_ohcnr"), SubResource("Resource_1xng4"), SubResource("Resource_ullhh"), SubResource("Resource_jf4ph"), SubResource("Resource_l0ykb")]
diff --git a/Audio/songMaps/Song2.tres b/Audio/songMaps/Song2.tres
new file mode 100644
index 00000000..486b0873
--- /dev/null
+++ b/Audio/songMaps/Song2.tres
@@ -0,0 +1,156 @@
+[gd_resource type="Resource" load_steps=32 format=3]
+
+[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_7gfc4"]
+[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_12jpe"]
+
+[sub_resource type="Resource" id="Resource_rxom0"]
+script = ExtResource("1_7gfc4")
+Beat = 1.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_asj20"]
+script = ExtResource("1_7gfc4")
+Beat = 6.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_hredl"]
+script = ExtResource("1_7gfc4")
+Beat = 10.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_iciyj"]
+script = ExtResource("1_7gfc4")
+Beat = 14.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_1w85u"]
+script = ExtResource("1_7gfc4")
+Beat = 17.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_daxqs"]
+script = ExtResource("1_7gfc4")
+Beat = 22.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_6qbd8"]
+script = ExtResource("1_7gfc4")
+Beat = 25.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_54mir"]
+script = ExtResource("1_7gfc4")
+Beat = 30.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ijh26"]
+script = ExtResource("1_7gfc4")
+Beat = 2.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_sstcx"]
+script = ExtResource("1_7gfc4")
+Beat = 4.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ldqq5"]
+script = ExtResource("1_7gfc4")
+Beat = 5.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_eltqr"]
+script = ExtResource("1_7gfc4")
+Beat = 10.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_fxmce"]
+script = ExtResource("1_7gfc4")
+Beat = 12.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_l7bpk"]
+script = ExtResource("1_7gfc4")
+Beat = 14.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_do8wm"]
+script = ExtResource("1_7gfc4")
+Beat = 15.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_qvcn2"]
+script = ExtResource("1_7gfc4")
+Beat = 18.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_siock"]
+script = ExtResource("1_7gfc4")
+Beat = 20.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_lec0e"]
+script = ExtResource("1_7gfc4")
+Beat = 22.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_6wstj"]
+script = ExtResource("1_7gfc4")
+Beat = 25.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_uxbx5"]
+script = ExtResource("1_7gfc4")
+Beat = 26.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_chdui"]
+script = ExtResource("1_7gfc4")
+Beat = 28.0
+Length = 1.0
+
+[sub_resource type="Resource" id="Resource_t7pyo"]
+script = ExtResource("1_7gfc4")
+Beat = 8.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_1obgv"]
+script = ExtResource("1_7gfc4")
+Beat = 15.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_3ah33"]
+script = ExtResource("1_7gfc4")
+Beat = 24.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_87dqu"]
+script = ExtResource("1_7gfc4")
+Beat = 1.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_81s21"]
+script = ExtResource("1_7gfc4")
+Beat = 2.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_pyy5l"]
+script = ExtResource("1_7gfc4")
+Beat = 9.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_7lmg0"]
+script = ExtResource("1_7gfc4")
+Beat = 17.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_hgf3i"]
+script = ExtResource("1_7gfc4")
+Beat = 25.0
+Length = 0.0
+
+[resource]
+script = ExtResource("2_12jpe")
+UpLaneData = Array[ExtResource("1_7gfc4")]([SubResource("Resource_87dqu"), SubResource("Resource_81s21"), SubResource("Resource_pyy5l"), SubResource("Resource_7lmg0"), SubResource("Resource_hgf3i")])
+DownLaneData = Array[ExtResource("1_7gfc4")]([SubResource("Resource_rxom0"), SubResource("Resource_asj20"), SubResource("Resource_hredl"), SubResource("Resource_iciyj"), SubResource("Resource_1w85u"), SubResource("Resource_daxqs"), SubResource("Resource_6qbd8"), SubResource("Resource_54mir")])
+LeftLaneData = Array[ExtResource("1_7gfc4")]([SubResource("Resource_ijh26"), SubResource("Resource_sstcx"), SubResource("Resource_ldqq5"), SubResource("Resource_eltqr"), SubResource("Resource_fxmce"), SubResource("Resource_l7bpk"), SubResource("Resource_do8wm"), SubResource("Resource_qvcn2"), SubResource("Resource_siock"), SubResource("Resource_lec0e"), SubResource("Resource_6wstj"), SubResource("Resource_uxbx5"), SubResource("Resource_chdui")])
+RightLaneData = Array[ExtResource("1_7gfc4")]([SubResource("Resource_t7pyo"), SubResource("Resource_1obgv"), SubResource("Resource_3ah33")])
diff --git a/Audio/songMaps/Song3.tres b/Audio/songMaps/Song3.tres
new file mode 100644
index 00000000..28d691de
--- /dev/null
+++ b/Audio/songMaps/Song3.tres
@@ -0,0 +1,281 @@
+[gd_resource type="Resource" load_steps=57 format=3 uid="uid://ekxscjn7ys6v"]
+
+[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_7kndb"]
+[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_xg88o"]
+
+[sub_resource type="Resource" id="Resource_7kndb"]
+script = ExtResource("1_7kndb")
+Beat = 3.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_xg88o"]
+script = ExtResource("1_7kndb")
+Beat = 6.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_g8421"]
+script = ExtResource("1_7kndb")
+Beat = 7.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_11qbm"]
+script = ExtResource("1_7kndb")
+Beat = 17.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_hrrtc"]
+script = ExtResource("1_7kndb")
+Beat = 20.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_rmog3"]
+script = ExtResource("1_7kndb")
+Beat = 22.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_tnqsp"]
+script = ExtResource("1_7kndb")
+Beat = 25.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_6n6ig"]
+script = ExtResource("1_7kndb")
+Beat = 27.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ci2g3"]
+script = ExtResource("1_7kndb")
+Beat = 32.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_2c17a"]
+script = ExtResource("1_7kndb")
+Beat = 34.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_gugsw"]
+script = ExtResource("1_7kndb")
+Beat = 39.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_j4ixp"]
+script = ExtResource("1_7kndb")
+Beat = 44.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_i2oko"]
+script = ExtResource("1_7kndb")
+Beat = 48.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_6oq4l"]
+script = ExtResource("1_7kndb")
+Beat = 50.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_s8y6q"]
+script = ExtResource("1_7kndb")
+Beat = 53.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_pdfmt"]
+script = ExtResource("1_7kndb")
+Beat = 59.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_lkwp6"]
+script = ExtResource("1_7kndb")
+Beat = 9.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_sd1fo"]
+script = ExtResource("1_7kndb")
+Beat = 12.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_wkvcn"]
+script = ExtResource("1_7kndb")
+Beat = 18.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_woki6"]
+script = ExtResource("1_7kndb")
+Beat = 21.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_gm3ao"]
+script = ExtResource("1_7kndb")
+Beat = 24.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_8sl4t"]
+script = ExtResource("1_7kndb")
+Beat = 29.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_j8ilf"]
+script = ExtResource("1_7kndb")
+Beat = 45.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_14d3f"]
+script = ExtResource("1_7kndb")
+Beat = 53.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_1qfq5"]
+script = ExtResource("1_7kndb")
+Beat = 56.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_v0l44"]
+script = ExtResource("1_7kndb")
+Beat = 59.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ywfrj"]
+script = ExtResource("1_7kndb")
+Beat = 60.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_0m2gd"]
+script = ExtResource("1_7kndb")
+Beat = 5.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_yjy3y"]
+script = ExtResource("1_7kndb")
+Beat = 12.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_31o0y"]
+script = ExtResource("1_7kndb")
+Beat = 16.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ismkv"]
+script = ExtResource("1_7kndb")
+Beat = 23.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_jkqwb"]
+script = ExtResource("1_7kndb")
+Beat = 27.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_k1pbh"]
+script = ExtResource("1_7kndb")
+Beat = 35.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_0nv8p"]
+script = ExtResource("1_7kndb")
+Beat = 39.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_bskfl"]
+script = ExtResource("1_7kndb")
+Beat = 42.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_8cd7v"]
+script = ExtResource("1_7kndb")
+Beat = 47.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_4giuv"]
+script = ExtResource("1_7kndb")
+Beat = 52.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_2wwc7"]
+script = ExtResource("1_7kndb")
+Beat = 56.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_y6l23"]
+script = ExtResource("1_7kndb")
+Beat = 62.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_wc7xs"]
+script = ExtResource("1_7kndb")
+Beat = 5.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_k53ay"]
+script = ExtResource("1_7kndb")
+Beat = 11.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_blbm2"]
+script = ExtResource("1_7kndb")
+Beat = 13.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_3gjtl"]
+script = ExtResource("1_7kndb")
+Beat = 19.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_mi50b"]
+script = ExtResource("1_7kndb")
+Beat = 23.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_vdnsu"]
+script = ExtResource("1_7kndb")
+Beat = 25.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_1xwp0"]
+script = ExtResource("1_7kndb")
+Beat = 32.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ybe5s"]
+script = ExtResource("1_7kndb")
+Beat = 36.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_wd1lo"]
+script = ExtResource("1_7kndb")
+Beat = 40.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_eotyn"]
+script = ExtResource("1_7kndb")
+Beat = 44.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_3wyug"]
+script = ExtResource("1_7kndb")
+Beat = 51.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_77c6u"]
+script = ExtResource("1_7kndb")
+Beat = 55.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_811fa"]
+script = ExtResource("1_7kndb")
+Beat = 57.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_6kji1"]
+script = ExtResource("1_7kndb")
+Beat = 60.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_tdwrl"]
+script = ExtResource("1_7kndb")
+Beat = 63.0
+Length = 0.0
+
+[resource]
+script = ExtResource("2_xg88o")
+UpLaneData = [SubResource("Resource_wc7xs"), SubResource("Resource_k53ay"), SubResource("Resource_blbm2"), SubResource("Resource_3gjtl"), SubResource("Resource_mi50b"), SubResource("Resource_vdnsu"), SubResource("Resource_1xwp0"), SubResource("Resource_ybe5s"), SubResource("Resource_wd1lo"), SubResource("Resource_eotyn"), SubResource("Resource_3wyug"), SubResource("Resource_77c6u"), SubResource("Resource_811fa"), SubResource("Resource_6kji1"), SubResource("Resource_tdwrl")]
+DownLaneData = [SubResource("Resource_7kndb"), SubResource("Resource_xg88o"), SubResource("Resource_g8421"), SubResource("Resource_11qbm"), SubResource("Resource_hrrtc"), SubResource("Resource_rmog3"), SubResource("Resource_tnqsp"), SubResource("Resource_6n6ig"), SubResource("Resource_ci2g3"), SubResource("Resource_2c17a"), SubResource("Resource_gugsw"), SubResource("Resource_j4ixp"), SubResource("Resource_i2oko"), SubResource("Resource_6oq4l"), SubResource("Resource_s8y6q"), SubResource("Resource_pdfmt")]
+LeftLaneData = [SubResource("Resource_lkwp6"), SubResource("Resource_sd1fo"), SubResource("Resource_wkvcn"), SubResource("Resource_woki6"), SubResource("Resource_gm3ao"), SubResource("Resource_8sl4t"), SubResource("Resource_j8ilf"), SubResource("Resource_14d3f"), SubResource("Resource_1qfq5"), SubResource("Resource_v0l44"), SubResource("Resource_ywfrj")]
+RightLaneData = [SubResource("Resource_0m2gd"), SubResource("Resource_yjy3y"), SubResource("Resource_31o0y"), SubResource("Resource_ismkv"), SubResource("Resource_jkqwb"), SubResource("Resource_k1pbh"), SubResource("Resource_0nv8p"), SubResource("Resource_bskfl"), SubResource("Resource_8cd7v"), SubResource("Resource_4giuv"), SubResource("Resource_2wwc7"), SubResource("Resource_y6l23")]
diff --git a/Classes/MidiMaestro/MidiMaestro.cs b/Classes/MidiMaestro/MidiMaestro.cs
index 57e6fca8..1bd1964f 100644
--- a/Classes/MidiMaestro/MidiMaestro.cs
+++ b/Classes/MidiMaestro/MidiMaestro.cs
@@ -2,30 +2,23 @@
using System.Linq;
using FunkEngine;
using Godot;
-using Melanchall.DryWetMidi.Core;
-using Melanchall.DryWetMidi.Interaction;
/**
- MidiMaestro: Manages reading midi file into lane note information.
+ MidiMaestro: Manages reading a song map file into lane note information.
*/
public partial class MidiMaestro : Resource
{
- private MidiFile _midiFile;
-
- public static TempoMap TempoMap { get; private set; }
- public static TimeSignature TimeSignature { get; private set; }
-
//The four note rows that we care about
- private readonly MidiNoteInfo[] _upNotes;
- private readonly MidiNoteInfo[] _downNotes;
- private readonly MidiNoteInfo[] _leftNotes;
- private readonly MidiNoteInfo[] _rightNotes;
+ private readonly NoteInfo[] _upNotes;
+ private readonly NoteInfo[] _downNotes;
+ private readonly NoteInfo[] _leftNotes;
+ private readonly NoteInfo[] _rightNotes;
//private MidiFile strippedSong;
/**
- * Constructor loads midi file and populates lane note arrays with midiNoteInfo
- * A string file path to a valid midi file
+ * Constructor loads resource file and populates lane note arrays with NoteInfo
+ * A string file path to a valid songMap .tres file
*/
public MidiMaestro(string filePath)
{
@@ -36,44 +29,32 @@ public MidiMaestro(string filePath)
if (!FileAccess.FileExists(filePath))
{
- GD.PushError("ERROR: Unable to load level Midi file: " + filePath);
+ GD.PushError("ERROR: Unable to load level songMap resource file: " + filePath);
}
- _midiFile = MidiFile.Read(filePath);
- TempoMap = _midiFile.GetTempoMap();
- TimeSignature = TempoMap.GetTimeSignatureAtTime(new MidiTimeSpan());
+ NoteChart savedChart = ResourceLoader.Load(filePath);
- //Strip out the notes from the midi file
- foreach (var track in _midiFile.GetTrackChunks())
+ if (savedChart != null)
{
- string trackName = track.Events.OfType().FirstOrDefault()?.Text;
- MidiNoteInfo[] noteEvents = track
- .GetNotes()
- .Select(note => new MidiNoteInfo(note))
- .ToArray();
-
- switch (trackName)
- {
- case "Up":
- _upNotes = noteEvents;
- break;
- case "Down":
- _downNotes = noteEvents;
- break;
- case "Left":
- _leftNotes = noteEvents;
- break;
- case "Right":
- _rightNotes = noteEvents;
- break;
- }
+ _upNotes = savedChart.GetLane(ArrowType.Up).ToArray();
+ _downNotes = savedChart.GetLane(ArrowType.Down).ToArray();
+ _leftNotes = savedChart.GetLane(ArrowType.Left).ToArray();
+ _rightNotes = savedChart.GetLane(ArrowType.Right).ToArray();
+ }
+ else
+ {
+ GD.PushError("ERROR: Unable to load songMap resource file: " + filePath);
+ _upNotes = [];
+ _downNotes = [];
+ _leftNotes = [];
+ _rightNotes = [];
}
}
/**
- * Gets midiNoteInfo by lane.
+ * Gets NoteInfo by lane.
*/
- public MidiNoteInfo[] GetNotes(ArrowType arrowType)
+ public NoteInfo[] GetNotes(ArrowType arrowType)
{
return arrowType switch
{
@@ -85,39 +66,3 @@ public MidiNoteInfo[] GetNotes(ArrowType arrowType)
};
}
}
-
-//A facade to wrap the midi notes. This is a simple class that wraps a Note object from the DryWetMidi library.
-public class MidiNoteInfo
-{
- private readonly Melanchall.DryWetMidi.Interaction.Note _note;
-
- public MidiNoteInfo(Melanchall.DryWetMidi.Interaction.Note note)
- {
- _note = note;
- }
-
- public long GetStartTimeBeat()
- {
- var beatsBar = _note.TimeAs(MidiMaestro.TempoMap);
- return beatsBar.Bars * MidiMaestro.TimeSignature.Numerator + beatsBar.Beats;
- }
-
- public long GetStartTimeTicks() => _note.Time;
-
- public float GetStartTimeSeconds() =>
- _note.TimeAs(MidiMaestro.TempoMap).Milliseconds / 1000f
- + _note.TimeAs(MidiMaestro.TempoMap).Seconds;
-
- public long GetEndTime() => _note.EndTime; //ticks
-
- public long GetDuration() => _note.Length; //ticks
-
- public long GetDurationBeats()
- {
- var beatsBar = TimeConverter.ConvertTo(
- _note.Length,
- MidiMaestro.TempoMap
- );
- return beatsBar.Bars * MidiMaestro.TimeSignature.Numerator + beatsBar.Beats;
- }
-}
diff --git a/Classes/MidiMaestro/NoteChart.cs b/Classes/MidiMaestro/NoteChart.cs
new file mode 100644
index 00000000..5e239bdc
--- /dev/null
+++ b/Classes/MidiMaestro/NoteChart.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Linq;
+using FunkEngine;
+using Godot;
+using Godot.Collections;
+
+public partial class NoteChart : Resource
+{ //Godot is unhappy with this sometimes.
+ const float Precision = 0.0001f;
+
+ [Export]
+ Array UpLaneData = [];
+
+ [Export]
+ Array DownLaneData = [];
+
+ [Export]
+ Array LeftLaneData = [];
+
+ [Export]
+ Array RightLaneData = [];
+
+ public void Reset()
+ {
+ UpLaneData = [];
+ DownLaneData = [];
+ LeftLaneData = [];
+ RightLaneData = [];
+ }
+
+ public void SaveChart(string path)
+ {
+ ResourceSaver.Save(this, path);
+ }
+
+ public Array GetLane(ArrowType arrowType)
+ {
+ return arrowType switch
+ {
+ ArrowType.Up => UpLaneData,
+ ArrowType.Down => DownLaneData,
+ ArrowType.Left => LeftLaneData,
+ ArrowType.Right => RightLaneData,
+ _ => throw new ArgumentOutOfRangeException(nameof(arrowType), arrowType, null),
+ };
+ }
+
+ public void RemoveNote(ArrowType type, float beat)
+ {
+ if (beat == 0)
+ return; //All my homies hate beat 0
+ for (int i = 0; i < GetLane(type).Count; i++)
+ {
+ if (Math.Abs(GetLane(type)[i].Beat - beat) > Precision)
+ continue;
+ GetLane(type).RemoveAt(i);
+ return;
+ }
+ }
+
+ public void AddNote(ArrowType type, float beat, float len = 0)
+ {
+ if (beat == 0)
+ return; //All my homies hate beat 0
+ if (GetLane(type).Any(note => Math.Abs(note.Beat - beat) < Precision)) //Fuck it, traverse the whole array.
+ {
+ return;
+ }
+ GetLane(type).Add(new NoteInfo().Create(beat, len));
+ }
+}
diff --git a/Classes/MidiMaestro/NoteChart.cs.uid b/Classes/MidiMaestro/NoteChart.cs.uid
new file mode 100644
index 00000000..51ea474f
--- /dev/null
+++ b/Classes/MidiMaestro/NoteChart.cs.uid
@@ -0,0 +1 @@
+uid://bnpnavb5lwobj
diff --git a/Classes/MidiMaestro/NoteInfo.cs b/Classes/MidiMaestro/NoteInfo.cs
new file mode 100644
index 00000000..17aacd8d
--- /dev/null
+++ b/Classes/MidiMaestro/NoteInfo.cs
@@ -0,0 +1,18 @@
+using System;
+using Godot;
+
+public partial class NoteInfo : Resource
+{
+ [Export]
+ public float Beat;
+
+ [Export]
+ public float Length;
+
+ public NoteInfo Create(float beat = 0, float len = 0)
+ {
+ Beat = beat;
+ Length = len;
+ return this;
+ }
+}
diff --git a/Classes/MidiMaestro/NoteInfo.cs.uid b/Classes/MidiMaestro/NoteInfo.cs.uid
new file mode 100644
index 00000000..017bc56b
--- /dev/null
+++ b/Classes/MidiMaestro/NoteInfo.cs.uid
@@ -0,0 +1 @@
+uid://bhbpcmtr6e6pk
diff --git a/Classes/MidiMaestro/SongTemplate.cs b/Classes/MidiMaestro/SongTemplate.cs
index cea1ba68..9cff9f5d 100644
--- a/Classes/MidiMaestro/SongTemplate.cs
+++ b/Classes/MidiMaestro/SongTemplate.cs
@@ -7,7 +7,7 @@ public struct SongTemplate
{
public string Name;
public readonly string AudioLocation;
- public string MIDILocation;
+ public string SongMapLocation;
public readonly string[] EnemyScenePath;
public SongData SongData;
@@ -15,13 +15,13 @@ public SongTemplate(
SongData songData,
string name = "",
string audioLocation = "",
- string midiLocation = "",
+ string songMapLocation = "",
string[] enemyScenePath = null
)
{
Name = name;
AudioLocation = audioLocation;
- MIDILocation = midiLocation;
+ SongMapLocation = songMapLocation;
SongData = songData;
EnemyScenePath = enemyScenePath;
}
diff --git a/Funk Engine.csproj b/Funk Engine.csproj
index 2eddb4c7..ae20ca2b 100644
--- a/Funk Engine.csproj
+++ b/Funk Engine.csproj
@@ -4,9 +4,6 @@
true
FunkEngine
-
-
-
diff --git a/Globals/Scribe.cs b/Globals/Scribe.cs
index a339e390..e15a8b97 100644
--- a/Globals/Scribe.cs
+++ b/Globals/Scribe.cs
@@ -365,7 +365,7 @@ public partial class Scribe : Node
},
"Song1",
"Audio/Song1.ogg",
- "Audio/Midi/Song1.mid",
+ "Audio/songMaps/Song1.tres",
[P_BossBlood.LoadPath]
),
new SongTemplate(
@@ -377,7 +377,7 @@ public partial class Scribe : Node
},
"Song2",
"Audio/Song2.ogg",
- "Audio/Midi/Song2.mid",
+ "Audio/songMaps/Song2.tres",
[P_Parasifly.LoadPath]
),
new SongTemplate(
@@ -389,7 +389,7 @@ public partial class Scribe : Node
},
"Song2",
"Audio/Song2.ogg",
- "Audio/Midi/Song2.mid",
+ "Audio/songMaps/Song2.tres",
[P_Parasifly.LoadPath, P_Parasifly.LoadPath]
),
new SongTemplate(
@@ -401,7 +401,7 @@ public partial class Scribe : Node
},
"Song3",
"Audio/Song3.ogg",
- "Audio/Midi/Song3.mid",
+ "Audio/songMaps/Song3.tres",
[P_TheGWS.LoadPath]
),
};
diff --git a/Scenes/BattleDirector/BattleScene.tscn b/Scenes/BattleDirector/BattleScene.tscn
index 4e373b4b..647e287b 100644
--- a/Scenes/BattleDirector/BattleScene.tscn
+++ b/Scenes/BattleDirector/BattleScene.tscn
@@ -19,10 +19,9 @@ gradient = SubResource("Gradient_8uy3a")
fill_from = Vector2(1, 0)
fill_to = Vector2(0.738532, 1)
-[node name="ProtoBattleDirector" type="Node2D" node_paths=PackedStringArray("BackgroundRect", "PuppetMarkers", "CD", "CM", "NPB", "Audio", "_focusedButton")]
+[node name="ProtoBattleDirector" type="Node2D" node_paths=PackedStringArray("PuppetMarkers", "CD", "CM", "NPB", "Audio", "_focusedButton")]
process_mode = 1
script = ExtResource("1_jmdo1")
-BackgroundRect = NodePath("BackGround")
PuppetMarkers = [NodePath("PlayerMarker"), NodePath("Enemy1Marker"), NodePath("Enemy2Marker"), NodePath("Enemy3Marker")]
CD = NodePath("Conductor")
CM = NodePath("SubViewport")
diff --git a/Scenes/BattleDirector/Scripts/BattleDirector.cs b/Scenes/BattleDirector/Scripts/BattleDirector.cs
index 6a83124c..b776ca33 100644
--- a/Scenes/BattleDirector/Scripts/BattleDirector.cs
+++ b/Scenes/BattleDirector/Scripts/BattleDirector.cs
@@ -2,7 +2,6 @@
using System.Linq;
using FunkEngine;
using Godot;
-using Melanchall.DryWetMidi.Interaction;
/**BattleDirector: Higher priority director to manage battle effects. Can directly access managers, which should signal up to Director WIP
*/
diff --git a/Scenes/BattleDirector/Scripts/Conductor.cs b/Scenes/BattleDirector/Scripts/Conductor.cs
index 0aa92719..146bba7a 100644
--- a/Scenes/BattleDirector/Scripts/Conductor.cs
+++ b/Scenes/BattleDirector/Scripts/Conductor.cs
@@ -23,7 +23,7 @@ public void Initialize(SongData curSong)
if (_initialized)
return;
- MM = new MidiMaestro(StageProducer.Config.CurSong.MIDILocation);
+ MM = new MidiMaestro(StageProducer.Config.CurSong.SongMapLocation);
CM.ArrowFromInput += ReceiveNoteInput;
CM.Initialize(curSong);
@@ -41,14 +41,9 @@ private void AddInitialNotes()
{
foreach (ArrowType type in Enum.GetValues(typeof(ArrowType)))
{
- foreach (MidiNoteInfo mNote in MM.GetNotes(type))
+ foreach (NoteInfo Note in MM.GetNotes(type))
{
- AddNoteData(
- Scribe.NoteDictionary[0],
- type,
- new Beat((int)mNote.GetStartTimeBeat()),
- mNote.GetDurationBeats()
- );
+ AddNoteData(Scribe.NoteDictionary[0], type, new Beat((int)Note.Beat), Note.Length);
}
}
SpawnInitialNotes();