X-TOUCH to djay bridge
Dependencies: mbed mbed-rtos FATFileSystem
main.cpp@1:0dac72ab5910, 2019-06-05 (annotated)
- Committer:
- okini3939
- Date:
- Wed Jun 05 04:54:37 2019 +0000
- Revision:
- 1:0dac72ab5910
- Parent:
- 0:0fd787d62a99
sample
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 1:0dac72ab5910 | 1 | /* |
okini3939 | 1:0dac72ab5910 | 2 | * BEHRINGER X-TOUCH to DJAY bridge |
okini3939 | 1:0dac72ab5910 | 3 | * for mbed LPC1768 |
okini3939 | 1:0dac72ab5910 | 4 | * |
okini3939 | 1:0dac72ab5910 | 5 | * X-TOUCH (MC/USB) <---USB---> LPC1768 <---UART MIDI---> MD-BT01 (YAMAHA, BLE MIDI) |
okini3939 | 1:0dac72ab5910 | 6 | */ |
okini3939 | 1:0dac72ab5910 | 7 | |
okini3939 | 0:0fd787d62a99 | 8 | #include "mbed.h" |
okini3939 | 1:0dac72ab5910 | 9 | #include "USBHostHub.h" |
okini3939 | 0:0fd787d62a99 | 10 | #include "USBHostMIDI.h" |
okini3939 | 1:0dac72ab5910 | 11 | #include "MIDI.h" |
okini3939 | 1:0dac72ab5910 | 12 | #include "CBuffer.h" |
okini3939 | 0:0fd787d62a99 | 13 | |
okini3939 | 0:0fd787d62a99 | 14 | Serial pc(USBTX, USBRX); |
okini3939 | 0:0fd787d62a99 | 15 | DigitalOut led1(LED1); |
okini3939 | 0:0fd787d62a99 | 16 | PwmOut led2(LED2), led3(LED3), led4(LED4); |
okini3939 | 1:0dac72ab5910 | 17 | USBHostHub hub; |
okini3939 | 0:0fd787d62a99 | 18 | USBHostMIDI midi; |
okini3939 | 1:0dac72ab5910 | 19 | MIDI midi2(p28, p27); |
okini3939 | 0:0fd787d62a99 | 20 | |
okini3939 | 1:0dac72ab5910 | 21 | CircBuffer <uint32_t>midi_out(20); |
okini3939 | 1:0dac72ab5910 | 22 | |
okini3939 | 0:0fd787d62a99 | 23 | |
okini3939 | 1:0dac72ab5910 | 24 | void systemExclusive (uint8_t *buffer, uint16_t length, bool flag) { |
okini3939 | 1:0dac72ab5910 | 25 | midi2.sendSysEx(length, buffer, flag); |
okini3939 | 1:0dac72ab5910 | 26 | } |
okini3939 | 0:0fd787d62a99 | 27 | void noteOn(uint8_t channel, uint8_t note, uint8_t velocity) { |
okini3939 | 1:0dac72ab5910 | 28 | midi_out.queue(((uint32_t)NoteOn << 24) | ((uint32_t)channel << 16) | (note << 8) | velocity); |
okini3939 | 1:0dac72ab5910 | 29 | } |
okini3939 | 1:0dac72ab5910 | 30 | void noteOff(uint8_t channel, uint8_t note, uint8_t velocity) { |
okini3939 | 1:0dac72ab5910 | 31 | midi_out.queue(((uint32_t)NoteOff << 24) | ((uint32_t)channel << 16) | (note << 8) | velocity); |
okini3939 | 1:0dac72ab5910 | 32 | } |
okini3939 | 1:0dac72ab5910 | 33 | void controlChange(uint8_t channel, uint8_t key, uint8_t value) { |
okini3939 | 1:0dac72ab5910 | 34 | midi_out.queue(((uint32_t)ControlChange << 24) | ((uint32_t)channel << 16) | (key << 8) | value); |
okini3939 | 1:0dac72ab5910 | 35 | } |
okini3939 | 1:0dac72ab5910 | 36 | void programChange (uint8_t channel, uint8_t progra) { |
okini3939 | 1:0dac72ab5910 | 37 | midi_out.queue(((uint32_t)ProgramChange << 24) | ((uint32_t)channel << 16) | (progra << 8)); |
okini3939 | 1:0dac72ab5910 | 38 | } |
okini3939 | 1:0dac72ab5910 | 39 | void pitchBend (uint8_t channel, uint16_t value) { |
okini3939 | 1:0dac72ab5910 | 40 | midi_out.queue(((uint32_t)PitchBend << 24) | ((uint32_t)channel << 16) | value); |
okini3939 | 0:0fd787d62a99 | 41 | } |
okini3939 | 0:0fd787d62a99 | 42 | |
okini3939 | 1:0dac72ab5910 | 43 | |
okini3939 | 1:0dac72ab5910 | 44 | void printLcd (int x, int y, char *buf) { |
okini3939 | 1:0dac72ab5910 | 45 | int i, len; |
okini3939 | 1:0dac72ab5910 | 46 | uint8_t msg[40] = {0xf0, 0x00, 0x00, 0x66, 0x14, 0x12, 0x00}; |
okini3939 | 0:0fd787d62a99 | 47 | |
okini3939 | 1:0dac72ab5910 | 48 | msg[6] = (7 * x) + (0x38 * y); |
okini3939 | 1:0dac72ab5910 | 49 | len = 7; |
okini3939 | 1:0dac72ab5910 | 50 | for (i = 0; i < strlen(buf); i ++) { |
okini3939 | 1:0dac72ab5910 | 51 | msg[len ++] = buf[i]; |
okini3939 | 0:0fd787d62a99 | 52 | } |
okini3939 | 1:0dac72ab5910 | 53 | msg[len ++] = 0xf7; |
okini3939 | 1:0dac72ab5910 | 54 | midi.sendSystemExclusive(msg, len); |
okini3939 | 0:0fd787d62a99 | 55 | } |
okini3939 | 0:0fd787d62a99 | 56 | |
okini3939 | 0:0fd787d62a99 | 57 | void midi_task(void const*) { |
okini3939 | 0:0fd787d62a99 | 58 | int i; |
okini3939 | 1:0dac72ab5910 | 59 | |
okini3939 | 1:0dac72ab5910 | 60 | // hub = new USBHostHub; |
okini3939 | 1:0dac72ab5910 | 61 | // midi = new USBHostMIDI; |
okini3939 | 1:0dac72ab5910 | 62 | |
okini3939 | 0:0fd787d62a99 | 63 | // attach midi event callbacks |
okini3939 | 1:0dac72ab5910 | 64 | midi.attachSystemExclusive(systemExclusive); |
okini3939 | 0:0fd787d62a99 | 65 | midi.attachNoteOn(noteOn); |
okini3939 | 0:0fd787d62a99 | 66 | midi.attachNoteOff(noteOff); |
okini3939 | 0:0fd787d62a99 | 67 | midi.attachControlChange(controlChange); |
okini3939 | 1:0dac72ab5910 | 68 | midi.attachProgramChange(programChange); |
okini3939 | 1:0dac72ab5910 | 69 | midi.attachPitchBend(pitchBend); |
okini3939 | 1:0dac72ab5910 | 70 | |
okini3939 | 0:0fd787d62a99 | 71 | pc.printf("begin\r\n"); |
okini3939 | 0:0fd787d62a99 | 72 | |
okini3939 | 1:0dac72ab5910 | 73 | uint32_t m; |
okini3939 | 1:0dac72ab5910 | 74 | int channel, data1, data2; |
okini3939 | 0:0fd787d62a99 | 75 | for (;;) { |
okini3939 | 0:0fd787d62a99 | 76 | // try to connect a midi device |
okini3939 | 0:0fd787d62a99 | 77 | while(!midi.connect()) { |
okini3939 | 0:0fd787d62a99 | 78 | Thread::wait(500); |
okini3939 | 0:0fd787d62a99 | 79 | led1 = !led1; |
okini3939 | 0:0fd787d62a99 | 80 | } |
okini3939 | 1:0dac72ab5910 | 81 | Thread::wait(500); |
okini3939 | 1:0dac72ab5910 | 82 | |
okini3939 | 1:0dac72ab5910 | 83 | pc.printf("detected\r\n"); |
okini3939 | 1:0dac72ab5910 | 84 | for (i = 0; i < 9; i ++) { |
okini3939 | 1:0dac72ab5910 | 85 | midi.sendPitchBend(i, 0); // fader 0 |
okini3939 | 1:0dac72ab5910 | 86 | } |
okini3939 | 1:0dac72ab5910 | 87 | for (i = 0; i < 0x7f; i ++) { |
okini3939 | 1:0dac72ab5910 | 88 | midi.sendNoteOn(0, i, 0); // led off |
okini3939 | 1:0dac72ab5910 | 89 | } |
okini3939 | 1:0dac72ab5910 | 90 | |
okini3939 | 1:0dac72ab5910 | 91 | // LCD |
okini3939 | 1:0dac72ab5910 | 92 | printLcd(0, 0, " High"); |
okini3939 | 1:0dac72ab5910 | 93 | printLcd(1, 0, " Mid"); |
okini3939 | 1:0dac72ab5910 | 94 | printLcd(2, 0, " Low"); |
okini3939 | 1:0dac72ab5910 | 95 | printLcd(3, 0, " Gain"); |
okini3939 | 1:0dac72ab5910 | 96 | printLcd(4, 0, " Gain"); |
okini3939 | 1:0dac72ab5910 | 97 | printLcd(5, 0, " Low"); |
okini3939 | 1:0dac72ab5910 | 98 | printLcd(6, 0, " Mid"); |
okini3939 | 1:0dac72ab5910 | 99 | printLcd(7, 0, " High"); |
okini3939 | 1:0dac72ab5910 | 100 | printLcd(2, 1, " Speed"); |
okini3939 | 1:0dac72ab5910 | 101 | printLcd(3, 1, " 1 <"); |
okini3939 | 1:0dac72ab5910 | 102 | printLcd(4, 1, "> 2 "); |
okini3939 | 1:0dac72ab5910 | 103 | printLcd(5, 1, " Speed"); |
okini3939 | 1:0dac72ab5910 | 104 | // 7segment LED |
okini3939 | 1:0dac72ab5910 | 105 | midi.sendControlChange(0, 0x43, 'D' & 0x1f); |
okini3939 | 1:0dac72ab5910 | 106 | midi.sendControlChange(0, 0x42, 'J' & 0x1f); |
okini3939 | 1:0dac72ab5910 | 107 | midi.sendControlChange(0, 0x41, 'A' & 0x1f); |
okini3939 | 1:0dac72ab5910 | 108 | midi.sendControlChange(0, 0x40, 'Y' & 0x1f); |
okini3939 | 1:0dac72ab5910 | 109 | |
okini3939 | 0:0fd787d62a99 | 110 | led1 = 1; |
okini3939 | 0:0fd787d62a99 | 111 | for (;;) { |
okini3939 | 0:0fd787d62a99 | 112 | if (!midi.connected()) { |
okini3939 | 0:0fd787d62a99 | 113 | pc.printf("disconnected\r\n"); |
okini3939 | 0:0fd787d62a99 | 114 | break; |
okini3939 | 0:0fd787d62a99 | 115 | } |
okini3939 | 0:0fd787d62a99 | 116 | |
okini3939 | 1:0dac72ab5910 | 117 | if (!midi_out.isEmpty()) { |
okini3939 | 1:0dac72ab5910 | 118 | // USB -> uart |
okini3939 | 1:0dac72ab5910 | 119 | midi_out.dequeue(&m); |
okini3939 | 1:0dac72ab5910 | 120 | channel = (m >> 16) & 0x7f; |
okini3939 | 1:0dac72ab5910 | 121 | data1 = (m >> 8) & 0x7f; |
okini3939 | 1:0dac72ab5910 | 122 | data2 = m & 0x7f; |
okini3939 | 1:0dac72ab5910 | 123 | |
okini3939 | 1:0dac72ab5910 | 124 | switch (m >> 24) { |
okini3939 | 1:0dac72ab5910 | 125 | case NoteOn: |
okini3939 | 1:0dac72ab5910 | 126 | midi2.sendNoteOn(data1, data2, channel); |
okini3939 | 1:0dac72ab5910 | 127 | // pc.printf("noteOn %02x %02x %02x\r\n", channel, data1, data2); |
okini3939 | 1:0dac72ab5910 | 128 | break; |
okini3939 | 1:0dac72ab5910 | 129 | case NoteOff: |
okini3939 | 1:0dac72ab5910 | 130 | midi2.sendNoteOff(data1, data2, channel); |
okini3939 | 1:0dac72ab5910 | 131 | // pc.printf("noteOff %02x %02x %02x\r\n", channel, data1, data2); |
okini3939 | 1:0dac72ab5910 | 132 | break; |
okini3939 | 1:0dac72ab5910 | 133 | case ControlChange: |
okini3939 | 1:0dac72ab5910 | 134 | if ((data1 >= 0x10 && data1 <= 0x17) || data1 == 0x3c) { |
okini3939 | 1:0dac72ab5910 | 135 | midi2.sendControlChange(data1, data2 < 0x40 ? data2 : 0x80 - (data2 - 0x40), channel); |
okini3939 | 1:0dac72ab5910 | 136 | } else { |
okini3939 | 1:0dac72ab5910 | 137 | midi2.sendControlChange(data1, data2, channel); |
okini3939 | 1:0dac72ab5910 | 138 | } |
okini3939 | 1:0dac72ab5910 | 139 | // pc.printf("controlChange %02x %02x %02x\r\n", channel, data1, data2); |
okini3939 | 1:0dac72ab5910 | 140 | break; |
okini3939 | 1:0dac72ab5910 | 141 | case ProgramChange: |
okini3939 | 1:0dac72ab5910 | 142 | midi2.sendProgramChange(data1, channel); |
okini3939 | 1:0dac72ab5910 | 143 | // pc.printf("programChange %02x %02x\r\n", channel, data1); |
okini3939 | 1:0dac72ab5910 | 144 | break; |
okini3939 | 1:0dac72ab5910 | 145 | case PitchBend: |
okini3939 | 1:0dac72ab5910 | 146 | data1 = m & 0x3fff; |
okini3939 | 1:0dac72ab5910 | 147 | midi.sendPitchBend(channel, data1); |
okini3939 | 1:0dac72ab5910 | 148 | midi2.sendControlChange(channel, data1 >> 7, 0); |
okini3939 | 1:0dac72ab5910 | 149 | // pc.printf("pitchBend %02x %04x\r\n", channel, data1); |
okini3939 | 1:0dac72ab5910 | 150 | break; |
okini3939 | 1:0dac72ab5910 | 151 | } |
okini3939 | 0:0fd787d62a99 | 152 | } |
okini3939 | 1:0dac72ab5910 | 153 | |
okini3939 | 1:0dac72ab5910 | 154 | if (midi2.read()) { |
okini3939 | 1:0dac72ab5910 | 155 | // uart -> USB |
okini3939 | 1:0dac72ab5910 | 156 | channel = midi2.getChannel(); |
okini3939 | 1:0dac72ab5910 | 157 | data1 = midi2.getData1(); |
okini3939 | 1:0dac72ab5910 | 158 | data2 = midi2.getData2(); |
okini3939 | 1:0dac72ab5910 | 159 | |
okini3939 | 1:0dac72ab5910 | 160 | switch (midi2.getType()) { |
okini3939 | 1:0dac72ab5910 | 161 | case NoteOn: |
okini3939 | 1:0dac72ab5910 | 162 | midi.sendNoteOn(channel, data1, data2); |
okini3939 | 1:0dac72ab5910 | 163 | // pc.printf(" noteOn %02x %02x %02x\r\n", channel, data1, data2); |
okini3939 | 1:0dac72ab5910 | 164 | break; |
okini3939 | 1:0dac72ab5910 | 165 | case NoteOff: |
okini3939 | 1:0dac72ab5910 | 166 | midi.sendNoteOff(channel, data1, data2); |
okini3939 | 1:0dac72ab5910 | 167 | // pc.printf(" noteOff %02x %02x %02x\r\n", channel, data1, data2); |
okini3939 | 1:0dac72ab5910 | 168 | break; |
okini3939 | 1:0dac72ab5910 | 169 | case ControlChange: |
okini3939 | 1:0dac72ab5910 | 170 | if (data1 < 0x10) { |
okini3939 | 1:0dac72ab5910 | 171 | midi.sendPitchBend(data1, (data2 << 7) | data2); |
okini3939 | 1:0dac72ab5910 | 172 | } else |
okini3939 | 1:0dac72ab5910 | 173 | if (data1 >= 0x10 && data1 <= 0x17) { |
okini3939 | 1:0dac72ab5910 | 174 | midi.sendControlChange(channel, 0x30 | (data1 & 0x0f), (data2 * 0x0c) / 0x7f); |
okini3939 | 1:0dac72ab5910 | 175 | } else { |
okini3939 | 1:0dac72ab5910 | 176 | midi.sendControlChange(channel, data1, data2); |
okini3939 | 1:0dac72ab5910 | 177 | } |
okini3939 | 1:0dac72ab5910 | 178 | // pc.printf(" controlChange %02x %02x %02x\r\n", channel, data1, data2); |
okini3939 | 1:0dac72ab5910 | 179 | break; |
okini3939 | 1:0dac72ab5910 | 180 | case ProgramChange: |
okini3939 | 1:0dac72ab5910 | 181 | midi.sendProgramChange(channel, data1); |
okini3939 | 1:0dac72ab5910 | 182 | // pc.printf(" programChange %02x %02x\r\n", channel, data1); |
okini3939 | 1:0dac72ab5910 | 183 | break; |
okini3939 | 1:0dac72ab5910 | 184 | case PitchBend: |
okini3939 | 1:0dac72ab5910 | 185 | // pc.printf(" pitchBend %02x %04x\r\n", channel, data1); |
okini3939 | 1:0dac72ab5910 | 186 | break; |
okini3939 | 1:0dac72ab5910 | 187 | case SystemExclusive: |
okini3939 | 1:0dac72ab5910 | 188 | midi.sendSystemExclusive((uint8_t *)midi2.getSysExArray(), midi2.getSysExArrayLength()); |
okini3939 | 1:0dac72ab5910 | 189 | // pc.printf(" SystemExclusive\r\n"); |
okini3939 | 1:0dac72ab5910 | 190 | break; |
okini3939 | 1:0dac72ab5910 | 191 | } |
okini3939 | 0:0fd787d62a99 | 192 | } |
okini3939 | 0:0fd787d62a99 | 193 | } |
okini3939 | 0:0fd787d62a99 | 194 | } |
okini3939 | 0:0fd787d62a99 | 195 | } |
okini3939 | 0:0fd787d62a99 | 196 | |
okini3939 | 0:0fd787d62a99 | 197 | int main() { |
okini3939 | 0:0fd787d62a99 | 198 | pc.baud(115200); |
okini3939 | 0:0fd787d62a99 | 199 | pc.printf("*** USB Host MIDI\r\n"); |
okini3939 | 0:0fd787d62a99 | 200 | |
okini3939 | 1:0dac72ab5910 | 201 | midi2.begin(MIDI_CHANNEL_OMNI); |
okini3939 | 1:0dac72ab5910 | 202 | midi2.turnThruOff(); |
okini3939 | 1:0dac72ab5910 | 203 | |
okini3939 | 1:0dac72ab5910 | 204 | // Thread midiTask(midi_task, NULL, osPriorityNormal, 5120); |
okini3939 | 0:0fd787d62a99 | 205 | for (;;) { |
okini3939 | 1:0dac72ab5910 | 206 | midi_task(NULL); |
okini3939 | 1:0dac72ab5910 | 207 | // Thread::wait(100); |
okini3939 | 0:0fd787d62a99 | 208 | } |
okini3939 | 0:0fd787d62a99 | 209 | } |