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