Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
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. |