#pragma once #include "Input.h" #include "Output.h" #include "LaunchpadColor.h" #include #include namespace midi { class Launchpad { public: typedef unsigned char KeyCoordinate; typedef void (*KeyEventCallback)(unsigned char x, unsigned char y, void* data); static const unsigned char width = 9; static const unsigned char height = 9; private: LaunchpadColor colors[width][height]; bool colorSet[width][height]; std::atomic keyBeingPressed[width][height]; protected: Input midiin; Output midiout; public: KeyEventCallback keyPressedCallback; KeyEventCallback keyReleasedCallback; void* keyEventCallbackData; Launchpad(); bool issetColor(unsigned char x, unsigned char y) const; const LaunchpadColor& getColor(unsigned char x, unsigned char y) const; void setColor(unsigned char x, unsigned char y, const LaunchpadColor& color); void setColorAll(const LaunchpadColor& color); bool getKeyPressed(KeyCoordinate x, KeyCoordinate y); protected: void keyPressed(unsigned char x, unsigned char y); void keyReleased(unsigned char x, unsigned char y); private: static void midiMessageCallback(double timeStamp, Message &message, void *launchpad); void setKeyPressed(KeyCoordinate x, KeyCoordinate y, bool pressed); }; class LaunchpadNotFoundError : public std::runtime_error { typedef std::runtime_error parent; public: LaunchpadNotFoundError(const char* message); }; };