1 /**
2  * Copyright (c) 2006-2019 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 
29 template<typename T>
30 class LazierAndSlowerButEasilyArrayableStringMap
31 {
32 public:
33 	struct Entry
34 	{
35 		const char *key;
36 		T value;
37 	};
LazierAndSlowerButEasilyArrayableStringMap()38 	LazierAndSlowerButEasilyArrayableStringMap()
39 	{
40 	}
41 
LazierAndSlowerButEasilyArrayableStringMap(const std::vector<Entry> & entries)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 
find(const char * key,T & t)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 
find(T key,const char * & str)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 
67 private:
68 	std::map<std::string, T> forward;
69 	std::map<T, const char*> reverse;
70 };
71 
72 namespace love
73 {
74 namespace audio
75 {
76 
77 class Effect
78 {
79 public:
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 
262 protected:
263 	Type type;
264 
265 private:
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