|
@@ -0,0 +1,70 @@
|
|
|
+#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 <iostream>
|
|
|
+
|
|
|
+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<NoteMessage*>(&message);
|
|
|
+ if(noteMessage)
|
|
|
+ {
|
|
|
+ unsigned char x = noteMessage->pitch % 16;
|
|
|
+ unsigned char y = 7 - noteMessage->pitch / 16;
|
|
|
+
|
|
|
+ if(dynamic_cast<NoteOnMessage*>(noteMessage))
|
|
|
+ {
|
|
|
+ launchpad->keyPressed(x, y);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ launchpad->keyReleased(x, y);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ControlChangeMessage *controlChangeMessage = dynamic_cast<ControlChangeMessage*>(&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);
|
|
|
+ }
|
|
|
+}
|