sendAfterTouch KEYWORD2 | sendAfterTouch KEYWORD2 | ||||
sendPitchBend KEYWORD2 | sendPitchBend KEYWORD2 | ||||
sendSysEx KEYWORD2 | sendSysEx KEYWORD2 | ||||
sendRealTime KEYWORD2 | |||||
sendTimeCodeQuarterFrame KEYWORD2 | |||||
sendSongPosition KEYWORD2 | |||||
sendSongSelect KEYWORD2 | |||||
sendTuneRequest KEYWORD2 | |||||
beginRpn KEYWORD2 | |||||
sendRpnValue KEYWORD2 | |||||
sendRpnValue KEYWORD2 | |||||
sendRpnIncrement KEYWORD2 | |||||
sendRpnDecrement KEYWORD2 | |||||
endRpn KEYWORD2 | |||||
beginNrpn KEYWORD2 | |||||
sendNrpnValue KEYWORD2 | |||||
sendNrpnValue KEYWORD2 | |||||
sendNrpnIncrement KEYWORD2 | |||||
sendNrpnDecrement KEYWORD2 | |||||
endNrpn KEYWORD2 | |||||
send KEYWORD2 | |||||
analog2velocity KEYWORD2 | analog2velocity KEYWORD2 | ||||
getType KEYWORD2 | getType KEYWORD2 | ||||
getCable KEYWORD2 | |||||
getChannel KEYWORD2 | getChannel KEYWORD2 | ||||
getData1 KEYWORD2 | getData1 KEYWORD2 | ||||
getData2 KEYWORD2 | getData2 KEYWORD2 | ||||
setHandleProgramChange KEYWORD2 | setHandleProgramChange KEYWORD2 | ||||
setHandleAfterTouch KEYWORD2 | setHandleAfterTouch KEYWORD2 | ||||
setHandlePitchChange KEYWORD2 | setHandlePitchChange KEYWORD2 | ||||
setHandlePitchChange KEYWORD2 | |||||
NoteOff LITERAL1 | |||||
NoteOn LITERAL1 | |||||
AfterTouchPoly LITERAL1 | |||||
ControlChange LITERAL1 | |||||
ProgramChange LITERAL1 | |||||
AfterTouchChannel LITERAL1 | |||||
PitchBend LITERAL1 | |||||
SystemExclusive LITERAL1 | |||||
#NoteOff LITERAL1 | |||||
#NoteOn LITERAL1 | |||||
#AfterTouchPoly LITERAL1 | |||||
#ControlChange LITERAL1 | |||||
#ProgramChange LITERAL1 | |||||
#AfterTouchChannel LITERAL1 | |||||
#PitchBend LITERAL1 | |||||
#SystemExclusive LITERAL1 | |||||
midiEventPacket_t LITERAL1 | midiEventPacket_t LITERAL1 | ||||
MidiUSB KEYWORD1 | MidiUSB KEYWORD1 | ||||
sendMIDI KEYWORD2 | sendMIDI KEYWORD2 |
EP0_SIZE, // bMaxPacketSize0 | EP0_SIZE, // bMaxPacketSize0 | ||||
LSB(VENDOR_ID), MSB(VENDOR_ID), // idVendor | LSB(VENDOR_ID), MSB(VENDOR_ID), // idVendor | ||||
LSB(PRODUCT_ID), MSB(PRODUCT_ID), // idProduct | LSB(PRODUCT_ID), MSB(PRODUCT_ID), // idProduct | ||||
0x00, 0x02, // bcdDevice | |||||
#ifdef BCD_DEVICE | |||||
LSB(BCD_DEVICE), MSB(BCD_DEVICE), // bcdDevice | |||||
#else | |||||
0x00, 0x02, | |||||
#endif | |||||
1, // iManufacturer | 1, // iManufacturer | ||||
2, // iProduct | 2, // iProduct | ||||
3, // iSerialNumber | 3, // iSerialNumber | ||||
#define MIDI_INTERFACE_DESC_POS CDC_DATA_INTERFACE_DESC_POS+CDC_DATA_INTERFACE_DESC_SIZE | #define MIDI_INTERFACE_DESC_POS CDC_DATA_INTERFACE_DESC_POS+CDC_DATA_INTERFACE_DESC_SIZE | ||||
#ifdef MIDI_INTERFACE | #ifdef MIDI_INTERFACE | ||||
#define MIDI_INTERFACE_DESC_SIZE 9+7+6+6+9+9+9+5+9+5 | |||||
#if !defined(MIDI_NUM_CABLES) || MIDI_NUM_CABLES < 1 || MIDI_NUM_CABLES > 16 | |||||
#error "MIDI_NUM_CABLES must be defined between 1 to 16" | |||||
#endif | |||||
#define MIDI_INTERFACE_DESC_SIZE 9+7+((6+6+9+9)*MIDI_NUM_CABLES)+(9+4+MIDI_NUM_CABLES)*2 | |||||
#else | #else | ||||
#define MIDI_INTERFACE_DESC_SIZE 0 | #define MIDI_INTERFACE_DESC_SIZE 0 | ||||
#endif | #endif | ||||
0x24, // bDescriptorType = CS_INTERFACE | 0x24, // bDescriptorType = CS_INTERFACE | ||||
0x01, // bDescriptorSubtype = MS_HEADER | 0x01, // bDescriptorSubtype = MS_HEADER | ||||
0x00, 0x01, // bcdMSC = revision 01.00 | 0x00, 0x01, // bcdMSC = revision 01.00 | ||||
0x41, 0x00, // wTotalLength | |||||
LSB(7+(6+6+9+9)*MIDI_NUM_CABLES), // wTotalLength | |||||
LSB(7+(6+6+9+9)*MIDI_NUM_CABLES), | |||||
// MIDI IN Jack Descriptor, B.4.3, Table B-7 (embedded), page 40 | // MIDI IN Jack Descriptor, B.4.3, Table B-7 (embedded), page 40 | ||||
6, // bLength | 6, // bLength | ||||
0x24, // bDescriptorType = CS_INTERFACE | 0x24, // bDescriptorType = CS_INTERFACE | ||||
1, // BaSourceID(1) = 1 | 1, // BaSourceID(1) = 1 | ||||
1, // BaSourcePin(1) = first pin | 1, // BaSourcePin(1) = first pin | ||||
0, // iJack | 0, // iJack | ||||
#if MIDI_NUM_CABLES >= 2 | |||||
#define MIDI_INTERFACE_JACK_PAIR(a, b, c, d) \ | |||||
6, 0x24, 0x02, 0x01, (a), 0, \ | |||||
6, 0x24, 0x02, 0x02, (b), 0, \ | |||||
9, 0x24, 0x03, 0x01, (c), 1, (b), 1, 0, \ | |||||
9, 0x24, 0x03, 0x02, (d), 1, (a), 1, 0, | |||||
MIDI_INTERFACE_JACK_PAIR(5, 6, 7, 8) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 3 | |||||
MIDI_INTERFACE_JACK_PAIR(9, 10, 11, 12) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 4 | |||||
MIDI_INTERFACE_JACK_PAIR(13, 14, 15, 16) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 5 | |||||
MIDI_INTERFACE_JACK_PAIR(17, 18, 19, 20) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 6 | |||||
MIDI_INTERFACE_JACK_PAIR(21, 22, 23, 24) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 7 | |||||
MIDI_INTERFACE_JACK_PAIR(25, 26, 27, 28) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 8 | |||||
MIDI_INTERFACE_JACK_PAIR(29, 30, 31, 32) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 9 | |||||
MIDI_INTERFACE_JACK_PAIR(33, 34, 35, 36) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 10 | |||||
MIDI_INTERFACE_JACK_PAIR(37, 38, 39, 40) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 11 | |||||
MIDI_INTERFACE_JACK_PAIR(41, 42, 43, 44) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 12 | |||||
MIDI_INTERFACE_JACK_PAIR(45, 46, 47, 48) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 13 | |||||
MIDI_INTERFACE_JACK_PAIR(49, 50, 51, 52) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 14 | |||||
MIDI_INTERFACE_JACK_PAIR(53, 54, 55, 56) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 15 | |||||
MIDI_INTERFACE_JACK_PAIR(57, 58, 59, 60) | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 16 | |||||
MIDI_INTERFACE_JACK_PAIR(61, 62, 63, 64) | |||||
#endif | |||||
// Standard Bulk OUT Endpoint Descriptor, B.5.1, Table B-11, pae 42 | // Standard Bulk OUT Endpoint Descriptor, B.5.1, Table B-11, pae 42 | ||||
9, // bLength | 9, // bLength | ||||
5, // bDescriptorType = ENDPOINT | 5, // bDescriptorType = ENDPOINT | ||||
0, // bRefresh | 0, // bRefresh | ||||
0, // bSynchAddress | 0, // bSynchAddress | ||||
// Class-specific MS Bulk OUT Endpoint Descriptor, B.5.2, Table B-12, page 42 | // Class-specific MS Bulk OUT Endpoint Descriptor, B.5.2, Table B-12, page 42 | ||||
5, // bLength | |||||
4+MIDI_NUM_CABLES, // bLength | |||||
0x25, // bDescriptorSubtype = CS_ENDPOINT | 0x25, // bDescriptorSubtype = CS_ENDPOINT | ||||
0x01, // bJackType = MS_GENERAL | 0x01, // bJackType = MS_GENERAL | ||||
1, // bNumEmbMIDIJack = 1 jack | |||||
MIDI_NUM_CABLES, // bNumEmbMIDIJack = number of jacks | |||||
1, // BaAssocJackID(1) = jack ID #1 | 1, // BaAssocJackID(1) = jack ID #1 | ||||
#if MIDI_NUM_CABLES >= 2 | |||||
5, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 3 | |||||
9, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 4 | |||||
13, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 5 | |||||
17, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 6 | |||||
21, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 7 | |||||
25, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 8 | |||||
29, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 9 | |||||
33, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 10 | |||||
37, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 11 | |||||
41, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 12 | |||||
45, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 13 | |||||
49, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 14 | |||||
53, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 15 | |||||
57, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 16 | |||||
61, | |||||
#endif | |||||
// Standard Bulk IN Endpoint Descriptor, B.5.1, Table B-11, pae 42 | // Standard Bulk IN Endpoint Descriptor, B.5.1, Table B-11, pae 42 | ||||
9, // bLength | 9, // bLength | ||||
5, // bDescriptorType = ENDPOINT | 5, // bDescriptorType = ENDPOINT | ||||
0, // bRefresh | 0, // bRefresh | ||||
0, // bSynchAddress | 0, // bSynchAddress | ||||
// Class-specific MS Bulk IN Endpoint Descriptor, B.5.2, Table B-12, page 42 | // Class-specific MS Bulk IN Endpoint Descriptor, B.5.2, Table B-12, page 42 | ||||
5, // bLength | |||||
4+MIDI_NUM_CABLES, // bLength | |||||
0x25, // bDescriptorSubtype = CS_ENDPOINT | 0x25, // bDescriptorSubtype = CS_ENDPOINT | ||||
0x01, // bJackType = MS_GENERAL | 0x01, // bJackType = MS_GENERAL | ||||
1, // bNumEmbMIDIJack = 1 jack | |||||
MIDI_NUM_CABLES, // bNumEmbMIDIJack = number of jacks | |||||
3, // BaAssocJackID(1) = jack ID #3 | 3, // BaAssocJackID(1) = jack ID #3 | ||||
#if MIDI_NUM_CABLES >= 2 | |||||
7, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 3 | |||||
11, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 4 | |||||
15, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 5 | |||||
19, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 6 | |||||
23, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 7 | |||||
27, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 8 | |||||
31, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 9 | |||||
35, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 10 | |||||
39, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 11 | |||||
43, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 12 | |||||
47, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 13 | |||||
51, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 14 | |||||
55, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 15 | |||||
59, | |||||
#endif | |||||
#if MIDI_NUM_CABLES >= 16 | |||||
63, | |||||
#endif | |||||
#endif // MIDI_INTERFACE | #endif // MIDI_INTERFACE | ||||
#ifdef KEYBOARD_INTERFACE | #ifdef KEYBOARD_INTERFACE |
#define SEREMU_RX_SIZE 32 | #define SEREMU_RX_SIZE 32 | ||||
#define SEREMU_RX_INTERVAL 2 | #define SEREMU_RX_INTERVAL 2 | ||||
#define MIDI_INTERFACE 0 // MIDI | #define MIDI_INTERFACE 0 // MIDI | ||||
#define MIDI_NUM_CABLES 1 | |||||
#define MIDI_TX_ENDPOINT 3 | |||||
#define MIDI_TX_SIZE 64 | |||||
#define MIDI_RX_ENDPOINT 4 | |||||
#define MIDI_RX_SIZE 64 | |||||
#define ENDPOINT1_CONFIG ENDPOINT_TRANSIMIT_ONLY | |||||
#define ENDPOINT2_CONFIG ENDPOINT_RECEIVE_ONLY | |||||
#define ENDPOINT3_CONFIG ENDPOINT_TRANSIMIT_ONLY | |||||
#define ENDPOINT4_CONFIG ENDPOINT_RECEIVE_ONLY | |||||
#elif defined(USB_MIDI_X8) | |||||
#define VENDOR_ID 0x16C0 | |||||
#define PRODUCT_ID 0x0485 | |||||
#define BCD_DEVICE 0x0300 | |||||
#define MANUFACTURER_NAME {'T','e','e','n','s','y','d','u','i','n','o'} | |||||
#define MANUFACTURER_NAME_LEN 11 | |||||
#define PRODUCT_NAME {'T','e','e','n','s','y',' ','M','I','D','I','x','8'} | |||||
#define PRODUCT_NAME_LEN 13 | |||||
#define EP0_SIZE 64 | |||||
#define NUM_ENDPOINTS 4 | |||||
#define NUM_USB_BUFFERS 16 | |||||
#define NUM_INTERFACE 2 | |||||
#define SEREMU_INTERFACE 1 // Serial emulation | |||||
#define SEREMU_TX_ENDPOINT 1 | |||||
#define SEREMU_TX_SIZE 64 | |||||
#define SEREMU_TX_INTERVAL 1 | |||||
#define SEREMU_RX_ENDPOINT 2 | |||||
#define SEREMU_RX_SIZE 32 | |||||
#define SEREMU_RX_INTERVAL 2 | |||||
#define MIDI_INTERFACE 0 // MIDI | |||||
#define MIDI_NUM_CABLES 8 | |||||
#define MIDI_TX_ENDPOINT 3 | #define MIDI_TX_ENDPOINT 3 | ||||
#define MIDI_TX_SIZE 64 | #define MIDI_TX_SIZE 64 | ||||
#define MIDI_RX_ENDPOINT 4 | #define MIDI_RX_ENDPOINT 4 | ||||
#define CDC_RX_SIZE 64 | #define CDC_RX_SIZE 64 | ||||
#define CDC_TX_SIZE 64 | #define CDC_TX_SIZE 64 | ||||
#define MIDI_INTERFACE 2 // MIDI | #define MIDI_INTERFACE 2 // MIDI | ||||
#define MIDI_NUM_CABLES 1 | |||||
#define MIDI_TX_ENDPOINT 4 | |||||
#define MIDI_TX_SIZE 64 | |||||
#define MIDI_RX_ENDPOINT 5 | |||||
#define MIDI_RX_SIZE 64 | |||||
#define ENDPOINT1_CONFIG ENDPOINT_TRANSIMIT_ONLY | |||||
#define ENDPOINT2_CONFIG ENDPOINT_RECEIVE_ONLY | |||||
#define ENDPOINT3_CONFIG ENDPOINT_TRANSIMIT_ONLY | |||||
#define ENDPOINT4_CONFIG ENDPOINT_TRANSIMIT_ONLY | |||||
#define ENDPOINT5_CONFIG ENDPOINT_RECEIVE_ONLY | |||||
#elif defined(USB_MIDI_X8_SERIAL) | |||||
#define VENDOR_ID 0x16C0 | |||||
#define PRODUCT_ID 0x0489 | |||||
#define BCD_DEVICE 0x0300 | |||||
#define MANUFACTURER_NAME {'T','e','e','n','s','y','d','u','i','n','o'} | |||||
#define MANUFACTURER_NAME_LEN 11 | |||||
#define PRODUCT_NAME {'T','e','e','n','s','y',' ','M','I','D','I','x','8'} | |||||
#define PRODUCT_NAME_LEN 13 | |||||
#define EP0_SIZE 64 | |||||
#define NUM_ENDPOINTS 5 | |||||
#define NUM_USB_BUFFERS 30 | |||||
#define NUM_INTERFACE 3 | |||||
#define CDC_IAD_DESCRIPTOR 1 | |||||
#define CDC_STATUS_INTERFACE 0 | |||||
#define CDC_DATA_INTERFACE 1 // Serial | |||||
#define CDC_ACM_ENDPOINT 1 | |||||
#define CDC_RX_ENDPOINT 2 | |||||
#define CDC_TX_ENDPOINT 3 | |||||
#define CDC_ACM_SIZE 16 | |||||
#define CDC_RX_SIZE 64 | |||||
#define CDC_TX_SIZE 64 | |||||
#define MIDI_INTERFACE 2 // MIDI | |||||
#define MIDI_NUM_CABLES 8 | |||||
#define MIDI_TX_ENDPOINT 4 | #define MIDI_TX_ENDPOINT 4 | ||||
#define MIDI_TX_SIZE 64 | #define MIDI_TX_SIZE 64 | ||||
#define MIDI_RX_ENDPOINT 5 | #define MIDI_RX_ENDPOINT 5 | ||||
#define CDC_RX_SIZE 64 | #define CDC_RX_SIZE 64 | ||||
#define CDC_TX_SIZE 64 | #define CDC_TX_SIZE 64 | ||||
#define MIDI_INTERFACE 2 // MIDI | #define MIDI_INTERFACE 2 // MIDI | ||||
#define MIDI_NUM_CABLES 1 | |||||
#define MIDI_TX_ENDPOINT 4 | |||||
#define MIDI_TX_SIZE 64 | |||||
#define MIDI_RX_ENDPOINT 5 | |||||
#define MIDI_RX_SIZE 64 | |||||
#define AUDIO_INTERFACE 3 // Audio (uses 3 consecutive interfaces) | |||||
#define AUDIO_TX_ENDPOINT 6 | |||||
#define AUDIO_TX_SIZE 180 | |||||
#define AUDIO_RX_ENDPOINT 7 | |||||
#define AUDIO_RX_SIZE 180 | |||||
#define AUDIO_SYNC_ENDPOINT 8 | |||||
#define ENDPOINT1_CONFIG ENDPOINT_TRANSIMIT_ONLY | |||||
#define ENDPOINT2_CONFIG ENDPOINT_RECEIVE_ONLY | |||||
#define ENDPOINT3_CONFIG ENDPOINT_TRANSIMIT_ONLY | |||||
#define ENDPOINT4_CONFIG ENDPOINT_TRANSIMIT_ONLY | |||||
#define ENDPOINT5_CONFIG ENDPOINT_RECEIVE_ONLY | |||||
#define ENDPOINT6_CONFIG ENDPOINT_TRANSMIT_ISOCHRONOUS | |||||
#define ENDPOINT7_CONFIG ENDPOINT_RECEIVE_ISOCHRONOUS | |||||
#define ENDPOINT8_CONFIG ENDPOINT_TRANSMIT_ISOCHRONOUS | |||||
#elif defined(USB_MIDI_X8_AUDIO_SERIAL) | |||||
#define VENDOR_ID 0x16C0 | |||||
#define PRODUCT_ID 0x048A | |||||
#define BCD_DEVICE 0x0300 | |||||
#define MANUFACTURER_NAME {'T','e','e','n','s','y','d','u','i','n','o'} | |||||
#define MANUFACTURER_NAME_LEN 11 | |||||
#define PRODUCT_NAME {'T','e','e','n','s','y',' ','M','I','D','I','x','8','/','A','u','d','i','o'} | |||||
#define PRODUCT_NAME_LEN 17 | |||||
#define EP0_SIZE 64 | |||||
#define NUM_ENDPOINTS 8 | |||||
#define NUM_USB_BUFFERS 30 | |||||
#define NUM_INTERFACE 6 | |||||
#define CDC_IAD_DESCRIPTOR 1 | |||||
#define CDC_STATUS_INTERFACE 0 | |||||
#define CDC_DATA_INTERFACE 1 // Serial | |||||
#define CDC_ACM_ENDPOINT 1 | |||||
#define CDC_RX_ENDPOINT 2 | |||||
#define CDC_TX_ENDPOINT 3 | |||||
#define CDC_ACM_SIZE 16 | |||||
#define CDC_RX_SIZE 64 | |||||
#define CDC_TX_SIZE 64 | |||||
#define MIDI_INTERFACE 2 // MIDI | |||||
#define MIDI_NUM_CABLES 8 | |||||
#define MIDI_TX_ENDPOINT 4 | #define MIDI_TX_ENDPOINT 4 | ||||
#define MIDI_TX_SIZE 64 | #define MIDI_TX_SIZE 64 | ||||
#define MIDI_RX_ENDPOINT 5 | #define MIDI_RX_ENDPOINT 5 | ||||
#define CDC_RX_SIZE 64 | #define CDC_RX_SIZE 64 | ||||
#define CDC_TX_SIZE 64 | #define CDC_TX_SIZE 64 | ||||
#define MIDI_INTERFACE 2 // MIDI | #define MIDI_INTERFACE 2 // MIDI | ||||
#define MIDI_NUM_CABLES 1 | |||||
#define MIDI_TX_ENDPOINT 3 | #define MIDI_TX_ENDPOINT 3 | ||||
#define MIDI_TX_SIZE 64 | #define MIDI_TX_SIZE 64 | ||||
#define MIDI_RX_ENDPOINT 3 | #define MIDI_RX_ENDPOINT 3 |
#ifdef MIDI_INTERFACE // defined by usb_dev.h -> usb_desc.h | #ifdef MIDI_INTERFACE // defined by usb_dev.h -> usb_desc.h | ||||
#if F_CPU >= 20000000 | #if F_CPU >= 20000000 | ||||
uint8_t usb_midi_msg_cable; | |||||
uint8_t usb_midi_msg_channel; | uint8_t usb_midi_msg_channel; | ||||
uint8_t usb_midi_msg_type; | uint8_t usb_midi_msg_type; | ||||
uint8_t usb_midi_msg_data1; | uint8_t usb_midi_msg_data1; | ||||
uint8_t usb_midi_msg_data2; | uint8_t usb_midi_msg_data2; | ||||
// TODO: separate sysex buffers for each cable... | |||||
uint8_t usb_midi_msg_sysex[USB_MIDI_SYSEX_MAX]; | uint8_t usb_midi_msg_sysex[USB_MIDI_SYSEX_MAX]; | ||||
uint16_t usb_midi_msg_sysex_len; | uint16_t usb_midi_msg_sysex_len; | ||||
void (*usb_midi_handleNoteOff)(uint8_t ch, uint8_t note, uint8_t vel) = NULL; | void (*usb_midi_handleNoteOff)(uint8_t ch, uint8_t note, uint8_t vel) = NULL; | ||||
type1 = n & 15; | type1 = n & 15; | ||||
type2 = (n >> 12) & 15; | type2 = (n >> 12) & 15; | ||||
ch = ((n >> 8) & 15) + 1; | ch = ((n >> 8) & 15) + 1; | ||||
usb_midi_msg_cable = (n >> 4) & 15; | |||||
if (type1 >= 0x08 && type1 <= 0x0E) { | if (type1 >= 0x08 && type1 <= 0x0E) { | ||||
if (channel && channel != ch) { | if (channel && channel != ch) { | ||||
// ignore other channels when user wants single channel read | // ignore other channels when user wants single channel read |
int usb_midi_read(uint32_t channel); | int usb_midi_read(uint32_t channel); | ||||
uint32_t usb_midi_available(void); | uint32_t usb_midi_available(void); | ||||
uint32_t usb_midi_read_message(void); | uint32_t usb_midi_read_message(void); | ||||
extern uint8_t usb_midi_msg_cable; | |||||
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; | ||||
send(0xE0, value, value >> 7, channel, cable); | send(0xE0, value, value >> 7, channel, cable); | ||||
}; | }; | ||||
void sendSysEx(uint32_t length, const uint8_t *data, bool hasTerm=false, uint8_t cable=0) __attribute__((always_inline)) { | void sendSysEx(uint32_t length, const uint8_t *data, bool hasTerm=false, uint8_t cable=0) __attribute__((always_inline)) { | ||||
if (cable >= MIDI_NUM_CABLES) return; | |||||
if (hasTerm) { | if (hasTerm) { | ||||
if (length > 2) { | if (length > 2) { | ||||
usb_midi_send_sysex(data + 1, length - 2, cable); | usb_midi_send_sysex(data + 1, length - 2, cable); | ||||
sendControlChange(98, 0x7F, channel, cable); | sendControlChange(98, 0x7F, channel, cable); | ||||
} | } | ||||
void send(uint8_t type, uint8_t data1, uint8_t data2, uint8_t channel, uint8_t cable) __attribute__((always_inline)) { | void send(uint8_t type, uint8_t data1, uint8_t data2, uint8_t channel, uint8_t cable) __attribute__((always_inline)) { | ||||
if (cable >= MIDI_NUM_CABLES) return; | |||||
if (type < 0xF0) { | if (type < 0xF0) { | ||||
if (type < 0x80) return; | if (type < 0x80) return; | ||||
type &= 0xF0; | type &= 0xF0; | ||||
inline uint8_t getType(void) __attribute__((always_inline)) { | inline uint8_t getType(void) __attribute__((always_inline)) { | ||||
return usb_midi_msg_type; | return usb_midi_msg_type; | ||||
}; | }; | ||||
inline uint8_t getCable(void) __attribute__((always_inline)) { | |||||
return usb_midi_msg_cable; | |||||
}; | |||||
inline uint8_t getChannel(void) __attribute__((always_inline)) { | inline uint8_t getChannel(void) __attribute__((always_inline)) { | ||||
return usb_midi_msg_channel; | return usb_midi_msg_channel; | ||||
}; | }; |
#ifdef PRODUCT_ID | #ifdef PRODUCT_ID | ||||
#undef PRODUCT_ID | #undef PRODUCT_ID | ||||
#endif | #endif | ||||
#ifdef BCD_DEVICE | |||||
#undef BCD_DEVICE | |||||
#endif | |||||
#ifdef DEVICE_CLASS | #ifdef DEVICE_CLASS | ||||
#undef DEVICE_CLASS | #undef DEVICE_CLASS | ||||
#endif | #endif | ||||
#undef CDC_IAD_DESCRIPTOR | #undef CDC_IAD_DESCRIPTOR | ||||
#endif | #endif | ||||
#ifdef MIDI_INTERFACE | #ifdef MIDI_INTERFACE | ||||
#undef MIDI_INTERFACE | |||||
#endif | |||||
#ifdef MIDI_NUM_CABLES | |||||
#undef MIDI_NUM_CABLES | |||||
#endif | |||||
#ifdef MIDI_INTERFACE_JACK_PAIR | |||||
#undef MIDI_INTERFACE_JACK_PAIR | |||||
#endif | |||||
#ifdef MIDI_TX_ENDPOINT | |||||
#undef MIDI_TX_ENDPOINT | #undef MIDI_TX_ENDPOINT | ||||
#endif | #endif | ||||
#ifdef MIDI_TX_SIZE | #ifdef MIDI_TX_SIZE |