caneen/node_2d.gd

132 lines
4.3 KiB
GDScript3
Raw Permalink Normal View History

2024-01-12 04:07:11 +01:00
extends Node2D
# https://docs.godotengine.org/en/stable/classes/class_inputeventmidi.html
# https://docs.godotengine.org/en/stable/classes/class_%40globalscope.html#enum-globalscope-midimessage
2024-02-02 02:59:23 +01:00
# if >0: print midi event to the console (1 for minimal logs, 2 for more logs)
# if =0: the program acts normally
const debug := 0
# load config values
var spin_channel_1 = Config.spin_channel_1
var spin_note_1 = Config.spin_note_1
var spin_channel_2 = Config.spin_channel_2
var spin_note_2 = Config.spin_note_2
var jog_channel = Config.jog_channel
var jog_note = Config.jog_note
var beat_channel = Config.beat_channel
var beat_note = Config.beat_note
var is_inverted = Config.is_inverted
# init control values
var midi_beat: bool = false
var midi_jog: bool = false
var midi_turnleft: bool = false
var midi_turnright: bool = false
var left: int = 1
var right: int = 127
2024-01-12 04:07:11 +01:00
# Called when the node enters the scene tree for the first time.
func _ready():
2024-02-02 02:59:23 +01:00
# fix midi values (the game adds one to the channel number)
spin_channel_1 -= 1
spin_channel_2 -= 1
jog_channel -= 1
beat_channel -= 1
# handle inverted turntable (must invert left and right values)
if is_inverted:
left = 127
right = 1
print("inverted!")
# connect to the midi turntable
2024-01-12 04:07:11 +01:00
OS.open_midi_inputs()
print(OS.get_connected_midi_inputs())
2024-02-02 02:59:23 +01:00
func _unhandled_input(input_event):
if input_event is InputEventKey:
if input_event.keycode == KEY_ESCAPE:
2024-01-12 04:07:11 +01:00
get_tree().quit()
2024-02-02 02:59:23 +01:00
if input_event is InputEventMIDI:
if debug > 0:
_print_midi_info(input_event)
2024-02-11 03:36:28 +01:00
# animate a beat
2024-02-10 00:35:42 +01:00
if !midi_beat and input_event.channel == beat_channel and ((input_event.pitch == beat_note and input_event.velocity == 127) or input_event.controller_number == 10):
if !midi_beat:
$beat/AnimationPlayer.play("beat")
2024-02-02 02:59:23 +01:00
midi_beat = true
2024-02-11 03:36:28 +01:00
elif input_event.channel == beat_channel and ((input_event.pitch == beat_note and input_event.velocity == 0) or input_event.controller_number == 9):
2024-02-10 00:35:42 +01:00
if midi_beat:
2024-02-11 03:36:28 +01:00
$beat/AnimationPlayer.play("RESET")
2024-02-02 02:59:23 +01:00
midi_beat = false
2024-02-11 03:36:28 +01:00
# animate a grabbed jog
2024-02-02 02:59:23 +01:00
if input_event.channel == jog_channel and ((input_event.pitch == jog_note and input_event.velocity == 127) or input_event.controller_number == spin_note_1):
2024-02-10 00:35:42 +01:00
if !midi_jog:
$jog/AnimationPlayer.play("jog")
2024-02-02 02:59:23 +01:00
midi_jog = true
2024-02-11 03:36:28 +01:00
elif input_event.channel == jog_channel and ((input_event.pitch == jog_note and input_event.velocity == 0) or input_event.controller_number == spin_note_2):
2024-02-10 00:35:42 +01:00
if midi_jog:
2024-02-11 03:36:28 +01:00
$jog/AnimationPlayer.play("RESET")
2024-02-02 02:59:23 +01:00
midi_jog = false
2024-02-11 03:36:28 +01:00
# animate a moving jog
2024-02-02 02:59:23 +01:00
if (input_event.channel == spin_channel_1 or input_event.channel == spin_channel_2) and input_event.controller_value == left:
2024-02-11 03:36:28 +01:00
$jog/AnimationPlayer.play("move")
2024-02-02 02:59:23 +01:00
midi_turnleft = true
2024-02-11 03:36:28 +01:00
elif (input_event.channel == spin_channel_1 or input_event.channel == spin_channel_2) and input_event.controller_value == right:
$jog/AnimationPlayer.play_backwards("move")
2024-02-02 02:59:23 +01:00
midi_turnright = true
func _print_midi_info(midi_event: InputEventMIDI):
print(midi_event)
if debug > 1:
print("Channel " + str(midi_event.channel))
print("Message " + str(midi_event.message))
print("Pitch " + str(midi_event.pitch))
print("Velocity " + str(midi_event.velocity))
print("Instrument " + str(midi_event.instrument))
print("Pressure " + str(midi_event.pressure))
print("Controller number: " + str(midi_event.controller_number))
print("Controller value: " + str(midi_event.controller_value))
2024-01-12 04:07:11 +01:00
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta):
2024-02-02 02:59:23 +01:00
if debug == 0:
# process inputs
if Input.is_action_pressed("quit"):
# exit the software
get_tree().quit()
if Input.is_action_pressed("left") or midi_beat:
# trigger the left controller
print("left")
if Input.is_action_pressed("right") or midi_jog:
# trigger the right controller
print("right")
if midi_turnleft:
# trigger the left controller
print("turn left")
if midi_turnright:
# trigger the right controller
print("turn right")
2024-01-12 04:07:11 +01:00
2024-02-11 03:36:28 +01:00
if !midi_turnleft and !midi_turnright:
if !midi_jog:
$jog/AnimationPlayer.play("RESET")
2024-02-02 02:59:23 +01:00
# reset the turn values before the next cycle
# needed because it can't be turned to false in the _unhandled_input function
# because apparently there is no MIDI command sended for that .___.
midi_turnleft = false
midi_turnright = false