MidiMessage.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. static const unsigned char messageType = 0x9;
  37. public:
  38. NoteOnMessage(unsigned char channel, unsigned char pitch, unsigned char velocity)
  39. : NoteMessage(channel, pitch, velocity)
  40. {
  41. }
  42. virtual void print(std::ostream& stream) const;
  43. virtual std::vector<unsigned char> getBytes() const;
  44. };
  45. class NoteOffMessage : public NoteMessage
  46. {
  47. static const unsigned char messageType = 0x8;
  48. public:
  49. NoteOffMessage(unsigned char channel, unsigned char pitch, unsigned char velocity)
  50. : NoteMessage(channel, pitch, velocity)
  51. {
  52. }
  53. virtual void print(std::ostream& stream) const;
  54. virtual std::vector<unsigned char> getBytes() const;
  55. };
  56. class ControlChangeMessage : public ChannelMessage
  57. {
  58. static const unsigned char messageType = 0xB;
  59. public:
  60. unsigned char control;
  61. static const unsigned char controlMaximum = (2 << 7) - 1;
  62. unsigned char value;
  63. static const unsigned char valueMaximum = (2 << 7) - 1;
  64. ControlChangeMessage(unsigned char channel, unsigned char control, unsigned char value)
  65. : ChannelMessage(channel), control(control), value(value)
  66. {
  67. }
  68. virtual void print(std::ostream& stream) const;
  69. virtual std::vector<unsigned char> getBytes() const;
  70. };
  71. class ProgramChangeMessage : public ChannelMessage
  72. {
  73. static const unsigned char messageType = 0xC;
  74. public:
  75. unsigned char program;
  76. static const unsigned char programMaximum = (2 << 7) - 1;
  77. ProgramChangeMessage(unsigned char channel, unsigned char program)
  78. : ChannelMessage(channel), program(program)
  79. {
  80. }
  81. virtual void print(std::ostream& stream) const;
  82. virtual std::vector<unsigned char> getBytes() const;
  83. };
  84. class PitchBendChangeMessage : public ChannelMessage
  85. {
  86. static const unsigned char messageType = 0xE;
  87. public:
  88. // 14 bit integer
  89. uint16_t value;
  90. static const uint16_t valueMaximum = (2 << 14) - 1;
  91. PitchBendChangeMessage(unsigned char channel, uint16_t value)
  92. : ChannelMessage(channel), value(value)
  93. {
  94. }
  95. virtual void print(std::ostream& stream) const;
  96. virtual std::vector<unsigned char> getBytes() const;
  97. };