MidiMessage.h 3.1 KB

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