Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
00001 #ifndef STK_JCREV_H 00002 #define STK_JCREV_H 00003 00004 #include "Effect.h" 00005 #include "Delay.h" 00006 #include "OnePole.h" 00007 00008 namespace stk { 00009 00010 /***************************************************/ 00029 /***************************************************/ 00030 00031 class JCRev : public Effect 00032 { 00033 public: 00035 JCRev( StkFloat T60 = 1.0 ); 00036 00038 void clear( void ); 00039 00041 void setT60( StkFloat T60 ); 00042 00044 00052 StkFloat lastOut( unsigned int channel = 0 ); 00053 00055 00062 StkFloat tick( StkFloat input, unsigned int channel = 0 ); 00063 00065 00074 StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); 00075 00077 00086 StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); 00087 00088 protected: 00089 00090 Delay allpassDelays_[3]; 00091 Delay combDelays_[4]; 00092 OnePole combFilters_[4]; 00093 Delay outLeftDelay_; 00094 Delay outRightDelay_; 00095 StkFloat allpassCoefficient_; 00096 StkFloat combCoefficient_[4]; 00097 00098 }; 00099 00100 inline StkFloat JCRev :: lastOut( unsigned int channel ) 00101 { 00102 #if defined(_STK_DEBUG_) 00103 if ( channel > 1 ) { 00104 oStream_ << "JCRev::lastOut(): channel argument must be less than 2!"; 00105 handleError( StkError::FUNCTION_ARGUMENT ); 00106 } 00107 #endif 00108 00109 return lastFrame_[channel]; 00110 } 00111 00112 inline StkFloat JCRev :: tick( StkFloat input, unsigned int channel ) 00113 { 00114 #if defined(_STK_DEBUG_) 00115 if ( channel > 1 ) { 00116 oStream_ << "JCRev::tick(): channel argument must be less than 2!"; 00117 handleError( StkError::FUNCTION_ARGUMENT ); 00118 } 00119 #endif 00120 00121 StkFloat temp, temp0, temp1, temp2, temp3, temp4, temp5, temp6; 00122 StkFloat filtout; 00123 00124 temp = allpassDelays_[0].lastOut(); 00125 temp0 = allpassCoefficient_ * temp; 00126 temp0 += input; 00127 allpassDelays_[0].tick(temp0); 00128 temp0 = -(allpassCoefficient_ * temp0) + temp; 00129 00130 temp = allpassDelays_[1].lastOut(); 00131 temp1 = allpassCoefficient_ * temp; 00132 temp1 += temp0; 00133 allpassDelays_[1].tick(temp1); 00134 temp1 = -(allpassCoefficient_ * temp1) + temp; 00135 00136 temp = allpassDelays_[2].lastOut(); 00137 temp2 = allpassCoefficient_ * temp; 00138 temp2 += temp1; 00139 allpassDelays_[2].tick(temp2); 00140 temp2 = -(allpassCoefficient_ * temp2) + temp; 00141 00142 temp3 = temp2 + ( combFilters_[0].tick( combCoefficient_[0] * combDelays_[0].lastOut() ) ); 00143 temp4 = temp2 + ( combFilters_[1].tick( combCoefficient_[1] * combDelays_[1].lastOut() ) ); 00144 temp5 = temp2 + ( combFilters_[2].tick( combCoefficient_[2] * combDelays_[2].lastOut() ) ); 00145 temp6 = temp2 + ( combFilters_[3].tick( combCoefficient_[3] * combDelays_[3].lastOut() ) ); 00146 00147 combDelays_[0].tick(temp3); 00148 combDelays_[1].tick(temp4); 00149 combDelays_[2].tick(temp5); 00150 combDelays_[3].tick(temp6); 00151 00152 filtout = temp3 + temp4 + temp5 + temp6; 00153 00154 lastFrame_[0] = effectMix_ * (outLeftDelay_.tick(filtout)); 00155 lastFrame_[1] = effectMix_ * (outRightDelay_.tick(filtout)); 00156 temp = (1.0 - effectMix_) * input; 00157 lastFrame_[0] += temp; 00158 lastFrame_[1] += temp; 00159 00160 return 0.7 * lastFrame_[channel]; 00161 } 00162 00163 } // stk namespace 00164 00165 #endif 00166
The Synthesis ToolKit in C++ (STK) |
©1995-2011 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |