Message.h 3.2 KB

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