X-TOUCH to djay bridge

Dependencies:   mbed mbed-rtos FATFileSystem

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002  * BEHRINGER X-TOUCH to DJAY bridge
00003  *   for mbed LPC1768
00004  *
00005  * X-TOUCH (MC/USB) <---USB---> LPC1768 <---UART MIDI---> MD-BT01 (YAMAHA, BLE MIDI)
00006  */
00007 
00008 #include "mbed.h"
00009 #include "USBHostHub.h"
00010 #include "USBHostMIDI.h"
00011 #include "MIDI.h"
00012 #include "CBuffer.h"
00013 
00014 Serial pc(USBTX, USBRX);
00015 DigitalOut led1(LED1);
00016 PwmOut led2(LED2), led3(LED3), led4(LED4);
00017 USBHostHub hub;
00018 USBHostMIDI midi;
00019 MIDI midi2(p28, p27);
00020 
00021 CircBuffer <uint32_t>midi_out(20);
00022 
00023 
00024 void systemExclusive (uint8_t *buffer, uint16_t length, bool flag) {
00025     midi2.sendSysEx(length, buffer, flag);
00026 }
00027 void noteOn(uint8_t channel, uint8_t note, uint8_t velocity) {
00028     midi_out.queue(((uint32_t)NoteOn << 24) | ((uint32_t)channel << 16) | (note << 8) | velocity);
00029 }
00030 void noteOff(uint8_t channel, uint8_t note, uint8_t velocity) {
00031     midi_out.queue(((uint32_t)NoteOff << 24) | ((uint32_t)channel << 16) | (note << 8) | velocity);
00032 }
00033 void controlChange(uint8_t channel, uint8_t key, uint8_t value) {
00034     midi_out.queue(((uint32_t)ControlChange << 24) | ((uint32_t)channel << 16) | (key << 8) | value);
00035 }
00036 void programChange (uint8_t channel, uint8_t progra) {
00037     midi_out.queue(((uint32_t)ProgramChange << 24) | ((uint32_t)channel << 16) | (progra << 8));
00038 }
00039 void pitchBend (uint8_t channel, uint16_t value) {
00040     midi_out.queue(((uint32_t)PitchBend << 24) | ((uint32_t)channel << 16) | value);
00041 }
00042 
00043 
00044 void printLcd (int x, int y, char *buf) {
00045     int i, len;
00046     uint8_t msg[40] = {0xf0, 0x00, 0x00, 0x66, 0x14,  0x12, 0x00};
00047 
00048     msg[6] = (7 * x) + (0x38 * y);
00049     len = 7;
00050     for (i = 0; i < strlen(buf); i ++) {
00051         msg[len ++] = buf[i];
00052     }
00053     msg[len ++] = 0xf7;
00054     midi.sendSystemExclusive(msg, len);
00055 }
00056 
00057 void midi_task(void const*) {
00058     int i;
00059 
00060 //    hub = new USBHostHub;
00061 //    midi = new USBHostMIDI;
00062 
00063     // attach midi event callbacks
00064     midi.attachSystemExclusive(systemExclusive);
00065     midi.attachNoteOn(noteOn);
00066     midi.attachNoteOff(noteOff);
00067     midi.attachControlChange(controlChange);
00068     midi.attachProgramChange(programChange);
00069     midi.attachPitchBend(pitchBend);
00070     
00071     pc.printf("begin\r\n");
00072 
00073     uint32_t m;
00074     int channel, data1, data2;
00075     for (;;) {
00076         // try to connect a midi device
00077         while(!midi.connect()) {
00078             Thread::wait(500);
00079             led1 = !led1;
00080         }
00081         Thread::wait(500);
00082 
00083         pc.printf("detected\r\n");
00084         for (i = 0; i < 9; i ++) {
00085             midi.sendPitchBend(i, 0); // fader 0
00086         }
00087         for (i = 0; i < 0x7f; i ++) {
00088             midi.sendNoteOn(0, i, 0); // led off
00089         }
00090 
00091         // LCD
00092         printLcd(0, 0, " High");
00093         printLcd(1, 0, "  Mid");
00094         printLcd(2, 0, "  Low");
00095         printLcd(3, 0, " Gain");
00096         printLcd(4, 0, " Gain");
00097         printLcd(5, 0, "  Low");
00098         printLcd(6, 0, "  Mid");
00099         printLcd(7, 0, " High");
00100         printLcd(2, 1, " Speed");
00101         printLcd(3, 1, "   1  <");
00102         printLcd(4, 1, ">  2   ");
00103         printLcd(5, 1, " Speed");
00104         // 7segment LED
00105         midi.sendControlChange(0, 0x43, 'D' & 0x1f);
00106         midi.sendControlChange(0, 0x42, 'J' & 0x1f);
00107         midi.sendControlChange(0, 0x41, 'A' & 0x1f);
00108         midi.sendControlChange(0, 0x40, 'Y' & 0x1f);
00109 
00110         led1 = 1;
00111         for (;;) {
00112             if (!midi.connected()) {
00113                 pc.printf("disconnected\r\n");
00114                 break;
00115             }
00116 
00117             if (!midi_out.isEmpty()) {
00118                 // USB -> uart
00119                 midi_out.dequeue(&m);
00120                 channel = (m >> 16) & 0x7f;
00121                 data1 = (m >> 8) & 0x7f;
00122                 data2 = m & 0x7f;
00123                 
00124                 switch (m >> 24) {
00125                 case NoteOn:
00126                     midi2.sendNoteOn(data1, data2, channel);
00127 //                    pc.printf("noteOn %02x %02x %02x\r\n", channel, data1, data2);
00128                     break;
00129                 case NoteOff:
00130                     midi2.sendNoteOff(data1, data2, channel);
00131 //                    pc.printf("noteOff %02x %02x %02x\r\n", channel, data1, data2);
00132                     break;
00133                 case ControlChange:
00134                     if ((data1 >= 0x10 && data1 <= 0x17) || data1 == 0x3c) {
00135                         midi2.sendControlChange(data1, data2 < 0x40 ? data2 : 0x80 - (data2 - 0x40), channel);
00136                     } else {
00137                         midi2.sendControlChange(data1, data2, channel);
00138                     }
00139 //                    pc.printf("controlChange %02x %02x %02x\r\n", channel, data1, data2);
00140                     break;
00141                 case ProgramChange:
00142                     midi2.sendProgramChange(data1, channel);
00143 //                    pc.printf("programChange %02x %02x\r\n", channel, data1);
00144                     break;
00145                 case PitchBend:
00146                     data1 = m & 0x3fff;
00147                     midi.sendPitchBend(channel, data1);
00148                     midi2.sendControlChange(channel, data1 >> 7, 0);
00149 //                    pc.printf("pitchBend %02x %04x\r\n", channel, data1);
00150                     break;
00151                 }
00152             }
00153 
00154             if (midi2.read()) {
00155                 // uart -> USB
00156                 channel = midi2.getChannel();
00157                 data1 = midi2.getData1();
00158                 data2 = midi2.getData2();
00159 
00160                 switch (midi2.getType()) {
00161                 case NoteOn:
00162                     midi.sendNoteOn(channel, data1, data2);
00163 //                    pc.printf(" noteOn %02x %02x %02x\r\n", channel, data1, data2);
00164                     break;
00165                 case NoteOff:
00166                     midi.sendNoteOff(channel, data1, data2);
00167 //                    pc.printf(" noteOff %02x %02x %02x\r\n", channel, data1, data2);
00168                     break;
00169                 case ControlChange:
00170                     if (data1 < 0x10) {
00171                         midi.sendPitchBend(data1, (data2 << 7) | data2);
00172                     } else
00173                     if (data1 >= 0x10 && data1 <= 0x17) {
00174                         midi.sendControlChange(channel, 0x30 | (data1 & 0x0f), (data2 * 0x0c) / 0x7f);
00175                     } else {
00176                         midi.sendControlChange(channel, data1, data2);
00177                     }
00178 //                    pc.printf(" controlChange %02x %02x %02x\r\n", channel, data1, data2);
00179                     break;
00180                 case ProgramChange:
00181                     midi.sendProgramChange(channel, data1);
00182 //                    pc.printf(" programChange %02x %02x\r\n", channel, data1);
00183                     break;
00184                 case PitchBend:
00185 //                    pc.printf(" pitchBend %02x %04x\r\n", channel, data1);
00186                     break;
00187                 case SystemExclusive:
00188                     midi.sendSystemExclusive((uint8_t *)midi2.getSysExArray(), midi2.getSysExArrayLength());
00189 //                    pc.printf(" SystemExclusive\r\n");
00190                     break;
00191                 }
00192             }
00193         }
00194     }
00195 }
00196 
00197 int main() {
00198     pc.baud(115200);
00199     pc.printf("*** USB Host MIDI\r\n");
00200 
00201     midi2.begin(MIDI_CHANNEL_OMNI);
00202     midi2.turnThruOff();
00203 
00204 //    Thread midiTask(midi_task, NULL, osPriorityNormal, 5120);
00205     for (;;) {
00206         midi_task(NULL);
00207 //        Thread::wait(100);
00208     }
00209 }