added virtual serialization methods

the serialization methods are the one that will send the MIDI buyes - either Serial, over AppleMIDI or BLE MIDI
This commit is contained in:
lathoub 2018-11-10 11:33:23 -05:00
parent 6c0b22e2ca
commit c3f40ace79
2 changed files with 93 additions and 56 deletions

View File

@ -5,7 +5,7 @@
#include <BLEUtils.h>
#include <BLEServer.h>
#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]);
getMidiTimestamp(&midiPacket[0], &midiPacket[1]);
midiPacket[2] = (type & 0xf0) | ((channel - 1) & 0x0f);
midiPacket[3] = data1;
pCharacteristic->setValue(midiPacket, 4);
_midiPacket[2] = b1;
// TODO: quid running status
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]);
getMidiTimestamp(&midiPacket[0], &midiPacket[1]);
midiPacket[2] = (type & 0xf0) | ((channel - 1) & 0x0f);
midiPacket[3] = data1;
midiPacket[4] = data2;
pCharacteristic->setValue(midiPacket, 5);
_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()
@ -150,11 +136,6 @@ public:
_disconnectedCallback = fptr;
}
//
void send(MidiType type, DataByte data1, DataByte data2, Channel channel) {
}
};
class MyServerCallbacks: public BLEServerCallbacks {

View File

@ -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:
};
}