The Synthesis ToolKit in C++ (STK)

Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial

# PRCRev.h

    00001 #ifndef STK_PRCREV_H
    00002 #define STK_PRCREV_H
    00003
    00004 #include "Effect.h"
    00005 #include "Delay.h"
    00006
    00007 namespace stk {
    00008
    00009 /***************************************************/
    00022 /***************************************************/
    00023
    00024 class PRCRev : public Effect
    00025 {
    00026 public:
    00028   PRCRev( StkFloat T60 = 1.0 );
    00029
    00031   void clear( void );
    00032
    00034   void setT60( StkFloat T60 );
    00035
    00037
    00045   StkFloat lastOut( unsigned int channel = 0 );
    00046
    00048
    00055   StkFloat tick( StkFloat input, unsigned int channel = 0 );
    00056
    00058
    00067   StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
    00068
    00070
    00079   StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
    00080
    00081 protected:
    00082
    00083   Delay    allpassDelays_[2];
    00084   Delay    combDelays_[2];
    00085   StkFloat allpassCoefficient_;
    00086   StkFloat combCoefficient_[2];
    00087
    00088 };
    00089
    00090 inline StkFloat PRCRev :: lastOut( unsigned int channel )
    00091 {
    00092 #if defined(_STK_DEBUG_)
    00093   if ( channel > 1 ) {
    00094     oStream_ << "PRCRev::lastOut(): channel argument must be less than 2!";
    00095     handleError( StkError::FUNCTION_ARGUMENT );
    00096   }
    00097 #endif
    00098
    00099   return lastFrame_[channel];
    00100 }
    00101
    00102  inline StkFloat PRCRev :: tick( StkFloat input, unsigned int channel )
    00103 {
    00104 #if defined(_STK_DEBUG_)
    00105   if ( channel > 1 ) {
    00106     oStream_ << "PRCRev::tick(): channel argument must be less than 2!";
    00107     handleError( StkError::FUNCTION_ARGUMENT );
    00108   }
    00109 #endif
    00110
    00111   StkFloat temp, temp0, temp1, temp2, temp3;
    00112
    00113   temp = allpassDelays_[0].lastOut();
    00114   temp0 = allpassCoefficient_ * temp;
    00115   temp0 += input;
    00116   allpassDelays_[0].tick(temp0);
    00117   temp0 = -(allpassCoefficient_ * temp0) + temp;
    00118
    00119   temp = allpassDelays_[1].lastOut();
    00120   temp1 = allpassCoefficient_ * temp;
    00121   temp1 += temp0;
    00122   allpassDelays_[1].tick(temp1);
    00123   temp1 = -(allpassCoefficient_ * temp1) + temp;
    00124
    00125   temp2 = temp1 + ( combCoefficient_[0] * combDelays_[0].lastOut() );
    00126   temp3 = temp1 + ( combCoefficient_[1] * combDelays_[1].lastOut() );
    00127
    00128   lastFrame_[0] = effectMix_ * (combDelays_[0].tick(temp2));
    00129   lastFrame_[1] = effectMix_ * (combDelays_[1].tick(temp3));
    00130   temp = (1.0 - effectMix_) * input;
    00131   lastFrame_[0] += temp;
    00132   lastFrame_[1] += temp;
    00133
    00134   return lastFrame_[channel];
    00135 }
    00136
    00137 } // stk namespace
    00138
    00139 #endif
    00140

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