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 setTarget( StkFloat target );
00065 
00067   void setValue( StkFloat value );
00068 
00070   int getState( void ) const { return state_; };
00071 
00073   StkFloat lastOut( void ) const { return lastFrame_[0]; };
00074 
00076   StkFloat tick( void );
00077 
00079 
00086   StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
00087 
00088  protected:
00089 
00090   void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
00091 
00092   StkFloat value_;
00093   StkFloat target_;
00094   StkFloat factor_;
00095   StkFloat constant_;
00096   int state_;
00097 };
00098 
00099 inline StkFloat Asymp :: tick( void )
00100 {
00101   if ( state_ ) {
00102 
00103     value_ = factor_ * value_ + constant_;
00104 
00105     // Check threshold.
00106     if ( target_ > value_ ) {
00107       if ( target_ - value_ <= TARGET_THRESHOLD ) {
00108         value_ = target_;
00109         state_ = 0;
00110       }
00111     }
00112     else {
00113       if ( value_ - target_ <= TARGET_THRESHOLD ) {
00114         value_ = target_;
00115         state_ = 0;
00116       }
00117     }
00118     lastFrame_[0] = value_;
00119   }
00120 
00121   return value_;
00122 }
00123 
00124 inline StkFrames& Asymp :: tick( StkFrames& frames, unsigned int channel )
00125 {
00126 #if defined(_STK_DEBUG_)
00127   if ( channel >= frames.channels() ) {
00128     errorString_ << "Asymp::tick(): channel and StkFrames arguments are incompatible!";
00129     handleError( StkError::FUNCTION_ARGUMENT );
00130   }
00131 #endif
00132 
00133   StkFloat *samples = &frames[channel];
00134   unsigned int hop = frames.channels();
00135   for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
00136     *samples = Asymp::tick();
00137 
00138   return frames;
00139 }
00140 
00141 } // stk namespace
00142 
00143 #endif

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