X-TOUCH to djay bridge

Dependencies:   mbed mbed-rtos FATFileSystem

Committer:
okini3939
Date:
Wed Jun 05 04:54:37 2019 +0000
Revision:
1:0dac72ab5910
Parent:
0:0fd787d62a99
sample

Who changed what in which revision?

UserRevisionLine numberNew 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 }