Sfoglia il codice sorgente

receive key strokes from launchpad

Fabian Peter Hammerle 11 anni fa
parent
commit
49901ee403
4 ha cambiato i file con 106 aggiunte e 2 eliminazioni
  1. 70 0
      Launchpad.cpp
  2. 26 0
      Launchpad.h
  3. 3 1
      msw/rtmidilib.vcxproj
  4. 7 1
      msw/rtmidilib.vcxproj.filters

+ 70 - 0
Launchpad.cpp

@@ -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);
+	}
+}

+ 26 - 0
Launchpad.h

@@ -0,0 +1,26 @@
+#pragma once
+#include "Midi.h"
+#include <utility>
+
+class Launchpad
+{
+public:
+	typedef void (*KeyEventCallback)(unsigned char x, unsigned char y);
+
+protected:
+	MidiIn midiin;
+	MidiOut midiout;
+
+public:
+	KeyEventCallback keyPressedCallback;
+	KeyEventCallback keyReleasedCallback;
+
+	Launchpad();
+
+protected:
+	void keyPressed(unsigned char x, unsigned char y);
+	void keyReleased(unsigned char x, unsigned char y);
+
+private:
+	static void midiMessageCallback(double timeStamp, MidiMessage &message, void *launchpad);
+};

+ 3 - 1
msw/rtmidilib.vcxproj

@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
@@ -73,11 +73,13 @@
     <ClCompile Include="..\Midi.cpp" />
     <ClCompile Include="..\MidiMessage.cpp" />
     <ClCompile Include="..\RtMidi.cpp" />
+    <ClCompile Include="..\Launchpad.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\Midi.h" />
     <ClInclude Include="..\MidiMessage.h" />
     <ClInclude Include="..\RtMidi.h" />
+    <ClInclude Include="..\Launchpad.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

+ 7 - 1
msw/rtmidilib.vcxproj.filters

@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <Filter Include="Source Files">
@@ -24,6 +24,9 @@
     <ClCompile Include="..\Midi.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\Launchpad.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\RtMidi.h">
@@ -35,5 +38,8 @@
     <ClInclude Include="..\MidiMessage.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\Launchpad.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>