Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial

# NRev.h

    00001 #ifndef STK_NREV_H
    00002 #define STK_NREV_H
    00003
    00004 #include "Effect.h"
    00005 #include "Delay.h"
    00006
    00007 namespace stk {
    00008
    00009 /***************************************************/
    00023 /***************************************************/
    00024
    00025 class NRev : public Effect
    00026 {
    00027  public:
    00029   NRev( StkFloat T60 = 1.0 );
    00030
    00032   void clear( void );
    00033
    00035   void setT60( StkFloat T60 );
    00036
    00038
    00046   StkFloat lastOut( unsigned int channel = 0 );
    00047
    00049
    00056   StkFloat tick( StkFloat input, unsigned int channel = 0 );
    00057
    00059
    00068   StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
    00069
    00071
    00080   StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
    00081
    00082  protected:
    00083
    00084   Delay allpassDelays_[8];
    00085   Delay combDelays_[6];
    00086   StkFloat allpassCoefficient_;
    00087   StkFloat combCoefficient_[6];
    00088          StkFloat lowpassState_;
    00089
    00090 };
    00091
    00092 inline StkFloat NRev :: lastOut( unsigned int channel )
    00093 {
    00094 #if defined(_STK_DEBUG_)
    00095   if ( channel > 1 ) {
    00096     errorString_ << "NRev::lastOut(): channel argument must be less than 2!";
    00097     handleError( StkError::FUNCTION_ARGUMENT );
    00098   }
    00099 #endif
    00100
    00101   return lastFrame_[channel];
    00102 }
    00103
    00104 inline StkFloat NRev :: tick( StkFloat input, unsigned int channel )
    00105 {
    00106 #if defined(_STK_DEBUG_)
    00107   if ( channel > 1 ) {
    00108     errorString_ << "NRev::tick(): channel argument must be less than 2!";
    00109     handleError( StkError::FUNCTION_ARGUMENT );
    00110   }
    00111 #endif
    00112
    00113   StkFloat temp, temp0, temp1, temp2, temp3;
    00114   int i;
    00115
    00116   temp0 = 0.0;
    00117   for ( i=0; i<6; i++ ) {
    00118     temp = input + (combCoefficient_[i] * combDelays_[i].lastOut());
    00119     temp0 += combDelays_[i].tick(temp);
    00120   }
    00121
    00122   for ( i=0; i<3; i++ )    {
    00123     temp = allpassDelays_[i].lastOut();
    00124     temp1 = allpassCoefficient_ * temp;
    00125     temp1 += temp0;
    00126     allpassDelays_[i].tick(temp1);
    00127     temp0 = -(allpassCoefficient_ * temp1) + temp;
    00128   }
    00129
    00130          // One-pole lowpass filter.
    00131   lowpassState_ = 0.7 * lowpassState_ + 0.3 * temp0;
    00132   temp = allpassDelays_[3].lastOut();
    00133   temp1 = allpassCoefficient_ * temp;
    00134   temp1 += lowpassState_;
    00135   allpassDelays_[3].tick( temp1 );
    00136   temp1 = -( allpassCoefficient_ * temp1 ) + temp;
    00137
    00138   temp = allpassDelays_[4].lastOut();
    00139   temp2 = allpassCoefficient_ * temp;
    00140   temp2 += temp1;
    00141   allpassDelays_[4].tick( temp2 );
    00142   lastFrame_[0] = effectMix_*( -( allpassCoefficient_ * temp2 ) + temp );
    00143
    00144   temp = allpassDelays_[5].lastOut();
    00145   temp3 = allpassCoefficient_ * temp;
    00146   temp3 += temp1;
    00147   allpassDelays_[5].tick( temp3 );
    00148   lastFrame_[1] = effectMix_*( - ( allpassCoefficient_ * temp3 ) + temp );
    00149
    00150   temp = ( 1.0 - effectMix_ ) * input;
    00151   lastFrame_[0] += temp;
    00152   lastFrame_[1] += temp;
    00153
    00154   return lastFrame_[channel];
    00155 }
    00156
    00157 } // stk namespace
    00158
    00159 #endif
    00160

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