Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
00001 #ifndef STK_MODULATE_H 00002 #define STK_MODULATE_H 00003 00004 #include "Generator.h" 00005 #include "SineWave.h" 00006 #include "Noise.h" 00007 #include "OnePole.h" 00008 00009 namespace stk { 00010 00011 /***************************************************/ 00021 /***************************************************/ 00022 00023 class Modulate : public Generator 00024 { 00025 public: 00027 00030 Modulate( void ); 00031 00033 ~Modulate( void ); 00034 00036 void reset( void ) { lastFrame_[0] = 0.0; }; 00037 00039 void setVibratoRate( StkFloat rate ) { vibrato_.setFrequency( rate ); }; 00040 00042 void setVibratoGain( StkFloat gain ) { vibratoGain_ = gain; }; 00043 00045 void setRandomGain( StkFloat gain ); 00046 00048 StkFloat lastOut( void ) const { return lastFrame_[0]; }; 00049 00051 StkFloat tick( void ); 00052 00054 00061 StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); 00062 00063 protected: 00064 00065 void sampleRateChanged( StkFloat newRate, StkFloat oldRate ); 00066 00067 SineWave vibrato_; 00068 Noise noise_; 00069 OnePole filter_; 00070 StkFloat vibratoGain_; 00071 StkFloat randomGain_; 00072 unsigned int noiseRate_; 00073 unsigned int noiseCounter_; 00074 00075 }; 00076 00077 inline StkFloat Modulate :: tick( void ) 00078 { 00079 // Compute periodic and random modulations. 00080 lastFrame_[0] = vibratoGain_ * vibrato_.tick(); 00081 if ( noiseCounter_++ >= noiseRate_ ) { 00082 noise_.tick(); 00083 noiseCounter_ = 0; 00084 } 00085 lastFrame_[0] += filter_.tick( noise_.lastOut() ); 00086 return lastFrame_[0]; 00087 } 00088 00089 inline StkFrames& Modulate :: tick( StkFrames& frames, unsigned int channel ) 00090 { 00091 #if defined(_STK_DEBUG_) 00092 if ( channel >= frames.channels() ) { 00093 errorString_ << "Modulate::tick(): channel and StkFrames arguments are incompatible!"; 00094 handleError( StkError::FUNCTION_ARGUMENT ); 00095 } 00096 #endif 00097 00098 StkFloat *samples = &frames[channel]; 00099 unsigned int hop = frames.channels(); 00100 for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) 00101 *samples = Modulate::tick(); 00102 00103 return frames; 00104 } 00105 00106 } // stk namespace 00107 00108 #endif
The Synthesis ToolKit in C++ (STK) |
©1995-2010 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |