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