Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
00001 #ifndef STK_DELAY_H 00002 #define STK_DELAY_H 00003 00004 #include "Filter.h" 00005 00006 namespace stk { 00007 00008 /***************************************************/ 00022 /***************************************************/ 00023 00024 class Delay : public Filter 00025 { 00026 public: 00027 00029 00034 Delay( unsigned long delay = 0, unsigned long maxDelay = 4095 ); 00035 00037 ~Delay(); 00038 00040 00047 void setMaximumDelay( unsigned long delay ); 00048 00050 00053 void setDelay( unsigned long delay ); 00054 00056 unsigned long getDelay( void ) const { return delay_; }; 00057 00059 00064 StkFloat contentsAt( unsigned long tapDelay ); 00065 00067 00072 StkFloat addTo( unsigned long tapDelay, StkFloat value ); 00073 00075 StkFloat lastOut( void ) const { return lastFrame_[0]; }; 00076 00078 00081 StkFloat nextOut( void ) { return inputs_[outPoint_]; }; 00082 00084 StkFloat energy( void ) const; 00085 00087 StkFloat tick( StkFloat input ); 00088 00090 00098 StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); 00099 00101 00109 StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); 00110 00111 protected: 00112 00113 unsigned long inPoint_; 00114 unsigned long outPoint_; 00115 unsigned long delay_; 00116 }; 00117 00118 inline StkFloat Delay :: tick( StkFloat input ) 00119 { 00120 inputs_[inPoint_++] = input * gain_; 00121 00122 // Check for end condition 00123 if ( inPoint_ == inputs_.size() ) 00124 inPoint_ = 0; 00125 00126 // Read out next value 00127 lastFrame_[0] = inputs_[outPoint_++]; 00128 00129 if ( outPoint_ == inputs_.size() ) 00130 outPoint_ = 0; 00131 00132 return lastFrame_[0]; 00133 } 00134 00135 inline StkFrames& Delay :: tick( StkFrames& frames, unsigned int channel ) 00136 { 00137 #if defined(_STK_DEBUG_) 00138 if ( channel >= frames.channels() ) { 00139 errorString_ << "Delay::tick(): channel and StkFrames arguments are incompatible!"; 00140 handleError( StkError::FUNCTION_ARGUMENT ); 00141 } 00142 #endif 00143 00144 StkFloat *samples = &frames[channel]; 00145 unsigned int hop = frames.channels(); 00146 for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) { 00147 inputs_[inPoint_++] = *samples * gain_; 00148 if ( inPoint_ == inputs_.size() ) inPoint_ = 0; 00149 *samples = inputs_[outPoint_++]; 00150 if ( outPoint_ == inputs_.size() ) outPoint_ = 0; 00151 } 00152 00153 lastFrame_[0] = *(samples-hop); 00154 return frames; 00155 } 00156 00157 inline StkFrames& Delay :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel ) 00158 { 00159 #if defined(_STK_DEBUG_) 00160 if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) { 00161 errorString_ << "Delay::tick(): channel and StkFrames arguments are incompatible!"; 00162 handleError( StkError::FUNCTION_ARGUMENT ); 00163 } 00164 #endif 00165 00166 StkFloat *iSamples = &iFrames[iChannel]; 00167 StkFloat *oSamples = &oFrames[oChannel]; 00168 unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); 00169 for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) { 00170 inputs_[inPoint_++] = *iSamples * gain_; 00171 if ( inPoint_ == inputs_.size() ) inPoint_ = 0; 00172 *oSamples = inputs_[outPoint_++]; 00173 if ( outPoint_ == inputs_.size() ) outPoint_ = 0; 00174 } 00175 00176 lastFrame_[0] = *(oSamples-oHop); 00177 return iFrames; 00178 } 00179 00180 } // stk namespace 00181 00182 #endif
The Synthesis ToolKit in C++ (STK) |
©1995-2010 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |