added callback for Message
before the specific callback are called, a generic mMessage callback can be fired to inform the user that 'a' message has been received.
This commit is contained in:
		
							parent
							
								
									7bb64074e1
								
							
						
					
					
						commit
						8905d36c0e
					
				|  | @ -24,6 +24,11 @@ void handleNoteOff(byte channel, byte pitch, byte velocity) | |||
|     // Note that NoteOn messages with 0 velocity are interpreted as NoteOffs.
 | ||||
| } | ||||
| 
 | ||||
| void handleMessage(__mismt::MidiMessage message) | ||||
| { | ||||
|     // Do something when the message.
 | ||||
| } | ||||
| 
 | ||||
| // -----------------------------------------------------------------------------
 | ||||
| 
 | ||||
| void setup() | ||||
|  | @ -35,6 +40,8 @@ void setup() | |||
|     // Do the same for NoteOffs
 | ||||
|     MIDI.setHandleNoteOff(handleNoteOff); | ||||
| 
 | ||||
|     MIDI.setHandleMessage(handleMessage); | ||||
| 
 | ||||
|     // Initiate MIDI communications, listen to all channels
 | ||||
|     MIDI.begin(MIDI_CHANNEL_OMNI); | ||||
| } | ||||
|  |  | |||
|  | @ -50,6 +50,7 @@ class MidiInterface | |||
| public: | ||||
|     typedef _Settings Settings; | ||||
|     typedef _Platform Platform; | ||||
|     typedef Message<Settings::SysExMaxSize> MidiMessage; | ||||
| 
 | ||||
| public: | ||||
|     inline  MidiInterface(Transport&); | ||||
|  | @ -164,6 +165,7 @@ public: | |||
|     // Input Callbacks
 | ||||
| 
 | ||||
| public: | ||||
|     inline void setHandleMessage(void (*fptr)(MidiMessage)); | ||||
|     inline void setHandleNoteOff(void (*fptr)(byte channel, byte note, byte velocity)); | ||||
|     inline void setHandleNoteOn(void (*fptr)(byte channel, byte note, byte velocity)); | ||||
|     inline void setHandleAfterTouchPoly(void (*fptr)(byte channel, byte note, byte pressure)); | ||||
|  | @ -188,6 +190,7 @@ public: | |||
| private: | ||||
|     void launchCallback(); | ||||
| 
 | ||||
|     void (*mMessageCallback)(MidiMessage message); | ||||
|     void (*mNoteOffCallback)(byte channel, byte note, byte velocity); | ||||
|     void (*mNoteOnCallback)(byte channel, byte note, byte velocity); | ||||
|     void (*mAfterTouchPolyCallback)(byte channel, byte note, byte velocity); | ||||
|  | @ -227,8 +230,6 @@ private: | |||
|     inline bool inputFilter(Channel inChannel); | ||||
|     inline void resetInput(); | ||||
| 
 | ||||
| private: | ||||
|     typedef Message<Settings::SysExMaxSize> MidiMessage; | ||||
| 
 | ||||
