aliasing for callbacks (and default initializers

This commit is contained in:
lathoub 2020-03-18 06:55:45 +01:00
parent bc4e940701
commit c09c8e8148
3 changed files with 95 additions and 110 deletions

View File

@ -168,49 +168,49 @@ public:
public: public:
inline void setHandleMessage(void (*fptr)(const MidiMessage&)); inline void setHandleMessage(void (*fptr)(const MidiMessage&));
inline void setHandleNoteOff(void (*fptr)(Channel channel, byte note, byte velocity)); inline void setHandleNoteOff(NoteOffCallback fptr) { mNoteOffCallback = fptr; }
inline void setHandleNoteOn(void (*fptr)(Channel channel, byte note, byte velocity)); inline void setHandleNoteOn(NoteOnCallback fptr) { mNoteOnCallback = fptr; }
inline void setHandleAfterTouchPoly(void (*fptr)(Channel channel, byte note, byte pressure)); inline void setHandleAfterTouchPoly(AfterTouchPolyCallback fptr) { mAfterTouchPolyCallback = fptr; }
inline void setHandleControlChange(void (*fptr)(Channel channel, byte number, byte value)); inline void setHandleControlChange(ControlChangeCallback fptr) { mControlChangeCallback = fptr; }
inline void setHandleProgramChange(void (*fptr)(Channel channel, byte number)); inline void setHandleProgramChange(ProgramChangeCallback fptr) { mProgramChangeCallback = fptr; }
inline void setHandleAfterTouchChannel(void (*fptr)(Channel channel, byte pressure)); inline void setHandleAfterTouchChannel(AfterTouchChannelCallback fptr) { mAfterTouchChannelCallback = fptr; }
inline void setHandlePitchBend(void (*fptr)(Channel channel, int bend)); inline void setHandlePitchBend(PitchBendCallback fptr) { mPitchBendCallback = fptr; }
inline void setHandleSystemExclusive(void (*fptr)(byte * array, unsigned size)); inline void setHandleSystemExclusive(SystemExclusiveCallback fptr) { mSystemExclusiveCallback = fptr; }
inline void setHandleTimeCodeQuarterFrame(void (*fptr)(byte data)); inline void setHandleTimeCodeQuarterFrame(TimeCodeQuarterFrameCallback fptr) { mTimeCodeQuarterFrameCallback = fptr; }
inline void setHandleSongPosition(void (*fptr)(unsigned beats)); inline void setHandleSongPosition(SongPositionCallback fptr) { mSongPositionCallback = fptr; }
inline void setHandleSongSelect(void (*fptr)(byte songnumber)); inline void setHandleSongSelect(SongSelectCallback fptr) { mSongSelectCallback = fptr; }
inline void setHandleTuneRequest(void (*fptr)(void)); inline void setHandleTuneRequest(TuneRequestCallback fptr) { mTuneRequestCallback = fptr; }
inline void setHandleClock(void (*fptr)(void)); inline void setHandleClock(ClockCallback fptr) { mClockCallback = fptr; }
inline void setHandleStart(void (*fptr)(void)); inline void setHandleStart(StartCallback fptr) { mStartCallback = fptr; }
inline void setHandleContinue(void (*fptr)(void)); inline void setHandleContinue(ContinueCallback fptr) { mContinueCallback = fptr; }
inline void setHandleStop(void (*fptr)(void)); inline void setHandleStop(StopCallback fptr) { mStopCallback = fptr; }
inline void setHandleActiveSensing(void (*fptr)(void)); inline void setHandleActiveSensing(ActiveSensingCallback fptr) { mActiveSensingCallback = fptr; }
inline void setHandleSystemReset(void (*fptr)(void)); inline void setHandleSystemReset(SystemResetCallback fptr) { mSystemResetCallback = fptr; }
inline void disconnectCallbackFromType(MidiType inType); inline void disconnectCallbackFromType(MidiType inType);
private: private:
void launchCallback(); void launchCallback();
void (*mMessageCallback)(const MidiMessage& message); void (*mMessageCallback)(const MidiMessage& message) = nullptr;
void (*mNoteOffCallback)(Channel channel, byte note, byte velocity); NoteOffCallback mNoteOffCallback = nullptr;
void (*mNoteOnCallback)(Channel channel, byte note, byte velocity); NoteOnCallback mNoteOnCallback = nullptr;
void (*mAfterTouchPolyCallback)(Channel channel, byte note, byte velocity); AfterTouchPolyCallback mAfterTouchPolyCallback = nullptr;
void (*mControlChangeCallback)(Channel channel, byte, byte); ControlChangeCallback mControlChangeCallback = nullptr;
void (*mProgramChangeCallback)(Channel channel, byte); ProgramChangeCallback mProgramChangeCallback = nullptr;
void (*mAfterTouchChannelCallback)(Channel channel, byte); AfterTouchChannelCallback mAfterTouchChannelCallback = nullptr;
void (*mPitchBendCallback)(Channel channel, int); PitchBendCallback mPitchBendCallback = nullptr;
void (*mSystemExclusiveCallback)(byte * array, unsigned size); SystemExclusiveCallback mSystemExclusiveCallback = nullptr;
void (*mTimeCodeQuarterFrameCallback)(byte data); TimeCodeQuarterFrameCallback mTimeCodeQuarterFrameCallback = nullptr;
void (*mSongPositionCallback)(unsigned beats); SongPositionCallback mSongPositionCallback = nullptr;
void (*mSongSelectCallback)(byte songnumber); SongSelectCallback mSongSelectCallback = nullptr;
void (*mTuneRequestCallback)(void); TuneRequestCallback mTuneRequestCallback = nullptr;
void (*mClockCallback)(void); ClockCallback mClockCallback = nullptr;
void (*mStartCallback)(void); StartCallback mStartCallback = nullptr;
void (*mContinueCallback)(void); ContinueCallback mContinueCallback = nullptr;
void (*mStopCallback)(void); StopCallback mStopCallback = nullptr;
void (*mActiveSensingCallback)(void); ActiveSensingCallback mActiveSensingCallback = nullptr;
void (*mSystemResetCallback)(void); SystemResetCallback mSystemResetCallback = nullptr;
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// MIDI Soft Thru // MIDI Soft Thru

View File

@ -45,25 +45,6 @@ inline MidiInterface<Transport, Settings, Platform>::MidiInterface(Transport& in
, mThruActivated(false) , mThruActivated(false)
, mThruFilterMode(Thru::Full) , mThruFilterMode(Thru::Full)
{ {
mMessageCallback = 0;
mNoteOffCallback = 0;
mNoteOnCallback = 0;
mAfterTouchPolyCallback = 0;
mControlChangeCallback = 0;
mProgramChangeCallback = 0;
mAfterTouchChannelCallback = 0;
mPitchBendCallback = 0;
mSystemExclusiveCallback = 0;
mTimeCodeQuarterFrameCallback = 0;
mSongPositionCallback = 0;
mSongSelectCallback = 0;
mTuneRequestCallback = 0;
mClockCallback = 0;
mStartCallback = 0;
mContinueCallback = 0;
mStopCallback = 0;
mActiveSensingCallback = 0;
mSystemResetCallback = 0;
} }
/*! \brief Destructor for MidiInterface. /*! \brief Destructor for MidiInterface.
@ -1200,24 +1181,6 @@ bool MidiInterface<Transport, Settings, Platform>::isChannelMessage(MidiType inT
*/ */
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleMessage(void (*fptr)(const MidiMessage&)) { mMessageCallback = fptr; } template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleMessage(void (*fptr)(const 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; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleControlChange(void (*fptr)(byte channel, byte number, byte value)) { mControlChangeCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleProgramChange(void (*fptr)(byte channel, byte number)) { mProgramChangeCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleAfterTouchChannel(void (*fptr)(byte channel, byte pressure)) { mAfterTouchChannelCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandlePitchBend(void (*fptr)(byte channel, int bend)) { mPitchBendCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleSystemExclusive(void (*fptr)(byte* array, unsigned size)) { mSystemExclusiveCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleTimeCodeQuarterFrame(void (*fptr)(byte data)) { mTimeCodeQuarterFrameCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleSongPosition(void (*fptr)(unsigned beats)) { mSongPositionCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleSongSelect(void (*fptr)(byte songnumber)) { mSongSelectCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleTuneRequest(void (*fptr)(void)) { mTuneRequestCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleClock(void (*fptr)(void)) { mClockCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleStart(void (*fptr)(void)) { mStartCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleContinue(void (*fptr)(void)) { mContinueCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleStop(void (*fptr)(void)) { mStopCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleActiveSensing(void (*fptr)(void)) { mActiveSensingCallback = fptr; }
template<class Transport, class Settings, class Platform> void MidiInterface<Transport, Settings, Platform>::setHandleSystemReset(void (*fptr)(void)) { mSystemResetCallback = fptr; }
/*! \brief Detach an external function from the given type. /*! \brief Detach an external function from the given type.
@ -1230,24 +1193,24 @@ void MidiInterface<Transport, Settings, Platform>::disconnectCallbackFromType(Mi
{ {
switch (inType) switch (inType)
{ {
case NoteOff: mNoteOffCallback = 0; break; case NoteOff: mNoteOffCallback = nullptr; break;
case NoteOn: mNoteOnCallback = 0; break; case NoteOn: mNoteOnCallback = nullptr; break;
case AfterTouchPoly: mAfterTouchPolyCallback = 0; break; case AfterTouchPoly: mAfterTouchPolyCallback = nullptr; break;
case ControlChange: mControlChangeCallback = 0; break; case ControlChange: mControlChangeCallback = nullptr; break;
case ProgramChange: mProgramChangeCallback = 0; break; case ProgramChange: mProgramChangeCallback = nullptr; break;
case AfterTouchChannel: mAfterTouchChannelCallback = 0; break; case AfterTouchChannel: mAfterTouchChannelCallback = nullptr; break;
case PitchBend: mPitchBendCallback = 0; break; case PitchBend: mPitchBendCallback = nullptr; break;
case SystemExclusive: mSystemExclusiveCallback = 0; break; case SystemExclusive: mSystemExclusiveCallback = nullptr; break;
case TimeCodeQuarterFrame: mTimeCodeQuarterFrameCallback = 0; break; case TimeCodeQuarterFrame: mTimeCodeQuarterFrameCallback = nullptr; break;
case SongPosition: mSongPositionCallback = 0; break; case SongPosition: mSongPositionCallback = nullptr; break;
case SongSelect: mSongSelectCallback = 0; break; case SongSelect: mSongSelectCallback = nullptr; break;
case TuneRequest: mTuneRequestCallback = 0; break; case TuneRequest: mTuneRequestCallback = nullptr; break;
case Clock: mClockCallback = 0; break; case Clock: mClockCallback = nullptr; break;
case Start: mStartCallback = 0; break; case Start: mStartCallback = nullptr; break;
case Continue: mContinueCallback = 0; break; case Continue: mContinueCallback = nullptr; break;
case Stop: mStopCallback = 0; break; case Stop: mStopCallback = nullptr; break;
case ActiveSensing: mActiveSensingCallback = 0; break; case ActiveSensing: mActiveSensingCallback = nullptr; break;
case SystemReset: mSystemResetCallback = 0; break; case SystemReset: mSystemResetCallback = nullptr; break;
default: default:
break; break;
} }
@ -1265,32 +1228,32 @@ void MidiInterface<Transport, Settings, Platform>::launchCallback()
switch (mMessage.type) switch (mMessage.type)
{ {
// Notes // Notes
case NoteOff: if (mNoteOffCallback != 0) mNoteOffCallback(mMessage.channel, mMessage.data1, mMessage.data2); break; case NoteOff: if (mNoteOffCallback != nullptr) mNoteOffCallback(mMessage.channel, mMessage.data1, mMessage.data2); break;
case NoteOn: if (mNoteOnCallback != 0) mNoteOnCallback(mMessage.channel, mMessage.data1, mMessage.data2); break; case NoteOn: if (mNoteOnCallback != nullptr) mNoteOnCallback(mMessage.channel, mMessage.data1, mMessage.data2); break;
// Real-time messages // Real-time messages
case Clock: if (mClockCallback != 0) mClockCallback(); break; case Clock: if (mClockCallback != nullptr) mClockCallback(); break;
case Start: if (mStartCallback != 0) mStartCallback(); break; case Start: if (mStartCallback != nullptr) mStartCallback(); break;
case Continue: if (mContinueCallback != 0) mContinueCallback(); break; case Continue: if (mContinueCallback != nullptr) mContinueCallback(); break;
case Stop: if (mStopCallback != 0) mStopCallback(); break; case Stop: if (mStopCallback != nullptr) mStopCallback(); break;
case ActiveSensing: if (mActiveSensingCallback != 0) mActiveSensingCallback(); break; case ActiveSensing: if (mActiveSensingCallback != nullptr) mActiveSensingCallback(); break;
// Continuous controllers // Continuous controllers
case ControlChange: if (mControlChangeCallback != 0) mControlChangeCallback(mMessage.channel, mMessage.data1, mMessage.data2); break; case ControlChange: if (mControlChangeCallback != nullptr) mControlChangeCallback(mMessage.channel, mMessage.data1, mMessage.data2); break;
case PitchBend: if (mPitchBendCallback != 0) mPitchBendCallback(mMessage.channel, (int)((mMessage.data1 & 0x7f) | ((mMessage.data2 & 0x7f) << 7)) + MIDI_PITCHBEND_MIN); break; case PitchBend: if (mPitchBendCallback != nullptr) mPitchBendCallback(mMessage.channel, (int)((mMessage.data1 & 0x7f) | ((mMessage.data2 & 0x7f) << 7)) + MIDI_PITCHBEND_MIN); break;
case AfterTouchPoly: if (mAfterTouchPolyCallback != 0) mAfterTouchPolyCallback(mMessage.channel, mMessage.data1, mMessage.data2); break; case AfterTouchPoly: if (mAfterTouchPolyCallback != nullptr) mAfterTouchPolyCallback(mMessage.channel, mMessage.data1, mMessage.data2); break;
case AfterTouchChannel: if (mAfterTouchChannelCallback != 0) mAfterTouchChannelCallback(mMessage.channel, mMessage.data1); break; case AfterTouchChannel: if (mAfterTouchChannelCallback != nullptr) mAfterTouchChannelCallback(mMessage.channel, mMessage.data1); break;
case ProgramChange: if (mProgramChangeCallback != 0) mProgramChangeCallback(mMessage.channel, mMessage.data1); break; case ProgramChange: if (mProgramChangeCallback != nullptr) mProgramChangeCallback(mMessage.channel, mMessage.data1); break;
case SystemExclusive: if (mSystemExclusiveCallback != 0) mSystemExclusiveCallback(mMessage.sysexArray, mMessage.getSysExSize()); break; case SystemExclusive: if (mSystemExclusiveCallback != nullptr) mSystemExclusiveCallback(mMessage.sysexArray, mMessage.getSysExSize()); break;
// Occasional messages // Occasional messages
case TimeCodeQuarterFrame: if (mTimeCodeQuarterFrameCallback != 0) mTimeCodeQuarterFrameCallback(mMessage.data1); break; case TimeCodeQuarterFrame: if (mTimeCodeQuarterFrameCallback != nullptr) mTimeCodeQuarterFrameCallback(mMessage.data1); break;
case SongPosition: if (mSongPositionCallback != 0) mSongPositionCallback(unsigned((mMessage.data1 & 0x7f) | ((mMessage.data2 & 0x7f) << 7))); break; case SongPosition: if (mSongPositionCallback != nullptr) mSongPositionCallback(unsigned((mMessage.data1 & 0x7f) | ((mMessage.data2 & 0x7f) << 7))); break;
case SongSelect: if (mSongSelectCallback != 0) mSongSelectCallback(mMessage.data1); break; case SongSelect: if (mSongSelectCallback != nullptr) mSongSelectCallback(mMessage.data1); break;
case TuneRequest: if (mTuneRequestCallback != 0) mTuneRequestCallback(); break; case TuneRequest: if (mTuneRequestCallback != nullptr) mTuneRequestCallback(); break;
case SystemReset: if (mSystemResetCallback != 0) mSystemResetCallback(); break; case SystemReset: if (mSystemResetCallback != nullptr) mSystemResetCallback(); break;
case InvalidType: case InvalidType:
default: default:

View File

@ -59,6 +59,28 @@ typedef byte DataByte;
typedef byte Channel; typedef byte Channel;
typedef byte FilterMode; typedef byte FilterMode;
// -----------------------------------------------------------------------------
// Aliasing
using NoteOffCallback = void (*)(Channel channel, byte note, byte velocity);
using NoteOnCallback = void (*)(Channel channel, byte note, byte velocity);
using AfterTouchPolyCallback = void (*)(Channel channel, byte note, byte velocity);
using ControlChangeCallback = void (*)(Channel channel, byte, byte);
using ProgramChangeCallback = void (*)(Channel channel, byte);
using AfterTouchChannelCallback = void (*)(Channel channel, byte);
using PitchBendCallback = void (*)(Channel channel, int);
using SystemExclusiveCallback = void (*)(byte * array, unsigned size);
using TimeCodeQuarterFrameCallback = void (*)(byte data);
using SongPositionCallback = void (*)(unsigned beats);
using SongSelectCallback = void (*)(byte songnumber);
using TuneRequestCallback = void (*)(void);
using ClockCallback = void (*)(void);
using StartCallback = void (*)(void);
using ContinueCallback = void (*)(void);
using StopCallback = void (*)(void);
using ActiveSensingCallback = void (*)(void);
using SystemResetCallback = void (*)(void);
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
/*! Enumeration of MIDI types */ /*! Enumeration of MIDI types */