Ported from Arduino MIDI library Orignal: http://www.arduino.cc/playground/Main/MIDILibrary use Serial (UART)

Dependents:   MIDI_sample MIDI_usb_bridge MIDI_Interpreter midi-timer ... more

Committer:
okini3939
Date:
Tue Jan 08 03:32:22 2013 +0000
Revision:
1:0eeca7deec08
Parent:
0:713ef38fead1
disable loopback

Who changed what in which revision?

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