123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- #pragma once
- #include <stdint.h>
- #include <vector>
- #include <ostream>
- namespace midi {
- class Message
- {
- public:
- virtual ~Message() throw ()
- {
- }
- static Message* parse(std::vector<unsigned char> &messageBytes);
- bool operator==(const Message& message) const;
- virtual std::vector<unsigned char> 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<unsigned char> 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<unsigned char> 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<unsigned char> 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<unsigned char> 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<unsigned char> getBytes() const;
- };
- } // namespace
|