Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial

# FormSwep.h

    00001 #ifndef STK_FORMSWEP_H
    00002 #define STK_FORMSWEP_H
    00003
    00004 #include "Filter.h"
    00005
    00006 namespace stk {
    00007
    00008 /***************************************************/
    00018 /***************************************************/
    00019
    00020 class FormSwep : public Filter
    00021 {
    00022  public:
    00023
    00025   FormSwep( void );
    00026
    00028   ~FormSwep();
    00029
    00031   void ignoreSampleRateChange( bool ignore = true ) { ignoreSampleRateChange_ = ignore; };
    00032
    00034
    00045   void setResonance( StkFloat frequency, StkFloat radius );
    00046
    00048   void setStates( StkFloat frequency, StkFloat radius, StkFloat gain = 1.0 );
    00049
    00051   void setTargets( StkFloat frequency, StkFloat radius, StkFloat gain = 1.0 );
    00052
    00054
    00062   void setSweepRate( StkFloat rate );
    00063
    00065
    00070   void setSweepTime( StkFloat time );
    00071
    00073   StkFloat lastOut( void ) const { return lastFrame_[0]; };
    00074
    00076   StkFloat tick( StkFloat input );
    00077
    00079
    00087   StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
    00088
    00090
    00098   StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
    00099
    00100  protected:
    00101
    00102   virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
    00103
    00104   bool dirty_;
    00105   StkFloat frequency_;
    00106   StkFloat radius_;
    00107   StkFloat startFrequency_;
    00108   StkFloat startRadius_;
    00109   StkFloat startGain_;
    00110   StkFloat targetFrequency_;
    00111   StkFloat targetRadius_;
    00112   StkFloat targetGain_;
    00113   StkFloat deltaFrequency_;
    00114   StkFloat deltaRadius_;
    00115   StkFloat deltaGain_;
    00116   StkFloat sweepState_;
    00117   StkFloat sweepRate_;
    00118
    00119 };
    00120
    00121 inline StkFloat FormSwep :: tick( StkFloat input )
    00122 {
    00123   if ( dirty_ )  {
    00124     sweepState_ += sweepRate_;
    00125     if ( sweepState_ >= 1.0 )   {
    00126       sweepState_ = 1.0;
    00127       dirty_ = false;
    00128       radius_ = targetRadius_;
    00129       frequency_ = targetFrequency_;
    00130       gain_ = targetGain_;
    00131     }
    00132     else {
    00133       radius_ = startRadius_ + (deltaRadius_ * sweepState_);
    00134       frequency_ = startFrequency_ + (deltaFrequency_ * sweepState_);
    00135       gain_ = startGain_ + (deltaGain_ * sweepState_);
    00136     }
    00137     this->setResonance( frequency_, radius_ );
    00138   }
    00139
    00140   inputs_[0] = gain_ * input;
    00141   lastFrame_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
    00142   lastFrame_[0] -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
    00143   inputs_[2] = inputs_[1];
    00144   inputs_[1] = inputs_[0];
    00145   outputs_[2] = outputs_[1];
    00146   outputs_[1] = lastFrame_[0];
    00147
    00148   return lastFrame_[0];
    00149 }
    00150
    00151 inline StkFrames& FormSwep :: tick( StkFrames& frames, unsigned int channel )
    00152 {
    00153 #if defined(_STK_DEBUG_)
    00154   if ( channel >= frames.channels() ) {
    00155     errorString_ << "FormSwep::tick(): channel and StkFrames arguments are incompatible!";
    00156     handleError( StkError::FUNCTION_ARGUMENT );
    00157   }
    00158 #endif
    00159
    00160   StkFloat *samples = &frames[channel];
    00161   unsigned int hop = frames.channels();
    00162   for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
    00163     *samples = tick( *samples );
    00164
    00165   return frames;
    00166 }
    00167
    00168 inline StkFrames& FormSwep :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
    00169 {
    00170 #if defined(_STK_DEBUG_)
    00171   if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
    00172     errorString_ << "FormSwep::tick(): channel and StkFrames arguments are incompatible!";
    00173     handleError( StkError::FUNCTION_ARGUMENT );
    00174   }
    00175 #endif
    00176
    00177   StkFloat *iSamples = &iFrames[iChannel];
    00178   StkFloat *oSamples = &oFrames[oChannel];
    00179   unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
    00180   for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop )
    00181     *oSamples = tick( *iSamples );
    00182
    00183   return iFrames;
    00184 }
    00185
    00186 } // stk namespace
    00187
    00188 #endif

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