OpenWareLaboratory
MidiMessage.h
Go to the documentation of this file.
1 #ifndef _MidiMessage_h_
2 #define _MidiMessage_h_
3 
4 #include "MidiStatus.h"
5 
6 class MidiMessage {
7  public:
8  union {
9  uint32_t packed;
10  uint8_t data[4];
11  };
13  MidiMessage(uint32_t msg): packed(msg){}
14  MidiMessage(uint8_t port, uint8_t d0, uint8_t d1, uint8_t d2){
15  data[0] = port;
16  data[1] = d0;
17  data[2] = d1;
18  data[3] = d2;
19  }
20  uint8_t getPort(){
21  return data[0] >> 4;
22  }
23  uint8_t getChannel(){
24  return (data[1] & MIDI_CHANNEL_MASK);
25  }
26  uint8_t getStatus(){
27  return (data[1] & MIDI_STATUS_MASK);
28  }
29  uint8_t getSize(){
30  uint8_t sz;
31  switch(data[0] & 0x0f){
34  sz = 1;
35  break;
40  sz = 2;
41  break;
47  case USB_COMMAND_SYSEX:
50  sz = 3;
51  break;
52  case USB_COMMAND_MISC:
54  default:
55  sz = 0;
56  break;
57  }
58  return sz;
59  }
60  uint8_t getNote(){
61  return data[2];
62  }
63  uint8_t getVelocity(){
64  return data[3];
65  }
67  return data[2];
68  }
69  uint8_t getControllerValue(){
70  return data[3];
71  }
72  uint8_t getChannelPressure(){
73  return data[2];
74  }
75  uint8_t getPolyKeyPressure(){
76  return data[3];
77  }
78  uint8_t getProgramChange(){
79  return data[1];
80  }
84  int16_t getPitchBend(){
85  int16_t pb = (data[2] | (data[3]<<7)) - 8192;
86  return pb;
87  }
88  bool isNote(){
89  return isNoteOn() || isNoteOff();
90  }
91  bool isNoteOn(){
92  return ((data[1] & MIDI_STATUS_MASK) == NOTE_ON) && getVelocity() != 0;
93  }
94  bool isNoteOff(){
95  return ((data[1] & MIDI_STATUS_MASK) == NOTE_OFF) || (((data[1] & MIDI_STATUS_MASK) == NOTE_ON) && getVelocity() == 0);
96  }
97  bool isSysEx(){
98  return data[0] == USB_COMMAND_SYSEX ||
102  }
104  return (data[1] & MIDI_STATUS_MASK) == CONTROL_CHANGE;
105  }
107  return (data[1] & MIDI_STATUS_MASK) == PROGRAM_CHANGE;
108  }
110  return (data[1] & MIDI_STATUS_MASK) == CHANNEL_PRESSURE;
111  }
113  return (data[1] & MIDI_STATUS_MASK) == POLY_KEY_PRESSURE;
114  }
115  bool isPitchBend(){
116  return (data[1] & MIDI_STATUS_MASK) == PITCH_BEND_CHANGE;
117  }
118  static MidiMessage cc(uint8_t ch, uint8_t cc, uint8_t value){
119  return MidiMessage(USB_COMMAND_CONTROL_CHANGE, CONTROL_CHANGE|(ch&0xf), cc&0x7f, value&0x7f);
120  }
121  static MidiMessage pc(uint8_t ch, uint8_t pc){
122  return MidiMessage(USB_COMMAND_PROGRAM_CHANGE, PROGRAM_CHANGE|(ch&0xf), pc&0x7f, 0);
123  }
124  static MidiMessage pb(uint8_t ch, int16_t bend){
125  bend += 8192;
126  return MidiMessage(USB_COMMAND_PITCH_BEND_CHANGE, PITCH_BEND_CHANGE|(ch&0xf), bend&0x7f, (bend>>7)&0x7f);
127  }
128  static MidiMessage note(uint8_t ch, uint8_t note, uint8_t velocity){
129  if(velocity == 0)
130  return MidiMessage(USB_COMMAND_NOTE_OFF, NOTE_OFF|(ch&0xf), note&0x7f, velocity&0x7f);
131  else
132  return MidiMessage(USB_COMMAND_NOTE_ON, NOTE_ON|(ch&0xf), note&0x7f, velocity&0x7f);
133  }
134  static MidiMessage cp(uint8_t ch, uint8_t value){
135  return MidiMessage(USB_COMMAND_CHANNEL_PRESSURE, CHANNEL_PRESSURE|(ch&0xf), value&0x7f, 0);
136  }
137 };
138 
139 #endif /* _MidiMessage_h_ */
@ USB_COMMAND_MISC
Definition: MidiStatus.h:65
@ USB_COMMAND_SINGLE_BYTE
Definition: MidiStatus.h:80
@ USB_COMMAND_POLY_KEY_PRESSURE
Definition: MidiStatus.h:75
@ USB_COMMAND_SYSEX_EOX2
Definition: MidiStatus.h:71
@ USB_COMMAND_NOTE_OFF
Definition: MidiStatus.h:73
@ USB_COMMAND_SYSEX_EOX3
Definition: MidiStatus.h:72
@ USB_COMMAND_SYSEX_EOX1
Definition: MidiStatus.h:70
@ USB_COMMAND_CABLE_EVENT
Definition: MidiStatus.h:66
@ USB_COMMAND_CHANNEL_PRESSURE
Definition: MidiStatus.h:78
@ USB_COMMAND_CONTROL_CHANGE
Definition: MidiStatus.h:76
@ USB_COMMAND_NOTE_ON
Definition: MidiStatus.h:74
@ USB_COMMAND_PROGRAM_CHANGE
Definition: MidiStatus.h:77
@ USB_COMMAND_PITCH_BEND_CHANGE
Definition: MidiStatus.h:79
@ USB_COMMAND_3BYTE_SYSTEM_COMMON
Definition: MidiStatus.h:68
@ USB_COMMAND_SYSEX
Definition: MidiStatus.h:69
@ USB_COMMAND_2BYTE_SYSTEM_COMMON
Definition: MidiStatus.h:67
@ PROGRAM_CHANGE
Definition: MidiStatus.h:10
@ POLY_KEY_PRESSURE
Definition: MidiStatus.h:8
@ CONTROL_CHANGE
Definition: MidiStatus.h:9
@ CHANNEL_PRESSURE
Definition: MidiStatus.h:11
@ NOTE_ON
Definition: MidiStatus.h:7
@ MIDI_STATUS_MASK
Definition: MidiStatus.h:32
@ NOTE_OFF
Definition: MidiStatus.h:6
@ MIDI_CHANNEL_MASK
Definition: MidiStatus.h:31
@ PITCH_BEND_CHANGE
Definition: MidiStatus.h:12
int16_t getPitchBend()
Get pitch bend value as a signed integer between -8192 and 8191.
Definition: MidiMessage.h:84
bool isChannelPressure()
Definition: MidiMessage.h:109
uint8_t getChannel()
Definition: MidiMessage.h:23
static MidiMessage note(uint8_t ch, uint8_t note, uint8_t velocity)
Definition: MidiMessage.h:128
MidiMessage(uint8_t port, uint8_t d0, uint8_t d1, uint8_t d2)
Definition: MidiMessage.h:14
static MidiMessage cc(uint8_t ch, uint8_t cc, uint8_t value)
Definition: MidiMessage.h:118
uint8_t getPort()
Definition: MidiMessage.h:20
bool isNoteOn()
Definition: MidiMessage.h:91
static MidiMessage pc(uint8_t ch, uint8_t pc)
Definition: MidiMessage.h:121
uint8_t getControllerValue()
Definition: MidiMessage.h:69
bool isNoteOff()
Definition: MidiMessage.h:94
bool isPitchBend()
Definition: MidiMessage.h:115
MidiMessage(uint32_t msg)
Definition: MidiMessage.h:13
uint8_t getVelocity()
Definition: MidiMessage.h:63
uint8_t getProgramChange()
Definition: MidiMessage.h:78
bool isNote()
Definition: MidiMessage.h:88
uint8_t getStatus()
Definition: MidiMessage.h:26
bool isPolyKeyPressure()
Definition: MidiMessage.h:112
bool isControlChange()
Definition: MidiMessage.h:103
uint8_t data[4]
Definition: MidiMessage.h:10
uint8_t getControllerNumber()
Definition: MidiMessage.h:66
static MidiMessage cp(uint8_t ch, uint8_t value)
Definition: MidiMessage.h:134
uint32_t packed
Definition: MidiMessage.h:9
uint8_t getPolyKeyPressure()
Definition: MidiMessage.h:75
uint8_t getChannelPressure()
Definition: MidiMessage.h:72
bool isProgramChange()
Definition: MidiMessage.h:106
uint8_t getNote()
Definition: MidiMessage.h:60
uint8_t getSize()
Definition: MidiMessage.h:29
static MidiMessage pb(uint8_t ch, int16_t bend)
Definition: MidiMessage.h:124
bool isSysEx()
Definition: MidiMessage.h:97