| 
							- #pragma once
 - 
 - #include <assert.h>
 - #include <map>
 - #include <vector>
 - #include "LookupTable.h"
 - 
 - using Spline = std::vector< std::pair<double, double> >;
 - 
 - 
 - /** Why does this class exist when we also have NonUniformLookupTable?
 - */
 - class NonUniformLookup
 - {
 - public:
 -     void add(double x, double y)
 -     {
 -         data[x] = y;
 -     }
 -     double lookup(double x)
 -     {
 -         //  printf("lookup %f\n", x);
 -         auto l = data.lower_bound(x);
 -         assert(l != data.end());
 -         // printf("lower = %f, %f\n", l->first, l->second);
 -         auto p = l;
 -         if (p == data.begin()) {
 -             // mac was crashing decrementing past begin
 -             assert(l->first == x);
 -             return l->second;
 -         }
 -         p--;
 -         if (p == data.end()) {
 -             assert(false);      // should never happen
 -             assert(l->first == x);
 -             return l->second;
 -         }
 -         assert(p != data.end());
 -         // printf("p = %f, %f\n", p->first, p->second);
 - 
 -         // construct line  y = y0 +   (y1 -y0)/(x1 - x0) * x-x0;
 -         // = b + a(x -b);
 -         const double b = p->second;
 -         const double a = (l->second - p->second) / (l->first - p->first);
 - 
 -         const double ret = b + a * (x - p->first);
 -         // printf("ret = %f\n", ret);
 - 
 -         return ret;
 -     }
 - private:
 -     std::map<double, double> data;
 - };
 - 
 - class AsymWaveShaper
 - {
 - public:
 -     const static int iNumPoints = 256;
 -     const static int iSymmetryTables = 16;
 - private:
 -     LookupTableParams<float> tables[iSymmetryTables];
 - public:
 - 
 -     AsymWaveShaper();
 -   
 -     float lookup(float x, int index) const
 -     {
 -         float x_scaled = 0;
 -         if (x >= 1) {
 -             x_scaled = iNumPoints - 1;
 -         } else if (x < -1) {
 -             x_scaled = 0;
 -         } else {
 -             x_scaled = (x + 1) * iNumPoints / 2;
 -         }
 - 
 -         assert(index >= 0 && index < iSymmetryTables);
 -         const LookupTableParams<float>& table = tables[index];
 -         // TODO: we are going outside of domain!.
 -         const float y = LookupTable<float>::lookup(table, x_scaled, true);
 -        // printf("lookup %f -> %f ret %f\n", x, x_scaled, y);
 -         return y;
 -     }
 - 
 -     static void genTableValues(const Spline& spline, int numPoints);
 -     static void genTable(int index, double symmetry);
 -     static Spline makeSplineRight(double symmetry);
 -     static Spline makeSplineLeft(double symmetry);
 -     static std::pair<double, double> calcPoint(const Spline& spline, double t);
 - };
 
 
  |