Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
00001 #ifndef STK_CHORUS_H 00002 #define STK_CHORUS_H 00003 00004 #include "Effect.h" 00005 #include "DelayL.h" 00006 #include "SineWave.h" 00007 00008 namespace stk { 00009 00010 /***************************************************/ 00019 /***************************************************/ 00020 00021 class Chorus : public Effect 00022 { 00023 public: 00025 00028 Chorus( StkFloat baseDelay = 6000 ); 00029 00031 void clear( void ); 00032 00034 void setModDepth( StkFloat depth ) { modDepth_ = depth; }; 00035 00037 void setModFrequency( StkFloat frequency ); 00038 00040 00048 StkFloat lastOut( unsigned int channel = 0 ); 00049 00051 00058 StkFloat tick( StkFloat input, unsigned int channel = 0 ); 00059 00061 00070 StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); 00071 00073 00082 StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); 00083 00084 protected: 00085 00086 DelayL delayLine_[2]; 00087 SineWave mods_[2]; 00088 StkFloat baseLength_; 00089 StkFloat modDepth_; 00090 00091 }; 00092 00093 inline StkFloat Chorus :: lastOut( unsigned int channel ) 00094 { 00095 #if defined(_STK_DEBUG_) 00096 if ( channel > 1 ) { 00097 errorString_ << "Chorus::lastOut(): channel argument must be less than 2!"; 00098 handleError( StkError::FUNCTION_ARGUMENT ); 00099 } 00100 #endif 00101 00102 return lastFrame_[channel]; 00103 } 00104 00105 inline StkFloat Chorus :: tick( StkFloat input, unsigned int channel ) 00106 { 00107 #if defined(_STK_DEBUG_) 00108 if ( channel > 1 ) { 00109 errorString_ << "Chorus::tick(): channel argument must be less than 2!"; 00110 handleError( StkError::FUNCTION_ARGUMENT ); 00111 } 00112 #endif 00113 00114 delayLine_[0].setDelay( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].tick() ) ); 00115 delayLine_[1].setDelay( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].tick() ) ); 00116 lastFrame_[0] = effectMix_ * ( delayLine_[0].tick( input ) - input ) + input; 00117 lastFrame_[1] = effectMix_ * ( delayLine_[1].tick( input ) - input ) + input; 00118 return lastFrame_[channel]; 00119 } 00120 00121 inline StkFrames& Chorus :: tick( StkFrames& frames, unsigned int channel ) 00122 { 00123 #if defined(_STK_DEBUG_) 00124 if ( channel >= frames.channels() - 1 ) { 00125 errorString_ << "Chorus::tick(): channel and StkFrames arguments are incompatible!"; 00126 handleError( StkError::FUNCTION_ARGUMENT ); 00127 } 00128 #endif 00129 00130 StkFloat *samples = &frames[channel]; 00131 unsigned int hop = frames.channels() - 1; 00132 for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) { 00133 *samples = effectMix_ * ( delayLine_[0].tick( *samples ) - *samples ) + *samples; 00134 samples++; 00135 *samples = effectMix_ * ( delayLine_[1].tick( *samples ) - *samples ) + *samples; 00136 } 00137 00138 lastFrame_[0] = *(samples-hop); 00139 lastFrame_[1] = *(samples-hop+1); 00140 return frames; 00141 } 00142 00143 inline StkFrames& Chorus :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel ) 00144 { 00145 #if defined(_STK_DEBUG_) 00146 if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() - 1 ) { 00147 errorString_ << "Chorus::tick(): channel and StkFrames arguments are incompatible!"; 00148 handleError( StkError::FUNCTION_ARGUMENT ); 00149 } 00150 #endif 00151 00152 StkFloat *iSamples = &iFrames[iChannel]; 00153 StkFloat *oSamples = &oFrames[oChannel]; 00154 unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); 00155 for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) { 00156 *oSamples++ = effectMix_ * ( delayLine_[0].tick( *iSamples ) - *iSamples ) + *iSamples; 00157 *oSamples = effectMix_ * ( delayLine_[1].tick( *iSamples ) - *iSamples ) + *iSamples; 00158 } 00159 00160 lastFrame_[0] = *(oSamples-oHop); 00161 lastFrame_[1] = *(oSamples-oHop+1); 00162 return iFrames; 00163 } 00164 00165 } // stk namespace 00166 00167 #endif 00168
The Synthesis ToolKit in C++ (STK) |
©1995-2010 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |