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