Message.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #pragma once
  2. #include <stdint.h>
  3. #include <vector>
  4. namespace midi {
  5. class Message
  6. {
  7. public:
  8. virtual ~Message() throw ()
  9. {
  10. }
  11. static Message* parse(std::vector<unsigned char> &messageBytes);
  12. bool operator==(const Message& message) const;
  13. virtual std::vector<unsigned char> getBytes() const = 0;
  14. virtual void print(std::ostream& stream) const = 0;
  15. };
  16. std::ostream& operator<<(std::ostream& stream, const Message& message);
  17. class ChannelMessage : public Message
  18. {
  19. public:
  20. unsigned char channel;
  21. static const unsigned char channelMaximum = (2 << 4) - 1;
  22. ChannelMessage(unsigned char channel)
  23. : channel(channel)
  24. {
  25. }
  26. };
  27. class NoteMessage : public ChannelMessage
  28. {
  29. public:
  30. unsigned char pitch;
  31. static const unsigned char pitchMaximum = (1 << 7) - 1;
  32. unsigned char velocity;
  33. static const unsigned char velocityMaximum = (2 << 7) - 1;
  34. NoteMessage(unsigned char channel, unsigned char pitch, unsigned char velocity)
  35. : ChannelMessage(channel), pitch(pitch), velocity(velocity)
  36. {
  37. }
  38. };
  39. class NoteOnMessage : public NoteMessage
  40. {
  41. friend class Message;
  42. protected:
  43. static const unsigned char messageType = 0x9;
  44. public:
  45. NoteOnMessage(unsigned char channel, unsigned char pitch, unsigned char velocity)
  46. : NoteMessage(channel, pitch, velocity)
  47. {
  48. }
  49. virtual void print(std::ostream& stream) const;
  50. virtual std::vector<unsigned char> getBytes() const;
  51. };
  52. class NoteOffMessage : public NoteMessage
  53. {
  54. friend class Message;
  55. protected:
  56. static const unsigned char messageType = 0x8;
  57. public:
  58. NoteOffMessage(unsigned char channel, unsigned char pitch, unsigned char velocity)
  59. : NoteMessage(channel, pitch, velocity)
  60. {
  61. }
  62. virtual void print(std::ostream& stream) const;
  63. virtual std::vector<unsigned char> getBytes() const;
  64. };
  65. class ControlChangeMessage : public ChannelMessage
  66. {
  67. friend class Message;
  68. protected:
  69. static const unsigned char messageType = 0xB;
  70. public:
  71. unsigned char control;
  72. static const unsigned char controlMaximum = (2 << 7) - 1;
  73. unsigned char value;
  74. static const unsigned char valueMaximum = (2 << 7) - 1;
  75. ControlChangeMessage(unsigned char channel, unsigned char control, unsigned char value)
  76. : ChannelMessage(channel), control(control), value(value)
  77. {
  78. }
  79. virtual void print(std::ostream& stream) const;
  80. virtual std::vector<unsigned char> getBytes() const;
  81. };
  82. class ProgramChangeMessage : public ChannelMessage
  83. {
  84. friend class Message;
  85. protected:
  86. static const unsigned char messageType = 0xC;
  87. public:
  88. unsigned char program;
  89. static const unsigned char programMaximum = (2 << 7) - 1;
  90. ProgramChangeMessage(unsigned char channel, unsigned char program)
  91. : ChannelMessage(channel), program(program)
  92. {
  93. }
  94. virtual void print(std::ostream& stream) const;
  95. virtual std::vector<unsigned char> getBytes() const;
  96. };
  97. class PitchBendChangeMessage : public ChannelMessage
  98. {
  99. friend class Message;
  100. protected:
  101. static const unsigned char messageType = 0xE;
  102. public:
  103. // 14 bit integer
  104. uint16_t value;
  105. static const uint16_t valueMaximum = (2 << 14) - 1;
  106. PitchBendChangeMessage(unsigned char channel, uint16_t value)
  107. : ChannelMessage(channel), value(value)
  108. {
  109. }
  110. virtual void print(std::ostream& stream) const;
  111. virtual std::vector<unsigned char> getBytes() const;
  112. };
  113. } // namespace