MidiMessage.h 2.3 KB

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