Browse Source

Add MIDIUSB.h for Arduino compatibility

teensy4-core
PaulStoffregen 7 years ago
parent
commit
ff5f62f798
4 changed files with 104 additions and 0 deletions
  1. +3
    -0
      keywords.txt
  2. +56
    -0
      teensy3/MIDIUSB.h
  3. +43
    -0
      teensy3/usb_midi.c
  4. +2
    -0
      teensy3/usb_midi.h

+ 3
- 0
keywords.txt View File

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

+ 56
- 0
teensy3/MIDIUSB.h View File

#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

+ 43
- 0
teensy3/usb_midi.c View File

} }
} }


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)
{ {

+ 2
- 0
teensy3/usb_midi.h View File

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;

Loading…
Cancel
Save