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     errorString_ << "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     errorString_ << "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-2010 Perry R. Cook and Gary P. Scavone. All Rights Reserved.