ON Semiconductor / mbed-os

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
group-onsemi
Date:
Wed Jan 25 20:34:15 2017 +0000
Revision:
0:098463de4c5d
Initial commit

Who changed what in which revision?

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