X-TOUCH to djay bridge
Dependencies: mbed mbed-rtos FATFileSystem
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 }
Generated on Wed Jul 13 2022 10:54:56 by 1.7.2