diff --git a/src/Ble_esp32.h b/src/Ble_esp32.h index ea0592a..ee5b9d8 100644 --- a/src/Ble_esp32.h +++ b/src/Ble_esp32.h @@ -5,7 +5,7 @@ #include #include -#include "AbstractMidiInterface.h" +#include "utility/AbstractMidiInterface.h" using namespace Midi; BEGIN_BLEMIDI_NAMESPACE @@ -20,6 +20,8 @@ protected: bool _connected; + uint8_t _midiPacket[5]; + public: // callbacks void(*_connectedCallback)() = NULL; @@ -72,61 +74,45 @@ protected: *timestamp = (currentTimeStamp & 0x7F) | 0x80; // 7 bits plus MSB } - void sendChannelMessage1(byte type, byte channel, byte data1) + void serialize(DataByte b1) { - uint8_t midiPacket[4]; + getMidiTimestamp(&_midiPacket[0], &_midiPacket[1]); + + _midiPacket[2] = b1; + + // TODO: quid running status - getMidiTimestamp(&midiPacket[0], &midiPacket[1]); - midiPacket[2] = (type & 0xf0) | ((channel - 1) & 0x0f); - midiPacket[3] = data1; - pCharacteristic->setValue(midiPacket, 4); + pCharacteristic->setValue(_midiPacket, 3); pCharacteristic->notify(); - } + }; - void sendChannelMessage2(byte type, byte channel, byte data1, byte data2) + void serialize(DataByte b1, DataByte b2) { - uint8_t midiPacket[5]; - - getMidiTimestamp(&midiPacket[0], &midiPacket[1]); - midiPacket[2] = (type & 0xf0) | ((channel - 1) & 0x0f); - midiPacket[3] = data1; - midiPacket[4] = data2; - pCharacteristic->setValue(midiPacket, 5); + getMidiTimestamp(&_midiPacket[0], &_midiPacket[1]); + + _midiPacket[2] = b1; + _midiPacket[3] = b2; + + // TODO: quid running status + + pCharacteristic->setValue(_midiPacket, 4); pCharacteristic->notify(); - } + }; - void sendSystemCommonMessage1(byte type, byte data1) + void serialize(DataByte b1, DataByte b2, DataByte b3) { - uint8_t midiPacket[4]; + getMidiTimestamp(&_midiPacket[0], &_midiPacket[1]); - getMidiTimestamp(&midiPacket[0], &midiPacket[1]); - midiPacket[2] = type; - midiPacket[3] = data1; - pCharacteristic->setValue(midiPacket, 4); + _midiPacket[2] = b1; + _midiPacket[3] = b2; + _midiPacket[4] = b3; + + // TODO: quid running status + + pCharacteristic->setValue(_midiPacket, 5); pCharacteristic->notify(); - } - - void sendSystemCommonMessage2(byte type, byte data1, byte data2) - { - uint8_t midiPacket[5]; - - getMidiTimestamp(&midiPacket[0], &midiPacket[1]); - midiPacket[2] = type; - midiPacket[3] = data1; - midiPacket[4] = data2; - pCharacteristic->setValue(midiPacket, 5); - pCharacteristic->notify(); - } - - void sendRealTimeMessage(byte type) - { - uint8_t midiPacket[3]; - - getMidiTimestamp(&midiPacket[0], &midiPacket[1]); - midiPacket[2] = type; - pCharacteristic->setValue(midiPacket, 3); - pCharacteristic->notify(); - } + }; + public: BleMidiInterface() @@ -149,12 +135,7 @@ public: _connected = false; _disconnectedCallback = fptr; } - - // - void send(MidiType type, DataByte data1, DataByte data2, Channel channel) { - - } - + }; class MyServerCallbacks: public BLEServerCallbacks { diff --git a/src/utility/AbstractMidiInterface.h b/src/utility/AbstractMidiInterface.h index 316d350..8825435 100644 --- a/src/utility/AbstractMidiInterface.h +++ b/src/utility/AbstractMidiInterface.h @@ -68,7 +68,7 @@ typedef byte MIDI_VELOCITY; typedef byte MIDI_PRESSURE; /*! Enumeration of MIDI types */ -enum class MidiType +enum MidiType : uint8_t { InvalidType = 0x00, ///< For notifying errors NoteOff = 0x80, ///< Note Off @@ -110,7 +110,7 @@ struct Thru See the detailed controllers numbers & description here: http://www.somascape.org/midi/tech/spec.html#ctrlnums */ -enum class MidiControlChangeNumber +enum MidiControlChangeNumber : uint8_t { // High resolution Continuous Controllers MSB (+32 for LSB) ---------------- BankSelect = 0, @@ -212,6 +212,13 @@ static MidiType getTypeFromStatusByte(byte status) return MidiType(status); } +/*! \brief Returns type + channel + */ +static StatusByte getStatus(MidiType type, Channel channel) +{ + return ( type & 0xf0) | ((channel - 1) & 0x0f); +} + /*! \brief Returns channel in the range 1-16 */ static Channel getChannelFromStatusByte(byte status) @@ -400,8 +407,57 @@ public: } protected: - // this method needs to be overwritten to add the specific Serial, BLE or AppleMIDI serializers - virtual void send(MidiType type, DataByte data1, DataByte data2, Channel channel) = 0; + // Channel messages + virtual void send(MidiType type, DataByte data1, DataByte data2, Channel channel) + { + // Then test if channel is valid + if (channel >= MIDI_CHANNEL_OFF || + channel == MIDI_CHANNEL_OMNI || + type < 0x80) + { + return; // Don't send anything + } + + if (type <= MidiType::PitchBend) // Channel messages + { + // Protection: remove MSBs on data + data1 &= 0x7f; + data2 &= 0x7f; + + const StatusByte status = getStatus(type, channel); + + if (type != MidiType::ProgramChange && type != MidiType::AfterTouchChannel) + { + serialize(status, data1, data2); + } + else + { + serialize(status, data1); + } + } + else if (type >= MidiType::Clock && type <= MidiType::SystemReset) + { + serialize(type); // System Real-time and 1 byte. + } + } + + // SystemCommon message + virtual void send(MidiType type, DataByte data1, DataByte data2) + { + + } + + // realTime + virtual void send(MidiType type) + { + + } + + virtual void serialize(DataByte) = 0; + virtual void serialize(DataByte, DataByte) = 0; + virtual void serialize(DataByte, DataByte, DataByte) = 0; + +protected: }; }