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

Files at this revision

API Documentation at this revision

Comitter:
okini3939
Date:
Tue Jan 08 03:32:22 2013 +0000
Parent:
0:713ef38fead1
Commit message:
disable loopback

Changed in this revision

MIDI.h Show annotated file Show diff for this revision Revisions of this file
diff -r 713ef38fead1 -r 0eeca7deec08 MIDI.h
--- a/MIDI.h	Mon Dec 03 14:20:05 2012 +0000
+++ b/MIDI.h	Tue Jan 08 03:32:22 2013 +0000
@@ -1,319 +1,319 @@
-/*!
- *  @file       MIDI.h
- *  Project     MIDI Library
- *  @brief      MIDI Library for the Arduino
- *  Version     3.2
- *  @author     Francois Best 
- *  @date       24/02/11
- *  License     GPL Forty Seven Effects - 2011
- */
-/*
- * Ported for mbed by Hiroshi Suga
- *   Orignal: http://www.arduino.cc/playground/Main/MIDILibrary
- */
-
-#ifndef LIB_MIDI_H_
-#define LIB_MIDI_H_
-
-#include "mbed.h"
-
-
-/*  
-    ###############################################################
-    #                                                             #
-    #    CONFIGURATION AREA                                       #
-    #                                                             #
-    #    Here are a few settings you can change to customize      #
-    #    the library for your own project. You can for example    #
-    #    choose to compile only parts of it so you gain flash     #
-    #    space and optimise the speed of your sketch.             #
-    #                                                             #
-    ###############################################################
- */
-
-
-#define COMPILE_MIDI_IN         1           // Set this setting to 1 to use the MIDI input.
-#define COMPILE_MIDI_OUT        1           // Set this setting to 1 to use the MIDI output. 
-#define COMPILE_MIDI_THRU       1           // Set this setting to 1 to use the MIDI Soft Thru feature
-                                            // Please note that the Thru will work only when both COMPILE_MIDI_IN and COMPILE_MIDI_OUT set to 1.
-
-
-#define USE_SERIAL_PORT         _midi      // Change the number (to Serial1 for example) if you want
-                                            // to use a different serial port for MIDI I/O.
-
-
-#define USE_RUNNING_STATUS      1           // Running status enables short messages when sending multiple values
-                                            // of the same type and channel.
-                                            // Set to 0 if you have troubles with controlling you hardware.
-
-
-#define USE_CALLBACKS           1           // Set this to 1 if you want to use callback handlers (to bind your functions to the library).
-                                            // To use the callbacks, you need to have COMPILE_MIDI_IN set to 1
-
-#define USE_1BYTE_PARSING       1           // Each call to MIDI.read will only parse one byte (might be faster).
-
-
-// END OF CONFIGURATION AREA 
-// (do not modify anything under this line unless you know what you are doing)
-
-
-#define MIDI_BAUDRATE           31250
-
-#define MIDI_CHANNEL_OMNI       0
-#define MIDI_CHANNEL_OFF        17          // and over
-
-#define MIDI_SYSEX_ARRAY_SIZE   255         // Maximum size is 65535 bytes.
-
-/*! Type definition for practical use (because "unsigned char" is a bit long to write.. )*/
-typedef uint8_t byte;
-typedef uint16_t word;
-
-/*! Enumeration of MIDI types */
-enum kMIDIType {
-    NoteOff               = 0x80,   ///< Note Off
-    NoteOn                = 0x90,   ///< Note On
-    AfterTouchPoly        = 0xA0,   ///< Polyphonic AfterTouch
-    ControlChange         = 0xB0,   ///< Control Change / Channel Mode
-    ProgramChange         = 0xC0,   ///< Program Change
-    AfterTouchChannel     = 0xD0,   ///< Channel (monophonic) AfterTouch
-    PitchBend             = 0xE0,   ///< Pitch Bend
-    SystemExclusive       = 0xF0,   ///< System Exclusive
-    TimeCodeQuarterFrame  = 0xF1,   ///< System Common - MIDI Time Code Quarter Frame
-    SongPosition          = 0xF2,   ///< System Common - Song Position Pointer
-    SongSelect            = 0xF3,   ///< System Common - Song Select
-    TuneRequest           = 0xF6,   ///< System Common - Tune Request
-    Clock                 = 0xF8,   ///< System Real Time - Timing Clock
-    Start                 = 0xFA,   ///< System Real Time - Start
-    Continue              = 0xFB,   ///< System Real Time - Continue
-    Stop                  = 0xFC,   ///< System Real Time - Stop
-    ActiveSensing         = 0xFE,   ///< System Real Time - Active Sensing
-    SystemReset           = 0xFF,   ///< System Real Time - System Reset
-    InvalidType           = 0x00    ///< For notifying errors
-};
-
-/*! Enumeration of Thru filter modes */
-enum kThruFilterMode {
-    Off                   = 0,  ///< Thru disabled (nothing passes through).
-    Full                  = 1,  ///< Fully enabled Thru (every incoming message is sent back).
-    SameChannel           = 2,  ///< Only the messages on the Input Channel will be sent back.
-    DifferentChannel      = 3   ///< All the messages but the ones on the Input Channel will be sent back.
-};
-
-
-/*! The midimsg structure contains decoded data of a MIDI message read from the serial port with read() or thru(). \n */
-struct midimsg {
-    /*! The MIDI channel on which the message was recieved. \n Value goes from 1 to 16. */
-    byte channel; 
-    /*! The type of the message (see the define section for types reference) */
-    kMIDIType type;
-    /*! The first data byte.\n Value goes from 0 to 127.\n */
-    byte data1;
-    /*! The second data byte. If the message is only 2 bytes long, this one is null.\n Value goes from 0 to 127. */
-    byte data2;
-    /*! System Exclusive dedicated byte array. \n Array length is stocked on 16 bits, in data1 (LSB) and data2 (MSB) */
-    byte sysex_array[MIDI_SYSEX_ARRAY_SIZE];
-    /*! This boolean indicates if the message is valid or not. There is no channel consideration here, validity means the message respects the MIDI norm. */
-    bool valid;
-};
-
-
-
-
-/*! \brief The main class for MIDI handling.\n
-    See member descriptions to know how to use it,
-    or check out the examples supplied with the library.
- */
-class MIDI {
-    
-    
-public:
-    // Constructor and Destructor
-    MIDI(PinName p_tx, PinName p_rx);
-    ~MIDI();
-    
-    
-    void begin(const byte inChannel = 1);
-    
-    
-    
-    
-/* ####### OUTPUT COMPILATION BLOCK ####### */  
-#if COMPILE_MIDI_OUT
-
-public: 
-    
-    void sendNoteOn(byte NoteNumber,byte Velocity,byte Channel);
-    void sendNoteOff(byte NoteNumber,byte Velocity,byte Channel);
-    void sendProgramChange(byte ProgramNumber,byte Channel);
-    void sendControlChange(byte ControlNumber, byte ControlValue,byte Channel);
-    void sendPitchBend(int PitchValue,byte Channel);
-    void sendPitchBend(unsigned int PitchValue,byte Channel);
-    void sendPitchBend(double PitchValue,byte Channel);
-    void sendPolyPressure(byte NoteNumber,byte Pressure,byte Channel);
-    void sendAfterTouch(byte Pressure,byte Channel);
-    void sendSysEx(int length, const byte *const array,bool ArrayContainsBoundaries = false);   
-    void sendTimeCodeQuarterFrame(byte TypeNibble, byte ValuesNibble);
-    void sendTimeCodeQuarterFrame(byte data);
-    void sendSongPosition(unsigned int Beats);
-    void sendSongSelect(byte SongNumber);
-    void sendTuneRequest();
-    void sendRealTime(kMIDIType Type);
-    
-    void send(kMIDIType type, byte param1, byte param2, byte channel);
-    
-private:
-    
-    Serial _midi;
-    byte genstatus(const kMIDIType inType,const byte inChannel) const;
-    
-    
-    // Attributes
-#if USE_RUNNING_STATUS
-    byte            mRunningStatus_TX;
-#endif // USE_RUNNING_STATUS
-
-#endif  // COMPILE_MIDI_OUT
-    
-
-    
-/* ####### INPUT COMPILATION BLOCK ####### */
-#if COMPILE_MIDI_IN 
-    
-public:
-    
-    bool read();
-    bool read(const byte Channel);
-    
-    // Getters
-    kMIDIType getType() const;
-    byte getChannel() const;
-    byte getData1() const;
-    byte getData2() const;
-    const byte * getSysExArray() const;
-    unsigned int getSysExArrayLength() const;
-    bool check() const;
-    
-    byte getInputChannel() const 
-    {
-        return mInputChannel;
-    }
-    
-    // Setters
-    void setInputChannel(const byte Channel);
-    
-    /*! \brief Extract an enumerated MIDI type from a status byte.
-     
-     This is a utility static method, used internally, made public so you can handle kMIDITypes more easily.
-     */
-    static inline kMIDIType getTypeFromStatusByte(const byte inStatus) 
-    {
-        if ((inStatus < 0x80) 
-            || (inStatus == 0xF4) 
-            || (inStatus == 0xF5) 
-            || (inStatus == 0xF9) 
-            || (inStatus == 0xFD)) return InvalidType; // data bytes and undefined.
-        if (inStatus < 0xF0) return (kMIDIType)(inStatus & 0xF0);   // Channel message, remove channel nibble.
-        else return (kMIDIType)inStatus;
-    }
-    
-    
-#if USE_CALLBACKS
-    
-    void setHandleNoteOff(void (*fptr)(byte channel, byte note, byte velocity));
-    void setHandleNoteOn(void (*fptr)(byte channel, byte note, byte velocity));
-    void setHandleAfterTouchPoly(void (*fptr)(byte channel, byte note, byte pressure));
-    void setHandleControlChange(void (*fptr)(byte channel, byte number, byte value));
-    void setHandleProgramChange(void (*fptr)(byte channel, byte number));
-    void setHandleAfterTouchChannel(void (*fptr)(byte channel, byte pressure));
-    void setHandlePitchBend(void (*fptr)(byte channel, int bend));
-    void setHandleSystemExclusive(void (*fptr)(byte * array, byte size));
-    void setHandleTimeCodeQuarterFrame(void (*fptr)(byte data));
-    void setHandleSongPosition(void (*fptr)(unsigned int beats));
-    void setHandleSongSelect(void (*fptr)(byte songnumber));
-    void setHandleTuneRequest(void (*fptr)(void));
-    void setHandleClock(void (*fptr)(void));
-    void setHandleStart(void (*fptr)(void));
-    void setHandleContinue(void (*fptr)(void));
-    void setHandleStop(void (*fptr)(void));
-    void setHandleActiveSensing(void (*fptr)(void));
-    void setHandleSystemReset(void (*fptr)(void));
-    
-    void disconnectCallbackFromType(kMIDIType Type);
-    
-#endif // USE_CALLBACKS
-    
-    
-private:
-    
-    bool input_filter(byte inChannel);
-    bool parse(byte inChannel);
-    void reset_input_attributes();
-    
-    // Attributes
-    byte            mRunningStatus_RX;
-    byte            mInputChannel;
-    
-    byte            mPendingMessage[MIDI_SYSEX_ARRAY_SIZE];
-    unsigned int    mPendingMessageExpectedLenght;
-    unsigned int    mPendingMessageIndex;                   // Extended to unsigned int for larger sysex payloads.
-    
-    midimsg         mMessage;
-    
-#if USE_CALLBACKS
-    
-    void launchCallback();
-    
-    void (*mNoteOffCallback)(byte channel, byte note, byte velocity);
-    void (*mNoteOnCallback)(byte channel, byte note, byte velocity);
-    void (*mAfterTouchPolyCallback)(byte channel, byte note, byte velocity);
-    void (*mControlChangeCallback)(byte channel, byte, byte);
-    void (*mProgramChangeCallback)(byte channel, byte);
-    void (*mAfterTouchChannelCallback)(byte channel, byte);
-    void (*mPitchBendCallback)(byte channel, int);
-    void (*mSystemExclusiveCallback)(byte * array, byte size);
-    void (*mTimeCodeQuarterFrameCallback)(byte data);
-    void (*mSongPositionCallback)(unsigned int beats);
-    void (*mSongSelectCallback)(byte songnumber);
-    void (*mTuneRequestCallback)(void);
-    void (*mClockCallback)(void);
-    void (*mStartCallback)(void);
-    void (*mContinueCallback)(void);
-    void (*mStopCallback)(void);
-    void (*mActiveSensingCallback)(void);
-    void (*mSystemResetCallback)(void);
-    
-#endif // USE_CALLBACKS
-    
-    
-#endif // COMPILE_MIDI_IN
-    
-
-/* ####### THRU COMPILATION BLOCK ####### */
-#if (COMPILE_MIDI_IN && COMPILE_MIDI_OUT && COMPILE_MIDI_THRU) // Thru
-    
-public:
-    
-    // Getters
-    kThruFilterMode getFilterMode() const { return mThruFilterMode; }
-    bool getThruState() const { return mThruActivated; }
-    
-    
-    // Setters
-    void turnThruOn(kThruFilterMode inThruFilterMode = Full);
-    void turnThruOff();
-    
-    void setThruFilterMode(const kThruFilterMode inThruFilterMode);
-    
-    
-private:
-    
-    void thru_filter(byte inChannel);
-    
-    bool                mThruActivated;
-    kThruFilterMode     mThruFilterMode;
-    
-#endif // Thru
-    
-};
-
-#endif // LIB_MIDI_H_
+/*!
+ *  @file       MIDI.h
+ *  Project     MIDI Library
+ *  @brief      MIDI Library for the Arduino
+ *  Version     3.2
+ *  @author     Francois Best 
+ *  @date       24/02/11
+ *  License     GPL Forty Seven Effects - 2011
+ */
+/*
+ * Ported for mbed by Hiroshi Suga
+ *   Orignal: http://www.arduino.cc/playground/Main/MIDILibrary
+ */
+
+#ifndef LIB_MIDI_H_
+#define LIB_MIDI_H_
+
+#include "mbed.h"
+
+
+/*  
+    ###############################################################
+    #                                                             #
+    #    CONFIGURATION AREA                                       #
+    #                                                             #
+    #    Here are a few settings you can change to customize      #
+    #    the library for your own project. You can for example    #
+    #    choose to compile only parts of it so you gain flash     #
+    #    space and optimise the speed of your sketch.             #
+    #                                                             #
+    ###############################################################
+ */
+
+
+#define COMPILE_MIDI_IN         1           // Set this setting to 1 to use the MIDI input.
+#define COMPILE_MIDI_OUT        1           // Set this setting to 1 to use the MIDI output. 
+#define COMPILE_MIDI_THRU       0           // Set this setting to 1 to use the MIDI Soft Thru feature
+                                            // Please note that the Thru will work only when both COMPILE_MIDI_IN and COMPILE_MIDI_OUT set to 1.
+
+
+#define USE_SERIAL_PORT         _midi      // Change the number (to Serial1 for example) if you want
+                                            // to use a different serial port for MIDI I/O.
+
+
+#define USE_RUNNING_STATUS      1           // Running status enables short messages when sending multiple values
+                                            // of the same type and channel.
+                                            // Set to 0 if you have troubles with controlling you hardware.
+
+
+#define USE_CALLBACKS           1           // Set this to 1 if you want to use callback handlers (to bind your functions to the library).
+                                            // To use the callbacks, you need to have COMPILE_MIDI_IN set to 1
+
+#define USE_1BYTE_PARSING       1           // Each call to MIDI.read will only parse one byte (might be faster).
+
+
+// END OF CONFIGURATION AREA 
+// (do not modify anything under this line unless you know what you are doing)
+
+
+#define MIDI_BAUDRATE           31250
+
+#define MIDI_CHANNEL_OMNI       0
+#define MIDI_CHANNEL_OFF        17          // and over
+
+#define MIDI_SYSEX_ARRAY_SIZE   255         // Maximum size is 65535 bytes.
+
+/*! Type definition for practical use (because "unsigned char" is a bit long to write.. )*/
+typedef uint8_t byte;
+typedef uint16_t word;
+
+/*! Enumeration of MIDI types */
+enum kMIDIType {
+    NoteOff               = 0x80,   ///< Note Off
+    NoteOn                = 0x90,   ///< Note On
+    AfterTouchPoly        = 0xA0,   ///< Polyphonic AfterTouch
+    ControlChange         = 0xB0,   ///< Control Change / Channel Mode
+    ProgramChange         = 0xC0,   ///< Program Change
+    AfterTouchChannel     = 0xD0,   ///< Channel (monophonic) AfterTouch
+    PitchBend             = 0xE0,   ///< Pitch Bend
+    SystemExclusive       = 0xF0,   ///< System Exclusive
+    TimeCodeQuarterFrame  = 0xF1,   ///< System Common - MIDI Time Code Quarter Frame
+    SongPosition          = 0xF2,   ///< System Common - Song Position Pointer
+    SongSelect            = 0xF3,   ///< System Common - Song Select
+    TuneRequest           = 0xF6,   ///< System Common - Tune Request
+    Clock                 = 0xF8,   ///< System Real Time - Timing Clock
+    Start                 = 0xFA,   ///< System Real Time - Start
+    Continue              = 0xFB,   ///< System Real Time - Continue
+    Stop                  = 0xFC,   ///< System Real Time - Stop
+    ActiveSensing         = 0xFE,   ///< System Real Time - Active Sensing
+    SystemReset           = 0xFF,   ///< System Real Time - System Reset
+    InvalidType           = 0x00    ///< For notifying errors
+};
+
+/*! Enumeration of Thru filter modes */
+enum kThruFilterMode {
+    Off                   = 0,  ///< Thru disabled (nothing passes through).
+    Full                  = 1,  ///< Fully enabled Thru (every incoming message is sent back).
+    SameChannel           = 2,  ///< Only the messages on the Input Channel will be sent back.
+    DifferentChannel      = 3   ///< All the messages but the ones on the Input Channel will be sent back.
+};
+
+
+/*! The midimsg structure contains decoded data of a MIDI message read from the serial port with read() or thru(). \n */
+struct midimsg {
+    /*! The MIDI channel on which the message was recieved. \n Value goes from 1 to 16. */
+    byte channel; 
+    /*! The type of the message (see the define section for types reference) */
+    kMIDIType type;
+    /*! The first data byte.\n Value goes from 0 to 127.\n */
+    byte data1;
+    /*! The second data byte. If the message is only 2 bytes long, this one is null.\n Value goes from 0 to 127. */
+    byte data2;
+    /*! System Exclusive dedicated byte array. \n Array length is stocked on 16 bits, in data1 (LSB) and data2 (MSB) */
+    byte sysex_array[MIDI_SYSEX_ARRAY_SIZE];
+    /*! This boolean indicates if the message is valid or not. There is no channel consideration here, validity means the message respects the MIDI norm. */
+    bool valid;
+};
+
+
+
+
+/*! \brief The main class for MIDI handling.\n
+    See member descriptions to know how to use it,
+    or check out the examples supplied with the library.
+ */
+class MIDI {
+    
+    
+public:
+    // Constructor and Destructor
+    MIDI(PinName p_tx, PinName p_rx);
+    ~MIDI();
+    
+    
+    void begin(const byte inChannel = 1);
+    
+    
+    
+    
+/* ####### OUTPUT COMPILATION BLOCK ####### */  
+#if COMPILE_MIDI_OUT
+
+public: 
+    
+    void sendNoteOn(byte NoteNumber,byte Velocity,byte Channel);
+    void sendNoteOff(byte NoteNumber,byte Velocity,byte Channel);
+    void sendProgramChange(byte ProgramNumber,byte Channel);
+    void sendControlChange(byte ControlNumber, byte ControlValue,byte Channel);
+    void sendPitchBend(int PitchValue,byte Channel);
+    void sendPitchBend(unsigned int PitchValue,byte Channel);
+    void sendPitchBend(double PitchValue,byte Channel);
+    void sendPolyPressure(byte NoteNumber,byte Pressure,byte Channel);
+    void sendAfterTouch(byte Pressure,byte Channel);
+    void sendSysEx(int length, const byte *const array,bool ArrayContainsBoundaries = false);   
+    void sendTimeCodeQuarterFrame(byte TypeNibble, byte ValuesNibble);
+    void sendTimeCodeQuarterFrame(byte data);
+    void sendSongPosition(unsigned int Beats);
+    void sendSongSelect(byte SongNumber);
+    void sendTuneRequest();
+    void sendRealTime(kMIDIType Type);
+    
+    void send(kMIDIType type, byte param1, byte param2, byte channel);
+    
+private:
+    
+    Serial _midi;
+    byte genstatus(const kMIDIType inType,const byte inChannel) const;
+    
+    
+    // Attributes
+#if USE_RUNNING_STATUS
+    byte            mRunningStatus_TX;
+#endif // USE_RUNNING_STATUS
+
+#endif  // COMPILE_MIDI_OUT
+    
+
+    
+/* ####### INPUT COMPILATION BLOCK ####### */
+#if COMPILE_MIDI_IN 
+    
+public:
+    
+    bool read();
+    bool read(const byte Channel);
+    
+    // Getters
+    kMIDIType getType() const;
+    byte getChannel() const;
+    byte getData1() const;
+    byte getData2() const;
+    const byte * getSysExArray() const;
+    unsigned int getSysExArrayLength() const;
+    bool check() const;
+    
+    byte getInputChannel() const 
+    {
+        return mInputChannel;
+    }
+    
+    // Setters
+    void setInputChannel(const byte Channel);
+    
+    /*! \brief Extract an enumerated MIDI type from a status byte.
+     
+     This is a utility static method, used internally, made public so you can handle kMIDITypes more easily.
+     */
+    static inline kMIDIType getTypeFromStatusByte(const byte inStatus) 
+    {
+        if ((inStatus < 0x80) 
+            || (inStatus == 0xF4) 
+            || (inStatus == 0xF5) 
+            || (inStatus == 0xF9) 
+            || (inStatus == 0xFD)) return InvalidType; // data bytes and undefined.
+        if (inStatus < 0xF0) return (kMIDIType)(inStatus & 0xF0);   // Channel message, remove channel nibble.
+        else return (kMIDIType)inStatus;
+    }
+    
+    
+#if USE_CALLBACKS
+    
+    void setHandleNoteOff(void (*fptr)(byte channel, byte note, byte velocity));
+    void setHandleNoteOn(void (*fptr)(byte channel, byte note, byte velocity));
+    void setHandleAfterTouchPoly(void (*fptr)(byte channel, byte note, byte pressure));
+    void setHandleControlChange(void (*fptr)(byte channel, byte number, byte value));
+    void setHandleProgramChange(void (*fptr)(byte channel, byte number));
+    void setHandleAfterTouchChannel(void (*fptr)(byte channel, byte pressure));
+    void setHandlePitchBend(void (*fptr)(byte channel, int bend));
+    void setHandleSystemExclusive(void (*fptr)(byte * array, byte size));
+    void setHandleTimeCodeQuarterFrame(void (*fptr)(byte data));
+    void setHandleSongPosition(void (*fptr)(unsigned int beats));
+    void setHandleSongSelect(void (*fptr)(byte songnumber));
+    void setHandleTuneRequest(void (*fptr)(void));
+    void setHandleClock(void (*fptr)(void));
+    void setHandleStart(void (*fptr)(void));
+    void setHandleContinue(void (*fptr)(void));
+    void setHandleStop(void (*fptr)(void));
+    void setHandleActiveSensing(void (*fptr)(void));
+    void setHandleSystemReset(void (*fptr)(void));
+    
+    void disconnectCallbackFromType(kMIDIType Type);
+    
+#endif // USE_CALLBACKS
+    
+    
+private:
+    
+    bool input_filter(byte inChannel);
+    bool parse(byte inChannel);
+    void reset_input_attributes();
+    
+    // Attributes
+    byte            mRunningStatus_RX;
+    byte            mInputChannel;
+    
+    byte            mPendingMessage[MIDI_SYSEX_ARRAY_SIZE];
+    unsigned int    mPendingMessageExpectedLenght;
+    unsigned int    mPendingMessageIndex;                   // Extended to unsigned int for larger sysex payloads.
+    
+    midimsg         mMessage;
+    
+#if USE_CALLBACKS
+    
+    void launchCallback();
+    
+    void (*mNoteOffCallback)(byte channel, byte note, byte velocity);
+    void (*mNoteOnCallback)(byte channel, byte note, byte velocity);
+    void (*mAfterTouchPolyCallback)(byte channel, byte note, byte velocity);
+    void (*mControlChangeCallback)(byte channel, byte, byte);
+    void (*mProgramChangeCallback)(byte channel, byte);
+    void (*mAfterTouchChannelCallback)(byte channel, byte);
+    void (*mPitchBendCallback)(byte channel, int);
+    void (*mSystemExclusiveCallback)(byte * array, byte size);
+    void (*mTimeCodeQuarterFrameCallback)(byte data);
+    void (*mSongPositionCallback)(unsigned int beats);
+    void (*mSongSelectCallback)(byte songnumber);
+    void (*mTuneRequestCallback)(void);
+    void (*mClockCallback)(void);
+    void (*mStartCallback)(void);
+    void (*mContinueCallback)(void);
+    void (*mStopCallback)(void);
+    void (*mActiveSensingCallback)(void);
+    void (*mSystemResetCallback)(void);
+    
+#endif // USE_CALLBACKS
+    
+    
+#endif // COMPILE_MIDI_IN
+    
+
+/* ####### THRU COMPILATION BLOCK ####### */
+#if (COMPILE_MIDI_IN && COMPILE_MIDI_OUT && COMPILE_MIDI_THRU) // Thru
+    
+public:
+    
+    // Getters
+    kThruFilterMode getFilterMode() const { return mThruFilterMode; }
+    bool getThruState() const { return mThruActivated; }
+    
+    
+    // Setters
+    void turnThruOn(kThruFilterMode inThruFilterMode = Full);
+    void turnThruOff();
+    
+    void setThruFilterMode(const kThruFilterMode inThruFilterMode);
+    
+    
+private:
+    
+    void thru_filter(byte inChannel);
+    
+    bool                mThruActivated;
+    kThruFilterMode     mThruFilterMode;
+    
+#endif // Thru
+    
+};
+
+#endif // LIB_MIDI_H_