comparison DPF-Prymula-audioplugins/dpf/distrho/src/lv2/midi.h @ 3:84e66ea83026

DPF-Prymula-audioplugins-0.231015-2
author prymula <prymula76@outlook.com>
date Mon, 16 Oct 2023 21:53:34 +0200
parents
children
comparison
equal deleted inserted replaced
2:cf2cb71d31dd 3:84e66ea83026
1 /*
2 Copyright 2012-2016 David Robillard <http://drobilla.net>
3
4 Permission to use, copy, modify, and/or distribute this software for any
5 purpose with or without fee is hereby granted, provided that the above
6 copyright notice and this permission notice appear in all copies.
7
8 THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 /**
18 @defgroup midi MIDI
19
20 Definitions of standard MIDI messages, see <http://lv2plug.in/ns/ext/midi>
21 for details.
22
23 @{
24 */
25
26 #ifndef LV2_MIDI_H
27 #define LV2_MIDI_H
28
29 #include <stdint.h>
30
31 #ifdef __cplusplus
32 extern "C" {
33 #else
34 # include <stdbool.h>
35 #endif
36
37 #define LV2_MIDI_URI "http://lv2plug.in/ns/ext/midi" ///< http://lv2plug.in/ns/ext/midi
38 #define LV2_MIDI_PREFIX LV2_MIDI_URI "#" ///< http://lv2plug.in/ns/ext/midi#
39
40 #define LV2_MIDI__ActiveSense LV2_MIDI_PREFIX "ActiveSense" ///< http://lv2plug.in/ns/ext/midi#ActiveSense
41 #define LV2_MIDI__Aftertouch LV2_MIDI_PREFIX "Aftertouch" ///< http://lv2plug.in/ns/ext/midi#Aftertouch
42 #define LV2_MIDI__Bender LV2_MIDI_PREFIX "Bender" ///< http://lv2plug.in/ns/ext/midi#Bender
43 #define LV2_MIDI__ChannelPressure LV2_MIDI_PREFIX "ChannelPressure" ///< http://lv2plug.in/ns/ext/midi#ChannelPressure
44 #define LV2_MIDI__Chunk LV2_MIDI_PREFIX "Chunk" ///< http://lv2plug.in/ns/ext/midi#Chunk
45 #define LV2_MIDI__Clock LV2_MIDI_PREFIX "Clock" ///< http://lv2plug.in/ns/ext/midi#Clock
46 #define LV2_MIDI__Continue LV2_MIDI_PREFIX "Continue" ///< http://lv2plug.in/ns/ext/midi#Continue
47 #define LV2_MIDI__Controller LV2_MIDI_PREFIX "Controller" ///< http://lv2plug.in/ns/ext/midi#Controller
48 #define LV2_MIDI__MidiEvent LV2_MIDI_PREFIX "MidiEvent" ///< http://lv2plug.in/ns/ext/midi#MidiEvent
49 #define LV2_MIDI__NoteOff LV2_MIDI_PREFIX "NoteOff" ///< http://lv2plug.in/ns/ext/midi#NoteOff
50 #define LV2_MIDI__NoteOn LV2_MIDI_PREFIX "NoteOn" ///< http://lv2plug.in/ns/ext/midi#NoteOn
51 #define LV2_MIDI__ProgramChange LV2_MIDI_PREFIX "ProgramChange" ///< http://lv2plug.in/ns/ext/midi#ProgramChange
52 #define LV2_MIDI__QuarterFrame LV2_MIDI_PREFIX "QuarterFrame" ///< http://lv2plug.in/ns/ext/midi#QuarterFrame
53 #define LV2_MIDI__Reset LV2_MIDI_PREFIX "Reset" ///< http://lv2plug.in/ns/ext/midi#Reset
54 #define LV2_MIDI__SongPosition LV2_MIDI_PREFIX "SongPosition" ///< http://lv2plug.in/ns/ext/midi#SongPosition
55 #define LV2_MIDI__SongSelect LV2_MIDI_PREFIX "SongSelect" ///< http://lv2plug.in/ns/ext/midi#SongSelect
56 #define LV2_MIDI__Start LV2_MIDI_PREFIX "Start" ///< http://lv2plug.in/ns/ext/midi#Start
57 #define LV2_MIDI__Stop LV2_MIDI_PREFIX "Stop" ///< http://lv2plug.in/ns/ext/midi#Stop
58 #define LV2_MIDI__SystemCommon LV2_MIDI_PREFIX "SystemCommon" ///< http://lv2plug.in/ns/ext/midi#SystemCommon
59 #define LV2_MIDI__SystemExclusive LV2_MIDI_PREFIX "SystemExclusive" ///< http://lv2plug.in/ns/ext/midi#SystemExclusive
60 #define LV2_MIDI__SystemMessage LV2_MIDI_PREFIX "SystemMessage" ///< http://lv2plug.in/ns/ext/midi#SystemMessage
61 #define LV2_MIDI__SystemRealtime LV2_MIDI_PREFIX "SystemRealtime" ///< http://lv2plug.in/ns/ext/midi#SystemRealtime
62 #define LV2_MIDI__Tick LV2_MIDI_PREFIX "Tick" ///< http://lv2plug.in/ns/ext/midi#Tick
63 #define LV2_MIDI__TuneRequest LV2_MIDI_PREFIX "TuneRequest" ///< http://lv2plug.in/ns/ext/midi#TuneRequest
64 #define LV2_MIDI__VoiceMessage LV2_MIDI_PREFIX "VoiceMessage" ///< http://lv2plug.in/ns/ext/midi#VoiceMessage
65 #define LV2_MIDI__benderValue LV2_MIDI_PREFIX "benderValue" ///< http://lv2plug.in/ns/ext/midi#benderValue
66 #define LV2_MIDI__binding LV2_MIDI_PREFIX "binding" ///< http://lv2plug.in/ns/ext/midi#binding
67 #define LV2_MIDI__byteNumber LV2_MIDI_PREFIX "byteNumber" ///< http://lv2plug.in/ns/ext/midi#byteNumber
68 #define LV2_MIDI__channel LV2_MIDI_PREFIX "channel" ///< http://lv2plug.in/ns/ext/midi#channel
69 #define LV2_MIDI__chunk LV2_MIDI_PREFIX "chunk" ///< http://lv2plug.in/ns/ext/midi#chunk
70 #define LV2_MIDI__controllerNumber LV2_MIDI_PREFIX "controllerNumber" ///< http://lv2plug.in/ns/ext/midi#controllerNumber
71 #define LV2_MIDI__controllerValue LV2_MIDI_PREFIX "controllerValue" ///< http://lv2plug.in/ns/ext/midi#controllerValue
72 #define LV2_MIDI__noteNumber LV2_MIDI_PREFIX "noteNumber" ///< http://lv2plug.in/ns/ext/midi#noteNumber
73 #define LV2_MIDI__pressure LV2_MIDI_PREFIX "pressure" ///< http://lv2plug.in/ns/ext/midi#pressure
74 #define LV2_MIDI__programNumber LV2_MIDI_PREFIX "programNumber" ///< http://lv2plug.in/ns/ext/midi#programNumber
75 #define LV2_MIDI__property LV2_MIDI_PREFIX "property" ///< http://lv2plug.in/ns/ext/midi#property
76 #define LV2_MIDI__songNumber LV2_MIDI_PREFIX "songNumber" ///< http://lv2plug.in/ns/ext/midi#songNumber
77 #define LV2_MIDI__songPosition LV2_MIDI_PREFIX "songPosition" ///< http://lv2plug.in/ns/ext/midi#songPosition
78 #define LV2_MIDI__status LV2_MIDI_PREFIX "status" ///< http://lv2plug.in/ns/ext/midi#status
79 #define LV2_MIDI__statusMask LV2_MIDI_PREFIX "statusMask" ///< http://lv2plug.in/ns/ext/midi#statusMask
80 #define LV2_MIDI__velocity LV2_MIDI_PREFIX "velocity" ///< http://lv2plug.in/ns/ext/midi#velocity
81
82 /**
83 MIDI Message Type.
84
85 This includes both voice messages (which have a channel) and system messages
86 (which do not), as well as a sentinel value for invalid messages. To get
87 the type of a message suitable for use in a switch statement, use
88 lv2_midi_get_type() on the status byte.
89 */
90 typedef enum {
91 LV2_MIDI_MSG_INVALID = 0, /**< Invalid Message */
92 LV2_MIDI_MSG_NOTE_OFF = 0x80, /**< Note Off */
93 LV2_MIDI_MSG_NOTE_ON = 0x90, /**< Note On */
94 LV2_MIDI_MSG_NOTE_PRESSURE = 0xA0, /**< Note Pressure */
95 LV2_MIDI_MSG_CONTROLLER = 0xB0, /**< Controller */
96 LV2_MIDI_MSG_PGM_CHANGE = 0xC0, /**< Program Change */
97 LV2_MIDI_MSG_CHANNEL_PRESSURE = 0xD0, /**< Channel Pressure */
98 LV2_MIDI_MSG_BENDER = 0xE0, /**< Pitch Bender */
99 LV2_MIDI_MSG_SYSTEM_EXCLUSIVE = 0xF0, /**< System Exclusive Begin */
100 LV2_MIDI_MSG_MTC_QUARTER = 0xF1, /**< MTC Quarter Frame */
101 LV2_MIDI_MSG_SONG_POS = 0xF2, /**< Song Position */
102 LV2_MIDI_MSG_SONG_SELECT = 0xF3, /**< Song Select */
103 LV2_MIDI_MSG_TUNE_REQUEST = 0xF6, /**< Tune Request */
104 LV2_MIDI_MSG_CLOCK = 0xF8, /**< Clock */
105 LV2_MIDI_MSG_START = 0xFA, /**< Start */
106 LV2_MIDI_MSG_CONTINUE = 0xFB, /**< Continue */
107 LV2_MIDI_MSG_STOP = 0xFC, /**< Stop */
108 LV2_MIDI_MSG_ACTIVE_SENSE = 0xFE, /**< Active Sensing */
109 LV2_MIDI_MSG_RESET = 0xFF /**< Reset */
110 } LV2_Midi_Message_Type;
111
112 /**
113 Standard MIDI Controller Numbers.
114 */
115 typedef enum {
116 LV2_MIDI_CTL_MSB_BANK = 0x00, /**< Bank Selection */
117 LV2_MIDI_CTL_MSB_MODWHEEL = 0x01, /**< Modulation */
118 LV2_MIDI_CTL_MSB_BREATH = 0x02, /**< Breath */
119 LV2_MIDI_CTL_MSB_FOOT = 0x04, /**< Foot */
120 LV2_MIDI_CTL_MSB_PORTAMENTO_TIME = 0x05, /**< Portamento Time */
121 LV2_MIDI_CTL_MSB_DATA_ENTRY = 0x06, /**< Data Entry */
122 LV2_MIDI_CTL_MSB_MAIN_VOLUME = 0x07, /**< Main Volume */
123 LV2_MIDI_CTL_MSB_BALANCE = 0x08, /**< Balance */
124 LV2_MIDI_CTL_MSB_PAN = 0x0A, /**< Panpot */
125 LV2_MIDI_CTL_MSB_EXPRESSION = 0x0B, /**< Expression */
126 LV2_MIDI_CTL_MSB_EFFECT1 = 0x0C, /**< Effect1 */
127 LV2_MIDI_CTL_MSB_EFFECT2 = 0x0D, /**< Effect2 */
128 LV2_MIDI_CTL_MSB_GENERAL_PURPOSE1 = 0x10, /**< General Purpose 1 */
129 LV2_MIDI_CTL_MSB_GENERAL_PURPOSE2 = 0x11, /**< General Purpose 2 */
130 LV2_MIDI_CTL_MSB_GENERAL_PURPOSE3 = 0x12, /**< General Purpose 3 */
131 LV2_MIDI_CTL_MSB_GENERAL_PURPOSE4 = 0x13, /**< General Purpose 4 */
132 LV2_MIDI_CTL_LSB_BANK = 0x20, /**< Bank Selection */
133 LV2_MIDI_CTL_LSB_MODWHEEL = 0x21, /**< Modulation */
134 LV2_MIDI_CTL_LSB_BREATH = 0x22, /**< Breath */
135 LV2_MIDI_CTL_LSB_FOOT = 0x24, /**< Foot */
136 LV2_MIDI_CTL_LSB_PORTAMENTO_TIME = 0x25, /**< Portamento Time */
137 LV2_MIDI_CTL_LSB_DATA_ENTRY = 0x26, /**< Data Entry */
138 LV2_MIDI_CTL_LSB_MAIN_VOLUME = 0x27, /**< Main Volume */
139 LV2_MIDI_CTL_LSB_BALANCE = 0x28, /**< Balance */
140 LV2_MIDI_CTL_LSB_PAN = 0x2A, /**< Panpot */
141 LV2_MIDI_CTL_LSB_EXPRESSION = 0x2B, /**< Expression */
142 LV2_MIDI_CTL_LSB_EFFECT1 = 0x2C, /**< Effect1 */
143 LV2_MIDI_CTL_LSB_EFFECT2 = 0x2D, /**< Effect2 */
144 LV2_MIDI_CTL_LSB_GENERAL_PURPOSE1 = 0x30, /**< General Purpose 1 */
145 LV2_MIDI_CTL_LSB_GENERAL_PURPOSE2 = 0x31, /**< General Purpose 2 */
146 LV2_MIDI_CTL_LSB_GENERAL_PURPOSE3 = 0x32, /**< General Purpose 3 */
147 LV2_MIDI_CTL_LSB_GENERAL_PURPOSE4 = 0x33, /**< General Purpose 4 */
148 LV2_MIDI_CTL_SUSTAIN = 0x40, /**< Sustain Pedal */
149 LV2_MIDI_CTL_PORTAMENTO = 0x41, /**< Portamento */
150 LV2_MIDI_CTL_SOSTENUTO = 0x42, /**< Sostenuto */
151 LV2_MIDI_CTL_SOFT_PEDAL = 0x43, /**< Soft Pedal */
152 LV2_MIDI_CTL_LEGATO_FOOTSWITCH = 0x44, /**< Legato Foot Switch */
153 LV2_MIDI_CTL_HOLD2 = 0x45, /**< Hold2 */
154 LV2_MIDI_CTL_SC1_SOUND_VARIATION = 0x46, /**< SC1 Sound Variation */
155 LV2_MIDI_CTL_SC2_TIMBRE = 0x47, /**< SC2 Timbre */
156 LV2_MIDI_CTL_SC3_RELEASE_TIME = 0x48, /**< SC3 Release Time */
157 LV2_MIDI_CTL_SC4_ATTACK_TIME = 0x49, /**< SC4 Attack Time */
158 LV2_MIDI_CTL_SC5_BRIGHTNESS = 0x4A, /**< SC5 Brightness */
159 LV2_MIDI_CTL_SC6 = 0x4B, /**< SC6 */
160 LV2_MIDI_CTL_SC7 = 0x4C, /**< SC7 */
161 LV2_MIDI_CTL_SC8 = 0x4D, /**< SC8 */
162 LV2_MIDI_CTL_SC9 = 0x4E, /**< SC9 */
163 LV2_MIDI_CTL_SC10 = 0x4F, /**< SC10 */
164 LV2_MIDI_CTL_GENERAL_PURPOSE5 = 0x50, /**< General Purpose 5 */
165 LV2_MIDI_CTL_GENERAL_PURPOSE6 = 0x51, /**< General Purpose 6 */
166 LV2_MIDI_CTL_GENERAL_PURPOSE7 = 0x52, /**< General Purpose 7 */
167 LV2_MIDI_CTL_GENERAL_PURPOSE8 = 0x53, /**< General Purpose 8 */
168 LV2_MIDI_CTL_PORTAMENTO_CONTROL = 0x54, /**< Portamento Control */
169 LV2_MIDI_CTL_E1_REVERB_DEPTH = 0x5B, /**< E1 Reverb Depth */
170 LV2_MIDI_CTL_E2_TREMOLO_DEPTH = 0x5C, /**< E2 Tremolo Depth */
171 LV2_MIDI_CTL_E3_CHORUS_DEPTH = 0x5D, /**< E3 Chorus Depth */
172 LV2_MIDI_CTL_E4_DETUNE_DEPTH = 0x5E, /**< E4 Detune Depth */
173 LV2_MIDI_CTL_E5_PHASER_DEPTH = 0x5F, /**< E5 Phaser Depth */
174 LV2_MIDI_CTL_DATA_INCREMENT = 0x60, /**< Data Increment */
175 LV2_MIDI_CTL_DATA_DECREMENT = 0x61, /**< Data Decrement */
176 LV2_MIDI_CTL_NRPN_LSB = 0x62, /**< Non-registered Parameter Number */
177 LV2_MIDI_CTL_NRPN_MSB = 0x63, /**< Non-registered Parameter Number */
178 LV2_MIDI_CTL_RPN_LSB = 0x64, /**< Registered Parameter Number */
179 LV2_MIDI_CTL_RPN_MSB = 0x65, /**< Registered Parameter Number */
180 LV2_MIDI_CTL_ALL_SOUNDS_OFF = 0x78, /**< All Sounds Off */
181 LV2_MIDI_CTL_RESET_CONTROLLERS = 0x79, /**< Reset Controllers */
182 LV2_MIDI_CTL_LOCAL_CONTROL_SWITCH = 0x7A, /**< Local Control Switch */
183 LV2_MIDI_CTL_ALL_NOTES_OFF = 0x7B, /**< All Notes Off */
184 LV2_MIDI_CTL_OMNI_OFF = 0x7C, /**< Omni Off */
185 LV2_MIDI_CTL_OMNI_ON = 0x7D, /**< Omni On */
186 LV2_MIDI_CTL_MONO1 = 0x7E, /**< Mono1 */
187 LV2_MIDI_CTL_MONO2 = 0x7F /**< Mono2 */
188 } LV2_Midi_Controller;
189
190 /**
191 Return true iff `msg` is a MIDI voice message (which has a channel).
192 */
193 static inline bool
194 lv2_midi_is_voice_message(const uint8_t* msg) {
195 return msg[0] >= 0x80 && msg[0] < 0xF0;
196 }
197
198 /**
199 Return true iff `msg` is a MIDI system message (which has no channel).
200 */
201 static inline bool
202 lv2_midi_is_system_message(const uint8_t* msg) {
203 switch (msg[0]) {
204 case 0xF4: case 0xF5: case 0xF7: case 0xF9: case 0xFD:
205 return false;
206 default:
207 return (msg[0] & 0xF0) == 0xF0;
208 }
209 }
210
211 /**
212 Return the type of a MIDI message.
213 @param msg Pointer to the start (status byte) of a MIDI message.
214 */
215 static inline LV2_Midi_Message_Type
216 lv2_midi_message_type(const uint8_t* msg) {
217 if (lv2_midi_is_voice_message(msg)) {
218 return (LV2_Midi_Message_Type)(msg[0] & 0xF0);
219 } else if (lv2_midi_is_system_message(msg)) {
220 return (LV2_Midi_Message_Type)msg[0];
221 } else {
222 return LV2_MIDI_MSG_INVALID;
223 }
224 }
225
226 #ifdef __cplusplus
227 } /* extern "C" */
228 #endif
229
230 #endif /* LV2_MIDI_H */
231
232 /**
233 @}
234 */