Make WebMIDI optional, MIDI for multiplayer

We now only open MIDI by default on non-Web platforms. On web, there is
an extra button to open MIDI devices. This allows us to no longer pester
users with the "allow MIDI" popup when they don't want to use MIDI.

If MIDI devices have been opened, the multiplayer part of this project
now uses it as well, in the same way the "singleplayer" part does it.
This commit is contained in:
Sebastian Lohff 2025-04-24 15:39:58 +02:00
parent cfddacb278
commit 807d9e2b0f
3 changed files with 34 additions and 4 deletions

View File

@ -32,6 +32,12 @@ func _ready():
playback = $Player.get_stream_playback() playback = $Player.get_stream_playback()
fill_buffer() fill_buffer()
if OS.get_name() != "Web":
OS.open_midi_inputs()
print(OS.get_connected_midi_inputs())
else:
%MidiButton.visible = true
if multiplayer_enabled: if multiplayer_enabled:
%MultiplayerButton.visible = true %MultiplayerButton.visible = true
@ -39,10 +45,6 @@ func _ready():
print("Direct connect to external freq: ", Utils.get_external_freq_param()) print("Direct connect to external freq: ", Utils.get_external_freq_param())
_on_multiplayer_button_pressed() _on_multiplayer_button_pressed()
# FIXME: make this dependent on button
OS.open_midi_inputs()
print(OS.get_connected_midi_inputs())
func set_morse_state(state: bool): func set_morse_state(state: bool):
MorseState.set_state(state) MorseState.set_state(state)
morse_state = state morse_state = state
@ -163,3 +165,8 @@ func _on_reset_button_pressed() -> void:
func _on_multiplayer_button_pressed() -> void: func _on_multiplayer_button_pressed() -> void:
get_tree().change_scene_to_file("res://scenes/MultiplayerConnect.tscn") get_tree().change_scene_to_file("res://scenes/MultiplayerConnect.tscn")
func _on_midi_button_pressed() -> void:
OS.open_midi_inputs()
print(OS.get_connected_midi_inputs())

View File

@ -64,6 +64,14 @@ text = "Save Wav"
layout_mode = 2 layout_mode = 2
size_flags_vertical = 3 size_flags_vertical = 3
[node name="MidiButton" type="Button" parent="VBoxContainer/HBoxContainer"]
unique_name_in_owner = true
visible = false
layout_mode = 2
size_flags_stretch_ratio = 0.25
text = "Open
Midi"
[node name="ResetButton" type="Button" parent="VBoxContainer/HBoxContainer"] [node name="ResetButton" type="Button" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
@ -89,5 +97,6 @@ script = ExtResource("3_sugp2")
[connection signal="button_down" from="VBoxContainer/MorseButton" to="." method="_on_morse_button_down"] [connection signal="button_down" from="VBoxContainer/MorseButton" to="." method="_on_morse_button_down"]
[connection signal="button_up" from="VBoxContainer/MorseButton" to="." method="_on_morse_button_up"] [connection signal="button_up" from="VBoxContainer/MorseButton" to="." method="_on_morse_button_up"]
[connection signal="pressed" from="VBoxContainer/WavButton" to="." method="_on_wav_button_pressed"] [connection signal="pressed" from="VBoxContainer/WavButton" to="." method="_on_wav_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/MidiButton" to="." method="_on_midi_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ResetButton" to="." method="_on_reset_button_pressed"] [connection signal="pressed" from="VBoxContainer/HBoxContainer/ResetButton" to="." method="_on_reset_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/MultiplayerButton" to="." method="_on_multiplayer_button_pressed"] [connection signal="pressed" from="VBoxContainer/HBoxContainer/MultiplayerButton" to="." method="_on_multiplayer_button_pressed"]

View File

@ -225,6 +225,20 @@ func _on_morse_button_button_up() -> void:
return return
set_morse_state(false) set_morse_state(false)
func _input(input_event):
if input_event is InputEventMIDI:
_process_midi_event(input_event)
func _process_midi_event(midi_event):
if not mmb_self:
return
if midi_event.channel in [0, 9]:
if midi_event.message == MIDI_MESSAGE_NOTE_ON:
set_morse_state(true)
elif midi_event.message == MIDI_MESSAGE_NOTE_OFF:
set_morse_state(false)
func _on_leave_button_pressed() -> void: func _on_leave_button_pressed() -> void:
send_data({"cmd": "leave"}) send_data({"cmd": "leave"})