AAX SDK  2.1.1
Avid Audio Extensions Development Kit
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AAX_CRangeTaperDelegate.h
Go to the documentation of this file.
1 /*================================================================================================*/
2 /*
3  *
4  * Copyright 2013 by Avid Technology, Inc.
5  * All rights reserved.
6  *
7  * CONFIDENTIAL: This document contains confidential information. Do not
8  * read or examine this document unless you are an Avid Technology employee
9  * or have signed a non-disclosure agreement with Avid Technology which protects
10  * the confidentiality of this document. DO NOT DISCLOSE ANY INFORMATION
11  * CONTAINED IN THIS DOCUMENT TO ANY THIRD-PARTY WITHOUT THE PRIOR WRITTEN CONSENT
12  * OF Avid Technolgy, INC.
13  *
14  */
15 
22 /*================================================================================================*/
23 
24 
25 #ifndef AAX_CRANGETAPERDELEGATE_H
26 #define AAX_CRANGETAPERDELEGATE_H
27 
28 #include "AAX_ITaperDelegate.h"
29 #include "AAX.h" //for types
30 
31 #include <cmath> //for floor()
32 #include <vector>
33 
34 
82 template <typename T, int32_t RealPrecision=1000>
84 {
85 public:
99  AAX_CRangeTaperDelegate(T* range, double* rangesSteps, long numRanges, bool useSmartRounding = true);
102 
103  //Virtual Overrides
105  T GetMinimumValue() const { return mMinValue; }
106  T GetMaximumValue() const { return mMaxValue; }
107  T ConstrainRealValue(T value) const;
108  T NormalizedToReal(double normalizedValue) const;
109  double RealToNormalized(T realValue) const;
110 
111 protected:
112  T Round(double iValue) const;
113  T SmartRound(double value) const;
114 
115 private:
116  T mMinValue;
117  T mMaxValue;
118  long mNumRanges;
119  std::vector<T> mRanges;
120  std::vector<double> mRangesSteps;
121  std::vector<double> mRangesPercents;
122  std::vector<double> mRangesStepsCount;
123  bool mUseSmartRounding;
124 };
125 
126 template <typename T, int32_t RealPrecision>
127 AAX_CRangeTaperDelegate<T, RealPrecision>::AAX_CRangeTaperDelegate(T* ranges, double* rangesSteps, long numRanges, bool useSmartRounding) :
128  AAX_ITaperDelegate<T>(),
129  mMinValue(*ranges),
130  mMaxValue(*(ranges + numRanges)),
131  mNumRanges(numRanges),
132  mRanges( ranges, ranges + numRanges + 1),
133  mRangesSteps( rangesSteps, rangesSteps + numRanges),
134  mUseSmartRounding( useSmartRounding )
135 {
136  mRangesStepsCount.reserve(numRanges);
137  mRangesPercents.reserve(numRanges);
138  int i = 0;
139  for (; i < mNumRanges; i++)
140  {
141  mRangesStepsCount.push_back( (mRanges.at(i + 1) - mRanges.at(i)) / mRangesSteps.at(i));
142  }
143  double numSteps = 0;
144  for (i = 0; i < mNumRanges; i++)
145  {
146  numSteps += mRangesStepsCount.at(i);
147  }
148  for (i = 0; i < mNumRanges; i++)
149  {
150  mRangesPercents.push_back( mRangesStepsCount.at(i) / numSteps );
151  }
152 }
153 
154 template <typename T, int32_t RealPrecision>
156  mMinValue(rhs.mMinValue),
157  mMaxValue(rhs.mMaxValue),
158  mNumRanges(rhs.mNumRanges),
159  mRanges( rhs.mRanges.begin(), rhs.mRanges.end()),
160  mRangesSteps( rhs.mRangesSteps.begin(), rhs.mRangesSteps.end()),
161  mRangesPercents( rhs.mRangesPercents.begin(), rhs.mRangesPercents.end()),
162  mRangesStepsCount( rhs.mRangesStepsCount.begin(), rhs.mRangesStepsCount.end()),
163  mUseSmartRounding( rhs.mUseSmartRounding )
164 {
165 }
166 
167 template <typename T, int32_t RealPrecision>
169 {
170  if (this == &rhs)
171  return *this;
172 
173  this->mMinValue = rhs.mMinValue;
174  this->mMaxValue = rhs.mMaxValue;
175  this->mNumRanges = rhs.mNumRanges;
176  this->mRanges.assign( rhs.mRanges.begin(), rhs.mRanges.end());
177  this->mRangesSteps.assign( rhs.mRangesSteps.begin(), rhs.mRangesSteps.end());
178  this->mRangesPercents.assign( rhs.mRangesPercents.begin(), rhs.mRangesPercents.end());
179  this->mRangesStepsCount.assign( rhs.mRangesStepsCount.begin(), rhs.mRangesStepsCount.end());
180 
181  return *this;
182 }
183 
184 template <typename T, int32_t RealPrecision>
186 {
187  return ((0 >= RealPrecision) ? static_cast<T>(iValue) :
188  (0 <= iValue) ? floor( iValue*RealPrecision + 0.5f ) / RealPrecision :
189  ceil( iValue*RealPrecision - 0.5f ) / RealPrecision
190  );
191 }
192 
193 template <typename T, int32_t RealPrecision>
195 {
197 }
198 
199 template <typename T, int32_t RealPrecision>
201 {
202  if (RealPrecision)
203  value = Round(value); //reduce the precision to get proper rounding behavior with integers.
204  if (value > mMaxValue)
205  return mMaxValue;
206  if (value < mMinValue)
207  return mMinValue;
208  return value;
209 }
210 
211 template <typename T, int32_t RealPrecision>
213 {
214  double percentTotal = normalizedValue;
215 
216  double percent = 0.0;
217  long i = 0;
218  for (; i < mNumRanges; i++)
219  {
220  if ((percentTotal >= percent) && (percentTotal < (percent + mRangesPercents.at( i ) )))
221  break;
222  percent += mRangesPercents.at( i );
223  }
224 
225  double extValue;
226  if (i == mNumRanges)
227  extValue = mMaxValue; // our control is 100% of maximum
228  else
229  extValue = mRanges.at(i) + ((mRanges.at(i+1) - mRanges.at(i))*(percentTotal - percent)) / (mRangesPercents.at(i));
230 
231  T realValue = T(extValue);
232  if ( mUseSmartRounding )
233  realValue = SmartRound(extValue); //reduce the precision to get proper rounding behavior with integers.
234 
235  return ConstrainRealValue(realValue);
236 }
237 
238 template <typename T, int32_t RealPrecision>
240 {
241  realValue = ConstrainRealValue(realValue);
242 
243  double percentTotal = 0.0;
244  long i = 0;
245  for (; i < mNumRanges; i++)
246  {
247  if ((realValue >= mRanges[i]) && (realValue < mRanges[i+1]))
248  break;
249  percentTotal += mRangesPercents[i];
250  }
251 
252  if (i == mNumRanges)
253  percentTotal = 1.0; // our control is 100% of maximum
254  else
255  percentTotal += (realValue - mRanges.at(i))/(mRanges.at(i + 1) - mRanges.at(i)) * mRangesPercents.at(i);
256 
257  double normalizedValue = percentTotal;
258  return normalizedValue;
259 }
260 
261 template <typename T, int32_t RealPrecision>
263 {
264  int32_t i = 0;
265  for (; i < mNumRanges; i++)
266  {
267  if ((value >= mRanges.at(i)) && (value < mRanges.at(i + 1) ))
268  break;
269  if ( i == mNumRanges - 1 )
270  break;
271  }
272 
273  int32_t longVal = 0;
274  if (value >= 0)
275  longVal = int32_t(floor(value / mRangesSteps.at(i) + 0.5));
276  else
277  longVal = int32_t(ceil(value / mRangesSteps.at(i) - 0.5));
278 
279  return static_cast<double>(longVal) * mRangesSteps.at(i);
280 }
281 
282 
283 #endif AAX_CRANGETAPERDELEGATE_H
AAX_CRangeTaperDelegate & operator=(AAX_CRangeTaperDelegate &rhs)
Definition: AAX_CRangeTaperDelegate.h:168
Various utility definitions for AAX.
AAX_CRangeTaperDelegate(T *range, double *rangesSteps, long numRanges, bool useSmartRounding=true)
Constructs a Range Taper with specified minimum and maximum values.
Definition: AAX_CRangeTaperDelegate.h:127
Defines the taper conversion behavior for a parameter.
T GetMaximumValue() const
Returns the taper&#39;s maximum real value.
Definition: AAX_CRangeTaperDelegate.h:106
Classes for conversion to and from normalized parameter values.
Definition: AAX_ITaperDelegate.h:88
double RealToNormalized(T realValue) const
Normalizes a real parameter value.
Definition: AAX_CRangeTaperDelegate.h:239
T ConstrainRealValue(T value) const
Applies a contraint to the value and returns the constrained value.
Definition: AAX_CRangeTaperDelegate.h:200
A piecewise-linear taper conforming to AAX_ITaperDelegate.
Definition: AAX_CRangeTaperDelegate.h:83
T GetMinimumValue() const
Returns the taper&#39;s minimum real value.
Definition: AAX_CRangeTaperDelegate.h:105
AAX_CRangeTaperDelegate< T, RealPrecision > * Clone() const
Constructs and returns a copy of the taper delegate.
Definition: AAX_CRangeTaperDelegate.h:194
T NormalizedToReal(double normalizedValue) const
Converts a normalized value to a real value.
Definition: AAX_CRangeTaperDelegate.h:212
T Round(double iValue) const
Definition: AAX_CRangeTaperDelegate.h:185
T SmartRound(double value) const
Definition: AAX_CRangeTaperDelegate.h:262