Arduino MIDI Library  Version 4.3.1
midi_UsbTransport.hpp
Go to the documentation of this file.
1 
28 #pragma once
29 
31 
32 template<unsigned BufferSize>
34 {
35 
36 }
37 
38 template<unsigned BufferSize>
40 {
41 
42 }
43 
44 // -----------------------------------------------------------------------------
45 
46 template<unsigned BufferSize>
47 inline void UsbTransport<BufferSize>::begin(unsigned inBaudrate)
48 {
49  mTxBuffer.clear();
50  mRxBuffer.clear();
51 }
52 
53 template<unsigned BufferSize>
55 {
56  pollUsbMidi();
57  return mRxBuffer.getLength();
58 }
59 
60 template<unsigned BufferSize>
62 {
63  return mRxBuffer.read();
64 }
65 
66 template<unsigned BufferSize>
68 {
69  mTxBuffer.write(inData);
70  recomposeAndSendTxPackets();
71 }
72 
73 // -----------------------------------------------------------------------------
74 
75 template<unsigned BufferSize>
77 {
78  bool received = false;
79  midiEventPacket_t packet = MidiUSB.read();
80  while (packet.header != 0)
81  {
82  received = true;
83 
84  switch (packet.header << 4)
85  {
86  // 3 bytes messages
87  case midi::NoteOff:
88  case midi::NoteOn:
91  case midi::PitchBend:
92  mRxBuffer.write(packet.byte1);
93  mRxBuffer.write(packet.byte2);
94  mRxBuffer.write(packet.byte3);
95  break;
96 
97  // 2 bytes messages
100  mRxBuffer.write(packet.byte1);
101  mRxBuffer.write(packet.byte2);
102  break;
103 
104  // 1 byte message
105  case midi::TuneRequest:
106  case midi::Clock:
107  case midi::Start:
108  case midi::Continue:
109  case midi::Stop:
110  case midi::ActiveSensing:
111  case midi::SystemReset:
112  mRxBuffer.write(packet.byte1);
113  break;
114 
115  // Special cases
116  // case midi::SystemExclusive:
117  // case midi::TimeCodeQuarterFrame:
118  // case midi::SongPosition:
119  // case midi::SongSelect:
120  // break;
121 
122  default:
123  break;
124  }
125 
126  packet = MidiUSB.read();
127  }
128  return received;
129 }
130 
131 template<unsigned BufferSize>
133 {
134  while (!mTxBuffer.isEmpty())
135  {
136  const byte data = mTxBuffer.read();
137  if (mCurrentTxPacketByteIndex == 0)
138  {
139  mCurrentTxPacket.mPacket.header = encodePacketHeader(data);
140  }
141  else
142  {
143  mCurrentTxPacket.mDataArray[mCurrentTxPacketByteIndex] = data;
144  }
145  mCurrentTxPacketByteIndex++;
146 
147  const int packetLength = getPacketLength(mCurrentTxPacket.mPacket);
148 
149  if (mCurrentTxPacketByteIndex == packetLength)
150  {
151  MidiUSB.write(mCurrentTxPacket.mDataArray, packetLength);
152  resetTx();
153  }
154  }
155 }
156 
157 template<unsigned BufferSize>
159 {
160  mCurrentTxPacket.mPacket.header = 0;
161  mCurrentTxPacket.mPacket.byte1 = 0;
162  mCurrentTxPacket.mPacket.byte2 = 0;
163  mCurrentTxPacket.mPacket.byte3 = 0;
164  mCurrentTxPacketByteIndex = 0;
165 }
166 
167 template<unsigned BufferSize>
169 {
170  // todo: fix me for other types than channel
171  return inStatusByte >> 4;
172 }
173 
174 template<unsigned BufferSize>
175 inline int UsbTransport<BufferSize>::getPacketLength(const midiEventPacket_t& inPacket)
176 {
177  return 3;
178 }
179 
Polyphonic AfterTouch.
Definition: midi_Defs.h:70
System Real Time - Stop.
Definition: midi_Defs.h:83
System Real Time - Timing Clock.
Definition: midi_Defs.h:80
byte StatusByte
Definition: midi_Defs.h:57
#define BEGIN_MIDI_NAMESPACE
#define END_MIDI_NAMESPACE
Channel (monophonic) AfterTouch.
Definition: midi_Defs.h:73
Program Change.
Definition: midi_Defs.h:72
System Real Time - Continue.
Definition: midi_Defs.h:82
System Real Time - Start.
Definition: midi_Defs.h:81
unsigned available()
Note On.
Definition: midi_Defs.h:69
Control Change / Channel Mode.
Definition: midi_Defs.h:71
System Common - Tune Request.
Definition: midi_Defs.h:79
Pitch Bend.
Definition: midi_Defs.h:74
uint8_t byte
Definition: midi_Defs.h:36
System Real Time - Active Sensing.
Definition: midi_Defs.h:84
Note Off.
Definition: midi_Defs.h:68
System Real Time - System Reset.
Definition: midi_Defs.h:85
void begin(unsigned inBaudrate)
void write(byte inData)