Răsfoiți Sursa

added class MidiOut and method getBytes() to message classes

Fabian Peter Hammerle 11 ani în urmă
părinte
comite
41555c3f67
4 a modificat fișierele cu 81 adăugiri și 5 ștergeri
  1. 9 2
      Midi.cpp
  2. 9 3
      Midi.h
  3. 46 0
      MidiMessage.cpp
  4. 17 0
      MidiMessage.h

+ 9 - 2
Midi.cpp

@@ -1,6 +1,7 @@
 #include "Midi.h"
+#include <vector>
 
-void MidiIn :: setCallback( MidiIn::MidiMessageInCallback callback, void *userData )
+void MidiIn::setCallback( MidiIn::MidiMessageInCallback callback, void *userData )
 {
 	userCallback = callback;
     userCallbackData = userData;
@@ -8,7 +9,7 @@ void MidiIn :: setCallback( MidiIn::MidiMessageInCallback callback, void *userDa
 	RtMidiIn::setCallback( rtmidiCallback, (void*) this );
 }
 
-void MidiIn :: rtmidiCallback( double timeStamp, std::vector<unsigned char> *messageBytes, void *callbackData )
+void MidiIn::rtmidiCallback( double timeStamp, std::vector<unsigned char> *messageBytes, void *callbackData )
 {
 	MidiIn *midiin = (MidiIn*) callbackData;
 
@@ -16,3 +17,9 @@ void MidiIn :: rtmidiCallback( double timeStamp, std::vector<unsigned char> *mes
 	midiin->userCallback( timeStamp, *message, midiin->userCallbackData );
 	delete message;
 }
+
+void MidiOut::sendMessage(MidiMessage& message)
+{
+	std::vector<unsigned char> bytes = message.getBytes();
+	RtMidiOut::sendMessage(&bytes);
+}

+ 9 - 3
Midi.h

@@ -11,9 +11,15 @@ public:
 	void setCallback( MidiMessageInCallback callback, void *userData = 0 );
 
 protected:
-	static void rtmidiCallback( double timeStamp, std::vector<unsigned char> *message, void *midiin );
-
-private:
 	MidiMessageInCallback userCallback;
     void *userCallbackData;
+	
+private:
+	static void rtmidiCallback( double timeStamp, std::vector<unsigned char> *message, void *midiin );
+};
+
+class MidiOut : public RtMidiOut
+{
+public:
+	void sendMessage(MidiMessage& message);
 };

+ 46 - 0
MidiMessage.cpp

@@ -54,6 +54,52 @@ MidiMessage* MidiMessage::parseMessage(std::vector<unsigned char> &messageBytes)
 	}
 }
 
+std::vector<unsigned char> NoteOnMessage::getBytes() const
+{
+	std::vector<unsigned char> bytes(3);
+	bytes[0] = messageType << 4 | channel;
+	bytes[1] = pitch;
+	bytes[2] = velocity;
+	return bytes;
+}
+
+std::vector<unsigned char> NoteOffMessage::getBytes() const
+{
+	std::vector<unsigned char> bytes(3);
+	bytes[0] = messageType << 4 | channel;
+	bytes[1] = pitch;
+	bytes[2] = velocity;
+	return bytes;
+}
+
+std::vector<unsigned char> ControlChangeMessage::getBytes() const
+{
+	std::vector<unsigned char> bytes(3);
+	bytes[0] = messageType << 4 | channel;
+	bytes[1] = control;
+	bytes[2] = value;
+	return bytes;
+}
+
+std::vector<unsigned char> ProgramChangeMessage::getBytes() const
+{
+	std::vector<unsigned char> bytes(2);
+	bytes[0] = messageType << 4 | channel;
+	bytes[1] = program;
+	return bytes;
+}
+
+std::vector<unsigned char> PitchBendChangeMessage::getBytes() const
+{
+	std::vector<unsigned char> bytes(3);
+	bytes[0] = messageType << 4 | channel;
+	// bytes[1] are the seven least significant bits. 
+	// bytes[2] are the seven most significant bits.
+	bytes[1] = value & (1 << 7 - 1);
+	bytes[2] = value >> 7;
+	return bytes;
+}
+
 std::ostream& operator<<(std::ostream& stream, const MidiMessage& message)
 {
 	message.print(stream);

+ 17 - 0
MidiMessage.h

@@ -1,11 +1,13 @@
 #pragma once
 #include <cstdint>
+#include <vector>
 
 class MidiMessage
 {
 public:
 	static MidiMessage* parseMessage(std::vector<unsigned char> &messageBytes);
 
+	virtual std::vector<unsigned char> getBytes() const = 0;
 	virtual void print(std::ostream& stream) const = 0;
 };
 
@@ -39,6 +41,8 @@ public:
 
 class NoteOnMessage : public NoteMessage
 {
+	static const unsigned char messageType = 0x9;
+
 public:
 	NoteOnMessage(unsigned char channel, unsigned char pitch, unsigned char velocity)
 		: NoteMessage(channel, pitch, velocity)
@@ -46,10 +50,13 @@ public:
 	}
 
 	virtual void print(std::ostream& stream) const;
+	virtual std::vector<unsigned char> getBytes() const;
 };
 
 class NoteOffMessage : public NoteMessage
 {
+	static const unsigned char messageType = 0x8;
+
 public:
 	NoteOffMessage(unsigned char channel, unsigned char pitch, unsigned char velocity)
 		: NoteMessage(channel, pitch, velocity)
@@ -57,10 +64,13 @@ public:
 	}
 
 	virtual void print(std::ostream& stream) const;
+	virtual std::vector<unsigned char> getBytes() const;
 };
 
 class ControlChangeMessage : public ChannelMessage
 {
+	static const unsigned char messageType = 0xB;
+
 public:
 	unsigned char control;
 	static const unsigned char controlMaximum = (2 << 7) - 1;
@@ -73,10 +83,13 @@ public:
 	}
 	
 	virtual void print(std::ostream& stream) const;
+	virtual std::vector<unsigned char> getBytes() const;
 };
 
 class ProgramChangeMessage : public ChannelMessage
 {
+	static const unsigned char messageType = 0xC;
+
 public:
 	unsigned char program;
 	static const unsigned char programMaximum = (2 << 7) - 1;
@@ -87,10 +100,13 @@ public:
 	}
 	
 	virtual void print(std::ostream& stream) const;
+	virtual std::vector<unsigned char> getBytes() const;
 };
 
 class PitchBendChangeMessage : public ChannelMessage
 {
+	static const unsigned char messageType = 0xE;
+
 public:
 	// 14 bit integer
 	uint16_t value;
@@ -102,4 +118,5 @@ public:
 	}
 	
 	virtual void print(std::ostream& stream) const;
+	virtual std::vector<unsigned char> getBytes() const;
 };