C++ API Reference RNBO: src/RNBO_MidiEvent.h Source File

RNBO: src/RNBO_MidiEvent.h Source File

1 //
2 // RNBO_MidiEvent.h
3 //
4 // Created by Rob Sussman on 8/4/15.
5 //
6 //
7 
8 #ifndef _RNBO_MidiEvent_H_
9 #define _RNBO_MidiEvent_H_
10 
11 
12 namespace RNBO {
13 
14  // Note that this is not derived from anything, it just declares getTime() and
15  // can therefore be used inside an event list.
16 
20  class EventTarget;
21 
22  class MidiEvent {
23  public:
24  MidiEvent()
25  : _eventTime(0)
26  , _portIndex(0)
27  , _length(0)
28  , _eventTarget(nullptr)
29  {
30  _midiData[0] = 0;
31  _midiData[1] = 0;
32  _midiData[2] = 0;
33  }
34 
35  MidiEvent(MillisecondTime eventTime, int portIndex, int b1, int b2, int b3, EventTarget* eventTarget = nullptr)
36  : _eventTime(eventTime)
37  , _portIndex(portIndex)
38  , _eventTarget(eventTarget)
39  {
40  // todo: assert b1, b2, and b3 are valid
41  _midiData[0] = uint8_t(b1);
42  _midiData[1] = uint8_t(b2);
43  _midiData[2] = uint8_t(b3);
44  // let length based on the status
45  int status = b1 & 0xF0;
46  if (status == 0xC0 || status == 0xD0 || b1 == 0xF1 || b1 == 0xF3) {
47  //prog change, channel pressure, quarter frame, song select
48  _length = 2;
49  } else if ((b1 >= 0xF8 && b1 <= 0xFF) || b1 == 0xF6) {
50  //realtime, tune request
51  _length = 1;
52  } else {
53  _length = 3;
54  }
55  }
56 
57 
58  MidiEvent(MillisecondTime eventTime, int portIndex, ConstByteArray data, Index length, EventTarget* eventTarget = nullptr)
59  : _eventTime(eventTime)
60  , _portIndex(portIndex)
61  , _eventTarget(eventTarget)
62  {
63  const Index maxlen = sizeof(_midiData) / sizeof(_midiData[0]);
64  for (Index i = 0; i < maxlen; i++) {
65  _midiData[i] = 0;
66  }
67  _length = length > maxlen ? maxlen : length;
68  // TODO: handle larger midi packets?
69  for (Index i = 0; i < _length; i++) {
70  _midiData[i] = data[i];
71  }
72  }
73 
74  bool operator==(const MidiEvent& rhs) const
75  {
76  return rhs.getTime() == getTime()
77  && rhs.getPortIndex() == getPortIndex()
78  && rhs.getData() == getData()
79  && rhs.getLength() == getLength()
80  && rhs._eventTarget == _eventTarget;
81  }
82 
83  int getPortIndex() const { return _portIndex; }
84  ConstByteArray getData() const { return _midiData; }
85  Index getLength() const { return _length; }
86 
87  MillisecondTime getTime() const { return _eventTime; }
88  EventTarget* getEventTarget() const { return _eventTarget; }
89 
90  // debugging
91  void dumpEvent() const {
92  // TODO: would be good to have logging that doesn't depend on fprintf
93  // fprintf(stdout, "MidiEvent: time=%.3f port=%d length=%d b1=%d b2=%d b3=%d\n", _eventTime, _portIndex, _length, _midiData[0], _midiData[1], _midiData[2]);
94  }
95 
96  private:
97 
98  MillisecondTime _eventTime;
99  int _portIndex;
100  Index _length;
101  uint8_t _midiData[3];
102 
103  friend class EventVariant;
104 
105  EventTarget* _eventTarget;
106 
107  void setTime(MillisecondTime eventTime) { _eventTime = eventTime; }
108 
109  };
110 
111 } // namespace RNBO
112 
113 #endif // #ifndef _RNBO_MidiEvent_H_
114