diff --git a/.github/workflows/platformio.yml b/.github/workflows/platformio.yml index b4f4891e..b99452e6 100644 --- a/.github/workflows/platformio.yml +++ b/.github/workflows/platformio.yml @@ -24,6 +24,8 @@ jobs: - RPN_NRPN - SimpleSynth - CustomBaudRate + - CustomMIDIsettings + - CustomMIDIandSerial board: - uno - due diff --git a/examples/CustomBaudRate/CustomBaudRate.ino b/examples/CustomBaudRate/CustomBaudRate.ino index d554871d..b22fcf80 100644 --- a/examples/CustomBaudRate/CustomBaudRate.ino +++ b/examples/CustomBaudRate/CustomBaudRate.ino @@ -2,17 +2,15 @@ // Override the default MIDI baudrate to // a decoding program such as Hairless MIDI (set baudrate to 115200) -struct CustomBaudRateSettings : public MIDI_NAMESPACE::DefaultSerialSettings { +struct CustomSerialSettings : public MIDI_NAMESPACE::DefaultSerialSettings { static const long BaudRate = 115200; }; #if defined(ARDUINO_SAM_DUE) || defined(USBCON) || defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MKL26Z64__) // Leonardo, Due and other USB boards use Serial1 by default. - MIDI_NAMESPACE::SerialMIDI serialMIDI(Serial1); - MIDI_NAMESPACE::MidiInterface> MIDI((MIDI_NAMESPACE::SerialMIDI&)serialMIDI); + MIDI_CREATE_CUSTOMSERIAL_INSTANCE(HardwareSerial, Serial1, MIDI, CustomSerialSettings) #else - MIDI_NAMESPACE::SerialMIDI serialMIDI(Serial); - MIDI_NAMESPACE::MidiInterface> MIDI((MIDI_NAMESPACE::SerialMIDI&)serialMIDI); + MIDI_CREATE_CUSTOMSERIAL_INSTANCE(HardwareSerial, Serial, MIDI, CustomSerialSettings) #endif void setup() { diff --git a/examples/CustomMIDIandSerial/CustomMIDIandSerial.ino b/examples/CustomMIDIandSerial/CustomMIDIandSerial.ino new file mode 100644 index 00000000..f2e9a331 --- /dev/null +++ b/examples/CustomMIDIandSerial/CustomMIDIandSerial.ino @@ -0,0 +1,36 @@ +#include + +// Disable the default Use1ByteParsing +struct CustomMIDISettings : public MIDI_NAMESPACE::DefaultSettings { + static const bool Use1ByteParsing = false; +}; + +// Override the default MIDI baudrate to +// a decoding program such as Hairless MIDI (set baudrate to 115200) +struct CustomSerialSettings : public MIDI_NAMESPACE::DefaultSerialSettings { + static const long BaudRate = 115200; +}; + + +#if defined(ARDUINO_SAM_DUE) || defined(USBCON) || defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MKL26Z64__) + // Leonardo, Due and other USB boards use Serial1 by default. + MIDI_CREATE_SPECIAL_INSTANCE(HardwareSerial, Serial1, MIDI, CustomMIDISettings, CustomSerialSettings) +#else + MIDI_CREATE_SPECIAL_INSTANCE(HardwareSerial, Serial, MIDI, CustomMIDISettings, CustomSerialSettings) +#endif + +void setup() { + pinMode(LED_BUILTIN, OUTPUT); + MIDI.begin(MIDI_CHANNEL_OMNI); +} + +void loop() { + if (MIDI.read()) // If we have received a message + { + digitalWrite(LED_BUILTIN, HIGH); + MIDI.sendNoteOn(42, 127, 1); // Send a Note (pitch 42, velo 127 on channel 1) + delay(1000); // Wait for a second + MIDI.sendNoteOff(42, 0, 1); // Stop the note + digitalWrite(LED_BUILTIN, LOW); + } +} \ No newline at end of file diff --git a/examples/CustomMIDIsettings/CustomMIDIsettings.ino b/examples/CustomMIDIsettings/CustomMIDIsettings.ino new file mode 100644 index 00000000..881eb06c --- /dev/null +++ b/examples/CustomMIDIsettings/CustomMIDIsettings.ino @@ -0,0 +1,29 @@ +#include + +// Disable the default Use1ByteParsing +struct CustomMIDISettings : public MIDI_NAMESPACE::DefaultSettings { + static const bool Use1ByteParsing = false; +}; + +#if defined(ARDUINO_SAM_DUE) || defined(USBCON) || defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MKL26Z64__) + // Leonardo, Due and other USB boards use Serial1 by default. + MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial1, MIDI, CustomMIDISettings) +#else + MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial, MIDI, CustomMIDISettings) +#endif + +void setup() { + pinMode(LED_BUILTIN, OUTPUT); + MIDI.begin(MIDI_CHANNEL_OMNI); +} + +void loop() { + if (MIDI.read()) // If we have received a message + { + digitalWrite(LED_BUILTIN, HIGH); + MIDI.sendNoteOn(42, 127, 1); // Send a Note (pitch 42, velo 127 on channel 1) + delay(1000); // Wait for a second + MIDI.sendNoteOff(42, 0, 1); // Stop the note + digitalWrite(LED_BUILTIN, LOW); + } +} diff --git a/keywords.txt b/keywords.txt index 845d7987..5bc077ba 100644 --- a/keywords.txt +++ b/keywords.txt @@ -10,6 +10,7 @@ MIDI KEYWORD1 MIDI.h KEYWORD1 MidiInterface KEYWORD1 DefaultSettings KEYWORD1 +DefaultSerialSettings KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) diff --git a/src/serialMIDI.h b/src/serialMIDI.h index e69e9b2d..e1316cc7 100644 --- a/src/serialMIDI.h +++ b/src/serialMIDI.h @@ -98,6 +98,20 @@ class SerialMIDI END_MIDI_NAMESPACE +/*! \brief Create an instance of the library attached to a serial port + with overwritten MIDI & Serial Settings + */ +#define MIDI_CREATE_SPECIAL_INSTANCE(Type, SerialPort, Name, CustomMIDISettings, CustomSerialSettings) \ + MIDI_NAMESPACE::SerialMIDI serial##Name(SerialPort); \ + MIDI_NAMESPACE::MidiInterface, CustomMIDISettings> Name((MIDI_NAMESPACE::SerialMIDI&)serial##Name); + +/*! \brief Create an instance of the library attached to a serial port + with overwritten Serial Settings + */ +#define MIDI_CREATE_CUSTOMSERIAL_INSTANCE(Type, SerialPort, Name, CustomSerialSettings) \ + MIDI_NAMESPACE::SerialMIDI serial##Name(SerialPort); \ + MIDI_NAMESPACE::MidiInterface> Name((MIDI_NAMESPACE::SerialMIDI&)serial##Name); + /*! \brief Create an instance of the library attached to a serial port. You can use HardwareSerial or SoftwareSerial for the serial port. Example: MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, midi2); @@ -125,6 +139,6 @@ END_MIDI_NAMESPACE @see DefaultSettings @see MIDI_CREATE_INSTANCE */ -#define MIDI_CREATE_CUSTOM_INSTANCE(Type, SerialPort, Name, Settings) \ +#define MIDI_CREATE_CUSTOM_INSTANCE(Type, SerialPort, Name, CustomMIDISettings) \ MIDI_NAMESPACE::SerialMIDI serial##Name(SerialPort);\ - MIDI_NAMESPACE::MidiInterface, Settings> Name((MIDI_NAMESPACE::SerialMIDI&)serial##Name); + MIDI_NAMESPACE::MidiInterface, CustomMIDISettings> Name((MIDI_NAMESPACE::SerialMIDI&)serial##Name);