Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
00001 #ifndef STK_FORMSWEP_H 00002 #define STK_FORMSWEP_H 00003 00004 #include "Filter.h" 00005 00006 namespace stk { 00007 00008 /***************************************************/ 00018 /***************************************************/ 00019 00020 class FormSwep : public Filter 00021 { 00022 public: 00023 00025 FormSwep( void ); 00026 00028 ~FormSwep(); 00029 00031 void ignoreSampleRateChange( bool ignore = true ) { ignoreSampleRateChange_ = ignore; }; 00032 00034 00047 void setResonance( StkFloat frequency, StkFloat radius ); 00048 00050 void setStates( StkFloat frequency, StkFloat radius, StkFloat gain = 1.0 ); 00051 00053 void setTargets( StkFloat frequency, StkFloat radius, StkFloat gain = 1.0 ); 00054 00056 00064 void setSweepRate( StkFloat rate ); 00065 00067 00072 void setSweepTime( StkFloat time ); 00073 00075 StkFloat lastOut( void ) const { return lastFrame_[0]; }; 00076 00078 StkFloat tick( StkFloat input ); 00079 00081 00089 StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); 00090 00092 00100 StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); 00101 00102 protected: 00103 00104 virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate ); 00105 00106 bool dirty_; 00107 StkFloat frequency_; 00108 StkFloat radius_; 00109 StkFloat startFrequency_; 00110 StkFloat startRadius_; 00111 StkFloat startGain_; 00112 StkFloat targetFrequency_; 00113 StkFloat targetRadius_; 00114 StkFloat targetGain_; 00115 StkFloat deltaFrequency_; 00116 StkFloat deltaRadius_; 00117 StkFloat deltaGain_; 00118 StkFloat sweepState_; 00119 StkFloat sweepRate_; 00120 00121 }; 00122 00123 inline StkFloat FormSwep :: tick( StkFloat input ) 00124 { 00125 if ( dirty_ ) { 00126 sweepState_ += sweepRate_; 00127 if ( sweepState_ >= 1.0 ) { 00128 sweepState_ = 1.0; 00129 dirty_ = false; 00130 radius_ = targetRadius_; 00131 frequency_ = targetFrequency_; 00132 gain_ = targetGain_; 00133 } 00134 else { 00135 radius_ = startRadius_ + (deltaRadius_ * sweepState_); 00136 frequency_ = startFrequency_ + (deltaFrequency_ * sweepState_); 00137 gain_ = startGain_ + (deltaGain_ * sweepState_); 00138 } 00139 this->setResonance( frequency_, radius_ ); 00140 } 00141 00142 inputs_[0] = gain_ * input; 00143 lastFrame_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2]; 00144 lastFrame_[0] -= a_[2] * outputs_[2] + a_[1] * outputs_[1]; 00145 inputs_[2] = inputs_[1]; 00146 inputs_[1] = inputs_[0]; 00147 outputs_[2] = outputs_[1]; 00148 outputs_[1] = lastFrame_[0]; 00149 00150 return lastFrame_[0]; 00151 } 00152 00153 inline StkFrames& FormSwep :: tick( StkFrames& frames, unsigned int channel ) 00154 { 00155 #if defined(_STK_DEBUG_) 00156 if ( channel >= frames.channels() ) { 00157 oStream_ << "FormSwep::tick(): channel and StkFrames arguments are incompatible!"; 00158 handleError( StkError::FUNCTION_ARGUMENT ); 00159 } 00160 #endif 00161 00162 StkFloat *samples = &frames[channel]; 00163 unsigned int hop = frames.channels(); 00164 for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) 00165 *samples = tick( *samples ); 00166 00167 return frames; 00168 } 00169 00170 inline StkFrames& FormSwep :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel ) 00171 { 00172 #if defined(_STK_DEBUG_) 00173 if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) { 00174 oStream_ << "FormSwep::tick(): channel and StkFrames arguments are incompatible!"; 00175 handleError( StkError::FUNCTION_ARGUMENT ); 00176 } 00177 #endif 00178 00179 StkFloat *iSamples = &iFrames[iChannel]; 00180 StkFloat *oSamples = &oFrames[oChannel]; 00181 unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); 00182 for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) 00183 *oSamples = tick( *iSamples ); 00184 00185 return iFrames; 00186 } 00187 00188 } // stk namespace 00189 00190 #endif
The Synthesis ToolKit in C++ (STK) |
©1995-2011 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |