Pierre Provent / USBHost

Dependents:   TEST_USB_Nucleo_F429ZI Essais_USB_Nucleo_F429ZI SID_V3_Nucleo_F429ZI SID_V4_Nucleo_F429ZI_copy

Committer:
pierreprovent
Date:
Fri Sep 25 10:17:49 2020 +0000
Revision:
0:77ca32e8e04e
Programme acquisition en enregistrement sur clef USB carte Nucleo F429ZI cours ELE118 Cnam

Who changed what in which revision?

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