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:
parent
6c0b22e2ca
commit
c3f40ace79
|
|
@ -5,7 +5,7 @@
|
||||||
#include <BLEUtils.h>
|
#include <BLEUtils.h>
|
||||||
#include <BLEServer.h>
|
#include <BLEServer.h>
|
||||||
|
|
||||||
#include "AbstractMidiInterface.h"
|
#include "utility/AbstractMidiInterface.h"
|
||||||
using namespace Midi;
|
using namespace Midi;
|
||||||
|
|
||||||
BEGIN_BLEMIDI_NAMESPACE
|
BEGIN_BLEMIDI_NAMESPACE
|
||||||
|
|
@ -20,6 +20,8 @@ protected:
|
||||||
|
|
||||||
bool _connected;
|
bool _connected;
|
||||||
|
|
||||||
|
uint8_t _midiPacket[5];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// callbacks
|
// callbacks
|
||||||
void(*_connectedCallback)() = NULL;
|
void(*_connectedCallback)() = NULL;
|
||||||
|
|
@ -72,61 +74,45 @@ protected:
|
||||||
*timestamp = (currentTimeStamp & 0x7F) | 0x80; // 7 bits plus MSB
|
*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]);
|
pCharacteristic->setValue(_midiPacket, 3);
|
||||||
midiPacket[2] = (type & 0xf0) | ((channel - 1) & 0x0f);
|
|
||||||
midiPacket[3] = data1;
|
|
||||||
pCharacteristic->setValue(midiPacket, 4);
|
|
||||||
pCharacteristic->notify();
|
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] = b1;
|
||||||
midiPacket[2] = (type & 0xf0) | ((channel - 1) & 0x0f);
|
_midiPacket[3] = b2;
|
||||||
midiPacket[3] = data1;
|
|
||||||
midiPacket[4] = data2;
|
// TODO: quid running status
|
||||||
pCharacteristic->setValue(midiPacket, 5);
|
|
||||||
|
pCharacteristic->setValue(_midiPacket, 4);
|
||||||
pCharacteristic->notify();
|
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] = b1;
|
||||||
midiPacket[2] = type;
|
_midiPacket[3] = b2;
|
||||||
midiPacket[3] = data1;
|
_midiPacket[4] = b3;
|
||||||
pCharacteristic->setValue(midiPacket, 4);
|
|
||||||
|
// TODO: quid running status
|
||||||
|
|
||||||
|
pCharacteristic->setValue(_midiPacket, 5);
|
||||||
pCharacteristic->notify();
|
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:
|
public:
|
||||||
BleMidiInterface()
|
BleMidiInterface()
|
||||||
|
|
@ -149,12 +135,7 @@ public:
|
||||||
_connected = false;
|
_connected = false;
|
||||||
_disconnectedCallback = fptr;
|
_disconnectedCallback = fptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
void send(MidiType type, DataByte data1, DataByte data2, Channel channel) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class MyServerCallbacks: public BLEServerCallbacks {
|
class MyServerCallbacks: public BLEServerCallbacks {
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ typedef byte MIDI_VELOCITY;
|
||||||
typedef byte MIDI_PRESSURE;
|
typedef byte MIDI_PRESSURE;
|
||||||
|
|
||||||
/*! Enumeration of MIDI types */
|
/*! Enumeration of MIDI types */
|
||||||
enum class MidiType
|
enum MidiType : uint8_t
|
||||||
{
|
{
|
||||||
InvalidType = 0x00, ///< For notifying errors
|
InvalidType = 0x00, ///< For notifying errors
|
||||||
NoteOff = 0x80, ///< Note Off
|
NoteOff = 0x80, ///< Note Off
|
||||||
|
|
@ -110,7 +110,7 @@ struct Thru
|
||||||
See the detailed controllers numbers & description here:
|
See the detailed controllers numbers & description here:
|
||||||
http://www.somascape.org/midi/tech/spec.html#ctrlnums
|
http://www.somascape.org/midi/tech/spec.html#ctrlnums
|
||||||
*/
|
*/
|
||||||
enum class MidiControlChangeNumber
|
enum MidiControlChangeNumber : uint8_t
|
||||||
{
|
{
|
||||||
// High resolution Continuous Controllers MSB (+32 for LSB) ----------------
|
// High resolution Continuous Controllers MSB (+32 for LSB) ----------------
|
||||||
BankSelect = 0,
|
BankSelect = 0,
|
||||||
|
|
@ -212,6 +212,13 @@ static MidiType getTypeFromStatusByte(byte status)
|
||||||
return MidiType(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
|
/*! \brief Returns channel in the range 1-16
|
||||||
*/
|
*/
|
||||||
static Channel getChannelFromStatusByte(byte status)
|
static Channel getChannelFromStatusByte(byte status)
|
||||||
|
|
@ -400,8 +407,57 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// this method needs to be overwritten to add the specific Serial, BLE or AppleMIDI serializers
|
// Channel messages
|
||||||
virtual void send(MidiType type, DataByte data1, DataByte data2, Channel channel) = 0;
|
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:
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue