Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


BiQuad.h

00001 /***************************************************/
00013 /***************************************************/
00014 
00015 #ifndef STK_BIQUAD_H
00016 #define STK_BIQUAD_H
00017 
00018 #include "Filter.h"
00019 
00020 class BiQuad : protected Filter
00021 {
00022 public:
00023 
00025   BiQuad();
00026 
00028   virtual ~BiQuad();
00029 
00031   void ignoreSampleRateChange( bool ignore = true ) { ignoreSampleRateChange_ = ignore; };
00032 
00034   void clear(void);
00035 
00037   void setB0(StkFloat b0);
00038 
00040   void setB1(StkFloat b1);
00041 
00043   void setB2(StkFloat b2);
00044 
00046   void setA1(StkFloat a1);
00047 
00049   void setA2(StkFloat a2);
00050 
00052 
00063   void setResonance(StkFloat frequency, StkFloat radius, bool normalize = false);
00064 
00066 
00072   void setNotch(StkFloat frequency, StkFloat radius);
00073 
00075 
00081   void setEqualGainZeroes();
00082 
00084 
00088   void setGain(StkFloat gain);
00089 
00091   StkFloat getGain(void) const;
00092 
00094   StkFloat lastOut(void) const;
00095 
00097   virtual StkFloat tick(StkFloat sample);
00098 
00100 
00106   virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
00107 
00108  protected:
00109 
00110   // This function must be implemented in all subclasses. It is used
00111   // to get around a C++ problem with overloaded virtual functions.
00112   virtual StkFloat computeSample( StkFloat input );
00113   virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
00114 };
00115 
00116 inline StkFloat BiQuad :: computeSample( StkFloat input )
00117 {
00118   inputs_[0] = gain_ * input;
00119   outputs_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
00120   outputs_[0] -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
00121   inputs_[2] = inputs_[1];
00122   inputs_[1] = inputs_[0];
00123   outputs_[2] = outputs_[1];
00124   outputs_[1] = outputs_[0];
00125 
00126   return outputs_[0];
00127 }
00128 
00129 inline StkFloat BiQuad :: tick( StkFloat input )
00130 {
00131   return this->computeSample( input );
00132 }
00133 
00134 inline StkFrames& BiQuad :: tick( StkFrames& frames, unsigned int channel )
00135 {
00136   return Filter::tick( frames, channel );
00137 }
00138 
00139 #endif

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