X-TOUCH to djay bridge

Dependencies:   mbed mbed-rtos FATFileSystem

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 1:0dac72ab5910 1 /* Copyright (c) 2014 mbed.org, MIT License
okini3939 1:0dac72ab5910 2 *
okini3939 1:0dac72ab5910 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
okini3939 1:0dac72ab5910 4 * and associated documentation files (the "Software"), to deal in the Software without
okini3939 1:0dac72ab5910 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
okini3939 1:0dac72ab5910 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
okini3939 1:0dac72ab5910 7 * Software is furnished to do so, subject to the following conditions:
okini3939 1:0dac72ab5910 8 *
okini3939 1:0dac72ab5910 9 * The above copyright notice and this permission notice shall be included in all copies or
okini3939 1:0dac72ab5910 10 * substantial portions of the Software.
okini3939 1:0dac72ab5910 11 *
okini3939 1:0dac72ab5910 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
okini3939 1:0dac72ab5910 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
okini3939 1:0dac72ab5910 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
okini3939 1:0dac72ab5910 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
okini3939 1:0dac72ab5910 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
okini3939 1:0dac72ab5910 17 */
okini3939 1:0dac72ab5910 18
okini3939 1:0dac72ab5910 19 #include "USBHostMIDI.h"
okini3939 1:0dac72ab5910 20
okini3939 1:0dac72ab5910 21 #if USBHOST_MIDI
okini3939 1:0dac72ab5910 22
okini3939 1:0dac72ab5910 23 #include "dbg.h"
okini3939 1:0dac72ab5910 24
okini3939 1:0dac72ab5910 25 #define SET_LINE_CODING 0x20
okini3939 1:0dac72ab5910 26
okini3939 1:0dac72ab5910 27 USBHostMIDI::USBHostMIDI() {
okini3939 1:0dac72ab5910 28 host = USBHost::getHostInst();
okini3939 1:0dac72ab5910 29 size_bulk_in = 0;
okini3939 1:0dac72ab5910 30 size_bulk_out = 0;
okini3939 1:0dac72ab5910 31 init();
okini3939 1:0dac72ab5910 32 }
okini3939 1:0dac72ab5910 33
okini3939 1:0dac72ab5910 34 void USBHostMIDI::init() {
okini3939 1:0dac72ab5910 35 dev = NULL;
okini3939 1:0dac72ab5910 36 bulk_in = NULL;
okini3939 1:0dac72ab5910 37 bulk_out = NULL;
okini3939 1:0dac72ab5910 38 dev_connected = false;
okini3939 1:0dac72ab5910 39 midi_intf = -1;
okini3939 1:0dac72ab5910 40 midi_device_found = false;
okini3939 1:0dac72ab5910 41 sysExBufferPos = 0;
okini3939 1:0dac72ab5910 42 }
okini3939 1:0dac72ab5910 43
okini3939 1:0dac72ab5910 44 bool USBHostMIDI::connected() {
okini3939 1:0dac72ab5910 45 return dev_connected;
okini3939 1:0dac72ab5910 46 }
okini3939 1:0dac72ab5910 47
okini3939 1:0dac72ab5910 48 bool USBHostMIDI::connect() {
okini3939 1:0dac72ab5910 49 if (dev_connected) {
okini3939 1:0dac72ab5910 50 return true;
okini3939 1:0dac72ab5910 51 }
okini3939 1:0dac72ab5910 52
okini3939 1:0dac72ab5910 53 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
okini3939 1:0dac72ab5910 54 if ((dev = host->getDevice(i)) != NULL) {
okini3939 1:0dac72ab5910 55
okini3939 1:0dac72ab5910 56 USB_DBG("Trying to connect MIDI device\r\n");
okini3939 1:0dac72ab5910 57
okini3939 1:0dac72ab5910 58 if (host->enumerate(dev, this)) {
okini3939 1:0dac72ab5910 59 break;
okini3939 1:0dac72ab5910 60 }
okini3939 1:0dac72ab5910 61
okini3939 1:0dac72ab5910 62 if (midi_device_found) {
okini3939 1:0dac72ab5910 63 bulk_in = dev->getEndpoint(midi_intf, BULK_ENDPOINT, IN);
okini3939 1:0dac72ab5910 64 bulk_out = dev->getEndpoint(midi_intf, BULK_ENDPOINT, OUT);
okini3939 1:0dac72ab5910 65
okini3939 1:0dac72ab5910 66 if (!bulk_in || !bulk_out) {
okini3939 1:0dac72ab5910 67 break;
okini3939 1:0dac72ab5910 68 }
okini3939 1:0dac72ab5910 69
okini3939 1:0dac72ab5910 70 USB_INFO("New MIDI device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, midi_intf);
okini3939 1:0dac72ab5910 71 dev->setName("MIDI", midi_intf);
okini3939 1:0dac72ab5910 72 host->registerDriver(dev, midi_intf, this, &USBHostMIDI::init);
okini3939 1:0dac72ab5910 73
okini3939 1:0dac72ab5910 74 size_bulk_in = bulk_in->getSize();
okini3939 1:0dac72ab5910 75 size_bulk_out = bulk_out->getSize();
okini3939 1:0dac72ab5910 76
okini3939 1:0dac72ab5910 77 bulk_in->attach(this, &USBHostMIDI::rxHandler);
okini3939 1:0dac72ab5910 78
okini3939 1:0dac72ab5910 79 host->bulkRead(dev, bulk_in, buf, size_bulk_in, false);
okini3939 1:0dac72ab5910 80 dev_connected = true;
okini3939 1:0dac72ab5910 81 return true;
okini3939 1:0dac72ab5910 82 }
okini3939 1:0dac72ab5910 83 }
okini3939 1:0dac72ab5910 84 }
okini3939 1:0dac72ab5910 85
okini3939 1:0dac72ab5910 86 init();
okini3939 1:0dac72ab5910 87 return false;
okini3939 1:0dac72ab5910 88 }
okini3939 1:0dac72ab5910 89
okini3939 1:0dac72ab5910 90 void USBHostMIDI::rxHandler() {
okini3939 1:0dac72ab5910 91 uint8_t *midi;
okini3939 1:0dac72ab5910 92 if (bulk_in) {
okini3939 1:0dac72ab5910 93 int length = bulk_in->getLengthTransferred();
okini3939 1:0dac72ab5910 94 if (bulk_in->getState() == USB_TYPE_IDLE || bulk_in->getState() == USB_TYPE_FREE) {
okini3939 1:0dac72ab5910 95 // MIDI event handling
okini3939 1:0dac72ab5910 96 for (int i = 0; i < length; i += 4) {
okini3939 1:0dac72ab5910 97 if (i + 4 > length) {
okini3939 1:0dac72ab5910 98 // length shortage, ignored.
okini3939 1:0dac72ab5910 99 break;
okini3939 1:0dac72ab5910 100 }
okini3939 1:0dac72ab5910 101
okini3939 1:0dac72ab5910 102 // read each four bytes
okini3939 1:0dac72ab5910 103 midi = &buf[i];
okini3939 1:0dac72ab5910 104 // process MIDI message
okini3939 1:0dac72ab5910 105 // switch by code index number
okini3939 1:0dac72ab5910 106 switch (midi[0] & 0xf) {
okini3939 1:0dac72ab5910 107 case 0: // miscellaneous function codes
okini3939 1:0dac72ab5910 108 miscellaneousFunctionCode(midi[1], midi[2], midi[3]);
okini3939 1:0dac72ab5910 109 break;
okini3939 1:0dac72ab5910 110 case 1: // cable events
okini3939 1:0dac72ab5910 111 cableEvent(midi[1], midi[2], midi[3]);
okini3939 1:0dac72ab5910 112 break;
okini3939 1:0dac72ab5910 113 case 2: // two bytes system common messages
okini3939 1:0dac72ab5910 114 systemCommonTwoBytes(midi[1], midi[2]);
okini3939 1:0dac72ab5910 115 break;
okini3939 1:0dac72ab5910 116 case 3: // three bytes system common messages
okini3939 1:0dac72ab5910 117 systemCommonThreeBytes(midi[1], midi[2], midi[3]);
okini3939 1:0dac72ab5910 118 break;
okini3939 1:0dac72ab5910 119 case 4: // SysEx starts or continues
okini3939 1:0dac72ab5910 120 sysExBuffer[sysExBufferPos++] = midi[1];
okini3939 1:0dac72ab5910 121 if (sysExBufferPos >= 64) {
okini3939 1:0dac72ab5910 122 systemExclusive(sysExBuffer, sysExBufferPos, true);
okini3939 1:0dac72ab5910 123 sysExBufferPos = 0;
okini3939 1:0dac72ab5910 124 }
okini3939 1:0dac72ab5910 125 sysExBuffer[sysExBufferPos++] = midi[2];
okini3939 1:0dac72ab5910 126 if (sysExBufferPos >= 64) {
okini3939 1:0dac72ab5910 127 systemExclusive(sysExBuffer, sysExBufferPos, true);
okini3939 1:0dac72ab5910 128 sysExBufferPos = 0;
okini3939 1:0dac72ab5910 129 }
okini3939 1:0dac72ab5910 130 sysExBuffer[sysExBufferPos++] = midi[3];
okini3939 1:0dac72ab5910 131 // SysEx continues. don't send
okini3939 1:0dac72ab5910 132 break;
okini3939 1:0dac72ab5910 133 case 5: // SysEx ends with single byte
okini3939 1:0dac72ab5910 134 sysExBuffer[sysExBufferPos++] = midi[1];
okini3939 1:0dac72ab5910 135 systemExclusive(sysExBuffer, sysExBufferPos, false);
okini3939 1:0dac72ab5910 136 sysExBufferPos = 0;
okini3939 1:0dac72ab5910 137 break;
okini3939 1:0dac72ab5910 138 case 6: // SysEx ends with two bytes
okini3939 1:0dac72ab5910 139 sysExBuffer[sysExBufferPos++] = midi[1];
okini3939 1:0dac72ab5910 140 if (sysExBufferPos >= 64) {
okini3939 1:0dac72ab5910 141 systemExclusive(sysExBuffer, sysExBufferPos, true);
okini3939 1:0dac72ab5910 142 sysExBufferPos = 0;
okini3939 1:0dac72ab5910 143 }
okini3939 1:0dac72ab5910 144 sysExBuffer[sysExBufferPos++] = midi[2];
okini3939 1:0dac72ab5910 145 systemExclusive(sysExBuffer, sysExBufferPos, false);
okini3939 1:0dac72ab5910 146 sysExBufferPos = 0;
okini3939 1:0dac72ab5910 147 break;
okini3939 1:0dac72ab5910 148 case 7: // SysEx ends with three bytes
okini3939 1:0dac72ab5910 149 sysExBuffer[sysExBufferPos++] = midi[1];
okini3939 1:0dac72ab5910 150 if (sysExBufferPos >= 64) {
okini3939 1:0dac72ab5910 151 systemExclusive(sysExBuffer, sysExBufferPos, true);
okini3939 1:0dac72ab5910 152 sysExBufferPos = 0;
okini3939 1:0dac72ab5910 153 }
okini3939 1:0dac72ab5910 154 sysExBuffer[sysExBufferPos++] = midi[2];
okini3939 1:0dac72ab5910 155 if (sysExBufferPos >= 64) {
okini3939 1:0dac72ab5910 156 systemExclusive(sysExBuffer, sysExBufferPos, true);
okini3939 1:0dac72ab5910 157 sysExBufferPos = 0;
okini3939 1:0dac72ab5910 158 }
okini3939 1:0dac72ab5910 159 sysExBuffer[sysExBufferPos++] = midi[3];
okini3939 1:0dac72ab5910 160 systemExclusive(sysExBuffer, sysExBufferPos, false);
okini3939 1:0dac72ab5910 161 sysExBufferPos = 0;
okini3939 1:0dac72ab5910 162 break;
okini3939 1:0dac72ab5910 163 case 8:
okini3939 1:0dac72ab5910 164 noteOff(midi[1] & 0xf, midi[2], midi[3]);
okini3939 1:0dac72ab5910 165 break;
okini3939 1:0dac72ab5910 166 case 9:
okini3939 1:0dac72ab5910 167 if (midi[3]) {
okini3939 1:0dac72ab5910 168 noteOn(midi[1] & 0xf, midi[2], midi[3]);
okini3939 1:0dac72ab5910 169 } else {
okini3939 1:0dac72ab5910 170 noteOff(midi[1] & 0xf, midi[2], midi[3]);
okini3939 1:0dac72ab5910 171 }
okini3939 1:0dac72ab5910 172 break;
okini3939 1:0dac72ab5910 173 case 10:
okini3939 1:0dac72ab5910 174 polyKeyPress(midi[1] & 0xf, midi[2], midi[3]);
okini3939 1:0dac72ab5910 175 break;
okini3939 1:0dac72ab5910 176 case 11:
okini3939 1:0dac72ab5910 177 controlChange(midi[1] & 0xf, midi[2], midi[3]);
okini3939 1:0dac72ab5910 178 break;
okini3939 1:0dac72ab5910 179 case 12:
okini3939 1:0dac72ab5910 180 programChange(midi[1] & 0xf, midi[2]);
okini3939 1:0dac72ab5910 181 break;
okini3939 1:0dac72ab5910 182 case 13:
okini3939 1:0dac72ab5910 183 channelPressure(midi[1] & 0xf, midi[2]);
okini3939 1:0dac72ab5910 184 break;
okini3939 1:0dac72ab5910 185 case 14:
okini3939 1:0dac72ab5910 186 pitchBend(midi[1] & 0xf, midi[2] | (midi[3] << 7));
okini3939 1:0dac72ab5910 187 break;
okini3939 1:0dac72ab5910 188 case 15:
okini3939 1:0dac72ab5910 189 singleByte(midi[1]);
okini3939 1:0dac72ab5910 190 break;
okini3939 1:0dac72ab5910 191 }
okini3939 1:0dac72ab5910 192 }
okini3939 1:0dac72ab5910 193
okini3939 1:0dac72ab5910 194 // read another message
okini3939 1:0dac72ab5910 195 host->bulkRead(dev, bulk_in, buf, size_bulk_in, false);
okini3939 1:0dac72ab5910 196 }
okini3939 1:0dac72ab5910 197 }
okini3939 1:0dac72ab5910 198 }
okini3939 1:0dac72ab5910 199
okini3939 1:0dac72ab5910 200 bool USBHostMIDI::sendMidiBuffer(uint8_t data0, uint8_t data1, uint8_t data2, uint8_t data3) {
okini3939 1:0dac72ab5910 201 if (bulk_out) {
okini3939 1:0dac72ab5910 202 uint8_t midi[4];
okini3939 1:0dac72ab5910 203
okini3939 1:0dac72ab5910 204 midi[0] = data0;
okini3939 1:0dac72ab5910 205 midi[1] = data1;
okini3939 1:0dac72ab5910 206 midi[2] = data2;
okini3939 1:0dac72ab5910 207 midi[3] = data3;
okini3939 1:0dac72ab5910 208 if (host->bulkWrite(dev, bulk_out, (uint8_t *)midi, 4) == USB_TYPE_OK) {
okini3939 1:0dac72ab5910 209 return true;
okini3939 1:0dac72ab5910 210 }
okini3939 1:0dac72ab5910 211 }
okini3939 1:0dac72ab5910 212 return false;
okini3939 1:0dac72ab5910 213 }
okini3939 1:0dac72ab5910 214
okini3939 1:0dac72ab5910 215 bool USBHostMIDI::sendMiscellaneousFunctionCode(uint8_t data1, uint8_t data2, uint8_t data3) {
okini3939 1:0dac72ab5910 216 return sendMidiBuffer(0, data1, data2, data3);
okini3939 1:0dac72ab5910 217 }
okini3939 1:0dac72ab5910 218
okini3939 1:0dac72ab5910 219 bool USBHostMIDI::sendCableEvent(uint8_t data1, uint8_t data2, uint8_t data3) {
okini3939 1:0dac72ab5910 220 return sendMidiBuffer(1, data1, data2, data3);
okini3939 1:0dac72ab5910 221 }
okini3939 1:0dac72ab5910 222
okini3939 1:0dac72ab5910 223 bool USBHostMIDI::sendSystemCommmonTwoBytes(uint8_t data1, uint8_t data2) {
okini3939 1:0dac72ab5910 224 return sendMidiBuffer(2, data1, data2, 0);
okini3939 1:0dac72ab5910 225 }
okini3939 1:0dac72ab5910 226
okini3939 1:0dac72ab5910 227 bool USBHostMIDI::sendSystemCommmonThreeBytes(uint8_t data1, uint8_t data2, uint8_t data3) {
okini3939 1:0dac72ab5910 228 return sendMidiBuffer(3, data1, data2, 0);
okini3939 1:0dac72ab5910 229 }
okini3939 1:0dac72ab5910 230
okini3939 1:0dac72ab5910 231 bool USBHostMIDI::sendSystemExclusive(uint8_t *buffer, int length) {
okini3939 1:0dac72ab5910 232 uint8_t midi[64];
okini3939 1:0dac72ab5910 233 int midiLength;
okini3939 1:0dac72ab5910 234 int midiPos;
okini3939 1:0dac72ab5910 235 if (bulk_out) {
okini3939 1:0dac72ab5910 236 for (int i = 0; i < length; i += 48) {
okini3939 1:0dac72ab5910 237 if (i + 48 >= length) {
okini3939 1:0dac72ab5910 238 // contains last data
okini3939 1:0dac72ab5910 239 midiLength = (((length - i) + 2) / 3) * 4;
okini3939 1:0dac72ab5910 240 for (int pos = i; pos < length; pos += 3) {
okini3939 1:0dac72ab5910 241 midiPos = (pos + 2) / 3 * 4;
okini3939 1:0dac72ab5910 242 if (pos + 3 >= length) {
okini3939 1:0dac72ab5910 243 // last data
okini3939 1:0dac72ab5910 244 switch (pos % 3) {
okini3939 1:0dac72ab5910 245 case 0:
okini3939 1:0dac72ab5910 246 midi[midiPos ] = 7;
okini3939 1:0dac72ab5910 247 midi[midiPos + 1] = buffer[pos ];
okini3939 1:0dac72ab5910 248 midi[midiPos + 2] = buffer[pos + 1];
okini3939 1:0dac72ab5910 249 midi[midiPos + 3] = buffer[pos + 2];
okini3939 1:0dac72ab5910 250 break;
okini3939 1:0dac72ab5910 251 case 1:
okini3939 1:0dac72ab5910 252 midi[midiPos ] = 5;
okini3939 1:0dac72ab5910 253 midi[midiPos + 1] = buffer[pos ];
okini3939 1:0dac72ab5910 254 midi[midiPos + 2] = 0;
okini3939 1:0dac72ab5910 255 midi[midiPos + 3] = 0;
okini3939 1:0dac72ab5910 256 break;
okini3939 1:0dac72ab5910 257 case 2:
okini3939 1:0dac72ab5910 258 midi[midiPos ] = 6;
okini3939 1:0dac72ab5910 259 midi[midiPos + 1] = buffer[pos ];
okini3939 1:0dac72ab5910 260 midi[midiPos + 2] = buffer[pos + 1];
okini3939 1:0dac72ab5910 261 midi[midiPos + 3] = 0;
okini3939 1:0dac72ab5910 262 break;
okini3939 1:0dac72ab5910 263 }
okini3939 1:0dac72ab5910 264 } else {
okini3939 1:0dac72ab5910 265 // has more data
okini3939 1:0dac72ab5910 266 midi[midiPos ] = 4;
okini3939 1:0dac72ab5910 267 midi[midiPos + 1] = buffer[pos ];
okini3939 1:0dac72ab5910 268 midi[midiPos + 2] = buffer[pos + 1];
okini3939 1:0dac72ab5910 269 midi[midiPos + 3] = buffer[pos + 2];
okini3939 1:0dac72ab5910 270 }
okini3939 1:0dac72ab5910 271 }
okini3939 1:0dac72ab5910 272 } else {
okini3939 1:0dac72ab5910 273 // has more data
okini3939 1:0dac72ab5910 274 midiLength = 64;
okini3939 1:0dac72ab5910 275 for (int pos = i; pos < length; pos += 3) {
okini3939 1:0dac72ab5910 276 midiPos = (pos + 2) / 3 * 4;
okini3939 1:0dac72ab5910 277 midi[midiPos ] = 4;
okini3939 1:0dac72ab5910 278 midi[midiPos + 1] = buffer[pos ];
okini3939 1:0dac72ab5910 279 midi[midiPos + 2] = buffer[pos + 1];
okini3939 1:0dac72ab5910 280 midi[midiPos + 3] = buffer[pos + 2];
okini3939 1:0dac72ab5910 281 }
okini3939 1:0dac72ab5910 282 }
okini3939 1:0dac72ab5910 283
okini3939 1:0dac72ab5910 284 if (host->bulkWrite(dev, bulk_out, (uint8_t *)midi, midiLength) != USB_TYPE_OK) {
okini3939 1:0dac72ab5910 285 return false;
okini3939 1:0dac72ab5910 286 }
okini3939 1:0dac72ab5910 287 }
okini3939 1:0dac72ab5910 288 return true;
okini3939 1:0dac72ab5910 289 }
okini3939 1:0dac72ab5910 290 return false;
okini3939 1:0dac72ab5910 291 }
okini3939 1:0dac72ab5910 292
okini3939 1:0dac72ab5910 293 bool USBHostMIDI::sendNoteOff(uint8_t channel, uint8_t note, uint8_t velocity) {
okini3939 1:0dac72ab5910 294 return sendMidiBuffer(8, channel & 0xf | 0x80, note & 0x7f, velocity & 0x7f);
okini3939 1:0dac72ab5910 295 }
okini3939 1:0dac72ab5910 296
okini3939 1:0dac72ab5910 297 bool USBHostMIDI::sendNoteOn(uint8_t channel, uint8_t note, uint8_t velocity) {
okini3939 1:0dac72ab5910 298 return sendMidiBuffer(9, channel & 0xf | 0x90, note & 0x7f, velocity & 0x7f);
okini3939 1:0dac72ab5910 299 }
okini3939 1:0dac72ab5910 300
okini3939 1:0dac72ab5910 301 bool USBHostMIDI::sendPolyKeyPress(uint8_t channel, uint8_t note, uint8_t pressure) {
okini3939 1:0dac72ab5910 302 return sendMidiBuffer(10, channel & 0xf | 0xa0, note & 0x7f, pressure & 0x7f);
okini3939 1:0dac72ab5910 303 }
okini3939 1:0dac72ab5910 304
okini3939 1:0dac72ab5910 305 bool USBHostMIDI::sendControlChange(uint8_t channel, uint8_t key, uint8_t value) {
okini3939 1:0dac72ab5910 306 return sendMidiBuffer(11, channel & 0xf | 0xb0, key & 0x7f, value & 0x7f);
okini3939 1:0dac72ab5910 307 }
okini3939 1:0dac72ab5910 308
okini3939 1:0dac72ab5910 309 bool USBHostMIDI::sendProgramChange(uint8_t channel, uint8_t program) {
okini3939 1:0dac72ab5910 310 return sendMidiBuffer(12, channel & 0xf | 0xc0, program & 0x7f, 0);
okini3939 1:0dac72ab5910 311 }
okini3939 1:0dac72ab5910 312
okini3939 1:0dac72ab5910 313 bool USBHostMIDI::sendChannelPressure(uint8_t channel, uint8_t pressure) {
okini3939 1:0dac72ab5910 314 return sendMidiBuffer(13, channel & 0xf | 0xd0, pressure & 0x7f, 0);
okini3939 1:0dac72ab5910 315 }
okini3939 1:0dac72ab5910 316
okini3939 1:0dac72ab5910 317 bool USBHostMIDI::sendPitchBend(uint8_t channel, uint16_t value) {
okini3939 1:0dac72ab5910 318 return sendMidiBuffer(14, channel & 0xf | 0xe0, value & 0x7f, (value >> 7) & 0x7f);
okini3939 1:0dac72ab5910 319 }
okini3939 1:0dac72ab5910 320
okini3939 1:0dac72ab5910 321 bool USBHostMIDI::sendSingleByte(uint8_t data) {
okini3939 1:0dac72ab5910 322 return sendMidiBuffer(15, data, 0, 0);
okini3939 1:0dac72ab5910 323 }
okini3939 1:0dac72ab5910 324
okini3939 1:0dac72ab5910 325 /*virtual*/ void USBHostMIDI::setVidPid(uint16_t vid, uint16_t pid)
okini3939 1:0dac72ab5910 326 {
okini3939 1:0dac72ab5910 327 // we don't check VID/PID for this driver
okini3939 1:0dac72ab5910 328 }
okini3939 1:0dac72ab5910 329
okini3939 1:0dac72ab5910 330 /*virtual*/ bool USBHostMIDI::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
okini3939 1:0dac72ab5910 331 {
okini3939 1:0dac72ab5910 332 // USB MIDI class/subclass
okini3939 1:0dac72ab5910 333 if ((midi_intf == -1) &&
okini3939 1:0dac72ab5910 334 (intf_class == AUDIO_CLASS) &&
okini3939 1:0dac72ab5910 335 (intf_subclass == 0x03)) {
okini3939 1:0dac72ab5910 336 midi_intf = intf_nb;
okini3939 1:0dac72ab5910 337 return true;
okini3939 1:0dac72ab5910 338 }
okini3939 1:0dac72ab5910 339
okini3939 1:0dac72ab5910 340 // vendor specific device
okini3939 1:0dac72ab5910 341 if ((midi_intf == -1) &&
okini3939 1:0dac72ab5910 342 (intf_class == 0xff) &&
okini3939 1:0dac72ab5910 343 (intf_subclass == 0x03)) {
okini3939 1:0dac72ab5910 344 midi_intf = intf_nb;
okini3939 1:0dac72ab5910 345 return true;
okini3939 1:0dac72ab5910 346 }
okini3939 1:0dac72ab5910 347
okini3939 1:0dac72ab5910 348 return false;
okini3939 1:0dac72ab5910 349 }
okini3939 1:0dac72ab5910 350
okini3939 1:0dac72ab5910 351 /*virtual*/ bool USBHostMIDI::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
okini3939 1:0dac72ab5910 352 {
okini3939 1:0dac72ab5910 353 if (intf_nb == midi_intf) {
okini3939 1:0dac72ab5910 354 if (type == BULK_ENDPOINT) {
okini3939 1:0dac72ab5910 355 midi_device_found = true;
okini3939 1:0dac72ab5910 356 return true;
okini3939 1:0dac72ab5910 357 }
okini3939 1:0dac72ab5910 358 }
okini3939 1:0dac72ab5910 359 return false;
okini3939 1:0dac72ab5910 360 }
okini3939 1:0dac72ab5910 361
okini3939 1:0dac72ab5910 362 #endif