My Fork of F401RE-USBHost. Add USBHostMIDI functions (originaled by Kaoru Shoji http://mbed.org/users/kshoji/code/USBHostMIDI/)
Dependents: F401RE-USBHostMIDI_RecieveExample
Fork of F401RE-USBHost by
USBHostMIDI/USBHostMIDI.h@27:23fa4e04b1db, 2014-10-13 (annotated)
- Committer:
- hsgw
- Date:
- Mon Oct 13 19:33:40 2014 +0000
- Revision:
- 27:23fa4e04b1db
- Parent:
- 26:077ab26227c6
Fix freeze bug on F401RE.; callback functions are initialized by dummy functions.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hsgw | 24:5281ea9f6e68 | 1 | /* USBHostMidi library |
hsgw | 24:5281ea9f6e68 | 2 | * Originaled by k.shoji |
hsgw | 24:5281ea9f6e68 | 3 | * porting by Takuya Urakawa |
hsgw | 24:5281ea9f6e68 | 4 | */ |
hsgw | 24:5281ea9f6e68 | 5 | |
hsgw | 24:5281ea9f6e68 | 6 | /* mbed USBHost Library |
hsgw | 24:5281ea9f6e68 | 7 | * Copyright (c) 2006-2013 ARM Limited |
hsgw | 24:5281ea9f6e68 | 8 | * |
hsgw | 24:5281ea9f6e68 | 9 | * Licensed under the Apache License, Version 2.0 (the "License"); |
hsgw | 24:5281ea9f6e68 | 10 | * you may not use this file except in compliance with the License. |
hsgw | 24:5281ea9f6e68 | 11 | * You may obtain a copy of the License at |
hsgw | 24:5281ea9f6e68 | 12 | * |
hsgw | 24:5281ea9f6e68 | 13 | * http://www.apache.org/licenses/LICENSE-2.0 |
hsgw | 24:5281ea9f6e68 | 14 | * |
hsgw | 24:5281ea9f6e68 | 15 | * Unless required by applicable law or agreed to in writing, software |
hsgw | 24:5281ea9f6e68 | 16 | * distributed under the License is distributed on an "AS IS" BASIS, |
hsgw | 24:5281ea9f6e68 | 17 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
hsgw | 24:5281ea9f6e68 | 18 | * See the License for the specific language governing permissions and |
hsgw | 24:5281ea9f6e68 | 19 | * limitations under the License. |
hsgw | 24:5281ea9f6e68 | 20 | */ |
hsgw | 24:5281ea9f6e68 | 21 | |
hsgw | 24:5281ea9f6e68 | 22 | #ifndef USBHOSTMIDI_H |
hsgw | 24:5281ea9f6e68 | 23 | #define USBHOSTMIDI_H |
hsgw | 24:5281ea9f6e68 | 24 | |
hsgw | 24:5281ea9f6e68 | 25 | #include "USBHostConf.h" |
hsgw | 24:5281ea9f6e68 | 26 | |
hsgw | 24:5281ea9f6e68 | 27 | #if USBHOST_MIDI |
hsgw | 24:5281ea9f6e68 | 28 | |
hsgw | 24:5281ea9f6e68 | 29 | #include "USBHost.h" |
hsgw | 24:5281ea9f6e68 | 30 | |
hsgw | 24:5281ea9f6e68 | 31 | /** |
hsgw | 24:5281ea9f6e68 | 32 | * A class to communicate a USB MIDI device |
hsgw | 24:5281ea9f6e68 | 33 | */ |
hsgw | 24:5281ea9f6e68 | 34 | class USBHostMIDI : public IUSBEnumerator { |
hsgw | 24:5281ea9f6e68 | 35 | public: |
hsgw | 24:5281ea9f6e68 | 36 | /** |
hsgw | 24:5281ea9f6e68 | 37 | * Constructor |
hsgw | 24:5281ea9f6e68 | 38 | */ |
hsgw | 24:5281ea9f6e68 | 39 | USBHostMIDI(); |
hsgw | 24:5281ea9f6e68 | 40 | |
hsgw | 24:5281ea9f6e68 | 41 | /** |
hsgw | 24:5281ea9f6e68 | 42 | * Check if a USB MIDI device is connected |
hsgw | 24:5281ea9f6e68 | 43 | * |
hsgw | 24:5281ea9f6e68 | 44 | * @returns true if a midi device is connected |
hsgw | 24:5281ea9f6e68 | 45 | */ |
hsgw | 24:5281ea9f6e68 | 46 | bool connected(); |
hsgw | 24:5281ea9f6e68 | 47 | |
hsgw | 24:5281ea9f6e68 | 48 | /** |
hsgw | 24:5281ea9f6e68 | 49 | * Try to connect a midi device |
hsgw | 24:5281ea9f6e68 | 50 | * |
hsgw | 24:5281ea9f6e68 | 51 | * @return true if connection was successful |
hsgw | 24:5281ea9f6e68 | 52 | */ |
hsgw | 24:5281ea9f6e68 | 53 | bool connect(); |
hsgw | 24:5281ea9f6e68 | 54 | |
hsgw | 26:077ab26227c6 | 55 | /** |
hsgw | 26:077ab26227c6 | 56 | * Attach a callback called when miscellaneous function code is received |
hsgw | 26:077ab26227c6 | 57 | * @warning DISABLED |
hsgw | 26:077ab26227c6 | 58 | * |
hsgw | 26:077ab26227c6 | 59 | * @param ptr function pointer |
hsgw | 26:077ab26227c6 | 60 | * prototype: void onMiscellaneousFunctionCode(uint8_t data1, uint8_t data2, uint8_t data3); |
hsgw | 26:077ab26227c6 | 61 | */ |
hsgw | 26:077ab26227c6 | 62 | inline void attachMiscellaneousFunctionCode(void (*fn)(uint8_t, uint8_t, uint8_t)) { |
hsgw | 26:077ab26227c6 | 63 | miscellaneousFunctionCode = fn; |
hsgw | 26:077ab26227c6 | 64 | } |
hsgw | 24:5281ea9f6e68 | 65 | |
hsgw | 26:077ab26227c6 | 66 | /** |
hsgw | 26:077ab26227c6 | 67 | * Attach a callback called when cable event is received |
hsgw | 26:077ab26227c6 | 68 | * @warning DISABLED |
hsgw | 26:077ab26227c6 | 69 | * |
hsgw | 26:077ab26227c6 | 70 | * @param ptr function pointer |
hsgw | 26:077ab26227c6 | 71 | * prototype: void onCableEvent(uint8_t data1, uint8_t data2, uint8_t data3); |
hsgw | 26:077ab26227c6 | 72 | */ |
hsgw | 26:077ab26227c6 | 73 | inline void attachCableEvent(void (*fn)(uint8_t, uint8_t, uint8_t)) { |
hsgw | 26:077ab26227c6 | 74 | cableEvent = fn; |
hsgw | 26:077ab26227c6 | 75 | } |
hsgw | 24:5281ea9f6e68 | 76 | |
hsgw | 24:5281ea9f6e68 | 77 | /** |
hsgw | 24:5281ea9f6e68 | 78 | * Attach a callback called when system exclusive is received |
hsgw | 24:5281ea9f6e68 | 79 | * |
hsgw | 24:5281ea9f6e68 | 80 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 81 | * prototype: void onSystemCommonTwoBytes(uint8_t data1, uint8_t data2); |
hsgw | 24:5281ea9f6e68 | 82 | */ |
hsgw | 24:5281ea9f6e68 | 83 | inline void attachSystemCommonTwoBytes(void (*fn)(uint8_t, uint8_t)) { |
hsgw | 24:5281ea9f6e68 | 84 | systemCommonTwoBytes = fn; |
hsgw | 24:5281ea9f6e68 | 85 | } |
hsgw | 24:5281ea9f6e68 | 86 | |
hsgw | 24:5281ea9f6e68 | 87 | /** |
hsgw | 24:5281ea9f6e68 | 88 | * Attach a callback called when system exclusive is received |
hsgw | 24:5281ea9f6e68 | 89 | * |
hsgw | 24:5281ea9f6e68 | 90 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 91 | * prototype: void onSystemCommonThreeBytes(uint8_t data1, uint8_t data2, uint8_t data3); |
hsgw | 24:5281ea9f6e68 | 92 | */ |
hsgw | 24:5281ea9f6e68 | 93 | inline void attachSystemCommonThreeBytes(void (*fn)(uint8_t, uint8_t, uint8_t)) { |
hsgw | 24:5281ea9f6e68 | 94 | systemCommonThreeBytes = fn; |
hsgw | 24:5281ea9f6e68 | 95 | } |
hsgw | 24:5281ea9f6e68 | 96 | |
hsgw | 24:5281ea9f6e68 | 97 | /** |
hsgw | 24:5281ea9f6e68 | 98 | * Attach a callback called when system exclusive is received |
hsgw | 24:5281ea9f6e68 | 99 | * |
hsgw | 24:5281ea9f6e68 | 100 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 101 | * prototype: void onSystemExclusive(uint8_t *data, uint16_t length, bool hasNextData); |
hsgw | 24:5281ea9f6e68 | 102 | */ |
hsgw | 24:5281ea9f6e68 | 103 | inline void attachSystemExclusive(void (*fn)(uint8_t *, uint16_t, bool)) { |
hsgw | 24:5281ea9f6e68 | 104 | systemExclusive = fn; |
hsgw | 24:5281ea9f6e68 | 105 | } |
hsgw | 24:5281ea9f6e68 | 106 | |
hsgw | 24:5281ea9f6e68 | 107 | /** |
hsgw | 24:5281ea9f6e68 | 108 | * Attach a callback called when note on is received |
hsgw | 24:5281ea9f6e68 | 109 | * |
hsgw | 24:5281ea9f6e68 | 110 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 111 | * prototype: void onNoteOn(uint8_t channel, uint8_t note, uint8_t velocity); |
hsgw | 24:5281ea9f6e68 | 112 | */ |
hsgw | 24:5281ea9f6e68 | 113 | inline void attachNoteOn(void (*fn)(uint8_t, uint8_t, uint8_t)) { |
hsgw | 24:5281ea9f6e68 | 114 | noteOn = fn; |
hsgw | 24:5281ea9f6e68 | 115 | } |
hsgw | 24:5281ea9f6e68 | 116 | |
hsgw | 24:5281ea9f6e68 | 117 | /** |
hsgw | 24:5281ea9f6e68 | 118 | * Attach a callback called when note off is received |
hsgw | 24:5281ea9f6e68 | 119 | * |
hsgw | 24:5281ea9f6e68 | 120 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 121 | * prototype: void onNoteOff(uint8_t channel, uint8_t note, uint8_t velocity); |
hsgw | 24:5281ea9f6e68 | 122 | */ |
hsgw | 24:5281ea9f6e68 | 123 | inline void attachNoteOff(void (*fn)(uint8_t, uint8_t, uint8_t)) { |
hsgw | 24:5281ea9f6e68 | 124 | noteOff = fn; |
hsgw | 24:5281ea9f6e68 | 125 | } |
hsgw | 24:5281ea9f6e68 | 126 | |
hsgw | 24:5281ea9f6e68 | 127 | /** |
hsgw | 24:5281ea9f6e68 | 128 | * Attach a callback called when poly keypress is received |
hsgw | 24:5281ea9f6e68 | 129 | * |
hsgw | 24:5281ea9f6e68 | 130 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 131 | * prototype: void onPolyKeyPress(uint8_t channel, uint8_t note, uint8_t pressure); |
hsgw | 24:5281ea9f6e68 | 132 | */ |
hsgw | 24:5281ea9f6e68 | 133 | inline void attachPolyKeyPress(void (*fn)(uint8_t, uint8_t, uint8_t)) { |
hsgw | 24:5281ea9f6e68 | 134 | polyKeyPress = fn; |
hsgw | 24:5281ea9f6e68 | 135 | } |
hsgw | 24:5281ea9f6e68 | 136 | |
hsgw | 24:5281ea9f6e68 | 137 | /** |
hsgw | 24:5281ea9f6e68 | 138 | * Attach a callback called when control change is received |
hsgw | 24:5281ea9f6e68 | 139 | * |
hsgw | 24:5281ea9f6e68 | 140 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 141 | * prototype: void onControlChange(uint8_t channel, uint8_t key, uint8_t value); |
hsgw | 24:5281ea9f6e68 | 142 | */ |
hsgw | 24:5281ea9f6e68 | 143 | inline void attachControlChange(void (*fn)(uint8_t, uint8_t, uint8_t)) { |
hsgw | 24:5281ea9f6e68 | 144 | controlChange = fn; |
hsgw | 24:5281ea9f6e68 | 145 | } |
hsgw | 24:5281ea9f6e68 | 146 | |
hsgw | 24:5281ea9f6e68 | 147 | /** |
hsgw | 24:5281ea9f6e68 | 148 | * Attach a callback called when program change is received |
hsgw | 24:5281ea9f6e68 | 149 | * |
hsgw | 24:5281ea9f6e68 | 150 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 151 | * prototype: void onProgramChange(uint8_t channel, uint8_t program); |
hsgw | 24:5281ea9f6e68 | 152 | */ |
hsgw | 24:5281ea9f6e68 | 153 | inline void attachProgramChange(void (*fn)(uint8_t, uint8_t)) { |
hsgw | 24:5281ea9f6e68 | 154 | programChange = fn; |
hsgw | 24:5281ea9f6e68 | 155 | } |
hsgw | 24:5281ea9f6e68 | 156 | |
hsgw | 24:5281ea9f6e68 | 157 | /** |
hsgw | 24:5281ea9f6e68 | 158 | * Attach a callback called when channel pressure is received |
hsgw | 24:5281ea9f6e68 | 159 | * |
hsgw | 24:5281ea9f6e68 | 160 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 161 | * prototype: void onChannelPressure(uint8_t channel, uint8_t pressure); |
hsgw | 24:5281ea9f6e68 | 162 | */ |
hsgw | 24:5281ea9f6e68 | 163 | inline void attachChannelPressure(void (*fn)(uint8_t, uint8_t)) { |
hsgw | 24:5281ea9f6e68 | 164 | channelPressure = fn; |
hsgw | 24:5281ea9f6e68 | 165 | } |
hsgw | 24:5281ea9f6e68 | 166 | |
hsgw | 24:5281ea9f6e68 | 167 | /** |
hsgw | 24:5281ea9f6e68 | 168 | * Attach a callback called when pitch bend is received |
hsgw | 24:5281ea9f6e68 | 169 | * |
hsgw | 24:5281ea9f6e68 | 170 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 171 | * prototype: void onPitchBend(uint8_t channel, uint16_t value); |
hsgw | 24:5281ea9f6e68 | 172 | */ |
hsgw | 24:5281ea9f6e68 | 173 | inline void attachPitchBend(void (*fn)(uint8_t, uint16_t)) { |
hsgw | 24:5281ea9f6e68 | 174 | pitchBend = fn; |
hsgw | 24:5281ea9f6e68 | 175 | } |
hsgw | 24:5281ea9f6e68 | 176 | |
hsgw | 24:5281ea9f6e68 | 177 | /** |
hsgw | 24:5281ea9f6e68 | 178 | * Attach a callback called when single byte is received |
hsgw | 24:5281ea9f6e68 | 179 | * |
hsgw | 24:5281ea9f6e68 | 180 | * @param ptr function pointer |
hsgw | 24:5281ea9f6e68 | 181 | * prototype: void onSingleByte(uint8_t value); |
hsgw | 24:5281ea9f6e68 | 182 | */ |
hsgw | 24:5281ea9f6e68 | 183 | inline void attachSingleByte(void (*fn)(uint8_t)) { |
hsgw | 24:5281ea9f6e68 | 184 | singleByte = fn; |
hsgw | 24:5281ea9f6e68 | 185 | } |
hsgw | 24:5281ea9f6e68 | 186 | |
hsgw | 24:5281ea9f6e68 | 187 | /** |
hsgw | 24:5281ea9f6e68 | 188 | * Send a cable event with 3 bytes event |
hsgw | 24:5281ea9f6e68 | 189 | * |
hsgw | 24:5281ea9f6e68 | 190 | * @param data1 0-255 |
hsgw | 24:5281ea9f6e68 | 191 | * @param data2 0-255 |
hsgw | 24:5281ea9f6e68 | 192 | * @param data3 0-255 |
hsgw | 24:5281ea9f6e68 | 193 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 194 | */ |
hsgw | 24:5281ea9f6e68 | 195 | bool sendMiscellaneousFunctionCode(uint8_t data1, uint8_t data2, uint8_t data3); |
hsgw | 24:5281ea9f6e68 | 196 | |
hsgw | 24:5281ea9f6e68 | 197 | /** |
hsgw | 24:5281ea9f6e68 | 198 | * Send a cable event with 3 bytes event |
hsgw | 24:5281ea9f6e68 | 199 | * |
hsgw | 24:5281ea9f6e68 | 200 | * @param data1 0-255 |
hsgw | 24:5281ea9f6e68 | 201 | * @param data2 0-255 |
hsgw | 24:5281ea9f6e68 | 202 | * @param data3 0-255 |
hsgw | 24:5281ea9f6e68 | 203 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 204 | */ |
hsgw | 24:5281ea9f6e68 | 205 | bool sendCableEvent(uint8_t data1, uint8_t data2, uint8_t data3); |
hsgw | 24:5281ea9f6e68 | 206 | |
hsgw | 24:5281ea9f6e68 | 207 | /** |
hsgw | 24:5281ea9f6e68 | 208 | * Send a system common message with 2 bytes event |
hsgw | 24:5281ea9f6e68 | 209 | * |
hsgw | 24:5281ea9f6e68 | 210 | * @param data1 0-255 |
hsgw | 24:5281ea9f6e68 | 211 | * @param data2 0-255 |
hsgw | 24:5281ea9f6e68 | 212 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 213 | */ |
hsgw | 24:5281ea9f6e68 | 214 | bool sendSystemCommmonTwoBytes(uint8_t data1, uint8_t data2); |
hsgw | 24:5281ea9f6e68 | 215 | |
hsgw | 24:5281ea9f6e68 | 216 | /** |
hsgw | 24:5281ea9f6e68 | 217 | * Send a system common message with 3 bytes event |
hsgw | 24:5281ea9f6e68 | 218 | * |
hsgw | 24:5281ea9f6e68 | 219 | * @param data1 0-255 |
hsgw | 24:5281ea9f6e68 | 220 | * @param data2 0-255 |
hsgw | 24:5281ea9f6e68 | 221 | * @param data3 0-255 |
hsgw | 24:5281ea9f6e68 | 222 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 223 | */ |
hsgw | 24:5281ea9f6e68 | 224 | bool sendSystemCommmonThreeBytes(uint8_t data1, uint8_t data2, uint8_t data3); |
hsgw | 24:5281ea9f6e68 | 225 | |
hsgw | 24:5281ea9f6e68 | 226 | /** |
hsgw | 24:5281ea9f6e68 | 227 | * Send a system exclusive event |
hsgw | 24:5281ea9f6e68 | 228 | * |
hsgw | 24:5281ea9f6e68 | 229 | * @param buffer, starts with 0xF0, and end with 0xf7 |
hsgw | 24:5281ea9f6e68 | 230 | * @param length |
hsgw | 24:5281ea9f6e68 | 231 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 232 | */ |
hsgw | 24:5281ea9f6e68 | 233 | bool sendSystemExclusive(uint8_t *buffer, int length); |
hsgw | 24:5281ea9f6e68 | 234 | |
hsgw | 24:5281ea9f6e68 | 235 | /** |
hsgw | 24:5281ea9f6e68 | 236 | * Send a note off event |
hsgw | 24:5281ea9f6e68 | 237 | * |
hsgw | 24:5281ea9f6e68 | 238 | * @param channel 0-15 |
hsgw | 24:5281ea9f6e68 | 239 | * @param note 0-127 |
hsgw | 24:5281ea9f6e68 | 240 | * @param velocity 0-127 |
hsgw | 24:5281ea9f6e68 | 241 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 242 | */ |
hsgw | 24:5281ea9f6e68 | 243 | bool sendNoteOff(uint8_t channel, uint8_t note, uint8_t velocity); |
hsgw | 24:5281ea9f6e68 | 244 | |
hsgw | 24:5281ea9f6e68 | 245 | /** |
hsgw | 24:5281ea9f6e68 | 246 | * Send a note on event |
hsgw | 24:5281ea9f6e68 | 247 | * |
hsgw | 24:5281ea9f6e68 | 248 | * @param channel 0-15 |
hsgw | 24:5281ea9f6e68 | 249 | * @param note 0-127 |
hsgw | 24:5281ea9f6e68 | 250 | * @param velocity 0-127 (0 means note off) |
hsgw | 24:5281ea9f6e68 | 251 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 252 | */ |
hsgw | 24:5281ea9f6e68 | 253 | bool sendNoteOn(uint8_t channel, uint8_t note, uint8_t velocity); |
hsgw | 24:5281ea9f6e68 | 254 | |
hsgw | 24:5281ea9f6e68 | 255 | /** |
hsgw | 24:5281ea9f6e68 | 256 | * Send a poly keypress event |
hsgw | 24:5281ea9f6e68 | 257 | * |
hsgw | 24:5281ea9f6e68 | 258 | * @param channel 0-15 |
hsgw | 24:5281ea9f6e68 | 259 | * @param note 0-127 |
hsgw | 24:5281ea9f6e68 | 260 | * @param pressure 0-127 |
hsgw | 24:5281ea9f6e68 | 261 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 262 | */ |
hsgw | 24:5281ea9f6e68 | 263 | bool sendPolyKeyPress(uint8_t channel, uint8_t note, uint8_t pressure); |
hsgw | 24:5281ea9f6e68 | 264 | |
hsgw | 24:5281ea9f6e68 | 265 | /** |
hsgw | 24:5281ea9f6e68 | 266 | * Send a control change event |
hsgw | 24:5281ea9f6e68 | 267 | * |
hsgw | 24:5281ea9f6e68 | 268 | * @param channel 0-15 |
hsgw | 24:5281ea9f6e68 | 269 | * @param key 0-127 |
hsgw | 24:5281ea9f6e68 | 270 | * @param value 0-127 |
hsgw | 24:5281ea9f6e68 | 271 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 272 | */ |
hsgw | 24:5281ea9f6e68 | 273 | bool sendControlChange(uint8_t channel, uint8_t key, uint8_t value); |
hsgw | 24:5281ea9f6e68 | 274 | |
hsgw | 24:5281ea9f6e68 | 275 | /** |
hsgw | 24:5281ea9f6e68 | 276 | * Send a program change event |
hsgw | 24:5281ea9f6e68 | 277 | * |
hsgw | 24:5281ea9f6e68 | 278 | * @param channel 0-15 |
hsgw | 24:5281ea9f6e68 | 279 | * @param program 0-127 |
hsgw | 24:5281ea9f6e68 | 280 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 281 | */ |
hsgw | 24:5281ea9f6e68 | 282 | bool sendProgramChange(uint8_t channel, uint8_t program); |
hsgw | 24:5281ea9f6e68 | 283 | |
hsgw | 24:5281ea9f6e68 | 284 | /** |
hsgw | 24:5281ea9f6e68 | 285 | * Send a channel pressure event |
hsgw | 24:5281ea9f6e68 | 286 | * |
hsgw | 24:5281ea9f6e68 | 287 | * @param channel 0-15 |
hsgw | 24:5281ea9f6e68 | 288 | * @param pressure 0-127 |
hsgw | 24:5281ea9f6e68 | 289 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 290 | */ |
hsgw | 24:5281ea9f6e68 | 291 | bool sendChannelPressure(uint8_t channel, uint8_t pressure); |
hsgw | 24:5281ea9f6e68 | 292 | |
hsgw | 24:5281ea9f6e68 | 293 | /** |
hsgw | 24:5281ea9f6e68 | 294 | * Send a control change event |
hsgw | 24:5281ea9f6e68 | 295 | * |
hsgw | 24:5281ea9f6e68 | 296 | * @param channel 0-15 |
hsgw | 24:5281ea9f6e68 | 297 | * @param key 0(lower)-8191(center)-16383(higher) |
hsgw | 24:5281ea9f6e68 | 298 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 299 | */ |
hsgw | 24:5281ea9f6e68 | 300 | bool sendPitchBend(uint8_t channel, uint16_t value); |
hsgw | 24:5281ea9f6e68 | 301 | |
hsgw | 24:5281ea9f6e68 | 302 | /** |
hsgw | 24:5281ea9f6e68 | 303 | * Send a single byte event |
hsgw | 24:5281ea9f6e68 | 304 | * |
hsgw | 24:5281ea9f6e68 | 305 | * @param data 0-255 |
hsgw | 24:5281ea9f6e68 | 306 | * @return true if message sent successfully |
hsgw | 24:5281ea9f6e68 | 307 | */ |
hsgw | 24:5281ea9f6e68 | 308 | bool sendSingleByte(uint8_t data); |
hsgw | 24:5281ea9f6e68 | 309 | |
hsgw | 24:5281ea9f6e68 | 310 | protected: |
hsgw | 24:5281ea9f6e68 | 311 | //From IUSBEnumerator |
hsgw | 24:5281ea9f6e68 | 312 | virtual void setVidPid(uint16_t vid, uint16_t pid); |
hsgw | 24:5281ea9f6e68 | 313 | 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 |
hsgw | 24:5281ea9f6e68 | 314 | virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used |
hsgw | 24:5281ea9f6e68 | 315 | |
hsgw | 24:5281ea9f6e68 | 316 | private: |
hsgw | 24:5281ea9f6e68 | 317 | USBHost * host; |
hsgw | 24:5281ea9f6e68 | 318 | USBDeviceConnected * dev; |
hsgw | 24:5281ea9f6e68 | 319 | USBEndpoint * bulk_in; |
hsgw | 24:5281ea9f6e68 | 320 | USBEndpoint * bulk_out; |
hsgw | 24:5281ea9f6e68 | 321 | uint32_t size_bulk_in; |
hsgw | 24:5281ea9f6e68 | 322 | uint32_t size_bulk_out; |
hsgw | 24:5281ea9f6e68 | 323 | |
hsgw | 24:5281ea9f6e68 | 324 | bool dev_connected; |
hsgw | 24:5281ea9f6e68 | 325 | |
hsgw | 24:5281ea9f6e68 | 326 | void init(); |
hsgw | 24:5281ea9f6e68 | 327 | |
hsgw | 24:5281ea9f6e68 | 328 | uint8_t buf[64]; |
hsgw | 24:5281ea9f6e68 | 329 | |
hsgw | 24:5281ea9f6e68 | 330 | void rxHandler(); |
hsgw | 24:5281ea9f6e68 | 331 | |
hsgw | 24:5281ea9f6e68 | 332 | uint16_t sysExBufferPos; |
hsgw | 24:5281ea9f6e68 | 333 | uint8_t sysExBuffer[64]; |
hsgw | 24:5281ea9f6e68 | 334 | |
hsgw | 26:077ab26227c6 | 335 | void (*miscellaneousFunctionCode)(uint8_t, uint8_t, uint8_t); |
hsgw | 26:077ab26227c6 | 336 | void (*cableEvent)(uint8_t, uint8_t, uint8_t); |
hsgw | 24:5281ea9f6e68 | 337 | void (*systemCommonTwoBytes)(uint8_t, uint8_t); |
hsgw | 24:5281ea9f6e68 | 338 | void (*systemCommonThreeBytes)(uint8_t, uint8_t, uint8_t); |
hsgw | 24:5281ea9f6e68 | 339 | void (*systemExclusive)(uint8_t *, uint16_t, bool); |
hsgw | 24:5281ea9f6e68 | 340 | void (*noteOff)(uint8_t, uint8_t, uint8_t); |
hsgw | 24:5281ea9f6e68 | 341 | void (*noteOn)(uint8_t, uint8_t, uint8_t); |
hsgw | 24:5281ea9f6e68 | 342 | void (*polyKeyPress)(uint8_t, uint8_t, uint8_t); |
hsgw | 24:5281ea9f6e68 | 343 | void (*controlChange)(uint8_t, uint8_t, uint8_t); |
hsgw | 24:5281ea9f6e68 | 344 | void (*programChange)(uint8_t, uint8_t); |
hsgw | 24:5281ea9f6e68 | 345 | void (*channelPressure)(uint8_t, uint8_t); |
hsgw | 24:5281ea9f6e68 | 346 | void (*pitchBend)(uint8_t, uint16_t); |
hsgw | 24:5281ea9f6e68 | 347 | void (*singleByte)(uint8_t); |
hsgw | 24:5281ea9f6e68 | 348 | |
hsgw | 24:5281ea9f6e68 | 349 | bool sendMidiBuffer(uint8_t data0, uint8_t data1, uint8_t data2, uint8_t data3); |
hsgw | 27:23fa4e04b1db | 350 | |
hsgw | 27:23fa4e04b1db | 351 | // dummy callback function |
hsgw | 27:23fa4e04b1db | 352 | static void callbackDummysingleByte(uint8_t a) { |
hsgw | 27:23fa4e04b1db | 353 | USB_INFO("Not attached command comming! First byte %d\n", a); |
hsgw | 27:23fa4e04b1db | 354 | return; |
hsgw | 27:23fa4e04b1db | 355 | } |
hsgw | 27:23fa4e04b1db | 356 | |
hsgw | 27:23fa4e04b1db | 357 | static void callbackDummy2Bytes(uint8_t a, uint8_t b){ |
hsgw | 27:23fa4e04b1db | 358 | callbackDummysingleByte(a); |
hsgw | 27:23fa4e04b1db | 359 | } |
hsgw | 27:23fa4e04b1db | 360 | |
hsgw | 27:23fa4e04b1db | 361 | static void callbackDummy3Bytes(uint8_t a, uint8_t b, uint8_t c){ |
hsgw | 27:23fa4e04b1db | 362 | callbackDummysingleByte(a); |
hsgw | 27:23fa4e04b1db | 363 | } |
hsgw | 27:23fa4e04b1db | 364 | |
hsgw | 27:23fa4e04b1db | 365 | static void callbackDummysystemExclusive(uint8_t *a, uint16_t b, bool c){ |
hsgw | 27:23fa4e04b1db | 366 | callbackDummysingleByte(a[0]); |
hsgw | 27:23fa4e04b1db | 367 | } |
hsgw | 27:23fa4e04b1db | 368 | static void callbackDummypitchBend(uint8_t a, uint16_t b){ |
hsgw | 27:23fa4e04b1db | 369 | callbackDummysingleByte(a); |
hsgw | 27:23fa4e04b1db | 370 | } |
hsgw | 24:5281ea9f6e68 | 371 | |
hsgw | 24:5281ea9f6e68 | 372 | int midi_intf; |
hsgw | 24:5281ea9f6e68 | 373 | bool midi_device_found; |
hsgw | 24:5281ea9f6e68 | 374 | |
hsgw | 24:5281ea9f6e68 | 375 | }; |
hsgw | 24:5281ea9f6e68 | 376 | |
hsgw | 24:5281ea9f6e68 | 377 | #endif |
hsgw | 24:5281ea9f6e68 | 378 | |
hsgw | 24:5281ea9f6e68 | 379 | #endif |