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#ifndef LOVE_AUDIO_EFFECTS_H
22#define LOVE_AUDIO_EFFECTS_H
23
24#include "common/Object.h"
25#include "common/StringMap.h"
26#include <map>
27#include <vector>
28
29template<typename T>
30class LazierAndSlowerButEasilyArrayableStringMap
31{
32public:
33 struct Entry
34 {
35 const char *key;
36 T value;
37 };
38 LazierAndSlowerButEasilyArrayableStringMap()
39 {
40 }
41
42 LazierAndSlowerButEasilyArrayableStringMap(const std::vector<Entry> &entries)
43 {
44 for (auto entry : entries)
45 {
46 forward[entry.key] = entry.value;
47 reverse[entry.value] = entry.key;
48 }
49 }
50
51 bool find(const char *key, T &t)
52 {
53 if (forward.find(key) == forward.end())
54 return false;
55 t = forward[key];
56 return true;
57 }
58
59 bool find(T key, const char *&str)
60 {
61 if (reverse.find(key) == reverse.end())
62 return false;
63 str = reverse[key];
64 return true;
65 }
66
67private:
68 std::map<std::string, T> forward;
69 std::map<T, const char*> reverse;
70};
71
72namespace love
73{
74namespace audio
75{
76
77class Effect
78{
79public:
80 enum Type
81 {
82 TYPE_BASIC, //not a real type
83 TYPE_REVERB,
84 TYPE_CHORUS,
85 TYPE_DISTORTION,
86 TYPE_ECHO,
87 TYPE_FLANGER,
88 //TYPE_FREQSHIFTER,
89 //TYPE_MORPHER,
90 //TYPE_PITCHSHIFTER,
91 TYPE_MODULATOR,
92 //TYPE_AUTOWAH,
93 TYPE_COMPRESSOR,
94 TYPE_EQUALIZER,
95 TYPE_MAX_ENUM
96 };
97
98 enum Parameter
99 {
100 EFFECT_TYPE,
101 EFFECT_VOLUME,
102
103 REVERB_GAIN,
104 REVERB_HFGAIN,
105 REVERB_DENSITY,
106 REVERB_DIFFUSION,
107 REVERB_DECAY,
108 REVERB_HFDECAY,
109 REVERB_EARLYGAIN,
110 REVERB_EARLYDELAY,
111 REVERB_LATEGAIN,
112 REVERB_LATEDELAY,
113 REVERB_ROLLOFF,
114 REVERB_AIRHFGAIN,
115 REVERB_HFLIMITER,
116
117 CHORUS_WAVEFORM,
118 CHORUS_PHASE,
119 CHORUS_RATE,
120 CHORUS_DEPTH,
121 CHORUS_FEEDBACK,
122 CHORUS_DELAY,
123
124 DISTORTION_GAIN,
125 DISTORTION_EDGE,
126 DISTORTION_LOWCUT,
127 DISTORTION_EQCENTER,
128 DISTORTION_EQBAND,
129
130 ECHO_DELAY,
131 ECHO_LRDELAY,
132 ECHO_DAMPING,
133 ECHO_FEEDBACK,
134 ECHO_SPREAD,
135
136 FLANGER_WAVEFORM,
137 FLANGER_PHASE,
138 FLANGER_RATE,
139 FLANGER_DEPTH,
140 FLANGER_FEEDBACK,
141 FLANGER_DELAY,
142/*
143 FREQSHIFTER_FREQ,
144 FREQSHIFTER_LEFTDIR,
145 FREQSHIFTER_RIGHTDIR,
146
147 MORPHER_WAVEFORM,
148 MORPHER_RATE,
149 MORPHER_PHONEMEA,
150 MORPHER_PHONEMEB,
151 MORPHER_TUNEA,
152 MORPHER_TUNEB,
153
154 PITCHSHIFTER_PITCH,
155*/
156 MODULATOR_WAVEFORM,
157 MODULATOR_FREQ,
158 MODULATOR_HIGHCUT,
159/*
160 AUTOWAH_ATTACK,
161 AUTOWAH_RELEASE,
162 AUTOWAH_RESONANCE,
163 AUTOWAH_PEAKGAIN,
164*/
165 COMPRESSOR_ENABLE,
166
167 EQUALIZER_LOWGAIN,
168 EQUALIZER_LOWCUT,
169 EQUALIZER_MID1GAIN,
170 EQUALIZER_MID1FREQ,
171 EQUALIZER_MID1BAND,
172 EQUALIZER_MID2GAIN,
173 EQUALIZER_MID2FREQ,
174 EQUALIZER_MID2BAND,
175 EQUALIZER_HIGHGAIN,
176 EQUALIZER_HIGHCUT,
177
178 EFFECT_MAX_ENUM
179 };
180
181 enum ParameterType
182 {
183 PARAM_TYPE,
184 PARAM_FLOAT,
185 PARAM_BOOL,
186 PARAM_WAVEFORM,
187 //PARAM_DIRECTION,
188 //PARAM_PHONEME,
189 PARAM_MAX_ENUM
190 };
191
192 enum Waveform
193 {
194 WAVE_SINE,
195 WAVE_TRIANGLE,
196 WAVE_SAWTOOTH,
197 WAVE_SQUARE,
198 WAVE_MAX_ENUM
199 };
200 /*
201 enum Direction
202 {
203 DIR_NONE,
204 DIR_UP,
205 DIR_DOWN,
206 DIR_MAX_ENUM
207 };
208
209 enum Phoneme
210 {
211 PHONEME_A,
212 PHONEME_E,
213 PHONEME_I,
214 PHONEME_O,
215 PHONEME_U,
216 PHONEME_AA,
217 PHONEME_AE,
218 PHONEME_AH,
219 PHONEME_AO,
220 PHONEME_EH,
221 PHONEME_ER,
222 PHONEME_IH,
223 PHONEME_IY,
224 PHONEME_UH,
225 PHONEME_UW,
226 PHONEME_B,
227 PHONEME_D,
228 PHONEME_F,
229 PHONEME_G,
230 PHONEME_J,
231 PHONEME_K,
232 PHONEME_L,
233 PHONEME_M,
234 PHONEME_N,
235 PHONEME_P,
236 PHONEME_R,
237 PHONEME_S,
238 PHONEME_T,
239 PHONEME_V,
240 PHONEME_Z,
241 PHONEME_MAX_ENUM
242 };
243 */
244
245 Effect();
246 virtual ~Effect();
247 Type getType() const;
248
249 static bool getConstant(const char *in, Type &out);
250 static bool getConstant(Type in, const char *&out);
251 static std::vector<std::string> getConstants(Type);
252 static bool getConstant(const char *in, Waveform &out);
253 static bool getConstant(Waveform in, const char *&out);
254 //static bool getConstant(const char *in, Direction &out);
255 //static bool getConstant(Direction in, const char *&out);
256 //static bool getConstant(const char *in, Phoneme &out);
257 //static bool getConstant(Phoneme in, const char *&out);
258 static bool getConstant(const char *in, Parameter &out, Type t);
259 static bool getConstant(Parameter in, const char *&out, Type t);
260 static ParameterType getParameterType(Parameter in);
261
262protected:
263 Type type;
264
265private:
266 static StringMap<Type, TYPE_MAX_ENUM>::Entry typeEntries[];
267 static StringMap<Type, TYPE_MAX_ENUM> types;
268 static StringMap<Waveform, WAVE_MAX_ENUM>::Entry waveformEntries[];
269 static StringMap<Waveform, WAVE_MAX_ENUM> waveforms;
270 //static StringMap<Direction, DIR_MAX_ENUM>::Entry directionEntries[];
271 //static StringMap<Direction, DIR_MAX_ENUM> directions;
272 //static StringMap<Phoneme, PHONEME_MAX_ENUM>::Entry phonemeEntries[];
273 //static StringMap<Phoneme, PHONEME_MAX_ENUM> phonemes;
274#define StringMap LazierAndSlowerButEasilyArrayableStringMap
275 static std::vector<StringMap<Effect::Parameter>::Entry> basicParameters;
276 static std::vector<StringMap<Effect::Parameter>::Entry> reverbParameters;
277 static std::vector<StringMap<Effect::Parameter>::Entry> chorusParameters;
278 static std::vector<StringMap<Effect::Parameter>::Entry> distortionParameters;
279 static std::vector<StringMap<Effect::Parameter>::Entry> echoParameters;
280 static std::vector<StringMap<Effect::Parameter>::Entry> flangerParameters;
281 //static std::vector<StringMap<Effect::Parameter>::Entry> freqshifterParameters;
282 //static std::vector<StringMap<Effect::Parameter>::Entry> morpherParameters;
283 //static std::vector<StringMap<Effect::Parameter>::Entry> pitchshifterParameters;
284 static std::vector<StringMap<Effect::Parameter>::Entry> modulatorParameters;
285 //static std::vector<StringMap<Effect::Parameter>::Entry> autowahParameters;
286 static std::vector<StringMap<Effect::Parameter>::Entry> compressorParameters;
287 static std::vector<StringMap<Effect::Parameter>::Entry> equalizerParameters;
288 static std::map<Type, StringMap<Parameter>> parameterNames;
289#undef StringMap
290 static std::map<Parameter, ParameterType> parameterTypes;
291
292};
293
294} //audio
295} //love
296
297#endif //LOVE_AUDIO_EFFECTS_H
298