Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial

# SineWave.h

    00001 #ifndef STK_SINEWAVE_H
    00002 #define STK_SINEWAVE_H
    00003
    00004 const unsigned long TABLE_SIZE = 2048;
    00005
    00006 #include "Generator.h"
    00007
    00008 namespace stk {
    00009
    00010 /***************************************************/
    00023 /***************************************************/
    00024
    00025 class SineWave : public Generator
    00026 {
    00027 public:
    00029   SineWave( void );
    00030
    00032   ~SineWave( void );
    00033
    00035   void reset( void );
    00036
    00038
    00041   void setRate( StkFloat rate ) { rate_ = rate; };
    00042
    00044
    00050   void setFrequency( StkFloat frequency );
    00051
    00053   void addTime( StkFloat time );
    00054
    00056
    00061   void addPhase( StkFloat phase );
    00062
    00064
    00068   void addPhaseOffset( StkFloat phaseOffset );
    00069
    00071   StkFloat lastOut( void ) const { return lastFrame_[0]; };
    00072
    00074   StkFloat tick( void );
    00075
    00077
    00084   StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
    00085
    00086 protected:
    00087
    00088   void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
    00089
    00090   static StkFrames table_;
    00091   StkFloat time_;
    00092   StkFloat rate_;
    00093   StkFloat phaseOffset_;
    00094   unsigned int iIndex_;
    00095   StkFloat alpha_;
    00096
    00097 };
    00098
    00099 inline StkFloat SineWave :: tick( void )
    00100 {
    00101   // Check limits of time address ... if necessary, recalculate modulo
    00102   // TABLE_SIZE.
    00103   while ( time_ < 0.0 )
    00104     time_ += TABLE_SIZE;
    00105   while ( time_ >= TABLE_SIZE )
    00106     time_ -= TABLE_SIZE;
    00107
    00108   iIndex_ = (unsigned int) time_;
    00109   alpha_ = time_ - iIndex_;
    00110   StkFloat tmp = table_[ iIndex_ ];
    00111   tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) );
    00112
    00113   // Increment time, which can be negative.
    00114   time_ += rate_;
    00115
    00116   lastFrame_[0] = tmp;
    00117   return lastFrame_[0];
    00118 }
    00119
    00120 inline StkFrames& SineWave :: tick( StkFrames& frames, unsigned int channel )
    00121 {
    00122 #if defined(_STK_DEBUG_)
    00123   if ( channel >= frames.channels() ) {
    00124     errorString_ << "SineWave::tick(): channel and StkFrames arguments are incompatible!";
    00125     handleError( StkError::FUNCTION_ARGUMENT );
    00126   }
    00127 #endif
    00128
    00129   StkFloat *samples = &frames[channel];
    00130   StkFloat tmp = 0.0;
    00131
    00132   unsigned int hop = frames.channels();
    00133   for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
    00134
    00135     // Check limits of time address ... if necessary, recalculate modulo
    00136     // TABLE_SIZE.
    00137     while ( time_ < 0.0 )
    00138       time_ += TABLE_SIZE;
    00139     while ( time_ >= TABLE_SIZE )
    00140       time_ -= TABLE_SIZE;
    00141
    00142     iIndex_ = (unsigned int) time_;
    00143     alpha_ = time_ - iIndex_;
    00144     tmp = table_[ iIndex_ ];
    00145     tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) );
    00146     *samples = tmp;
    00147
    00148     // Increment time, which can be negative.
    00149     time_ += rate_;
    00150   }
    00151
    00152   lastFrame_[0] = tmp;
    00153   return frames;
    00154 }
    00155
    00156 } // stk namespace
    00157
    00158 #endif
    00159

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