MIDI-Synthesizer/Project/MIDI_Synthesizer.gd
2025-04-15 11:57:16 -07:00

67 lines
1.8 KiB
GDScript

extends Control
@export var BPM: float = 140
@export var BeatsInAMeasure: int = 4
var InternalCounter: float = 0
var CurrentNote: int = 0
@export var NoteScene: PackedScene
@export var Path: NodePath
@export_subgroup("sounds")
var CurrentInstrument = 0
@export var PianoSounds: Array[AudioStreamOggVorbis]
@export var PianoNames: Array[String]
# GUI functions above
func _on_exit_pressed():
get_tree().quit()
func _on_bpm_input_text_changed(new_text):
BPM = float(new_text)
func _on_measures_text_changed(new_text):
BeatsInAMeasure = int(new_text)
var children = get_node("ScrollContainer/VBoxContainer").get_children()
# Remove everything
for i in children:
if i.name != "Line":
i.free()
# once the notes were removed, we put the notes again.
ChangeInstrument(CurrentInstrument)
CurrentNote = 0
# These are the instrument functions
func _ready():
ChangeInstrument(0)
func _process(delta):
InternalCounter = InternalCounter + delta
if InternalCounter >= (60 / BPM) / 4:
InternalCounter = 0
# move the funny line
CurrentNote = CurrentNote + 1
if CurrentNote == BeatsInAMeasure * 16:
CurrentNote = 0
get_node(Path).position = Vector2(0 + (CurrentNote * 25), 0)
func ChangeInstrument(index: int):
CurrentInstrument = index
match index:
# Piano
0:
var newArray = PianoNames.duplicate()
for i in PianoSounds:
var thing = NoteScene.instantiate()
var counter = 0
thing.SetLabel(newArray.pop_front())
while BeatsInAMeasure * 4 != counter:
thing.AddSection(i)
counter = counter + 1
get_node("ScrollContainer/VBoxContainer").add_child(thing)
var sized = get_node("ScrollContainer/VBoxContainer").get_child_count()
if sized != null:
get_node(Path).scale = Vector2(1, 25 * sized)
func _on_line_area_entered(area):
area.get_parent().get_node("Audio").play()