Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Asymp.h

00001 #ifndef STK_ASYMP_H
00002 #define STK_ASYMP_H
00003 
00004 #include "Generator.h"
00005 
00006 namespace stk {
00007 
00008 /***************************************************/
00031 /***************************************************/
00032 
00033 const StkFloat TARGET_THRESHOLD = 0.000001;
00034 
00035 class Asymp : public Generator
00036 {
00037  public:
00038 
00040   Asymp( void );
00041 
00043   ~Asymp( void );
00044 
00046   void keyOn( void );
00047 
00049   void keyOff( void );
00050 
00052 
00058   void setTau( StkFloat tau );
00059 
00061   void setTime( StkFloat time );
00062 
00064   void setT60( StkFloat t60 );
00065 
00067   void setTarget( StkFloat target );
00068 
00070   void setValue( StkFloat value );
00071 
00073   int getState( void ) const { return state_; };
00074 
00076   StkFloat lastOut( void ) const { return lastFrame_[0]; };
00077 
00079   StkFloat tick( void );
00080 
00082 
00089   StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
00090 
00091  protected:
00092 
00093   void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
00094 
00095   StkFloat value_;
00096   StkFloat target_;
00097   StkFloat factor_;
00098   StkFloat constant_;
00099   int state_;
00100 };
00101 
00102 inline StkFloat Asymp :: tick( void )
00103 {
00104   if ( state_ ) {
00105 
00106     value_ = factor_ * value_ + constant_;
00107 
00108     // Check threshold.
00109     if ( target_ > value_ ) {
00110       if ( target_ - value_ <= TARGET_THRESHOLD ) {
00111         value_ = target_;
00112         state_ = 0;
00113       }
00114     }
00115     else {
00116       if ( value_ - target_ <= TARGET_THRESHOLD ) {
00117         value_ = target_;
00118         state_ = 0;
00119       }
00120     }
00121     lastFrame_[0] = value_;
00122   }
00123 
00124   return value_;
00125 }
00126 
00127 inline StkFrames& Asymp :: tick( StkFrames& frames, unsigned int channel )
00128 {
00129 #if defined(_STK_DEBUG_)
00130   if ( channel >= frames.channels() ) {
00131     oStream_ << "Asymp::tick(): channel and StkFrames arguments are incompatible!";
00132     handleError( StkError::FUNCTION_ARGUMENT );
00133   }
00134 #endif
00135 
00136   StkFloat *samples = &frames[channel];
00137   unsigned int hop = frames.channels();
00138   for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
00139     *samples = Asymp::tick();
00140 
00141   return frames;
00142 }
00143 
00144 } // stk namespace
00145 
00146 #endif

The Synthesis ToolKit in C++ (STK)
©1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.