44
44
#endif
45
45
#endif
46
46
47
- #define SYSEX_START 0xF0
48
- #define SYSEX_END 0xF7
49
47
50
48
/* MIDI Service: 03B80E5A-EDE8-4B33-A751-6CE34EC4C700
51
49
* MIDI I/O : 7772E5DB-3868-4112-A1A9-F2669D106BF3
@@ -110,7 +108,6 @@ BLEMidi::BLEMidi(uint16_t fifo_depth)
110
108
{
111
109
_write_cb = NULL ;
112
110
_midilib_obj = NULL ;
113
- _receiving_sysex = false ;
114
111
}
115
112
116
113
bool BLEMidi::notifyEnabled (void )
@@ -164,89 +161,32 @@ void blemidi_write_cb(BLECharacteristic& chr, uint8_t* data, uint16_t len, uint1
164
161
165
162
void BLEMidi::_write_handler (uint8_t * data, uint16_t len)
166
163
{
167
- // First 3 bytes is always : Header + Timestamp + Status
168
- midi_header_t header;
169
- uint16_t tstamp = 0 ;
170
- uint8_t status = 0 ;
171
-
172
- header.byte = *data++;
164
+ // drop the BLE MIDI header byte
165
+ data++;
173
166
len--;
174
167
175
- /* SysEx message
176
- * Header | Timestamp | SysEx Start (0xF0) | SysEx Data ...... | timestamp | SysEx End (0xF7)
177
- * For each MTU packet, SysEx Data is preceded by Header
178
- */
179
-
180
- // Start packet of SysEx
181
- if ( !_receiving_sysex && (data[1 ] == SYSEX_START) )
168
+ while (len)
182
169
{
183
- // skip timestamp
184
- data++;
185
- len--;
186
-
187
- _receiving_sysex = true ;
188
- }
189
170
190
- // Receiving SysEx (including first packet above)
191
- if (_receiving_sysex)
192
- {
193
- // If final packet --> skip timestamp
194
- if ( (data[len-1 ] == SYSEX_END) && bitRead (data[len-2 ],7 ) )
195
- {
196
- _rxd_fifo.write (data, len-2 );
197
- _rxd_fifo.write (&data[len-1 ]); // SYSEX_END
198
-
199
- _receiving_sysex = false ; // done with SysEx
200
- }else
171
+ if ( bitRead (data[0 ], 7 ) && bitRead (data[1 ], 7 ) )
201
172
{
202
- _rxd_fifo.write (data, len);
173
+ // timestamp low + MIDI status so we skip the timestamp
174
+ data++;
175
+ len--;
203
176
}
204
- }else
205
- {
206
- /* Normal Event data
207
- * event : 0x00 - 0x7F
208
- * status: 0x80 - 0xEF
209
- */
210
-
211
- while (len)
177
+ else if ( bitRead (data[0 ], 7 ) && ! bitRead (data[1 ], 7 ) )
212
178
{
213
- if ( bitRead (data[0 ], 7 ) )
214
- {
215
- // Start of new full event
216
- midi_timestamp_t timestamp;
217
-
218
- timestamp.byte = *data++;
219
- len--;
220
-
221
- tstamp = (header.timestamp_hi << 7 ) | timestamp.timestamp_low ;
222
- (void ) tstamp;
223
-
224
- status = *data++;
225
- len--;
226
-
227
- // Status must have 7th-bit set, otherwise something is wrong !!!
228
- if ( !bitRead (status, 7 ) ) return ;
229
-
230
- uint8_t tempbuf[3 ] = { status, data[0 ], data[1 ] };
231
-
232
- _rxd_fifo.write (tempbuf, 3 );
233
- if ( _write_cb ) _write_cb ();
179
+ // timestamp low on its own, skip timestamp
180
+ data++;
181
+ len--;
182
+ }
234
183
235
- len -= 2 ;
236
- data += 2 ;
237
- }
238
- else
239
- {
240
- // Running event
241
- uint8_t tempbuf[3 ] = { status, data[0 ], data[1 ] };
184
+ // write the status or MIDI data to the FIFO
185
+ _rxd_fifo.write (data++, 1 );
186
+ len--;
242
187
243
- _rxd_fifo.write (tempbuf, 3 );
244
- if ( _write_cb ) _write_cb ();
188
+ if ( _write_cb ) _write_cb ();
245
189
246
- len -= 2 ;
247
- data += 2 ;
248
- }
249
- }
250
190
}
251
191
252
192
#ifdef MIDI_LIB_INCLUDED
@@ -256,6 +196,7 @@ void BLEMidi::_write_handler(uint8_t* data, uint16_t len)
256
196
while ( ((midi::MidiInterface<BLEMidi>*)_midilib_obj)->read () ) { }
257
197
}
258
198
#endif
199
+
259
200
}
260
201
261
202
/* ------------------------------------------------------------------*/
0 commit comments