Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
00001 #ifndef STK_PITSHIFT_H 00002 #define STK_PITSHIFT_H 00003 00004 #include "Effect.h" 00005 #include "DelayL.h" 00006 00007 namespace stk { 00008 00009 /***************************************************/ 00018 /***************************************************/ 00019 00020 const int maxDelay = 5024; 00021 00022 class PitShift : public Effect 00023 { 00024 public: 00026 PitShift( void ); 00027 00029 void clear( void ); 00030 00032 void setShift( StkFloat shift ); 00033 00035 StkFloat lastOut( void ) const { return lastFrame_[0]; }; 00036 00038 StkFloat tick( StkFloat input ); 00039 00041 00049 StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); 00050 00052 00060 StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); 00061 00062 protected: 00063 00064 DelayL delayLine_[2]; 00065 StkFloat delay_[2]; 00066 StkFloat env_[2]; 00067 StkFloat rate_; 00068 unsigned long delayLength_; 00069 unsigned long halfLength_; 00070 00071 }; 00072 00073 inline StkFloat PitShift :: tick( StkFloat input ) 00074 { 00075 // Calculate the two delay length values, keeping them within the 00076 // range 12 to maxDelay-12. 00077 delay_[0] += rate_; 00078 while ( delay_[0] > maxDelay-12 ) delay_[0] -= delayLength_; 00079 while ( delay_[0] < 12 ) delay_[0] += delayLength_; 00080 00081 delay_[1] = delay_[0] + halfLength_; 00082 while ( delay_[1] > maxDelay-12 ) delay_[1] -= delayLength_; 00083 while ( delay_[1] < 12 ) delay_[1] += delayLength_; 00084 00085 // Set the new delay line lengths. 00086 delayLine_[0].setDelay( delay_[0] ); 00087 delayLine_[1].setDelay( delay_[1] ); 00088 00089 // Calculate a triangular envelope. 00090 env_[1] = fabs( ( delay_[0] - halfLength_ + 12 ) * ( 1.0 / (halfLength_ + 12 ) ) ); 00091 env_[0] = 1.0 - env_[1]; 00092 00093 // Delay input and apply envelope. 00094 lastFrame_[0] = env_[0] * delayLine_[0].tick( input ); 00095 lastFrame_[0] += env_[1] * delayLine_[1].tick( input ); 00096 00097 // Compute effect mix and output. 00098 lastFrame_[0] *= effectMix_; 00099 lastFrame_[0] += ( 1.0 - effectMix_ ) * input; 00100 00101 return lastFrame_[0]; 00102 } 00103 00104 } // stk namespace 00105 00106 #endif 00107
The Synthesis ToolKit in C++ (STK) |
©1995-2010 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |