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