message.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #pragma once
  2. #include <stdint.h>
  3. #include <stdbool.h>
  4. #include "config.h"
  5. typedef enum {
  6. NoteOff, /**< & */
  7. NoteOn, /**< & */
  8. PolyphonicKeyPressure, /**< & */
  9. ControlChange, /**< & */
  10. ProgramChange, /**< & */
  11. ChannelPressure, /**< & */
  12. PitchBend, /**< & */
  13. SystemCommon, /**< & */
  14. SystemRealTime, /**< & */
  15. ChannelMode, /**< & */
  16. MessageLast, /**< & */
  17. } MidiMessageType;
  18. typedef enum {
  19. SystemExclusive, /**< & */
  20. MTCQuarterFrame, /**< & */
  21. SongPositionPointer, /**< & */
  22. SongSelect, /**< & */
  23. SCUndefined0, /**< & */
  24. SCUndefined1, /**< & */
  25. TuneRequest, /**< & */
  26. SysExEnd, /**< & */
  27. SystemCommonLast, /**< & */
  28. } SystemCommonType;
  29. typedef enum {
  30. TimingClock, /**< & */
  31. SRTUndefined0, /**< & */
  32. Start, /**< & */
  33. Continue, /**< & */
  34. Stop, /**< & */
  35. SRTUndefined1, /**< & */
  36. ActiveSensing, /**< & */
  37. Reset, /**< & */
  38. SystemRealTimeLast, /**< & */
  39. } SystemRealTimeType;
  40. typedef enum {
  41. AllSoundOff, /**< & */
  42. ResetAllControllers, /**< & */
  43. LocalControl, /**< & */
  44. AllNotesOff, /**< & */
  45. OmniModeOff, /**< & */
  46. OmniModeOn, /**< & */
  47. MonoModeOn, /**< & */
  48. PolyModeOn, /**< & */
  49. ChannelModeLast, /**< & */
  50. } ChannelModeType;
  51. /** Struct containing note, and velocity data for a given channel.
  52. Can be made from MidiEvent
  53. */
  54. typedef struct {
  55. int channel; /**< & */
  56. uint8_t note; /**< & */
  57. uint8_t velocity; /**< & */
  58. } NoteOffEvent;
  59. /** Struct containing note, and velocity data for a given channel.
  60. Can be made from MidiEvent
  61. */
  62. typedef struct {
  63. int channel; /**< & */
  64. uint8_t note; /**< & */
  65. uint8_t velocity; /**< & */
  66. } NoteOnEvent;
  67. /** Struct containing note, and pressure data for a given channel.
  68. Can be made from MidiEvent
  69. */
  70. typedef struct {
  71. int channel;
  72. uint8_t note;
  73. uint8_t pressure;
  74. } PolyphonicKeyPressureEvent;
  75. /** Struct containing control number, and value for a given channel.
  76. Can be made from MidiEvent
  77. */
  78. typedef struct {
  79. int channel; /**< & */
  80. uint8_t control_number; /**< & */
  81. uint8_t value; /**< & */
  82. } ControlChangeEvent;
  83. /** Struct containing new program number, for a given channel.
  84. Can be made from MidiEvent
  85. */
  86. typedef struct {
  87. int channel; /**< & */
  88. uint8_t program; /**< & */
  89. } ProgramChangeEvent;
  90. /** Struct containing pressure (aftertouch), for a given channel.
  91. Can be made from MidiEvent
  92. */
  93. typedef struct {
  94. int channel; /**< & */
  95. uint8_t pressure; /**< & */
  96. } ChannelPressureEvent;
  97. /** Struct containing pitch bend value for a given channel.
  98. Can be made from MidiEvent
  99. */
  100. typedef struct {
  101. int channel; /**< & */
  102. int16_t value; /**< & */
  103. } PitchBendEvent;
  104. /** Struct containing sysex data.
  105. Can be made from MidiEvent
  106. */
  107. typedef struct {
  108. int length;
  109. uint8_t data[SYSEX_BUFFER_LEN]; /**< & */
  110. } SystemExclusiveEvent;
  111. /** Struct containing QuarterFrame data.
  112. Can be made from MidiEvent
  113. */
  114. typedef struct {
  115. uint8_t message_type; /**< & */
  116. uint8_t value; /**< & */
  117. } MTCQuarterFrameEvent;
  118. /** Struct containing song position data.
  119. Can be made from MidiEvent
  120. */
  121. typedef struct {
  122. uint16_t position; /**< & */
  123. } SongPositionPointerEvent;
  124. /** Struct containing song select data.
  125. Can be made from MidiEvent
  126. */
  127. typedef struct {
  128. uint8_t song; /**< & */
  129. } SongSelectEvent;
  130. /** Struct containing sound off data.
  131. Can be made from MidiEvent
  132. */
  133. typedef struct {
  134. int channel; /**< & */
  135. } AllSoundOffEvent;
  136. /** Struct containing ResetAllControllersEvent data.
  137. Can be made from MidiEvent
  138. */
  139. typedef struct {
  140. int channel; /**< & */
  141. uint8_t value; /**< & */
  142. } ResetAllControllersEvent;
  143. /** Struct containing LocalControlEvent data.
  144. Can be made from MidiEvent
  145. */
  146. typedef struct {
  147. int channel; /**< & */
  148. bool local_control_off; /**< & */
  149. bool local_control_on; /**< & */
  150. } LocalControlEvent;
  151. /** Struct containing AllNotesOffEvent data.
  152. Can be made from MidiEvent
  153. */
  154. typedef struct {
  155. int channel; /**< & */
  156. } AllNotesOffEvent;
  157. /** Struct containing OmniModeOffEvent data.
  158. * Can be made from MidiEvent
  159. */
  160. typedef struct {
  161. int channel; /**< & */
  162. } OmniModeOffEvent;
  163. /** Struct containing OmniModeOnEvent data.
  164. Can be made from MidiEvent
  165. */
  166. typedef struct {
  167. int channel; /**< & */
  168. } OmniModeOnEvent;
  169. /** Struct containing MonoModeOnEvent data.
  170. Can be made from MidiEvent
  171. */
  172. typedef struct {
  173. int channel; /**< & */
  174. uint8_t num_channels; /**< & */
  175. } MonoModeOnEvent;
  176. /** Struct containing PolyModeOnEvent data.
  177. Can be made from MidiEvent
  178. */
  179. typedef struct {
  180. int channel; /**< & */
  181. } PolyModeOnEvent;
  182. /** Simple MidiEvent with message type, channel, and data[2] members.
  183. */
  184. typedef struct {
  185. MidiMessageType type;
  186. int channel;
  187. uint8_t data[2];
  188. uint8_t sysex_data[SYSEX_BUFFER_LEN];
  189. uint8_t sysex_message_len;
  190. SystemCommonType sc_type;
  191. SystemRealTimeType srt_type;
  192. ChannelModeType cm_type;
  193. } MidiEvent;
  194. /** Returns the data within the MidiEvent as a NoteOffEvent struct */
  195. NoteOffEvent AsNoteOff(MidiEvent* event);
  196. /** Returns the data within the MidiEvent as a NoteOnEvent struct */
  197. NoteOnEvent AsNoteOn(MidiEvent* event);
  198. /** Returns the data within the MidiEvent as a PolyphonicKeyPressureEvent struct */
  199. PolyphonicKeyPressureEvent AsPolyphonicKeyPressure(MidiEvent* event);
  200. /** Returns the data within the MidiEvent as a ControlChangeEvent struct.*/
  201. ControlChangeEvent AsControlChange(MidiEvent* event);
  202. /** Returns the data within the MidiEvent as a ProgramChangeEvent struct.*/
  203. ProgramChangeEvent AsProgramChange(MidiEvent* event);
  204. /** Returns the data within the MidiEvent as a ProgramChangeEvent struct.*/
  205. ChannelPressureEvent AsChannelPressure(MidiEvent* event);
  206. /** Returns the data within the MidiEvent as a PitchBendEvent struct.*/
  207. PitchBendEvent AsPitchBend(MidiEvent* event);
  208. SystemExclusiveEvent AsSystemExclusive(MidiEvent* event);
  209. MTCQuarterFrameEvent AsMTCQuarterFrame(MidiEvent* event);
  210. SongPositionPointerEvent AsSongPositionPointer(MidiEvent* event);
  211. SongSelectEvent AsSongSelect(MidiEvent* event);
  212. AllSoundOffEvent AsAllSoundOff(MidiEvent* event);
  213. ResetAllControllersEvent AsResetAllControllers(MidiEvent* event);
  214. LocalControlEvent AsLocalControl(MidiEvent* event);
  215. AllNotesOffEvent AsAllNotesOff(MidiEvent* event);
  216. OmniModeOffEvent AsOmniModeOff(MidiEvent* event);
  217. OmniModeOnEvent AsOmniModeOn(MidiEvent* event);
  218. MonoModeOnEvent AsMonoModeOn(MidiEvent* event);
  219. PolyModeOnEvent AsPolyModeOn(MidiEvent* event);