| private: | ||||
|     Transport& mTransport; | ||||
|  |  | |||
							
								
								
									
										34
									
								
								src/MIDI.hpp
								
								
								
								
							
							
						
						
									
										34
									
								
								src/MIDI.hpp
								
								
								
								
							|  | @ -45,6 +45,7 @@ inline MidiInterface<Transport, Settings, Platform>::MidiInterface(Transport& in | |||
|     , mThruActivated(false) | ||||
|     , mThruFilterMode(Thru::Full) | ||||
| { | ||||
|     mMessageCallback                = 0; | ||||
|     mNoteOffCallback                = 0; | ||||
|     mNoteOnCallback                 = 0; | ||||
|     mAfterTouchPolyCallback         = 0; | ||||
|  | @ -706,10 +707,7 @@ template<class Transport, class Settings, class Platform> | |||
| bool MidiInterface<Transport, Settings, Platform>::parse() | ||||
| { | ||||
|     if (mTransport.available() == 0) | ||||
|     { | ||||
|         // No data available.
 | ||||
|         return false; | ||||
|     } | ||||
|         return false; // No data available.
 | ||||
| 
 | ||||
|     // Parsing algorithm:
 | ||||
|     // Get a byte from the serial buffer.
 | ||||
|  | @ -724,19 +722,7 @@ bool MidiInterface<Transport, Settings, Platform>::parse() | |||
| 
 | ||||
|     // Ignore Undefined
 | ||||
|     if (extracted == 0xf9 || extracted == 0xfd) | ||||
|     { | ||||
|         return (Settings::Use1ByteParsing) ? false : parse(); | ||||
| /*
 | ||||
|         if (Settings::Use1ByteParsing) | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return parse(); | ||||
|         } | ||||
|  */ | ||||
|     } | ||||
| 
 | ||||
|     if (mPendingMessageIndex == 0) | ||||
|     { | ||||
|  | @ -978,20 +964,7 @@ bool MidiInterface<Transport, Settings, Platform>::parse() | |||
|             // Then update the index of the pending message.
 | ||||
|             mPendingMessageIndex++; | ||||
| 
 | ||||
|              | ||||
|             return (Settings::Use1ByteParsing) ? false : parse(); | ||||
|              | ||||
|  /*           if (Settings::Use1ByteParsing)
 | ||||
|             { | ||||
|                 // Message is not complete.
 | ||||
|                 return false; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 // Call the parser recursively to parse the rest of the message.
 | ||||
|                 return parse(); | ||||
|             } | ||||
|   */ | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -1178,6 +1151,7 @@ bool MidiInterface<Transport, Settings, Platform>::isChannelMessage(MidiType inT | |||
|  @{ | ||||
|  */ | ||||
| 
 | ||||
| template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleMessage(void (*fptr)(MidiMessage))                                     { mMessageCallback              = fptr; } | ||||
| template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleNoteOff(void (*fptr)(byte channel, byte note, byte velocity))          { mNoteOffCallback              = fptr; } | ||||
| template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleNoteOn(void (*fptr)(byte channel, byte note, byte velocity))           { mNoteOnCallback               = fptr; } | ||||
| template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleAfterTouchPoly(void (*fptr)(byte channel, byte note, byte pressure))   { mAfterTouchPolyCallback       = fptr; } | ||||
|  | @ -1237,6 +1211,8 @@ void MidiInterface<Transport, Settings, Platform>::disconnectCallbackFromType(Mi | |||
| template<class Transport, class Settings, class Platform> | ||||
| void MidiInterface<Transport, Settings, Platform>::launchCallback() | ||||
| { | ||||
|     if (mMessageCallback != 0) mMessageCallback(mMessage); | ||||
|                                                                | ||||
|     // The order is mixed to allow frequent messages to trigger their callback faster.
 | ||||
|     switch (mMessage.type) | ||||
|     { | ||||
|  |  | |||
|  | @ -52,9 +52,10 @@ private: | |||
|  Then call midi2.begin(), midi2.read() etc.. | ||||
|  */ | ||||
| #define MIDI_CREATE_INSTANCE(Type, SerialPort, Name)  \ | ||||
|     typedef MIDI_NAMESPACE::serialMIDI<Type> __amt;\ | ||||
|     __amt serialMidi(SerialPort);\ | ||||
|     MIDI_NAMESPACE::MidiInterface<__amt> Name((__amt&)serialMidi); | ||||
|     typedef MIDI_NAMESPACE::serialMIDI<Type> __smt;\ | ||||
|     typedef MIDI_NAMESPACE::MidiInterface<__smt> __mismt;\ | ||||
|     __smt serialMidi(SerialPort);\ | ||||
|     __mismt Name((__smt&)serialMidi); | ||||
| 
 | ||||
| #if defined(ARDUINO_SAM_DUE) || defined(USBCON) || defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MKL26Z64__) | ||||
|     // Leonardo, Due and other USB boards use Serial1 by default.
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 lathoub
						lathoub