|
|
@@ -81,6 +81,7 @@ extern void (*usb_midi_handleAfterTouch)(uint8_t ch, uint8_t pressure); |
|
|
|
extern void (*usb_midi_handlePitchChange)(uint8_t ch, int pitch); |
|
|
|
extern void (*usb_midi_handleSysEx)(const uint8_t *data, uint16_t length, uint8_t complete); |
|
|
|
extern void (*usb_midi_handleRealTimeSystem)(uint8_t rtb); |
|
|
|
extern void (*usb_midi_handleTimeCodeQuarterFrame)(uint16_t data); |
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
} |
|
|
@@ -124,6 +125,28 @@ class usb_midi_class |
|
|
|
void sendSysEx(uint32_t length, const uint8_t *data) { |
|
|
|
usb_midi_send_sysex(data, length); |
|
|
|
} |
|
|
|
void sendRealTime(uint32_t type) __attribute__((always_inline)) { |
|
|
|
uint32_t data = ( (type & 0xFF) | ((type << 8) & 0xFF00) ); |
|
|
|
switch (type) { |
|
|
|
case 0xF8: // Clock |
|
|
|
case 0xFA: // Start |
|
|
|
case 0xFC: // Stop |
|
|
|
case 0xFB: // Continue |
|
|
|
case 0xFE: // ActiveSensing |
|
|
|
case 0xFF: // SystemReset |
|
|
|
usb_midi_write_packed(data); |
|
|
|
break; |
|
|
|
default: // Invalid Real Time marker |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
void sendTimeCodeQuarterFrame(uint32_t type, uint32_t value) __attribute__((always_inline)) { |
|
|
|
uint32_t data = ( ((type & 0x07) << 4) | (value & 0x0F) ); |
|
|
|
sendTimeCodeQuarterFrame(data); |
|
|
|
} |
|
|
|
void sendTimeCodeQuarterFrame(uint32_t data) __attribute__((always_inline)) { |
|
|
|
usb_midi_write_packed(0xF108 | ((data & 0x7F) << 16)); |
|
|
|
} |
|
|
|
void send_now(void) { |
|
|
|
usb_midi_flush_output(); |
|
|
|
} |
|
|
@@ -173,6 +196,9 @@ class usb_midi_class |
|
|
|
inline void setHandleRealTimeSystem(void (*fptr)(uint8_t realtimebyte)) { |
|
|
|
usb_midi_handleRealTimeSystem = fptr; |
|
|
|
}; |
|
|
|
inline void setHandleTimeCodeQuarterFrame(void (*fptr)(uint16_t data)) { |
|
|
|
usb_midi_handleTimeCodeQuarterFrame = fptr; |
|
|
|
}; |
|
|
|
private: |
|
|
|
}; |
|
|
|
|