Message.h 3.3 KB

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