23 #define MAX_MIDI_MESSAGE_SIZE 256 // Max message size. SysEx can be up to 65536 but 256 should be fine for most usage 41 #define CABLE_NUM (0<<4) 54 MIDIMessage() : data(
new uint8_t[MAX_MIDI_MESSAGE_SIZE + 1]), length(0) {}
56 MIDIMessage(uint8_t *buf) : data(
new uint8_t[MAX_MIDI_MESSAGE_SIZE + 1]), length(0)
58 for (
int i = 0; i < 4; i++) {
76 length = other.length;
77 for (
int i = 0; i < length; i++) {
78 data[i] = other.data[i];
98 if (length > MAX_MIDI_MESSAGE_SIZE) {
105 data[0] = CABLE_NUM | 0x08;
107 for (
int i = 0; i < buf_len; i++) {
108 data[i + 1] = buf[i];
123 msg.data[0] = CABLE_NUM | 0x08;
124 msg.data[1] = 0x80 | (
channel & 0x0F);
125 msg.data[2] = key & 0x7F;
140 msg.data[0] = CABLE_NUM | 0x09;
141 msg.data[1] = 0x90 | (
channel & 0x0F);
142 msg.data[2] = key & 0x7F;
157 msg.data[0] = CABLE_NUM | 0x0A;
158 msg.data[1] = 0xA0 | (
channel & 0x0F);
159 msg.data[2] = key & 0x7F;
160 msg.data[3] = pressure & 0x7F;
174 msg.data[0] = CABLE_NUM | 0x0B;
175 msg.data[1] = 0xB0 | (
channel & 0x0F);
176 msg.data[2] = control & 0x7F;
177 msg.data[3] = value & 0x7F;
190 msg.data[0] = CABLE_NUM | 0x0C;
191 msg.data[1] = 0xC0 | (
channel & 0x0F);
192 msg.data[2] = program & 0x7F;
206 msg.data[0] = CABLE_NUM | 0x0D;
207 msg.data[1] = 0xD0 | (
channel & 0x0F);
208 msg.data[2] = pressure & 0x7F;
222 int p =
pitch + 8192;
223 msg.data[0] = CABLE_NUM | 0x0E;
224 msg.data[1] = 0xE0 | (
channel & 0x0F);
225 msg.data[2] = p & 0x7F;
226 msg.data[3] = (p >> 7) & 0x7F;
259 PolyphonicAftertouchType,
262 ChannelAftertouchType,
264 ResetAllControllersType,
277 switch ((data[1] >> 4) & 0xF) {
283 message_type = NoteOffType;
290 message_type = NoteOnType;
297 message_type = PolyphonicAftertouchType;
303 if ((data[2] & 0x7F) < 120) {
304 message_type = ControlChangeType;
305 }
else if ((data[2] & 0x7F) == 121) {
306 message_type = ResetAllControllersType;
307 }
else if ((data[2] & 0x7F) == 123) {
308 message_type = AllNotesOffType;
310 message_type = ErrorType;
317 message_type = ProgramChangeType;
323 message_type = ChannelAftertouchType;
330 message_type = PitchWheelType;
334 message_type = SysExType;
337 message_type = ErrorType;
342 if (length < min_size) {
344 message_type = ErrorType;
357 return (data[1] & 0x0F);
368 if ((msg_type != NoteOffType) &&
369 (msg_type != NoteOnType) &&
370 (msg_type != PolyphonicAftertouchType)) {
374 return data[2] & 0x7F;
385 if ((msg_type != NoteOffType) &&
386 (msg_type != NoteOnType)) {
390 return data[3] & 0x7F;
401 if ((msg_type != ControlChangeType) &&
402 (msg_type != ResetAllControllersType) &&
403 (msg_type != AllNotesOffType)) {
407 return data[3] & 0x7F;
418 if ((msg_type != PolyphonicAftertouchType) &&
419 (msg_type != ChannelAftertouchType)) {
423 if (
type() == PolyphonicAftertouchType) {
424 return data[3] & 0x7F;
426 return data[2] & 0x7F;
438 if ((msg_type != ControlChangeType) &&
439 (msg_type != ResetAllControllersType) &&
440 (msg_type != AllNotesOffType)) {
444 return data[2] & 0x7F;
455 if (msg_type != ProgramChangeType) {
459 return data[2] & 0x7F;
470 if (msg_type != PitchWheelType) {
474 int p = ((data[3] & 0x7F) << 7) | (data[2] & 0x7F);
MIDIMessageType type()
Read the message type.
static MIDIMessage NoteOn(int key, int velocity=127, int channel=0)
Create a NoteOn message.
static MIDIMessage ProgramChange(int program, int channel=0)
Create a Program Change message.
int controller()
Read the controller number.
static MIDIMessage NoteOff(int key, int velocity=127, int channel=0)
Create a NoteOff message.
static MIDIMessage AllNotesOff(int channel=0)
Create an All Notes Off message.
static MIDIMessage SysEx(uint8_t *data, int len)
Create a SysEx message.
int pressure()
Read the aftertouch pressure.
static MIDIMessage ControlChange(int control, int value, int channel=0)
Create a Control Change message.
int key()
Read the key ID.
int channel()
Read the channel number.
static MIDIMessage ChannelAftertouch(int pressure, int channel=0)
Create a Channel Aftertouch message.
void from_raw(uint8_t *buf, int buf_len)
Set this MIDIMessage to a raw MIDI message.
MIDIMessage & operator=(const MIDIMessage &other)
Assignment operator.
A MIDI message container.
static MIDIMessage PitchWheel(int pitch=0, int channel=0)
Create a Pitch Wheel message.
static MIDIMessage PolyphonicAftertouch(int key, int pressure, int channel=0)
Create a PolyPhonic Aftertouch message.
int program()
Read the program number.
int value()
Read the controller value.
int pitch()
Read the pitch value.
int velocity()
Read the velocity.
MIDIMessageType
MIDI Message Types.
MIDIMessage(const MIDIMessage &other)
Copy constructor.