test public

Dependencies:   HttpServer_snapshot_mbed-os

Committer:
anhtran
Date:
Fri Oct 18 03:09:43 2019 +0000
Revision:
0:e9fd5575b10e
abc

Who changed what in which revision?

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