1 #ifndef __Mappers_H__ 2 #define __Mappers_H__ 3 4 #include "AActionParamMapper.h" 5 6 #include <math.h> 7 #include "../backend/unit_conv.h" 8 9 class CActionParamMapper_linear : public AActionParamMapper 10 { 11 public: 12 CActionParamMapper_linear(double defaultValue,int defaultScalar,int minScalar=0,int maxScalar=0) : AActionParamMapper(defaultValue,defaultScalar,minScalar,maxScalar)13 AActionParamMapper(defaultValue,defaultScalar,minScalar,maxScalar), 14 doFloor(false) 15 { 16 } 17 ~CActionParamMapper_linear()18 virtual ~CActionParamMapper_linear() {} 19 floorTheValue(bool _doFloor)20 void floorTheValue(bool _doFloor) { doFloor=_doFloor; } 21 interpretValue(const double x)22 double interpretValue(const double x) 23 { // [0,1] -> [0,s] 24 if(doFloor) 25 return floor(x*getScalar()); 26 else 27 return x*getScalar(); 28 } 29 uninterpretValue(const double x)30 double uninterpretValue(const double x) 31 { // [0,s] -> [0,1] 32 if(doFloor) 33 return floor(x)/getScalar(); 34 else 35 return x/getScalar(); 36 } 37 38 private: 39 bool doFloor; // could make this a math.h function pointer so I could pass round, floor, ceil, etc??? 40 }; 41 42 // maps the unit range to [-scalar,scalar] 43 class CActionParamMapper_linear_bipolar : public AActionParamMapper 44 { 45 public: CActionParamMapper_linear_bipolar(double defaultValue,int defaultScalar,int maxScalar)46 CActionParamMapper_linear_bipolar(double defaultValue,int defaultScalar,int maxScalar) : 47 AActionParamMapper(defaultValue,defaultScalar,1,maxScalar), 48 mul(1.0) 49 { 50 } 51 setMultiplier(double _mul)52 void setMultiplier(double _mul) { mul=_mul; } 53 54 ~CActionParamMapper_linear_bipolar()55 virtual ~CActionParamMapper_linear_bipolar() {} 56 interpretValue(const double x)57 double interpretValue(const double x) 58 { // [0,1] -> [-s,s]*mul 59 return unitRange_to_otherRange_linear(x,-getScalar(),getScalar())*mul; 60 } 61 uninterpretValue(const double x)62 double uninterpretValue(const double x) 63 { // [-s,s]*mul -> [0,1] 64 return otherRange_to_unitRange_linear(x/mul,-getScalar(),getScalar()); 65 } 66 67 private: 68 double mul; 69 }; 70 71 // same as CActionParamMapper_linear_range below except the value will be multipled by the scalar 72 class CActionParamMapper_linear_range_scaled : public AActionParamMapper 73 { 74 public: CActionParamMapper_linear_range_scaled(double defaultValue,double _minValue,double _maxValue,int defaultScalar,int minScalar,int maxScalar)75 CActionParamMapper_linear_range_scaled(double defaultValue,double _minValue,double _maxValue,int defaultScalar,int minScalar,int maxScalar) : 76 AActionParamMapper(defaultValue,defaultScalar,minScalar,maxScalar), 77 minValue(_minValue), 78 maxValue(_maxValue), 79 doFloor(false) 80 { 81 } 82 ~CActionParamMapper_linear_range_scaled()83 virtual ~CActionParamMapper_linear_range_scaled() {} 84 floorTheValue(bool _doFloor)85 void floorTheValue(bool _doFloor) { doFloor=_doFloor; } 86 interpretValue(const double x)87 double interpretValue(const double x) 88 { // [0,1] -> [minValue,maxValue]*scalar 89 if(doFloor) 90 return floor(unitRange_to_otherRange_linear(x,minValue,maxValue)*getScalar()); 91 else 92 return unitRange_to_otherRange_linear(x,minValue,maxValue)*getScalar(); 93 } 94 uninterpretValue(const double x)95 double uninterpretValue(const double x) 96 { // [minValue,maxValue]*scalar -> [0,1] 97 if(doFloor) 98 return otherRange_to_unitRange_linear(floor(x)/getScalar(),minValue,maxValue); 99 else 100 return otherRange_to_unitRange_linear(x/getScalar(),minValue,maxValue); 101 } 102 103 private: 104 const double minValue,maxValue; 105 bool doFloor; // could make this a math.h function pointer so I could pass round, floor, ceil, etc??? 106 }; 107 108 // maps the unit range to the given min and max values 109 class CActionParamMapper_linear_range : public CActionParamMapper_linear_range_scaled 110 { 111 public: CActionParamMapper_linear_range(double defaultValue,double minValue,double maxValue)112 CActionParamMapper_linear_range(double defaultValue,double minValue,double maxValue) : 113 CActionParamMapper_linear_range_scaled(defaultValue,minValue,maxValue,1,0,0) 114 { 115 } 116 ~CActionParamMapper_linear_range()117 virtual ~CActionParamMapper_linear_range() {} 118 }; 119 120 // maps the unit range to [min,scalar] 121 class CActionParamMapper_linear_min_to_scalar : public AActionParamMapper 122 { 123 public: CActionParamMapper_linear_min_to_scalar(double defaultValue,double _minValue,int defaultScalar,int minScalar,int maxScalar)124 CActionParamMapper_linear_min_to_scalar(double defaultValue,double _minValue,int defaultScalar,int minScalar,int maxScalar) : 125 AActionParamMapper(defaultValue,defaultScalar,minScalar,maxScalar), 126 minValue(_minValue), 127 doFloor(false) 128 { 129 } 130 ~CActionParamMapper_linear_min_to_scalar()131 virtual ~CActionParamMapper_linear_min_to_scalar() {} 132 floorTheValue(bool _doFloor)133 void floorTheValue(bool _doFloor) { doFloor=_doFloor; } 134 interpretValue(const double x)135 double interpretValue(const double x) 136 { // [0,1] -> [minValue,scalar] 137 if(doFloor) 138 return floor(unitRange_to_otherRange_linear(x,minValue,getScalar())); 139 else 140 return unitRange_to_otherRange_linear(x,minValue,getScalar()); 141 } 142 uninterpretValue(const double x)143 double uninterpretValue(const double x) 144 { // [minValue,scalar] -> [0,1] 145 if(doFloor) 146 return otherRange_to_unitRange_linear(x,minValue,getScalar()); 147 else 148 return otherRange_to_unitRange_linear(x,minValue,getScalar()); 149 } 150 151 private: 152 const double minValue; 153 bool doFloor; 154 }; 155 156 // same as CActionParamMapper_linear_range except the path from minValue to maxValue follows the curve shape: x^2 where x:[0,1] 157 class CActionParamMapper_parabola_range : public AActionParamMapper 158 { // ??? if I create a "CActionParamMapper_parabola_range_scaled" (like I did with linear) then make this class derive from it 159 public: CActionParamMapper_parabola_range(double defaultValue,double _minValue,double _maxValue)160 CActionParamMapper_parabola_range(double defaultValue,double _minValue,double _maxValue) : 161 AActionParamMapper(defaultValue), 162 minValue(_minValue), 163 maxValue(_maxValue) 164 { 165 } 166 ~CActionParamMapper_parabola_range()167 virtual ~CActionParamMapper_parabola_range() {} 168 interpretValue(const double x)169 double interpretValue(const double x) 170 { // [0,1] -> [minValue,maxValue] 171 return unitRange_to_otherRange_linear(unitRange_to_unitRange_squared(x),minValue,maxValue); 172 } 173 uninterpretValue(const double x)174 double uninterpretValue(const double x) 175 { // [minValue,maxValue] -> [0,1] 176 return unitRange_to_unitRange_unsquared(otherRange_to_unitRange_linear(x,minValue,maxValue)); 177 } 178 179 private: 180 const double minValue,maxValue; 181 }; 182 183 /* 'recipsym' means reciprocally symetric as the range of the function is reciprocally symetric around 1 */ 184 class CActionParamMapper_recipsym : public AActionParamMapper 185 { 186 public: CActionParamMapper_recipsym(double defaultValue,int defaultScalar,int minScalar,int maxScalar)187 CActionParamMapper_recipsym(double defaultValue,int defaultScalar,int minScalar,int maxScalar) : 188 AActionParamMapper(defaultValue,defaultScalar,minScalar,maxScalar) 189 { 190 } 191 ~CActionParamMapper_recipsym()192 virtual ~CActionParamMapper_recipsym() {} 193 interpretValue(const double x)194 double interpretValue(const double x) 195 { // [0,1] -> [1/s,s] 196 return unitRange_to_recipsymRange_exp(x,getScalar()); 197 } 198 uninterpretValue(const double x)199 double uninterpretValue(const double x) 200 { // [1/s,s] -> [0,1] 201 return recipsymRange_to_unitRange_exp(x,getScalar()); 202 } 203 }; 204 205 class CActionParamMapper_dBFS : public AActionParamMapper 206 { 207 public: CActionParamMapper_dBFS(double defaultValue)208 CActionParamMapper_dBFS(double defaultValue) : 209 AActionParamMapper(defaultValue) 210 { 211 } 212 ~CActionParamMapper_dBFS()213 virtual ~CActionParamMapper_dBFS() {} 214 interpretValue(const double x)215 double interpretValue(const double x) 216 { // [0,1] -> [-inf,0] 217 return amp_to_dBFS(x,1.0); 218 } 219 uninterpretValue(const double x)220 double uninterpretValue(const double x) 221 { // [-inf,0] -> [0,1] 222 return dBFS_to_amp(x,1.0); 223 } 224 }; 225 226 227 #endif 228