f@0: #pragma once f@0: f@0: #include "RtMidi.h" f@0: #include f@0: #include f@0: #include f@0: f@0: class Config; f@0: f@0: f@0: namespace collidoscope { f@0: f@0: f@0: class MIDIException : public std::exception f@0: { f@0: public: f@0: f@0: MIDIException( std::string message ) : mMessage( message ) {} f@0: f@0: virtual const std::string& getMessage( void ) const { return mMessage; } f@0: f@0: #ifdef _WINDOWS f@0: const char* what() const override { return mMessage.c_str(); } f@0: #else f@0: const char* what() const noexcept override { return mMessage.c_str(); } f@0: #endif f@0: f@0: protected: f@0: std::string mMessage; f@0: }; f@0: f@0: class MIDIMessage f@0: { f@0: friend class MIDI; f@0: public: f@0: f@0: enum class Voice { eNoteOn, eNoteOff, ePitchBend, eControlChange, eIgnore }; f@0: f@0: Voice getVoice() { return mVoice; } f@0: f@0: unsigned char getChannel() { return mChannel; } f@0: f@0: unsigned char getData_1() { return mData1; } f@0: f@0: unsigned char getData_2() { return mData2; } f@0: f@0: private: f@0: f@0: Voice mVoice = Voice::eIgnore; f@0: unsigned char mChannel; f@0: unsigned char mData1; f@0: unsigned char mData2; f@0: f@0: f@0: }; f@0: f@0: f@0: class MIDI f@0: { f@0: f@0: public: f@0: f@0: MIDI(); f@0: ~MIDI(); f@0: f@0: void setup( const Config& ); f@0: f@0: void checkMessages( std::vector< MIDIMessage >& ); f@0: f@0: private: f@0: f@0: static void RtMidiInCallback( double deltatime, std::vector *message, void *userData ); f@0: f@0: MIDIMessage parseRtMidiMessage( std::vector *message ); f@0: f@0: // messages to pass to checkMessages caller f@0: std::vector< MIDIMessage > mMIDIMessages; f@0: std::array< MIDIMessage, NUM_WAVES > mPitchBendMessages; f@0: std::array< MIDIMessage, NUM_WAVES > mFilterMessages; f@0: f@0: f@0: f@0: std::vector< std::unique_ptr > mInputs; f@0: std::mutex mMutex; f@0: }; f@0: f@0: f@0: f@0: } // collidsocope }