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 /*!
okini3939 1:0dac72ab5910 2 * @file MIDI.h
okini3939 1:0dac72ab5910 3 * Project MIDI Library
okini3939 1:0dac72ab5910 4 * @brief MIDI Library for the Arduino
okini3939 1:0dac72ab5910 5 * Version 3.2
okini3939 1:0dac72ab5910 6 * @author Francois Best
okini3939 1:0dac72ab5910 7 * @date 24/02/11
okini3939 1:0dac72ab5910 8 * License GPL Forty Seven Effects - 2011
okini3939 1:0dac72ab5910 9 */
okini3939 1:0dac72ab5910 10 /*
okini3939 1:0dac72ab5910 11 * Ported for mbed by Hiroshi Suga
okini3939 1:0dac72ab5910 12 * Orignal: http://www.arduino.cc/playground/Main/MIDILibrary
okini3939 1:0dac72ab5910 13 */
okini3939 1:0dac72ab5910 14
okini3939 1:0dac72ab5910 15 #ifndef LIB_MIDI_H_
okini3939 1:0dac72ab5910 16 #define LIB_MIDI_H_
okini3939 1:0dac72ab5910 17
okini3939 1:0dac72ab5910 18 #include "mbed.h"
okini3939 1:0dac72ab5910 19 #include "CBuffer.h"
okini3939 1:0dac72ab5910 20
okini3939 1:0dac72ab5910 21
okini3939 1:0dac72ab5910 22 /*
okini3939 1:0dac72ab5910 23 ###############################################################
okini3939 1:0dac72ab5910 24 # #
okini3939 1:0dac72ab5910 25 # CONFIGURATION AREA #
okini3939 1:0dac72ab5910 26 # #
okini3939 1:0dac72ab5910 27 # Here are a few settings you can change to customize #
okini3939 1:0dac72ab5910 28 # the library for your own project. You can for example #
okini3939 1:0dac72ab5910 29 # choose to compile only parts of it so you gain flash #
okini3939 1:0dac72ab5910 30 # space and optimise the speed of your sketch. #
okini3939 1:0dac72ab5910 31 # #
okini3939 1:0dac72ab5910 32 ###############################################################
okini3939 1:0dac72ab5910 33 */
okini3939 1:0dac72ab5910 34
okini3939 1:0dac72ab5910 35
okini3939 1:0dac72ab5910 36 #define COMPILE_MIDI_IN 1 // Set this setting to 1 to use the MIDI input.
okini3939 1:0dac72ab5910 37 #define COMPILE_MIDI_OUT 1 // Set this setting to 1 to use the MIDI output.
okini3939 1:0dac72ab5910 38 #define COMPILE_MIDI_THRU 1 // Set this setting to 1 to use the MIDI Soft Thru feature
okini3939 1:0dac72ab5910 39 // Please note that the Thru will work only when both COMPILE_MIDI_IN and COMPILE_MIDI_OUT set to 1.
okini3939 1:0dac72ab5910 40
okini3939 1:0dac72ab5910 41
okini3939 1:0dac72ab5910 42 #define USE_SERIAL_PORT _midi // Change the number (to Serial1 for example) if you want
okini3939 1:0dac72ab5910 43 // to use a different serial port for MIDI I/O.
okini3939 1:0dac72ab5910 44
okini3939 1:0dac72ab5910 45
okini3939 1:0dac72ab5910 46 #define USE_RUNNING_STATUS 0 // Running status enables short messages when sending multiple values
okini3939 1:0dac72ab5910 47 // of the same type and channel.
okini3939 1:0dac72ab5910 48 // Set to 0 if you have troubles with controlling you hardware.
okini3939 1:0dac72ab5910 49
okini3939 1:0dac72ab5910 50
okini3939 1:0dac72ab5910 51 #define USE_CALLBACKS 1 // Set this to 1 if you want to use callback handlers (to bind your functions to the library).
okini3939 1:0dac72ab5910 52 // To use the callbacks, you need to have COMPILE_MIDI_IN set to 1
okini3939 1:0dac72ab5910 53
okini3939 1:0dac72ab5910 54 #define USE_1BYTE_PARSING 1 // Each call to MIDI.read will only parse one byte (might be faster).
okini3939 1:0dac72ab5910 55
okini3939 1:0dac72ab5910 56
okini3939 1:0dac72ab5910 57 // END OF CONFIGURATION AREA
okini3939 1:0dac72ab5910 58 // (do not modify anything under this line unless you know what you are doing)
okini3939 1:0dac72ab5910 59
okini3939 1:0dac72ab5910 60
okini3939 1:0dac72ab5910 61 #define MIDI_BAUDRATE 31250
okini3939 1:0dac72ab5910 62
okini3939 1:0dac72ab5910 63 #define MIDI_CHANNEL_OMNI 0
okini3939 1:0dac72ab5910 64 #define MIDI_CHANNEL_OFF 17 // and over
okini3939 1:0dac72ab5910 65
okini3939 1:0dac72ab5910 66 #define MIDI_SYSEX_ARRAY_SIZE 255 // Maximum size is 65535 bytes.
okini3939 1:0dac72ab5910 67
okini3939 1:0dac72ab5910 68 /*! Type definition for practical use (because "unsigned char" is a bit long to write.. )*/
okini3939 1:0dac72ab5910 69 typedef uint8_t byte;
okini3939 1:0dac72ab5910 70 typedef uint16_t word;
okini3939 1:0dac72ab5910 71
okini3939 1:0dac72ab5910 72 /*! Enumeration of MIDI types */
okini3939 1:0dac72ab5910 73 enum kMIDIType {
okini3939 1:0dac72ab5910 74 NoteOff = 0x80, ///< Note Off
okini3939 1:0dac72ab5910 75 NoteOn = 0x90, ///< Note On
okini3939 1:0dac72ab5910 76 AfterTouchPoly = 0xA0, ///< Polyphonic AfterTouch
okini3939 1:0dac72ab5910 77 ControlChange = 0xB0, ///< Control Change / Channel Mode
okini3939 1:0dac72ab5910 78 ProgramChange = 0xC0, ///< Program Change
okini3939 1:0dac72ab5910 79 AfterTouchChannel = 0xD0, ///< Channel (monophonic) AfterTouch
okini3939 1:0dac72ab5910 80 PitchBend = 0xE0, ///< Pitch Bend
okini3939 1:0dac72ab5910 81 SystemExclusive = 0xF0, ///< System Exclusive
okini3939 1:0dac72ab5910 82 TimeCodeQuarterFrame = 0xF1, ///< System Common - MIDI Time Code Quarter Frame
okini3939 1:0dac72ab5910 83 SongPosition = 0xF2, ///< System Common - Song Position Pointer
okini3939 1:0dac72ab5910 84 SongSelect = 0xF3, ///< System Common - Song Select
okini3939 1:0dac72ab5910 85 TuneRequest = 0xF6, ///< System Common - Tune Request
okini3939 1:0dac72ab5910 86 Clock = 0xF8, ///< System Real Time - Timing Clock
okini3939 1:0dac72ab5910 87 Start = 0xFA, ///< System Real Time - Start
okini3939 1:0dac72ab5910 88 Continue = 0xFB, ///< System Real Time - Continue
okini3939 1:0dac72ab5910 89 Stop = 0xFC, ///< System Real Time - Stop
okini3939 1:0dac72ab5910 90 ActiveSensing = 0xFE, ///< System Real Time - Active Sensing
okini3939 1:0dac72ab5910 91 SystemReset = 0xFF, ///< System Real Time - System Reset
okini3939 1:0dac72ab5910 92 InvalidType = 0x00 ///< For notifying errors
okini3939 1:0dac72ab5910 93 };
okini3939 1:0dac72ab5910 94
okini3939 1:0dac72ab5910 95 /*! Enumeration of Thru filter modes */
okini3939 1:0dac72ab5910 96 enum kThruFilterMode {
okini3939 1:0dac72ab5910 97 Off = 0, ///< Thru disabled (nothing passes through).
okini3939 1:0dac72ab5910 98 Full = 1, ///< Fully enabled Thru (every incoming message is sent back).
okini3939 1:0dac72ab5910 99 SameChannel = 2, ///< Only the messages on the Input Channel will be sent back.
okini3939 1:0dac72ab5910 100 DifferentChannel = 3 ///< All the messages but the ones on the Input Channel will be sent back.
okini3939 1:0dac72ab5910 101 };
okini3939 1:0dac72ab5910 102
okini3939 1:0dac72ab5910 103
okini3939 1:0dac72ab5910 104 /*! The midimsg structure contains decoded data of a MIDI message read from the serial port with read() or thru(). \n */
okini3939 1:0dac72ab5910 105 struct midimsg {
okini3939 1:0dac72ab5910 106 /*! The MIDI channel on which the message was recieved. \n Value goes from 1 to 16. */
okini3939 1:0dac72ab5910 107 byte channel;
okini3939 1:0dac72ab5910 108 /*! The type of the message (see the define section for types reference) */
okini3939 1:0dac72ab5910 109 kMIDIType type;
okini3939 1:0dac72ab5910 110 /*! The first data byte.\n Value goes from 0 to 127.\n */
okini3939 1:0dac72ab5910 111 byte data1;
okini3939 1:0dac72ab5910 112 /*! The second data byte. If the message is only 2 bytes long, this one is null.\n Value goes from 0 to 127. */
okini3939 1:0dac72ab5910 113 byte data2;
okini3939 1:0dac72ab5910 114 /*! System Exclusive dedicated byte array. \n Array length is stocked on 16 bits, in data1 (LSB) and data2 (MSB) */
okini3939 1:0dac72ab5910 115 byte sysex_array[MIDI_SYSEX_ARRAY_SIZE];
okini3939 1:0dac72ab5910 116 /*! This boolean indicates if the message is valid or not. There is no channel consideration here, validity means the message respects the MIDI norm. */
okini3939 1:0dac72ab5910 117 bool valid;
okini3939 1:0dac72ab5910 118 };
okini3939 1:0dac72ab5910 119
okini3939 1:0dac72ab5910 120
okini3939 1:0dac72ab5910 121
okini3939 1:0dac72ab5910 122
okini3939 1:0dac72ab5910 123 /*! \brief The main class for MIDI handling.\n
okini3939 1:0dac72ab5910 124 See member descriptions to know how to use it,
okini3939 1:0dac72ab5910 125 or check out the examples supplied with the library.
okini3939 1:0dac72ab5910 126 */
okini3939 1:0dac72ab5910 127 class MIDI {
okini3939 1:0dac72ab5910 128
okini3939 1:0dac72ab5910 129
okini3939 1:0dac72ab5910 130 public:
okini3939 1:0dac72ab5910 131 // Constructor and Destructor
okini3939 1:0dac72ab5910 132 MIDI(PinName p_tx, PinName p_rx);
okini3939 1:0dac72ab5910 133 ~MIDI();
okini3939 1:0dac72ab5910 134
okini3939 1:0dac72ab5910 135
okini3939 1:0dac72ab5910 136 void begin(const byte inChannel = 1);
okini3939 1:0dac72ab5910 137
okini3939 1:0dac72ab5910 138
okini3939 1:0dac72ab5910 139
okini3939 1:0dac72ab5910 140
okini3939 1:0dac72ab5910 141 /* ####### OUTPUT COMPILATION BLOCK ####### */
okini3939 1:0dac72ab5910 142 #if COMPILE_MIDI_OUT
okini3939 1:0dac72ab5910 143
okini3939 1:0dac72ab5910 144 public:
okini3939 1:0dac72ab5910 145
okini3939 1:0dac72ab5910 146 void sendNoteOn(byte NoteNumber,byte Velocity,byte Channel);
okini3939 1:0dac72ab5910 147 void sendNoteOff(byte NoteNumber,byte Velocity,byte Channel);
okini3939 1:0dac72ab5910 148 void sendProgramChange(byte ProgramNumber,byte Channel);
okini3939 1:0dac72ab5910 149 void sendControlChange(byte ControlNumber, byte ControlValue,byte Channel);
okini3939 1:0dac72ab5910 150 void sendPitchBend(int PitchValue,byte Channel);
okini3939 1:0dac72ab5910 151 void sendPitchBend(unsigned int PitchValue,byte Channel);
okini3939 1:0dac72ab5910 152 void sendPitchBend(double PitchValue,byte Channel);
okini3939 1:0dac72ab5910 153 void sendPolyPressure(byte NoteNumber,byte Pressure,byte Channel);
okini3939 1:0dac72ab5910 154 void sendAfterTouch(byte Pressure,byte Channel);
okini3939 1:0dac72ab5910 155 void sendSysEx(int length, const byte *const array,bool ArrayContainsBoundaries = false);
okini3939 1:0dac72ab5910 156 void sendTimeCodeQuarterFrame(byte TypeNibble, byte ValuesNibble);
okini3939 1:0dac72ab5910 157 void sendTimeCodeQuarterFrame(byte data);
okini3939 1:0dac72ab5910 158 void sendSongPosition(unsigned int Beats);
okini3939 1:0dac72ab5910 159 void sendSongSelect(byte SongNumber);
okini3939 1:0dac72ab5910 160 void sendTuneRequest();
okini3939 1:0dac72ab5910 161 void sendRealTime(kMIDIType Type);
okini3939 1:0dac72ab5910 162
okini3939 1:0dac72ab5910 163 void send(kMIDIType type, byte param1, byte param2, byte channel);
okini3939 1:0dac72ab5910 164
okini3939 1:0dac72ab5910 165 private:
okini3939 1:0dac72ab5910 166
okini3939 1:0dac72ab5910 167 RawSerial _midi;
okini3939 1:0dac72ab5910 168 byte genstatus(const kMIDIType inType,const byte inChannel) const;
okini3939 1:0dac72ab5910 169
okini3939 1:0dac72ab5910 170
okini3939 1:0dac72ab5910 171 // Attributes
okini3939 1:0dac72ab5910 172 #if USE_RUNNING_STATUS
okini3939 1:0dac72ab5910 173 byte mRunningStatus_TX;
okini3939 1:0dac72ab5910 174 #endif // USE_RUNNING_STATUS
okini3939 1:0dac72ab5910 175
okini3939 1:0dac72ab5910 176 #endif // COMPILE_MIDI_OUT
okini3939 1:0dac72ab5910 177
okini3939 1:0dac72ab5910 178
okini3939 1:0dac72ab5910 179
okini3939 1:0dac72ab5910 180 /* ####### INPUT COMPILATION BLOCK ####### */
okini3939 1:0dac72ab5910 181 #if COMPILE_MIDI_IN
okini3939 1:0dac72ab5910 182
okini3939 1:0dac72ab5910 183 public:
okini3939 1:0dac72ab5910 184
okini3939 1:0dac72ab5910 185 bool read();
okini3939 1:0dac72ab5910 186 bool read(const byte Channel);
okini3939 1:0dac72ab5910 187
okini3939 1:0dac72ab5910 188 // Getters
okini3939 1:0dac72ab5910 189 kMIDIType getType() const;
okini3939 1:0dac72ab5910 190 byte getChannel() const;
okini3939 1:0dac72ab5910 191 byte getData1() const;
okini3939 1:0dac72ab5910 192 byte getData2() const;
okini3939 1:0dac72ab5910 193 const byte * getSysExArray() const;
okini3939 1:0dac72ab5910 194 unsigned int getSysExArrayLength() const;
okini3939 1:0dac72ab5910 195 bool check() const;
okini3939 1:0dac72ab5910 196
okini3939 1:0dac72ab5910 197 byte getInputChannel() const
okini3939 1:0dac72ab5910 198 {
okini3939 1:0dac72ab5910 199 return mInputChannel;
okini3939 1:0dac72ab5910 200 }
okini3939 1:0dac72ab5910 201
okini3939 1:0dac72ab5910 202 // Setters
okini3939 1:0dac72ab5910 203 void setInputChannel(const byte Channel);
okini3939 1:0dac72ab5910 204
okini3939 1:0dac72ab5910 205 /*! \brief Extract an enumerated MIDI type from a status byte.
okini3939 1:0dac72ab5910 206
okini3939 1:0dac72ab5910 207 This is a utility static method, used internally, made public so you can handle kMIDITypes more easily.
okini3939 1:0dac72ab5910 208 */
okini3939 1:0dac72ab5910 209 static inline kMIDIType getTypeFromStatusByte(const byte inStatus)
okini3939 1:0dac72ab5910 210 {
okini3939 1:0dac72ab5910 211 if ((inStatus < 0x80)
okini3939 1:0dac72ab5910 212 || (inStatus == 0xF4)
okini3939 1:0dac72ab5910 213 || (inStatus == 0xF5)
okini3939 1:0dac72ab5910 214 || (inStatus == 0xF9)
okini3939 1:0dac72ab5910 215 || (inStatus == 0xFD)) return InvalidType; // data bytes and undefined.
okini3939 1:0dac72ab5910 216 if (inStatus < 0xF0) return (kMIDIType)(inStatus & 0xF0); // Channel message, remove channel nibble.
okini3939 1:0dac72ab5910 217 else return (kMIDIType)inStatus;
okini3939 1:0dac72ab5910 218 }
okini3939 1:0dac72ab5910 219
okini3939 1:0dac72ab5910 220
okini3939 1:0dac72ab5910 221 #if USE_CALLBACKS
okini3939 1:0dac72ab5910 222
okini3939 1:0dac72ab5910 223 void setHandleNoteOff(void (*fptr)(byte channel, byte note, byte velocity));
okini3939 1:0dac72ab5910 224 void setHandleNoteOn(void (*fptr)(byte channel, byte note, byte velocity));
okini3939 1:0dac72ab5910 225 void setHandleAfterTouchPoly(void (*fptr)(byte channel, byte note, byte pressure));
okini3939 1:0dac72ab5910 226 void setHandleControlChange(void (*fptr)(byte channel, byte number, byte value));
okini3939 1:0dac72ab5910 227 void setHandleProgramChange(void (*fptr)(byte channel, byte number));
okini3939 1:0dac72ab5910 228 void setHandleAfterTouchChannel(void (*fptr)(byte channel, byte pressure));
okini3939 1:0dac72ab5910 229 void setHandlePitchBend(void (*fptr)(byte channel, int bend));
okini3939 1:0dac72ab5910 230 void setHandleSystemExclusive(void (*fptr)(byte * array, byte size));
okini3939 1:0dac72ab5910 231 void setHandleTimeCodeQuarterFrame(void (*fptr)(byte data));
okini3939 1:0dac72ab5910 232 void setHandleSongPosition(void (*fptr)(unsigned int beats));
okini3939 1:0dac72ab5910 233 void setHandleSongSelect(void (*fptr)(byte songnumber));
okini3939 1:0dac72ab5910 234 void setHandleTuneRequest(void (*fptr)(void));
okini3939 1:0dac72ab5910 235 void setHandleClock(void (*fptr)(void));
okini3939 1:0dac72ab5910 236 void setHandleStart(void (*fptr)(void));
okini3939 1:0dac72ab5910 237 void setHandleContinue(void (*fptr)(void));
okini3939 1:0dac72ab5910 238 void setHandleStop(void (*fptr)(void));
okini3939 1:0dac72ab5910 239 void setHandleActiveSensing(void (*fptr)(void));
okini3939 1:0dac72ab5910 240 void setHandleSystemReset(void (*fptr)(void));
okini3939 1:0dac72ab5910 241
okini3939 1:0dac72ab5910 242 void disconnectCallbackFromType(kMIDIType Type);
okini3939 1:0dac72ab5910 243
okini3939 1:0dac72ab5910 244 #endif // USE_CALLBACKS
okini3939 1:0dac72ab5910 245
okini3939 1:0dac72ab5910 246
okini3939 1:0dac72ab5910 247 private:
okini3939 1:0dac72ab5910 248
okini3939 1:0dac72ab5910 249 bool input_filter(byte inChannel);
okini3939 1:0dac72ab5910 250 bool parse(byte inChannel);
okini3939 1:0dac72ab5910 251 void reset_input_attributes();
okini3939 1:0dac72ab5910 252
okini3939 1:0dac72ab5910 253 // Attributes
okini3939 1:0dac72ab5910 254 byte mRunningStatus_RX;
okini3939 1:0dac72ab5910 255 byte mInputChannel;
okini3939 1:0dac72ab5910 256
okini3939 1:0dac72ab5910 257 byte mPendingMessage[MIDI_SYSEX_ARRAY_SIZE];
okini3939 1:0dac72ab5910 258 unsigned int mPendingMessageExpectedLenght;
okini3939 1:0dac72ab5910 259 unsigned int mPendingMessageIndex; // Extended to unsigned int for larger sysex payloads.
okini3939 1:0dac72ab5910 260
okini3939 1:0dac72ab5910 261 midimsg mMessage;
okini3939 1:0dac72ab5910 262
okini3939 1:0dac72ab5910 263 #if USE_CALLBACKS
okini3939 1:0dac72ab5910 264
okini3939 1:0dac72ab5910 265 void launchCallback();
okini3939 1:0dac72ab5910 266
okini3939 1:0dac72ab5910 267 void (*mNoteOffCallback)(byte channel, byte note, byte velocity);
okini3939 1:0dac72ab5910 268 void (*mNoteOnCallback)(byte channel, byte note, byte velocity);
okini3939 1:0dac72ab5910 269 void (*mAfterTouchPolyCallback)(byte channel, byte note, byte velocity);
okini3939 1:0dac72ab5910 270 void (*mControlChangeCallback)(byte channel, byte, byte);
okini3939 1:0dac72ab5910 271 void (*mProgramChangeCallback)(byte channel, byte);
okini3939 1:0dac72ab5910 272 void (*mAfterTouchChannelCallback)(byte channel, byte);
okini3939 1:0dac72ab5910 273 void (*mPitchBendCallback)(byte channel, int);
okini3939 1:0dac72ab5910 274 void (*mSystemExclusiveCallback)(byte * array, byte size);
okini3939 1:0dac72ab5910 275 void (*mTimeCodeQuarterFrameCallback)(byte data);
okini3939 1:0dac72ab5910 276 void (*mSongPositionCallback)(unsigned int beats);
okini3939 1:0dac72ab5910 277 void (*mSongSelectCallback)(byte songnumber);
okini3939 1:0dac72ab5910 278 void (*mTuneRequestCallback)(void);
okini3939 1:0dac72ab5910 279 void (*mClockCallback)(void);
okini3939 1:0dac72ab5910 280 void (*mStartCallback)(void);
okini3939 1:0dac72ab5910 281 void (*mContinueCallback)(void);
okini3939 1:0dac72ab5910 282 void (*mStopCallback)(void);
okini3939 1:0dac72ab5910 283 void (*mActiveSensingCallback)(void);
okini3939 1:0dac72ab5910 284 void (*mSystemResetCallback)(void);
okini3939 1:0dac72ab5910 285
okini3939 1:0dac72ab5910 286 #endif // USE_CALLBACKS
okini3939 1:0dac72ab5910 287
okini3939 1:0dac72ab5910 288
okini3939 1:0dac72ab5910 289 #endif // COMPILE_MIDI_IN
okini3939 1:0dac72ab5910 290
okini3939 1:0dac72ab5910 291
okini3939 1:0dac72ab5910 292 /* ####### THRU COMPILATION BLOCK ####### */
okini3939 1:0dac72ab5910 293 #if (COMPILE_MIDI_IN && COMPILE_MIDI_OUT && COMPILE_MIDI_THRU) // Thru
okini3939 1:0dac72ab5910 294
okini3939 1:0dac72ab5910 295 public:
okini3939 1:0dac72ab5910 296
okini3939 1:0dac72ab5910 297 // Getters
okini3939 1:0dac72ab5910 298 kThruFilterMode getFilterMode() const { return mThruFilterMode; }
okini3939 1:0dac72ab5910 299 bool getThruState() const { return mThruActivated; }
okini3939 1:0dac72ab5910 300
okini3939 1:0dac72ab5910 301
okini3939 1:0dac72ab5910 302 // Setters
okini3939 1:0dac72ab5910 303 void turnThruOn(kThruFilterMode inThruFilterMode = Full);
okini3939 1:0dac72ab5910 304 void turnThruOff();
okini3939 1:0dac72ab5910 305
okini3939 1:0dac72ab5910 306 void setThruFilterMode(const kThruFilterMode inThruFilterMode);
okini3939 1:0dac72ab5910 307
okini3939 1:0dac72ab5910 308
okini3939 1:0dac72ab5910 309 private:
okini3939 1:0dac72ab5910 310
okini3939 1:0dac72ab5910 311 void thru_filter(byte inChannel);
okini3939 1:0dac72ab5910 312 void isr_rx();
okini3939 1:0dac72ab5910 313
okini3939 1:0dac72ab5910 314 bool mThruActivated;
okini3939 1:0dac72ab5910 315 kThruFilterMode mThruFilterMode;
okini3939 1:0dac72ab5910 316 CircBuffer <byte>*uart_in;
okini3939 1:0dac72ab5910 317
okini3939 1:0dac72ab5910 318 #endif // Thru
okini3939 1:0dac72ab5910 319
okini3939 1:0dac72ab5910 320 };
okini3939 1:0dac72ab5910 321
okini3939 1:0dac72ab5910 322 #endif // LIB_MIDI_H_