#pragma once #include "LookupTable.h" // TODO: this class should not be templatized. the functions should template class LookupTableFactory { public: /** * domain (x) = -1 .. +1 */ static void makeBipolarAudioTaper(LookupTableParams& params); /** * domain (x) = 0..1 */ static void makeAudioTaper(LookupTableParams& params); static double audioTaperKnee() { return -24; } /** * Factory methods for exp base 2 * domain = 0..10 * range = 20..20k (for now). but should be .001 to 1.0? */ static void makeExp2(LookupTableParams& params); static double exp2YMin() { return 4; } static double exp2YMax() { return 40000; } static double exp2XMin() { return std::log2(exp2YMin()); } static double exp2XMax() { return std::log2(exp2YMax()); } static void makeExp2ExLow(LookupTableParams& params); static double exp2ExLowYMin() { return 2; } static double exp2ExLowYMax() { return 400; } static double exp2ExLowXMin() { return std::log2(exp2ExLowYMin()); } static double exp2ExLowXMax() { return std::log2(exp2ExLowYMax()); } static void makeExp2ExHigh(LookupTableParams& params); static double exp2ExHighYMin() { return 400; } static double exp2ExHighYMax() { return 20000; } static double exp2ExHighXMin() { return std::log2(exp2ExHighYMin()); } static double exp2ExHighXMax() { return std::log2(exp2ExHighYMax()); } }; template inline void LookupTableFactory::makeExp2(LookupTableParams& params) { // 256 enough for one cent const int bins = 256; const T xMin = (T) std::log2(exp2YMin()); const T xMax = (T) std::log2(exp2YMax()); assert(xMin < xMax); LookupTable::init(params, bins, xMin, xMax, [](double x) { return std::pow(2, x); }); } // hit specs with 256 / 128 @200 crossover // try 800 ng - need 256/256 // 400 need 256 / 128 template inline void LookupTableFactory::makeExp2ExHigh(LookupTableParams& params) { const int bins = 512; const T xMin = (T) std::log2(exp2ExHighYMin()); const T xMax = (T) std::log2(exp2ExHighYMax()); assert(xMin < xMax); LookupTable::init(params, bins, xMin, xMax, [](double x) { return std::pow(2, x); }); } template inline void LookupTableFactory::makeExp2ExLow(LookupTableParams& params) { const int bins = 256; const T xMin = (T) std::log2(exp2ExLowYMin()); const T xMax = (T) std::log2(exp2ExLowYMax()); assert(xMin < xMax); LookupTable::init(params, bins, xMin, xMax, [](double x) { return std::pow(2, x); }); } template inline void LookupTableFactory::makeBipolarAudioTaper(LookupTableParams& params) { const int bins = 32; std::function audioTaper = AudioMath::makeFunc_AudioTaper(audioTaperKnee()); const T xMin = -1; const T xMax = 1; LookupTable::init(params, bins, xMin, xMax, [audioTaper](double x) { return (x >= 0) ? audioTaper(x) : -audioTaper(-x); }); } template inline void LookupTableFactory::makeAudioTaper(LookupTableParams& params) { const int bins = 32; std::function audioTaper = AudioMath::makeFunc_AudioTaper(audioTaperKnee()); const T xMin = 0; const T xMax = 1; LookupTable::init(params, bins, xMin, xMax, [audioTaper](double x) { return audioTaper(x); }); }