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