diff --git a/Marionette.cs b/Marionette.cs index 835147f..b255761 100644 --- a/Marionette.cs +++ b/Marionette.cs @@ -75,7 +75,7 @@ namespace godotVmcSharp new VmcExtKey(m); break; case "/VMC/Ext/Midi/Note": - MidiNote(m.Data); + new VmcExtMidiNote(m); break; case "/VMC/Ext/Midi/CC/Val": MidiValue(m.Data); @@ -106,42 +106,6 @@ namespace godotVmcSharp break; } } - private void MidiNote(List data) - { - var addr = "/VMC/Ext/Midi/Note"; - if (data[0].Type != 'i') - { - GD.Print(InvalidArgumentType.GetErrorString(addr, "active", 'i', data[0].Type)); - return; - } - if (data[1].Type != 'i') - { - GD.Print(InvalidArgumentType.GetErrorString(addr, "channel", 'i', data[1].Type)); - return; - } - if (data[2].Type != 'i') - { - GD.Print(InvalidArgumentType.GetErrorString(addr, "note", 'i', data[2].Type)); - return; - } - if (data[3].Type != 'f') - { - GD.Print(InvalidArgumentType.GetErrorString(addr, "velocity", 'f', data[4].Type)); - return; - } - switch ((int)data[0].Value) - { - case 0: - GD.Print($"Note event released on channel {(int)data[1].Value} for note {(int)data[2].Value} with velocity {(float)data[3].Value}."); - break; - case 1: - GD.Print($"Note event pressed on channel {(int)data[1].Value} for note {(int)data[2].Value} with velocity {(float)data[3].Value}."); - break; - default: - GD.Print($"Invalid value for \"active\" 'i' argument of {addr}. Expected 0 or 1, received {(int)data[0].Value}"); - return; - } - } private void MidiValue(List data) { var addr = "/VMC/Ext/Midi/CC/Val"; diff --git a/VmcMessages/VmcExtMidiNote.cs b/VmcMessages/VmcExtMidiNote.cs new file mode 100644 index 0000000..a3a0ba0 --- /dev/null +++ b/VmcMessages/VmcExtMidiNote.cs @@ -0,0 +1,64 @@ +/* + godotVmcSharp + Copyright (C) 2023 Cassandra de la Cruz-Munoz + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +using Godot; +using godotOscSharp; + +namespace godotVmcSharp +{ + public class VmcExtMidiNote : VmcMessage + { + public int active { get; } + public int channel { get; } + public int note { get; } + public float velocity { get; } + + public VmcExtMidiNote(godotOscSharp.OscMessage m) : base(m.Address) + { + if (m.Data[0].Type != 'i') + { + GD.Print(InvalidArgumentType.GetErrorString(addr, "active", 'i', m.Data[0].Type)); + return; + } + if (m.Data[1].Type != 'i') + { + GD.Print(InvalidArgumentType.GetErrorString(addr, "channel", 'i', m.Data[1].Type)); + return; + } + if (m.Data[2].Type != 'i') + { + GD.Print(InvalidArgumentType.GetErrorString(addr, "note", 'i', m.Data[2].Type)); + return; + } + if (m.Data[3].Type != 'f') + { + GD.Print(InvalidArgumentType.GetErrorString(addr, "velocity", 'f', m.Data[4].Type)); + return; + } + if ((int)m.Data[0].Value < 0 || (int)m.Data[0].Value > 1) + { + GD.Print($"Invalid value for \"active\" 'i' argument of {addr}. Expected 0 or 1, received {(int)m.Data[0].Value}"); + return; + } + active = (int)m.Data[0].Value; + channel = (int)m.Data[1].Value; + note = (int)m.Data[2].Value; + velocity = (int)m.Data[3].Value; + } + } +} \ No newline at end of file