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