@@ -459,6 +459,9 @@ ProgramChange LITERAL1 | |||
AfterTouchChannel LITERAL1 | |||
PitchBend LITERAL1 | |||
SystemExclusive LITERAL1 | |||
midiEventPacket_t LITERAL1 | |||
MidiUSB KEYWORD1 | |||
sendMIDI KEYWORD2 | |||
# USB RawHID | |||
RawHID KEYWORD1 |
@@ -0,0 +1,56 @@ | |||
#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 |
@@ -166,6 +166,49 @@ void static sysex_byte(uint8_t b) | |||
} | |||
} | |||
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) | |||
{ |
@@ -66,6 +66,8 @@ void usb_midi_write_packed(uint32_t n); | |||
void usb_midi_send_sysex(const uint8_t *data, uint32_t length); | |||
void usb_midi_flush_output(void); | |||
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_type; | |||
extern uint8_t usb_midi_msg_data1; |