Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial

# TwoPole.h

    00001 #ifndef STK_TWOPOLE_H
    00002 #define STK_TWOPOLE_H
    00003
    00004 #include "Filter.h"
    00005
    00006 namespace stk {
    00007
    00008 /***************************************************/
    00018 /***************************************************/
    00019
    00020 class TwoPole : public Filter
    00021 {
    00022  public:
    00023
    00025   TwoPole( void );
    00026
    00028   ~TwoPole();
    00029
    00031   void ignoreSampleRateChange( bool ignore = true ) { ignoreSampleRateChange_ = ignore; };
    00032
    00034   void setB0( StkFloat b0 ) { b_[0] = b0; };
    00035
    00037   void setA1( StkFloat a1 ) { a_[1] = a1; };
    00038
    00040   void setA2( StkFloat a2 ) { a_[2] = a2; };
    00041
    00043   void setCoefficients( StkFloat b0, StkFloat a1, StkFloat a2, bool clearState = false );
    00044
    00046
    00061   void setResonance(StkFloat frequency, StkFloat radius, bool normalize = false);
    00062
    00064   StkFloat lastOut( void ) const { return lastFrame_[0]; };
    00065
    00067   StkFloat tick( StkFloat input );
    00068
    00070
    00078   StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
    00079
    00081
    00089   StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
    00090
    00091  protected:
    00092
    00093   virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
    00094 };
    00095
    00096 inline StkFloat TwoPole :: tick( StkFloat input )
    00097 {
    00098   inputs_[0] = gain_ * input;
    00099   lastFrame_[0] = b_[0] * inputs_[0] - a_[1] * outputs_[1] - a_[2] * outputs_[2];
    00100   outputs_[2] = outputs_[1];
    00101   outputs_[1] = lastFrame_[0];
    00102
    00103   return lastFrame_[0];
    00104 }
    00105
    00106 inline StkFrames& TwoPole :: tick( StkFrames& frames, unsigned int channel )
    00107 {
    00108 #if defined(_STK_DEBUG_)
    00109   if ( channel >= frames.channels() ) {
    00110     oStream_ << "TwoPole::tick(): channel and StkFrames arguments are incompatible!";
    00111     handleError( StkError::FUNCTION_ARGUMENT );
    00112   }
    00113 #endif
    00114
    00115   StkFloat *samples = &frames[channel];
    00116   unsigned int hop = frames.channels();
    00117   for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
    00118     inputs_[0] = gain_ * *samples;
    00119     *samples = b_[0] * inputs_[0] - a_[1] * outputs_[1] - a_[2] * outputs_[2];
    00120     outputs_[2] = outputs_[1];
    00121     outputs_[1] = *samples;
    00122   }
    00123
    00124   lastFrame_[0] = outputs_[1];
    00125   return frames;
    00126 }
    00127
    00128 inline StkFrames& TwoPole :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
    00129 {
    00130 #if defined(_STK_DEBUG_)
    00131   if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
    00132     oStream_ << "TwoPole::tick(): channel and StkFrames arguments are incompatible!";
    00133     handleError( StkError::FUNCTION_ARGUMENT );
    00134   }
    00135 #endif
    00136
    00137   StkFloat *iSamples = &iFrames[iChannel];
    00138   StkFloat *oSamples = &oFrames[oChannel];
    00139   unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
    00140   for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
    00141     inputs_[0] = gain_ * *iSamples;
    00142     *oSamples = b_[0] * inputs_[0] - a_[1] * outputs_[1] - a_[2] * outputs_[2];
    00143     outputs_[2] = outputs_[1];
    00144     outputs_[1] = *oSamples;
    00145   }
    00146
    00147   lastFrame_[0] = outputs_[1];
    00148   return iFrames;
    00149 }
    00150
    00151 } // stk namespace
    00152
    00153 #endif

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