#include "Launchpad.h" #include "MidiMessage.h" Launchpad::Launchpad() : midiin(), midiout(), keyPressedCallback(0), keyReleasedCallback(0) { midiin.setCallback(midiMessageCallback, (void*) this); midiout.openPort(1); midiin.openPort(0); } #include void Launchpad::midiMessageCallback(double timeStamp, MidiMessage &message, void *userData) { Launchpad *launchpad = (Launchpad*) userData; // use runtime type information to check for the message type. // this requires the specified class to have a virtual member. NoteMessage *noteMessage = dynamic_cast(&message); if(noteMessage) { unsigned char x = noteMessage->pitch % 16; unsigned char y = 7 - noteMessage->pitch / 16; if(dynamic_cast(noteMessage)) { launchpad->keyPressed(x, y); } else { launchpad->keyReleased(x, y); } } else { ControlChangeMessage *controlChangeMessage = dynamic_cast(&message); if(controlChangeMessage) { unsigned char x = controlChangeMessage->control - 104; unsigned char y = 8; if(controlChangeMessage->value == 127) { launchpad->keyPressed(x, y); } else { launchpad->keyReleased(x, y); } } } } void Launchpad::keyPressed(unsigned char x, unsigned char y) { if(keyPressedCallback) { keyPressedCallback(x, y); } } void Launchpad::keyReleased(unsigned char x, unsigned char y) { if(keyReleasedCallback) { keyReleasedCallback(x, y); } }