Message.h 3.2 KB

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