Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial

# JCRev.h

    00001 #ifndef STK_JCREV_H
    00002 #define STK_JCREV_H
    00003
    00004 #include "Effect.h"
    00005 #include "Delay.h"
    00006
    00007 namespace stk {
    00008
    00009 /***************************************************/
    00022 /***************************************************/
    00023
    00024 class JCRev : public Effect
    00025 {
    00026  public:
    00028   JCRev( 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_[3];
    00084   Delay combDelays_[4];
    00085   Delay outLeftDelay_;
    00086   Delay outRightDelay_;
    00087   StkFloat allpassCoefficient_;
    00088   StkFloat combCoefficient_[4];
    00089
    00090 };
    00091
    00092 inline StkFloat JCRev :: lastOut( unsigned int channel )
    00093 {
    00094 #if defined(_STK_DEBUG_)
    00095   if ( channel > 1 ) {
    00096     errorString_ << "JCRev::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 JCRev :: tick( StkFloat input, unsigned int channel )
    00105 {
    00106 #if defined(_STK_DEBUG_)
    00107   if ( channel > 1 ) {
    00108     errorString_ << "JCRev::tick(): channel argument must be less than 2!";
    00109     handleError( StkError::FUNCTION_ARGUMENT );
    00110   }
    00111 #endif
    00112
    00113   StkFloat temp, temp0, temp1, temp2, temp3, temp4, temp5, temp6;
    00114   StkFloat filtout;
    00115
    00116   temp = allpassDelays_[0].lastOut();
    00117   temp0 = allpassCoefficient_ * temp;
    00118   temp0 += input;
    00119   allpassDelays_[0].tick(temp0);
    00120   temp0 = -(allpassCoefficient_ * temp0) + temp;
    00121
    00122   temp = allpassDelays_[1].lastOut();
    00123   temp1 = allpassCoefficient_ * temp;
    00124   temp1 += temp0;
    00125   allpassDelays_[1].tick(temp1);
    00126   temp1 = -(allpassCoefficient_ * temp1) + temp;
    00127
    00128   temp = allpassDelays_[2].lastOut();
    00129   temp2 = allpassCoefficient_ * temp;
    00130   temp2 += temp1;
    00131   allpassDelays_[2].tick(temp2);
    00132   temp2 = -(allpassCoefficient_ * temp2) + temp;
    00133
    00134   temp3 = temp2 + (combCoefficient_[0] * combDelays_[0].lastOut());
    00135   temp4 = temp2 + (combCoefficient_[1] * combDelays_[1].lastOut());
    00136   temp5 = temp2 + (combCoefficient_[2] * combDelays_[2].lastOut());
    00137   temp6 = temp2 + (combCoefficient_[3] * combDelays_[3].lastOut());
    00138
    00139   combDelays_[0].tick(temp3);
    00140   combDelays_[1].tick(temp4);
    00141   combDelays_[2].tick(temp5);
    00142   combDelays_[3].tick(temp6);
    00143
    00144   filtout = temp3 + temp4 + temp5 + temp6;
    00145
    00146   lastFrame_[0] = effectMix_ * (outLeftDelay_.tick(filtout));
    00147   lastFrame_[1] = effectMix_ * (outRightDelay_.tick(filtout));
    00148   temp = (1.0 - effectMix_) * input;
    00149   lastFrame_[0] += temp;
    00150   lastFrame_[1] += temp;
    00151
    00152   return lastFrame_[channel];
    00153 }
    00154
    00155 } // stk namespace
    00156
    00157 #endif
    00158

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