瀏覽代碼

Add MIDIUSB.h for Arduino compatibility

main
PaulStoffregen 6 年之前
父節點
當前提交
ff5f62f798
共有 4 個文件被更改,包括 104 次插入0 次删除
  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 查看文件

@@ -459,6 +459,9 @@ ProgramChange LITERAL1
AfterTouchChannel LITERAL1
PitchBend LITERAL1
SystemExclusive LITERAL1
midiEventPacket_t LITERAL1
MidiUSB KEYWORD1
sendMIDI KEYWORD2

# USB RawHID
RawHID KEYWORD1

+ 56
- 0
teensy3/MIDIUSB.h 查看文件

@@ -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

+ 43
- 0
teensy3/usb_midi.c 查看文件

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

+ 2
- 0
teensy3/usb_midi.h 查看文件

@@ -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;

Loading…
取消
儲存