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 #ifndef USBHOSTMIDI_H
okini3939 1:0dac72ab5910 20 #define USBHOSTMIDI_H
okini3939 1:0dac72ab5910 21
okini3939 1:0dac72ab5910 22 #include "USBHostConf.h"
okini3939 1:0dac72ab5910 23
okini3939 1:0dac72ab5910 24 #if USBHOST_MIDI
okini3939 1:0dac72ab5910 25
okini3939 1:0dac72ab5910 26 #include "USBHost.h"
okini3939 1:0dac72ab5910 27
okini3939 1:0dac72ab5910 28 /**
okini3939 1:0dac72ab5910 29 * A class to communicate a USB MIDI device
okini3939 1:0dac72ab5910 30 */
okini3939 1:0dac72ab5910 31 class USBHostMIDI : public IUSBEnumerator {
okini3939 1:0dac72ab5910 32 public:
okini3939 1:0dac72ab5910 33 /**
okini3939 1:0dac72ab5910 34 * Constructor
okini3939 1:0dac72ab5910 35 */
okini3939 1:0dac72ab5910 36 USBHostMIDI();
okini3939 1:0dac72ab5910 37
okini3939 1:0dac72ab5910 38 /**
okini3939 1:0dac72ab5910 39 * Check if a USB MIDI device is connected
okini3939 1:0dac72ab5910 40 *
okini3939 1:0dac72ab5910 41 * @returns true if a midi device is connected
okini3939 1:0dac72ab5910 42 */
okini3939 1:0dac72ab5910 43 bool connected();
okini3939 1:0dac72ab5910 44
okini3939 1:0dac72ab5910 45 /**
okini3939 1:0dac72ab5910 46 * Try to connect a midi device
okini3939 1:0dac72ab5910 47 *
okini3939 1:0dac72ab5910 48 * @return true if connection was successful
okini3939 1:0dac72ab5910 49 */
okini3939 1:0dac72ab5910 50 bool connect();
okini3939 1:0dac72ab5910 51
okini3939 1:0dac72ab5910 52 /**
okini3939 1:0dac72ab5910 53 * Attach a callback called when miscellaneous function code is received
okini3939 1:0dac72ab5910 54 *
okini3939 1:0dac72ab5910 55 * @param ptr function pointer
okini3939 1:0dac72ab5910 56 * prototype: void onMiscellaneousFunctionCode(uint8_t data1, uint8_t data2, uint8_t data3);
okini3939 1:0dac72ab5910 57 */
okini3939 1:0dac72ab5910 58 inline void attachMiscellaneousFunctionCode(void (*fn)(uint8_t, uint8_t, uint8_t)) {
okini3939 1:0dac72ab5910 59 miscellaneousFunctionCode = fn;
okini3939 1:0dac72ab5910 60 }
okini3939 1:0dac72ab5910 61
okini3939 1:0dac72ab5910 62 /**
okini3939 1:0dac72ab5910 63 * Attach a callback called when cable event is received
okini3939 1:0dac72ab5910 64 *
okini3939 1:0dac72ab5910 65 * @param ptr function pointer
okini3939 1:0dac72ab5910 66 * prototype: void onCableEvent(uint8_t data1, uint8_t data2, uint8_t data3);
okini3939 1:0dac72ab5910 67 */
okini3939 1:0dac72ab5910 68 inline void attachCableEvent(void (*fn)(uint8_t, uint8_t, uint8_t)) {
okini3939 1:0dac72ab5910 69 cableEvent = fn;
okini3939 1:0dac72ab5910 70 }
okini3939 1:0dac72ab5910 71
okini3939 1:0dac72ab5910 72 /**
okini3939 1:0dac72ab5910 73 * Attach a callback called when system exclusive is received
okini3939 1:0dac72ab5910 74 *
okini3939 1:0dac72ab5910 75 * @param ptr function pointer
okini3939 1:0dac72ab5910 76 * prototype: void onSystemCommonTwoBytes(uint8_t data1, uint8_t data2);
okini3939 1:0dac72ab5910 77 */
okini3939 1:0dac72ab5910 78 inline void attachSystemCommonTwoBytes(void (*fn)(uint8_t, uint8_t)) {
okini3939 1:0dac72ab5910 79 systemCommonTwoBytes = fn;
okini3939 1:0dac72ab5910 80 }
okini3939 1:0dac72ab5910 81
okini3939 1:0dac72ab5910 82 /**
okini3939 1:0dac72ab5910 83 * Attach a callback called when system exclusive is received
okini3939 1:0dac72ab5910 84 *
okini3939 1:0dac72ab5910 85 * @param ptr function pointer
okini3939 1:0dac72ab5910 86 * prototype: void onSystemCommonThreeBytes(uint8_t data1, uint8_t data2, uint8_t data3);
okini3939 1:0dac72ab5910 87 */
okini3939 1:0dac72ab5910 88 inline void attachSystemCommonThreeBytes(void (*fn)(uint8_t, uint8_t, uint8_t)) {
okini3939 1:0dac72ab5910 89 systemCommonThreeBytes = fn;
okini3939 1:0dac72ab5910 90 }
okini3939 1:0dac72ab5910 91
okini3939 1:0dac72ab5910 92 /**
okini3939 1:0dac72ab5910 93 * Attach a callback called when system exclusive is received
okini3939 1:0dac72ab5910 94 *
okini3939 1:0dac72ab5910 95 * @param ptr function pointer
okini3939 1:0dac72ab5910 96 * prototype: void onSystemExclusive(uint8_t *data, uint16_t length, bool hasNextData);
okini3939 1:0dac72ab5910 97 */
okini3939 1:0dac72ab5910 98 inline void attachSystemExclusive(void (*fn)(uint8_t *, uint16_t, bool)) {
okini3939 1:0dac72ab5910 99 systemExclusive = fn;
okini3939 1:0dac72ab5910 100 }
okini3939 1:0dac72ab5910 101
okini3939 1:0dac72ab5910 102 /**
okini3939 1:0dac72ab5910 103 * Attach a callback called when note on is received
okini3939 1:0dac72ab5910 104 *
okini3939 1:0dac72ab5910 105 * @param ptr function pointer
okini3939 1:0dac72ab5910 106 * prototype: void onNoteOn(uint8_t channel, uint8_t note, uint8_t velocity);
okini3939 1:0dac72ab5910 107 */
okini3939 1:0dac72ab5910 108 inline void attachNoteOn(void (*fn)(uint8_t, uint8_t, uint8_t)) {
okini3939 1:0dac72ab5910 109 noteOn = fn;
okini3939 1:0dac72ab5910 110 }
okini3939 1:0dac72ab5910 111
okini3939 1:0dac72ab5910 112 /**
okini3939 1:0dac72ab5910 113 * Attach a callback called when note off is received
okini3939 1:0dac72ab5910 114 *
okini3939 1:0dac72ab5910 115 * @param ptr function pointer
okini3939 1:0dac72ab5910 116 * prototype: void onNoteOff(uint8_t channel, uint8_t note, uint8_t velocity);
okini3939 1:0dac72ab5910 117 */
okini3939 1:0dac72ab5910 118 inline void attachNoteOff(void (*fn)(uint8_t, uint8_t, uint8_t)) {
okini3939 1:0dac72ab5910 119 noteOff = fn;
okini3939 1:0dac72ab5910 120 }
okini3939 1:0dac72ab5910 121
okini3939 1:0dac72ab5910 122 /**
okini3939 1:0dac72ab5910 123 * Attach a callback called when poly keypress is received
okini3939 1:0dac72ab5910 124 *
okini3939 1:0dac72ab5910 125 * @param ptr function pointer
okini3939 1:0dac72ab5910 126 * prototype: void onPolyKeyPress(uint8_t channel, uint8_t note, uint8_t pressure);
okini3939 1:0dac72ab5910 127 */
okini3939 1:0dac72ab5910 128 inline void attachPolyKeyPress(void (*fn)(uint8_t, uint8_t, uint8_t)) {
okini3939 1:0dac72ab5910 129 polyKeyPress = fn;
okini3939 1:0dac72ab5910 130 }
okini3939 1:0dac72ab5910 131
okini3939 1:0dac72ab5910 132 /**
okini3939 1:0dac72ab5910 133 * Attach a callback called when control change is received
okini3939 1:0dac72ab5910 134 *
okini3939 1:0dac72ab5910 135 * @param ptr function pointer
okini3939 1:0dac72ab5910 136 * prototype: void onControlChange(uint8_t channel, uint8_t key, uint8_t value);
okini3939 1:0dac72ab5910 137 */
okini3939 1:0dac72ab5910 138 inline void attachControlChange(void (*fn)(uint8_t, uint8_t, uint8_t)) {
okini3939 1:0dac72ab5910 139 controlChange = fn;
okini3939 1:0dac72ab5910 140 }
okini3939 1:0dac72ab5910 141
okini3939 1:0dac72ab5910 142 /**
okini3939 1:0dac72ab5910 143 * Attach a callback called when program change is received
okini3939 1:0dac72ab5910 144 *
okini3939 1:0dac72ab5910 145 * @param ptr function pointer
okini3939 1:0dac72ab5910 146 * prototype: void onProgramChange(uint8_t channel, uint8_t program);
okini3939 1:0dac72ab5910 147 */
okini3939 1:0dac72ab5910 148 inline void attachProgramChange(void (*fn)(uint8_t, uint8_t)) {
okini3939 1:0dac72ab5910 149 programChange = fn;
okini3939 1:0dac72ab5910 150 }
okini3939 1:0dac72ab5910 151
okini3939 1:0dac72ab5910 152 /**
okini3939 1:0dac72ab5910 153 * Attach a callback called when channel pressure is received
okini3939 1:0dac72ab5910 154 *
okini3939 1:0dac72ab5910 155 * @param ptr function pointer
okini3939 1:0dac72ab5910 156 * prototype: void onChannelPressure(uint8_t channel, uint8_t pressure);
okini3939 1:0dac72ab5910 157 */
okini3939 1:0dac72ab5910 158 inline void attachChannelPressure(void (*fn)(uint8_t, uint8_t)) {
okini3939 1:0dac72ab5910 159 channelPressure = fn;
okini3939 1:0dac72ab5910 160 }
okini3939 1:0dac72ab5910 161
okini3939 1:0dac72ab5910 162 /**
okini3939 1:0dac72ab5910 163 * Attach a callback called when pitch bend is received
okini3939 1:0dac72ab5910 164 *
okini3939 1:0dac72ab5910 165 * @param ptr function pointer
okini3939 1:0dac72ab5910 166 * prototype: void onPitchBend(uint8_t channel, uint16_t value);
okini3939 1:0dac72ab5910 167 */
okini3939 1:0dac72ab5910 168 inline void attachPitchBend(void (*fn)(uint8_t, uint16_t)) {
okini3939 1:0dac72ab5910 169 pitchBend = fn;
okini3939 1:0dac72ab5910 170 }
okini3939 1:0dac72ab5910 171
okini3939 1:0dac72ab5910 172 /**
okini3939 1:0dac72ab5910 173 * Attach a callback called when single byte is received
okini3939 1:0dac72ab5910 174 *
okini3939 1:0dac72ab5910 175 * @param ptr function pointer
okini3939 1:0dac72ab5910 176 * prototype: void onSingleByte(uint8_t value);
okini3939 1:0dac72ab5910 177 */
okini3939 1:0dac72ab5910 178 inline void attachSingleByte(void (*fn)(uint8_t)) {
okini3939 1:0dac72ab5910 179 singleByte = fn;
okini3939 1:0dac72ab5910 180 }
okini3939 1:0dac72ab5910 181
okini3939 1:0dac72ab5910 182 /**
okini3939 1:0dac72ab5910 183 * Send a cable event with 3 bytes event
okini3939 1:0dac72ab5910 184 *
okini3939 1:0dac72ab5910 185 * @param data1 0-255
okini3939 1:0dac72ab5910 186 * @param data2 0-255
okini3939 1:0dac72ab5910 187 * @param data3 0-255
okini3939 1:0dac72ab5910 188 * @return true if message sent successfully
okini3939 1:0dac72ab5910 189 */
okini3939 1:0dac72ab5910 190 bool sendMiscellaneousFunctionCode(uint8_t data1, uint8_t data2, uint8_t data3);
okini3939 1:0dac72ab5910 191
okini3939 1:0dac72ab5910 192 /**
okini3939 1:0dac72ab5910 193 * Send a cable event with 3 bytes event
okini3939 1:0dac72ab5910 194 *
okini3939 1:0dac72ab5910 195 * @param data1 0-255
okini3939 1:0dac72ab5910 196 * @param data2 0-255
okini3939 1:0dac72ab5910 197 * @param data3 0-255
okini3939 1:0dac72ab5910 198 * @return true if message sent successfully
okini3939 1:0dac72ab5910 199 */
okini3939 1:0dac72ab5910 200 bool sendCableEvent(uint8_t data1, uint8_t data2, uint8_t data3);
okini3939 1:0dac72ab5910 201
okini3939 1:0dac72ab5910 202 /**
okini3939 1:0dac72ab5910 203 * Send a system common message with 2 bytes event
okini3939 1:0dac72ab5910 204 *
okini3939 1:0dac72ab5910 205 * @param data1 0-255
okini3939 1:0dac72ab5910 206 * @param data2 0-255
okini3939 1:0dac72ab5910 207 * @return true if message sent successfully
okini3939 1:0dac72ab5910 208 */
okini3939 1:0dac72ab5910 209 bool sendSystemCommmonTwoBytes(uint8_t data1, uint8_t data2);
okini3939 1:0dac72ab5910 210
okini3939 1:0dac72ab5910 211 /**
okini3939 1:0dac72ab5910 212 * Send a system common message with 3 bytes event
okini3939 1:0dac72ab5910 213 *
okini3939 1:0dac72ab5910 214 * @param data1 0-255
okini3939 1:0dac72ab5910 215 * @param data2 0-255
okini3939 1:0dac72ab5910 216 * @param data3 0-255
okini3939 1:0dac72ab5910 217 * @return true if message sent successfully
okini3939 1:0dac72ab5910 218 */
okini3939 1:0dac72ab5910 219 bool sendSystemCommmonThreeBytes(uint8_t data1, uint8_t data2, uint8_t data3);
okini3939 1:0dac72ab5910 220
okini3939 1:0dac72ab5910 221 /**
okini3939 1:0dac72ab5910 222 * Send a system exclusive event
okini3939 1:0dac72ab5910 223 *
okini3939 1:0dac72ab5910 224 * @param buffer, starts with 0xF0, and end with 0xf7
okini3939 1:0dac72ab5910 225 * @param length
okini3939 1:0dac72ab5910 226 * @return true if message sent successfully
okini3939 1:0dac72ab5910 227 */
okini3939 1:0dac72ab5910 228 bool sendSystemExclusive(uint8_t *buffer, int length);
okini3939 1:0dac72ab5910 229
okini3939 1:0dac72ab5910 230 /**
okini3939 1:0dac72ab5910 231 * Send a note off event
okini3939 1:0dac72ab5910 232 *
okini3939 1:0dac72ab5910 233 * @param channel 0-15
okini3939 1:0dac72ab5910 234 * @param note 0-127
okini3939 1:0dac72ab5910 235 * @param velocity 0-127
okini3939 1:0dac72ab5910 236 * @return true if message sent successfully
okini3939 1:0dac72ab5910 237 */
okini3939 1:0dac72ab5910 238 bool sendNoteOff(uint8_t channel, uint8_t note, uint8_t velocity);
okini3939 1:0dac72ab5910 239
okini3939 1:0dac72ab5910 240 /**
okini3939 1:0dac72ab5910 241 * Send a note on event
okini3939 1:0dac72ab5910 242 *
okini3939 1:0dac72ab5910 243 * @param channel 0-15
okini3939 1:0dac72ab5910 244 * @param note 0-127
okini3939 1:0dac72ab5910 245 * @param velocity 0-127 (0 means note off)
okini3939 1:0dac72ab5910 246 * @return true if message sent successfully
okini3939 1:0dac72ab5910 247 */
okini3939 1:0dac72ab5910 248 bool sendNoteOn(uint8_t channel, uint8_t note, uint8_t velocity);
okini3939 1:0dac72ab5910 249
okini3939 1:0dac72ab5910 250 /**
okini3939 1:0dac72ab5910 251 * Send a poly keypress event
okini3939 1:0dac72ab5910 252 *
okini3939 1:0dac72ab5910 253 * @param channel 0-15
okini3939 1:0dac72ab5910 254 * @param note 0-127
okini3939 1:0dac72ab5910 255 * @param pressure 0-127
okini3939 1:0dac72ab5910 256 * @return true if message sent successfully
okini3939 1:0dac72ab5910 257 */
okini3939 1:0dac72ab5910 258 bool sendPolyKeyPress(uint8_t channel, uint8_t note, uint8_t pressure);
okini3939 1:0dac72ab5910 259
okini3939 1:0dac72ab5910 260 /**
okini3939 1:0dac72ab5910 261 * Send a control change event
okini3939 1:0dac72ab5910 262 *
okini3939 1:0dac72ab5910 263 * @param channel 0-15
okini3939 1:0dac72ab5910 264 * @param key 0-127
okini3939 1:0dac72ab5910 265 * @param value 0-127
okini3939 1:0dac72ab5910 266 * @return true if message sent successfully
okini3939 1:0dac72ab5910 267 */
okini3939 1:0dac72ab5910 268 bool sendControlChange(uint8_t channel, uint8_t key, uint8_t value);
okini3939 1:0dac72ab5910 269
okini3939 1:0dac72ab5910 270 /**
okini3939 1:0dac72ab5910 271 * Send a program change event
okini3939 1:0dac72ab5910 272 *
okini3939 1:0dac72ab5910 273 * @param channel 0-15
okini3939 1:0dac72ab5910 274 * @param program 0-127
okini3939 1:0dac72ab5910 275 * @return true if message sent successfully
okini3939 1:0dac72ab5910 276 */
okini3939 1:0dac72ab5910 277 bool sendProgramChange(uint8_t channel, uint8_t program);
okini3939 1:0dac72ab5910 278
okini3939 1:0dac72ab5910 279 /**
okini3939 1:0dac72ab5910 280 * Send a channel pressure event
okini3939 1:0dac72ab5910 281 *
okini3939 1:0dac72ab5910 282 * @param channel 0-15
okini3939 1:0dac72ab5910 283 * @param pressure 0-127
okini3939 1:0dac72ab5910 284 * @return true if message sent successfully
okini3939 1:0dac72ab5910 285 */
okini3939 1:0dac72ab5910 286 bool sendChannelPressure(uint8_t channel, uint8_t pressure);
okini3939 1:0dac72ab5910 287
okini3939 1:0dac72ab5910 288 /**
okini3939 1:0dac72ab5910 289 * Send a control change event
okini3939 1:0dac72ab5910 290 *
okini3939 1:0dac72ab5910 291 * @param channel 0-15
okini3939 1:0dac72ab5910 292 * @param key 0(lower)-8191(center)-16383(higher)
okini3939 1:0dac72ab5910 293 * @return true if message sent successfully
okini3939 1:0dac72ab5910 294 */
okini3939 1:0dac72ab5910 295 bool sendPitchBend(uint8_t channel, uint16_t value);
okini3939 1:0dac72ab5910 296
okini3939 1:0dac72ab5910 297 /**
okini3939 1:0dac72ab5910 298 * Send a single byte event
okini3939 1:0dac72ab5910 299 *
okini3939 1:0dac72ab5910 300 * @param data 0-255
okini3939 1:0dac72ab5910 301 * @return true if message sent successfully
okini3939 1:0dac72ab5910 302 */
okini3939 1:0dac72ab5910 303 bool sendSingleByte(uint8_t data);
okini3939 1:0dac72ab5910 304
okini3939 1:0dac72ab5910 305 protected:
okini3939 1:0dac72ab5910 306 //From IUSBEnumerator
okini3939 1:0dac72ab5910 307 virtual void setVidPid(uint16_t vid, uint16_t pid);
okini3939 1:0dac72ab5910 308 virtual bool 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 309 virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
okini3939 1:0dac72ab5910 310
okini3939 1:0dac72ab5910 311 private:
okini3939 1:0dac72ab5910 312 USBHost * host;
okini3939 1:0dac72ab5910 313 USBDeviceConnected * dev;
okini3939 1:0dac72ab5910 314 USBEndpoint * bulk_in;
okini3939 1:0dac72ab5910 315 USBEndpoint * bulk_out;
okini3939 1:0dac72ab5910 316 uint32_t size_bulk_in;
okini3939 1:0dac72ab5910 317 uint32_t size_bulk_out;
okini3939 1:0dac72ab5910 318
okini3939 1:0dac72ab5910 319 bool dev_connected;
okini3939 1:0dac72ab5910 320
okini3939 1:0dac72ab5910 321 void init();
okini3939 1:0dac72ab5910 322
okini3939 1:0dac72ab5910 323 uint8_t buf[64];
okini3939 1:0dac72ab5910 324
okini3939 1:0dac72ab5910 325 void rxHandler();
okini3939 1:0dac72ab5910 326
okini3939 1:0dac72ab5910 327 uint16_t sysExBufferPos;
okini3939 1:0dac72ab5910 328 uint8_t sysExBuffer[64];
okini3939 1:0dac72ab5910 329
okini3939 1:0dac72ab5910 330 void (*miscellaneousFunctionCode)(uint8_t, uint8_t, uint8_t);
okini3939 1:0dac72ab5910 331 void (*cableEvent)(uint8_t, uint8_t, uint8_t);
okini3939 1:0dac72ab5910 332 void (*systemCommonTwoBytes)(uint8_t, uint8_t);
okini3939 1:0dac72ab5910 333 void (*systemCommonThreeBytes)(uint8_t, uint8_t, uint8_t);
okini3939 1:0dac72ab5910 334 void (*systemExclusive)(uint8_t *, uint16_t, bool);
okini3939 1:0dac72ab5910 335 void (*noteOff)(uint8_t, uint8_t, uint8_t);
okini3939 1:0dac72ab5910 336 void (*noteOn)(uint8_t, uint8_t, uint8_t);
okini3939 1:0dac72ab5910 337 void (*polyKeyPress)(uint8_t, uint8_t, uint8_t);
okini3939 1:0dac72ab5910 338 void (*controlChange)(uint8_t, uint8_t, uint8_t);
okini3939 1:0dac72ab5910 339 void (*programChange)(uint8_t, uint8_t);
okini3939 1:0dac72ab5910 340 void (*channelPressure)(uint8_t, uint8_t);
okini3939 1:0dac72ab5910 341 void (*pitchBend)(uint8_t, uint16_t);
okini3939 1:0dac72ab5910 342 void (*singleByte)(uint8_t);
okini3939 1:0dac72ab5910 343
okini3939 1:0dac72ab5910 344 bool sendMidiBuffer(uint8_t data0, uint8_t data1, uint8_t data2, uint8_t data3);
okini3939 1:0dac72ab5910 345
okini3939 1:0dac72ab5910 346 int midi_intf;
okini3939 1:0dac72ab5910 347 bool midi_device_found;
okini3939 1:0dac72ab5910 348
okini3939 1:0dac72ab5910 349 };
okini3939 1:0dac72ab5910 350
okini3939 1:0dac72ab5910 351 #endif /* USBHOST_MIDI */
okini3939 1:0dac72ab5910 352
okini3939 1:0dac72ab5910 353 #endif /* USBHOSTMIDI_H */