1 /*
2 * MIDIEvents.cpp
3 * --------------
4 * Purpose: MIDI event handling, event lists, ...
5 * Notes : (currently none)
6 * Authors: OpenMPT Devs
7 * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
8 */
9
10
11 #include "stdafx.h"
12 #include "MIDIEvents.h"
13
14 OPENMPT_NAMESPACE_BEGIN
15
16 namespace MIDIEvents
17 {
18
19 // Build a generic MIDI event
Event(EventType eventType,uint8 midiChannel,uint8 dataByte1,uint8 dataByte2)20 uint32 Event(EventType eventType, uint8 midiChannel, uint8 dataByte1, uint8 dataByte2)
21 {
22 return (eventType << 4) | (midiChannel & 0x0F) | (dataByte1 << 8) | (dataByte2 << 16);
23 }
24
25
26 // Build a MIDI CC event
CC(MidiCC midiCC,uint8 midiChannel,uint8 param)27 uint32 CC(MidiCC midiCC, uint8 midiChannel, uint8 param)
28 {
29 return Event(evControllerChange, midiChannel, static_cast<uint8>(midiCC), param);
30 }
31
32
33 // Build a MIDI Pitchbend event
PitchBend(uint8 midiChannel,uint16 bendAmount)34 uint32 PitchBend(uint8 midiChannel, uint16 bendAmount)
35 {
36 return Event(evPitchBend, midiChannel, static_cast<uint8>(bendAmount & 0x7F), static_cast<uint8>(bendAmount >> 7));
37 }
38
39
40 // Build a MIDI Program Change event
ProgramChange(uint8 midiChannel,uint8 program)41 uint32 ProgramChange(uint8 midiChannel, uint8 program)
42 {
43 return Event(evProgramChange, midiChannel, program, 0);
44 }
45
46
47 // Build a MIDI Note Off event
NoteOff(uint8 midiChannel,uint8 note,uint8 velocity)48 uint32 NoteOff(uint8 midiChannel, uint8 note, uint8 velocity)
49 {
50 return Event(evNoteOff, midiChannel, note, velocity);
51 }
52
53
54 // Build a MIDI Note On event
NoteOn(uint8 midiChannel,uint8 note,uint8 velocity)55 uint32 NoteOn(uint8 midiChannel, uint8 note, uint8 velocity)
56 {
57 return Event(evNoteOn, midiChannel, note, velocity);
58 }
59
60
61 // Build a MIDI System Event
System(SystemEvent eventType)62 uint8 System(SystemEvent eventType)
63 {
64 return static_cast<uint8>((evSystem << 4) | eventType);
65 }
66
67
68 // Get MIDI channel from a MIDI event
GetChannelFromEvent(uint32 midiMsg)69 uint8 GetChannelFromEvent(uint32 midiMsg)
70 {
71 return static_cast<uint8>((midiMsg & 0xF));
72 }
73
74
75 // Get MIDI Event type from a MIDI event
GetTypeFromEvent(uint32 midiMsg)76 EventType GetTypeFromEvent(uint32 midiMsg)
77 {
78 return static_cast<EventType>(((midiMsg >> 4) & 0xF));
79 }
80
81
82 // Get first data byte from a MIDI event
GetDataByte1FromEvent(uint32 midiMsg)83 uint8 GetDataByte1FromEvent(uint32 midiMsg)
84 {
85 return static_cast<uint8>(((midiMsg >> 8) & 0xFF));
86 }
87
88
89 // Get second data byte from a MIDI event
GetDataByte2FromEvent(uint32 midiMsg)90 uint8 GetDataByte2FromEvent(uint32 midiMsg)
91 {
92 return static_cast<uint8>(((midiMsg >> 16) & 0xFF));
93 }
94
95
96 // Get the length of a MIDI event in bytes
GetEventLength(uint8 firstByte)97 uint8 GetEventLength(uint8 firstByte)
98 {
99 uint8 msgSize = 3;
100 switch(firstByte & 0xF0)
101 {
102 case 0xC0:
103 case 0xD0:
104 msgSize = 2;
105 break;
106 case 0xF0:
107 switch(firstByte)
108 {
109 case 0xF1:
110 case 0xF3:
111 msgSize = 2;
112 break;
113 case 0xF2:
114 msgSize = 3;
115 break;
116 default:
117 msgSize = 1;
118 break;
119 }
120 break;
121 }
122 return msgSize;
123 }
124
125
126 // MIDI CC Names
127 const char* const MidiCCNames[MIDICC_end + 1] =
128 {
129 "BankSelect [Coarse]", //0
130 "ModulationWheel [Coarse]", //1
131 "Breathcontroller [Coarse]", //2
132 "", //3
133 "FootPedal [Coarse]", //4
134 "PortamentoTime [Coarse]", //5
135 "DataEntry [Coarse]", //6
136 "Volume [Coarse]", //7
137 "Balance [Coarse]", //8
138 "", //9
139 "Panposition [Coarse]", //10
140 "Expression [Coarse]", //11
141 "EffectControl1 [Coarse]", //12
142 "EffectControl2 [Coarse]", //13
143 "", //14
144 "", //15
145 "GeneralPurposeSlider1", //16
146 "GeneralPurposeSlider2", //17
147 "GeneralPurposeSlider3", //18
148 "GeneralPurposeSlider4", //19
149 "", //20
150 "", //21
151 "", //22
152 "", //23
153 "", //24
154 "", //25
155 "", //26
156 "", //27
157 "", //28
158 "", //29
159 "", //30
160 "", //31
161 "BankSelect [Fine]", //32
162 "ModulationWheel [Fine]", //33
163 "Breathcontroller [Fine]", //34
164 "", //35
165 "FootPedal [Fine]", //36
166 "PortamentoTime [Fine]", //37
167 "DataEntry [Fine]", //38
168 "Volume [Fine]", //39
169 "Balance [Fine]", //40
170 "", //41
171 "Panposition [Fine]", //42
172 "Expression [Fine]", //43
173 "EffectControl1 [Fine]", //44
174 "EffectControl2 [Fine]", //45
175 "", //46
176 "", //47
177 "", //48
178 "", //49
179 "", //50
180 "", //51
181 "", //52
182 "", //53
183 "", //54
184 "", //55
185 "", //56
186 "", //57
187 "", //58
188 "", //59
189 "", //60
190 "", //61
191 "", //62
192 "", //63
193 "HoldPedal [OnOff]", //64
194 "Portamento [OnOff]", //65
195 "SustenutoPedal [OnOff]", //66
196 "SoftPedal [OnOff]", //67
197 "LegatoPedal [OnOff]", //68
198 "Hold2Pedal [OnOff]", //69
199 "SoundVariation", //70
200 "SoundTimbre", //71
201 "SoundReleaseTime", //72
202 "SoundAttackTime", //73
203 "SoundBrightness", //74
204 "SoundControl6", //75
205 "SoundControl7", //76
206 "SoundControl8", //77
207 "SoundControl9", //78
208 "SoundControl10", //79
209 "GeneralPurposeButton1 [OnOff]",//80
210 "GeneralPurposeButton2 [OnOff]",//81
211 "GeneralPurposeButton3 [OnOff]",//82
212 "GeneralPurposeButton4 [OnOff]",//83
213 "", //84
214 "", //85
215 "", //86
216 "", //87
217 "", //88
218 "", //89
219 "", //90
220 "EffectsLevel", //91
221 "TremoloLevel", //92
222 "ChorusLevel", //93
223 "CelesteLevel", //94
224 "PhaserLevel", //95
225 "DataButtonIncrement", //96
226 "DataButtonDecrement", //97
227 "NonRegisteredParameter [Fine]",//98
228 "NonRegisteredParameter [Coarse]",//99
229 "RegisteredParameter [Fine]", //100
230 "RegisteredParameter [Coarse]", //101
231 "", //102
232 "", //103
233 "", //104
234 "", //105
235 "", //106
236 "", //107
237 "", //108
238 "", //109
239 "", //110
240 "", //111
241 "", //112
242 "", //113
243 "", //114
244 "", //115
245 "", //116
246 "", //117
247 "", //118
248 "", //119
249 "AllSoundOff", //120
250 "AllControllersOff", //121
251 "LocalKeyboard [OnOff]", //122
252 "AllNotesOff", //123
253 "OmniModeOff", //124
254 "OmniModeOn", //125
255 "MonoOperation", //126
256 "PolyOperation", //127
257 };
258
259
260 } // End namespace
261
262
263 OPENMPT_NAMESPACE_END
264