AfterTouchChannel LITERAL1 | AfterTouchChannel LITERAL1 | ||||
PitchBend LITERAL1 | PitchBend LITERAL1 | ||||
SystemExclusive LITERAL1 | SystemExclusive LITERAL1 | ||||
midiEventPacket_t LITERAL1 | |||||
MidiUSB KEYWORD1 | |||||
sendMIDI KEYWORD2 | |||||
# USB RawHID | # USB RawHID | ||||
RawHID KEYWORD1 | RawHID KEYWORD1 |
#ifndef MIDIUSB_h | |||||
#define MIDIUSB_h | |||||
// For compatibility with Arduino's MIDIUSB library | |||||
#include "usb_midi.h" | |||||
#ifdef __cplusplus | |||||
#ifndef MIDI_INTERFACE | |||||
#error "Please select MIDI in Tools > USB Type to use MIDIUSB.h" | |||||
#endif | |||||
typedef struct { | |||||
union { | |||||
struct { | |||||
uint8_t header; | |||||
uint8_t byte1; | |||||
uint8_t byte2; | |||||
uint8_t byte3; | |||||
}; | |||||
uint32_t word; | |||||
}; | |||||
} midiEventPacket_t; | |||||
class MIDI_ | |||||
{ | |||||
public: | |||||
constexpr MIDI_(void) { } | |||||
uint32_t available(void) { | |||||
return usb_midi_available(); | |||||
} | |||||
midiEventPacket_t read(void) { | |||||
midiEventPacket_t event; | |||||
event.word = usb_midi_read_message(); | |||||
return event; | |||||
} | |||||
void flush(void) { | |||||
usb_midi_flush_output(); | |||||
} | |||||
void sendMIDI(midiEventPacket_t event) { | |||||
usb_midi_write_packed(event.word); | |||||
} | |||||
size_t write(const uint8_t *buffer, size_t size) { | |||||
// TODO - is this really needed? | |||||
return 0; | |||||
} | |||||
operator bool() { | |||||
// TODO - is this really needed? | |||||
return true; | |||||
} | |||||
}; | |||||
extern MIDI_ MidiUSB; | |||||
#endif // __cplusplus | |||||
#endif // MIDIUSB_h |
} | } | ||||
} | } | ||||
uint32_t usb_midi_available(void) | |||||
{ | |||||
uint32_t index; | |||||
if (!rx_packet) { | |||||
if (!usb_configuration) return 0; | |||||
rx_packet = usb_rx(MIDI_RX_ENDPOINT); | |||||
if (!rx_packet) return 0; | |||||
if (rx_packet->len == 0) { | |||||
usb_free(rx_packet); | |||||
rx_packet = NULL; | |||||
return 0; | |||||
} | |||||
} | |||||
index = rx_packet->index; | |||||
return rx_packet->len - index; | |||||
} | |||||
uint32_t usb_midi_read_message(void) | |||||
{ | |||||
uint32_t n, index; | |||||
if (!rx_packet) { | |||||
if (!usb_configuration) return 0; | |||||
rx_packet = usb_rx(MIDI_RX_ENDPOINT); | |||||
if (!rx_packet) return 0; | |||||
if (rx_packet->len == 0) { | |||||
usb_free(rx_packet); | |||||
rx_packet = NULL; | |||||
return 0; | |||||
} | |||||
} | |||||
index = rx_packet->index; | |||||
n = ((uint32_t *)rx_packet->buf)[index/4]; | |||||
index += 4; | |||||
if (index < rx_packet->len) { | |||||
rx_packet->index = index; | |||||
} else { | |||||
usb_free(rx_packet); | |||||
rx_packet = usb_rx(MIDI_RX_ENDPOINT); | |||||
} | |||||
return n; | |||||
} | |||||
int usb_midi_read(uint32_t channel) | int usb_midi_read(uint32_t channel) | ||||
{ | { |
void usb_midi_send_sysex(const uint8_t *data, uint32_t length); | void usb_midi_send_sysex(const uint8_t *data, uint32_t length); | ||||
void usb_midi_flush_output(void); | void usb_midi_flush_output(void); | ||||
int usb_midi_read(uint32_t channel); | int usb_midi_read(uint32_t channel); | ||||
uint32_t usb_midi_available(void); | |||||
uint32_t usb_midi_read_message(void); | |||||
extern uint8_t usb_midi_msg_channel; | extern uint8_t usb_midi_msg_channel; | ||||
extern uint8_t usb_midi_msg_type; | extern uint8_t usb_midi_msg_type; | ||||
extern uint8_t usb_midi_msg_data1; | extern uint8_t usb_midi_msg_data1; |