Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial

# PitShift.h

    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.