1 | /** |
2 | * Copyright (c) 2006-2023 LOVE Development Team |
3 | * |
4 | * This software is provided 'as-is', without any express or implied |
5 | * warranty. In no event will the authors be held liable for any damages |
6 | * arising from the use of this software. |
7 | * |
8 | * Permission is granted to anyone to use this software for any purpose, |
9 | * including commercial applications, and to alter it and redistribute it |
10 | * freely, subject to the following restrictions: |
11 | * |
12 | * 1. The origin of this software must not be misrepresented; you must not |
13 | * claim that you wrote the original software. If you use this software |
14 | * in a product, an acknowledgment in the product documentation would be |
15 | * appreciated but is not required. |
16 | * 2. Altered source versions must be plainly marked as such, and must not be |
17 | * misrepresented as being the original software. |
18 | * 3. This notice may not be removed or altered from any source distribution. |
19 | **/ |
20 | |
21 | #include "Effect.h" |
22 | |
23 | namespace love |
24 | { |
25 | namespace audio |
26 | { |
27 | |
28 | Effect::Effect() |
29 | { |
30 | } |
31 | |
32 | Effect::~Effect() |
33 | { |
34 | } |
35 | |
36 | Effect::Type Effect::getType() const |
37 | { |
38 | return type; |
39 | } |
40 | |
41 | bool Effect::getConstant(const char *in, Type &out) |
42 | { |
43 | return types.find(in, out); |
44 | } |
45 | |
46 | bool Effect::getConstant(Type in, const char *&out) |
47 | { |
48 | return types.find(in, out); |
49 | } |
50 | |
51 | std::vector<std::string> Effect::getConstants(Type) |
52 | { |
53 | return types.getNames(); |
54 | } |
55 | |
56 | /* |
57 | bool Effect::getConstant(const char *in, Phoneme &out) |
58 | { |
59 | return phonemes.find(in, out); |
60 | } |
61 | |
62 | bool Effect::getConstant(Phoneme in, const char *&out) |
63 | { |
64 | return phonemes.find(in, out); |
65 | } |
66 | */ |
67 | bool Effect::getConstant(const char *in, Waveform &out) |
68 | { |
69 | return waveforms.find(in, out); |
70 | } |
71 | |
72 | bool Effect::getConstant(Waveform in, const char *&out) |
73 | { |
74 | return waveforms.find(in, out); |
75 | } |
76 | /* |
77 | bool Effect::getConstant(const char *in, Direction &out) |
78 | { |
79 | return directions.find(in, out); |
80 | } |
81 | |
82 | bool Effect::getConstant(Direction in, const char *&out) |
83 | { |
84 | return directions.find(in, out); |
85 | } |
86 | */ |
87 | bool Effect::getConstant(const char *in, Parameter &out, Type t) |
88 | { |
89 | return parameterNames[t].find(in, out); |
90 | } |
91 | |
92 | bool Effect::getConstant(Parameter in, const char *&out, Type t) |
93 | { |
94 | return parameterNames[t].find(in, out); |
95 | } |
96 | |
97 | Effect::ParameterType Effect::getParameterType(Effect::Parameter in) |
98 | { |
99 | return parameterTypes[in]; |
100 | } |
101 | |
102 | StringMap<Effect::Type, Effect::TYPE_MAX_ENUM>::Entry Effect::typeEntries[] = |
103 | { |
104 | {"reverb" , Effect::TYPE_REVERB}, |
105 | {"chorus" , Effect::TYPE_CHORUS}, |
106 | {"distortion" , Effect::TYPE_DISTORTION}, |
107 | {"echo" , Effect::TYPE_ECHO}, |
108 | {"flanger" , Effect::TYPE_FLANGER}, |
109 | //{"frequencyshifter", Effect::TYPE_FREQSHIFTER}, |
110 | //{"vocalmorpher", Effect::TYPE_MORPHER}, |
111 | //{"pitchshifter", Effect::TYPE_PITCHSHIFTER}, |
112 | {"ringmodulator" , Effect::TYPE_MODULATOR}, |
113 | //{"autowah", Effect::TYPE_AUTOWAH}, |
114 | {"compressor" , Effect::TYPE_COMPRESSOR}, |
115 | {"equalizer" , Effect::TYPE_EQUALIZER}, |
116 | }; |
117 | |
118 | StringMap<Effect::Type, Effect::TYPE_MAX_ENUM> Effect::types(Effect::typeEntries, sizeof(Effect::typeEntries)); |
119 | |
120 | StringMap<Effect::Waveform, Effect::WAVE_MAX_ENUM>::Entry Effect::waveformEntries[] = |
121 | { |
122 | {"sine" , Effect::WAVE_SINE}, |
123 | {"triangle" , Effect::WAVE_TRIANGLE}, |
124 | {"sawtooth" , Effect::WAVE_SAWTOOTH}, |
125 | {"square" , Effect::WAVE_SQUARE}, |
126 | }; |
127 | |
128 | StringMap<Effect::Waveform, Effect::WAVE_MAX_ENUM> Effect::waveforms(Effect::waveformEntries, sizeof(Effect::waveformEntries)); |
129 | |
130 | /* |
131 | StringMap<Effect::Direction, Effect::DIR_MAX_ENUM>::Entry Effect::directionEntries[] = |
132 | { |
133 | {"up", Effect::DIR_UP}, |
134 | {"down", Effect::DIR_DOWN}, |
135 | {"none", Effect::DIR_NONE}, |
136 | }; |
137 | |
138 | StringMap<Effect::Direction, Effect::DIR_MAX_ENUM> Effect::directions(Effect::directionEntries, sizeof(Effect::directionEntries)); |
139 | |
140 | StringMap<Effect::Phoneme, Effect::PHONEME_MAX_ENUM>::Entry Effect::phonemeEntries[] = |
141 | { |
142 | {"a", Effect::PHONEME_A}, |
143 | {"e", Effect::PHONEME_E}, |
144 | {"i", Effect::PHONEME_I}, |
145 | {"o", Effect::PHONEME_O}, |
146 | {"u", Effect::PHONEME_U}, |
147 | {"aa", Effect::PHONEME_AA}, |
148 | {"ae", Effect::PHONEME_AE}, |
149 | {"ah", Effect::PHONEME_AH}, |
150 | {"ao", Effect::PHONEME_AO}, |
151 | {"eh", Effect::PHONEME_EH}, |
152 | {"er", Effect::PHONEME_ER}, |
153 | {"ih", Effect::PHONEME_IH}, |
154 | {"iy", Effect::PHONEME_IY}, |
155 | {"uh", Effect::PHONEME_UH}, |
156 | {"uw", Effect::PHONEME_UW}, |
157 | {"b", Effect::PHONEME_B}, |
158 | {"d", Effect::PHONEME_D}, |
159 | {"f", Effect::PHONEME_F}, |
160 | {"g", Effect::PHONEME_G}, |
161 | {"j", Effect::PHONEME_J}, |
162 | {"k", Effect::PHONEME_K}, |
163 | {"l", Effect::PHONEME_L}, |
164 | {"m", Effect::PHONEME_M}, |
165 | {"n", Effect::PHONEME_N}, |
166 | {"p", Effect::PHONEME_P}, |
167 | {"r", Effect::PHONEME_R}, |
168 | {"s", Effect::PHONEME_S}, |
169 | {"t", Effect::PHONEME_T}, |
170 | {"v", Effect::PHONEME_V}, |
171 | {"z", Effect::PHONEME_Z}, |
172 | }; |
173 | |
174 | StringMap<Effect::Phoneme, Effect::PHONEME_MAX_ENUM> Effect::phonemes(Effect::phonemeEntries, sizeof(Effect::phonemeEntries)); |
175 | */ |
176 | |
177 | #define StringMap LazierAndSlowerButEasilyArrayableStringMap |
178 | |
179 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::basicParameters = |
180 | { |
181 | {"type" , Effect::EFFECT_TYPE}, |
182 | {"volume" , Effect::EFFECT_VOLUME} |
183 | }; |
184 | |
185 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::reverbParameters = |
186 | { |
187 | {"gain" , Effect::REVERB_GAIN}, |
188 | {"highgain" , Effect::REVERB_HFGAIN}, |
189 | {"density" , Effect::REVERB_DENSITY}, |
190 | {"diffusion" , Effect::REVERB_DIFFUSION}, |
191 | {"decaytime" , Effect::REVERB_DECAY}, |
192 | {"decayhighratio" , Effect::REVERB_HFDECAY}, |
193 | {"earlygain" , Effect::REVERB_EARLYGAIN}, |
194 | {"earlydelay" , Effect::REVERB_EARLYDELAY}, |
195 | {"lategain" , Effect::REVERB_LATEGAIN}, |
196 | {"latedelay" , Effect::REVERB_LATEDELAY}, |
197 | {"roomrolloff" , Effect::REVERB_ROLLOFF}, |
198 | {"airabsorption" , Effect::REVERB_AIRHFGAIN}, |
199 | {"highlimit" , Effect::REVERB_HFLIMITER} |
200 | }; |
201 | |
202 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::chorusParameters = |
203 | { |
204 | {"waveform" , Effect::CHORUS_WAVEFORM}, |
205 | {"phase" , Effect::CHORUS_PHASE}, |
206 | {"rate" , Effect::CHORUS_RATE}, |
207 | {"depth" , Effect::CHORUS_DEPTH}, |
208 | {"feedback" , Effect::CHORUS_FEEDBACK}, |
209 | {"delay" , Effect::CHORUS_DELAY} |
210 | }; |
211 | |
212 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::distortionParameters = |
213 | { |
214 | {"gain" , Effect::DISTORTION_GAIN}, |
215 | {"edge" , Effect::DISTORTION_EDGE}, |
216 | {"lowcut" , Effect::DISTORTION_LOWCUT}, |
217 | {"center" , Effect::DISTORTION_EQCENTER}, |
218 | {"bandwidth" , Effect::DISTORTION_EQBAND} |
219 | }; |
220 | |
221 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::echoParameters = |
222 | { |
223 | {"delay" , Effect::ECHO_DELAY}, |
224 | {"tapdelay" , Effect::ECHO_LRDELAY}, |
225 | {"damping" , Effect::ECHO_DAMPING}, |
226 | {"feedback" , Effect::ECHO_FEEDBACK}, |
227 | {"spread" , Effect::ECHO_SPREAD} |
228 | }; |
229 | |
230 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::flangerParameters = |
231 | { |
232 | {"waveform" , Effect::FLANGER_WAVEFORM}, |
233 | {"phase" , Effect::FLANGER_PHASE}, |
234 | {"rate" , Effect::FLANGER_RATE}, |
235 | {"depth" , Effect::FLANGER_DEPTH}, |
236 | {"feedback" , Effect::FLANGER_FEEDBACK}, |
237 | {"delay" , Effect::FLANGER_DELAY} |
238 | }; |
239 | /* |
240 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::freqshifterParameters = |
241 | { |
242 | {"frequency", Effect::FREQSHIFTER_FREQ}, |
243 | {"leftdirection", Effect::FREQSHIFTER_LEFTDIR}, |
244 | {"rightdirection", Effect::FREQSHIFTER_RIGHTDIR} |
245 | }; |
246 | |
247 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::morpherParameters = |
248 | { |
249 | {"waveform", Effect::MORPHER_WAVEFORM}, |
250 | {"rate", Effect::MORPHER_RATE}, |
251 | {"phonemea", Effect::MORPHER_PHONEMEA}, |
252 | {"phonemeb", Effect::MORPHER_PHONEMEB}, |
253 | {"tunea", Effect::MORPHER_COARSEA}, |
254 | {"tuneb", Effect::MORPHER_COARSEB} |
255 | } |
256 | ; |
257 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::pitchshifterParameters = |
258 | { |
259 | {"pitch", Effect::PITCHSHIFTER_PITCH} |
260 | }; |
261 | */ |
262 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::modulatorParameters = |
263 | { |
264 | {"waveform" , Effect::MODULATOR_WAVEFORM}, |
265 | {"frequency" , Effect::MODULATOR_FREQ}, |
266 | {"highcut" , Effect::MODULATOR_HIGHCUT} |
267 | }; |
268 | /* |
269 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::autowahParameters = |
270 | { |
271 | {"attack", Effect::AUTOWAH_ATTACK}, |
272 | {"release", Effect::AUTOWAH_RELEASE}, |
273 | {"resonance", Effect::AUTOWAH_RESONANCE}, |
274 | {"peakgain", Effect::AUTOWAH_PEAKGAIN} |
275 | }; |
276 | */ |
277 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::compressorParameters = |
278 | { |
279 | {"enable" , Effect::COMPRESSOR_ENABLE} |
280 | }; |
281 | |
282 | std::vector<StringMap<Effect::Parameter>::Entry> Effect::equalizerParameters = |
283 | { |
284 | {"lowgain" , Effect::EQUALIZER_LOWGAIN}, |
285 | {"lowcut" , Effect::EQUALIZER_LOWCUT}, |
286 | {"lowmidgain" , Effect::EQUALIZER_MID1GAIN}, |
287 | {"lowmidfrequency" , Effect::EQUALIZER_MID1FREQ}, |
288 | {"lowmidbandwidth" , Effect::EQUALIZER_MID1BAND}, |
289 | {"highmidgain" , Effect::EQUALIZER_MID2GAIN}, |
290 | {"highmidfrequency" , Effect::EQUALIZER_MID2FREQ}, |
291 | {"highmidbandwidth" , Effect::EQUALIZER_MID2BAND}, |
292 | {"highgain" , Effect::EQUALIZER_HIGHGAIN}, |
293 | {"highcut" , Effect::EQUALIZER_HIGHCUT} |
294 | }; |
295 | |
296 | std::map<Effect::Type, StringMap<Effect::Parameter>> Effect::parameterNames = |
297 | { |
298 | {Effect::TYPE_BASIC, Effect::basicParameters}, |
299 | {Effect::TYPE_REVERB, Effect::reverbParameters}, |
300 | {Effect::TYPE_CHORUS, Effect::chorusParameters}, |
301 | {Effect::TYPE_DISTORTION, Effect::distortionParameters}, |
302 | {Effect::TYPE_ECHO, Effect::echoParameters}, |
303 | {Effect::TYPE_FLANGER, Effect::flangerParameters}, |
304 | //{Effect::TYPE_FREQSHIFTER, Effect::freqshifterParameters}, |
305 | //{Effect::TYPE_MORPHER, Effect::morpherbParameters}, |
306 | //{Effect::TYPE_PITCHSHIFTER, Effect::pitchshifterParameters}, |
307 | {Effect::TYPE_MODULATOR, Effect::modulatorParameters}, |
308 | //{Effect::TYPE_AUTOWAH, Effect::autowahParameters}, |
309 | {Effect::TYPE_COMPRESSOR, Effect::compressorParameters}, |
310 | {Effect::TYPE_EQUALIZER, Effect::equalizerParameters} |
311 | }; |
312 | #undef StringMap |
313 | |
314 | std::map<Effect::Parameter, Effect::ParameterType> Effect::parameterTypes = |
315 | { |
316 | {Effect::EFFECT_TYPE, Effect::PARAM_TYPE}, |
317 | {Effect::EFFECT_VOLUME, Effect::PARAM_FLOAT}, |
318 | |
319 | {Effect::REVERB_GAIN, Effect::PARAM_FLOAT}, |
320 | {Effect::REVERB_HFGAIN, Effect::PARAM_FLOAT}, |
321 | {Effect::REVERB_DENSITY, Effect::PARAM_FLOAT}, |
322 | {Effect::REVERB_DIFFUSION, Effect::PARAM_FLOAT}, |
323 | {Effect::REVERB_DECAY, Effect::PARAM_FLOAT}, |
324 | {Effect::REVERB_HFDECAY, Effect::PARAM_FLOAT}, |
325 | {Effect::REVERB_EARLYGAIN, Effect::PARAM_FLOAT}, |
326 | {Effect::REVERB_EARLYDELAY, Effect::PARAM_FLOAT}, |
327 | {Effect::REVERB_LATEGAIN, Effect::PARAM_FLOAT}, |
328 | {Effect::REVERB_LATEDELAY, Effect::PARAM_FLOAT}, |
329 | {Effect::REVERB_ROLLOFF, Effect::PARAM_FLOAT}, |
330 | {Effect::REVERB_AIRHFGAIN, Effect::PARAM_FLOAT}, |
331 | {Effect::REVERB_HFLIMITER, Effect::PARAM_BOOL}, |
332 | |
333 | {Effect::CHORUS_WAVEFORM, Effect::PARAM_WAVEFORM}, |
334 | {Effect::CHORUS_PHASE, Effect::PARAM_FLOAT}, |
335 | {Effect::CHORUS_RATE, Effect::PARAM_FLOAT}, |
336 | {Effect::CHORUS_DEPTH, Effect::PARAM_FLOAT}, |
337 | {Effect::CHORUS_FEEDBACK, Effect::PARAM_FLOAT}, |
338 | {Effect::CHORUS_DELAY, Effect::PARAM_FLOAT}, |
339 | |
340 | {Effect::DISTORTION_GAIN, Effect::PARAM_FLOAT}, |
341 | {Effect::DISTORTION_EDGE, Effect::PARAM_FLOAT}, |
342 | {Effect::DISTORTION_LOWCUT, Effect::PARAM_FLOAT}, |
343 | {Effect::DISTORTION_EQCENTER, Effect::PARAM_FLOAT}, |
344 | {Effect::DISTORTION_EQBAND, Effect::PARAM_FLOAT}, |
345 | |
346 | {Effect::ECHO_DELAY, Effect::PARAM_FLOAT}, |
347 | {Effect::ECHO_LRDELAY, Effect::PARAM_FLOAT}, |
348 | {Effect::ECHO_DAMPING, Effect::PARAM_FLOAT}, |
349 | {Effect::ECHO_FEEDBACK, Effect::PARAM_FLOAT}, |
350 | {Effect::ECHO_SPREAD, Effect::PARAM_FLOAT}, |
351 | |
352 | {Effect::FLANGER_WAVEFORM, Effect::PARAM_WAVEFORM}, |
353 | {Effect::FLANGER_PHASE, Effect::PARAM_FLOAT}, |
354 | {Effect::FLANGER_RATE, Effect::PARAM_FLOAT}, |
355 | {Effect::FLANGER_DEPTH, Effect::PARAM_FLOAT}, |
356 | {Effect::FLANGER_FEEDBACK, Effect::PARAM_FLOAT}, |
357 | {Effect::FLANGER_DELAY, Effect::PARAM_FLOAT}, |
358 | /* |
359 | {Effect::FREQSHIFTER_FREQ, Effect::PARAM_FLOAT}, |
360 | {Effect::FREQSHIFTER_LEFTDIR, Effect::PARAM_DIRECTION}, |
361 | {Effect::FREQSHIFTER_RIGHTDIR, Effect::PARAM_DIRECTION}, |
362 | |
363 | {Effect::MORPHER_WAVEFORM, Effect::PARAM_WAVEFORM}, |
364 | {Effect::MORPHER_RATE, Effect::PARAM_FLOAT}, |
365 | {Effect::MORPHER_PHONEMEA, Effect::PARAM_PHONEME}, |
366 | {Effect::MORPHER_PHONEMEB, Effect::PARAM_PHONEME}, |
367 | {Effect::MORPHER_TUNEA, Effect::PARAM_FLOAT}, |
368 | {Effect::MORPHER_TUNEB, Effect::PARAM_FLOAT}, |
369 | |
370 | {Effect::PITCHSHIFTER_PITCH, Effect::PARAM_FLOAT}, |
371 | */ |
372 | {Effect::MODULATOR_WAVEFORM, Effect::PARAM_WAVEFORM}, |
373 | {Effect::MODULATOR_FREQ, Effect::PARAM_FLOAT}, |
374 | {Effect::MODULATOR_HIGHCUT, Effect::PARAM_FLOAT}, |
375 | /* |
376 | {Effect::AUTOWAH_ATTACK, Effect::PARAM_FLOAT}, |
377 | {Effect::AUTOWAH_RELEASE, Effect::PARAM_FLOAT}, |
378 | {Effect::AUTOWAH_RESONANCE, Effect::PARAM_FLOAT}, |
379 | {Effect::AUTOWAH_PEAKGAIN, Effect::PARAM_FLOAT}, |
380 | */ |
381 | {Effect::COMPRESSOR_ENABLE, Effect::PARAM_BOOL}, |
382 | |
383 | {Effect::EQUALIZER_LOWGAIN, Effect::PARAM_FLOAT}, |
384 | {Effect::EQUALIZER_LOWCUT, Effect::PARAM_FLOAT}, |
385 | {Effect::EQUALIZER_MID1GAIN, Effect::PARAM_FLOAT}, |
386 | {Effect::EQUALIZER_MID1FREQ, Effect::PARAM_FLOAT}, |
387 | {Effect::EQUALIZER_MID1BAND, Effect::PARAM_FLOAT}, |
388 | {Effect::EQUALIZER_MID2GAIN, Effect::PARAM_FLOAT}, |
389 | {Effect::EQUALIZER_MID2FREQ, Effect::PARAM_FLOAT}, |
390 | {Effect::EQUALIZER_MID2BAND, Effect::PARAM_FLOAT}, |
391 | {Effect::EQUALIZER_HIGHGAIN, Effect::PARAM_FLOAT}, |
392 | {Effect::EQUALIZER_HIGHCUT, Effect::PARAM_FLOAT} |
393 | }; |
394 | |
395 | } //audio |
396 | } //love |
397 | |