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