Message.h 3.1 KB

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