#pragma once #include #include #include namespace midi { class Message { public: virtual ~Message() throw () { } static Message* parse(std::vector &messageBytes); bool operator==(const Message& message) const; virtual std::vector getBytes() const = 0; virtual void print(std::ostream& stream) const = 0; }; std::ostream& operator<<(std::ostream& stream, const Message& message); class ChannelMessage : public Message { public: typedef unsigned char Channel; Channel channel; static const Channel channelMaximum = (2 << 4) - 1; ChannelMessage(Channel channel) : channel(channel) { } }; class NoteMessage : public ChannelMessage { public: typedef unsigned char Pitch; typedef unsigned char Velocity; Pitch pitch; static const Pitch pitchMaximum = (1 << 7) - 1; Velocity velocity; static const Velocity velocityMaximum = (2 << 7) - 1; NoteMessage(Channel channel, Pitch pitch, Velocity velocity) : ChannelMessage(channel), pitch(pitch), velocity(velocity) { } }; class NoteOffMessage; class NoteOnMessage : public NoteMessage { friend class Message; protected: static const unsigned char messageType = 0x9; public: NoteOnMessage(Channel channel, Pitch pitch, Velocity velocity) : NoteMessage(channel, pitch, velocity) { } virtual void print(std::ostream& stream) const; virtual std::vector getBytes() const; NoteOffMessage toOffMessage(Velocity velocity = 0) const; }; class NoteOffMessage : public NoteMessage { friend class Message; protected: static const unsigned char messageType = 0x8; public: NoteOffMessage(Channel channel, Pitch pitch, Velocity velocity) : NoteMessage(channel, pitch, velocity) { } virtual void print(std::ostream& stream) const; virtual std::vector getBytes() const; }; class ControlChangeMessage : public ChannelMessage { friend class Message; protected: static const unsigned char messageType = 0xB; public: unsigned char control; static const unsigned char controlMaximum = (2 << 7) - 1; unsigned char value; static const unsigned char valueMaximum = (2 << 7) - 1; ControlChangeMessage(Channel channel, unsigned char control, unsigned char value) : ChannelMessage(channel), control(control), value(value) { } virtual void print(std::ostream& stream) const; virtual std::vector getBytes() const; }; class ProgramChangeMessage : public ChannelMessage { friend class Message; protected: static const unsigned char messageType = 0xC; public: unsigned char program; static const unsigned char programMaximum = (2 << 7) - 1; ProgramChangeMessage(Channel channel, unsigned char program) : ChannelMessage(channel), program(program) { } virtual void print(std::ostream& stream) const; virtual std::vector getBytes() const; }; class PitchBendChangeMessage : public ChannelMessage { friend class Message; protected: static const unsigned char messageType = 0xE; public: // 14 bit integer uint16_t value; static const uint16_t valueMaximum = (2 << 14) - 1; PitchBendChangeMessage(Channel channel, uint16_t value) : ChannelMessage(channel), value(value) { } virtual void print(std::ostream& stream) const; virtual std::vector getBytes() const; }; } // namespace