Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
00001 #ifndef STK_PLUCKED_H 00002 #define STK_PLUCKED_H 00003 00004 #include "Instrmnt.h" 00005 #include "DelayA.h" 00006 #include "OneZero.h" 00007 #include "OnePole.h" 00008 #include "Noise.h" 00009 00010 namespace stk { 00011 00012 /***************************************************/ 00032 /***************************************************/ 00033 00034 class Plucked : public Instrmnt 00035 { 00036 public: 00038 Plucked( StkFloat lowestFrequency = 10.0 ); 00039 00041 ~Plucked( void ); 00042 00044 void clear( void ); 00045 00047 void setFrequency( StkFloat frequency ); 00048 00050 void pluck( StkFloat amplitude ); 00051 00053 void noteOn( StkFloat frequency, StkFloat amplitude ); 00054 00056 void noteOff( StkFloat amplitude ); 00057 00059 StkFloat tick( unsigned int channel = 0 ); 00060 00062 00069 StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); 00070 00071 protected: 00072 00073 DelayA delayLine_; 00074 OneZero loopFilter_; 00075 OnePole pickFilter_; 00076 Noise noise_; 00077 00078 StkFloat loopGain_; 00079 }; 00080 00081 inline StkFloat Plucked :: tick( unsigned int ) 00082 { 00083 // Here's the whole inner loop of the instrument!! 00084 return lastFrame_[0] = 3.0 * delayLine_.tick( loopFilter_.tick( delayLine_.lastOut() * loopGain_ ) ); 00085 } 00086 00087 inline StkFrames& Plucked :: tick( StkFrames& frames, unsigned int channel ) 00088 { 00089 unsigned int nChannels = lastFrame_.channels(); 00090 #if defined(_STK_DEBUG_) 00091 if ( channel > frames.channels() - nChannels ) { 00092 oStream_ << "Plucked::tick(): channel and StkFrames arguments are incompatible!"; 00093 handleError( StkError::FUNCTION_ARGUMENT ); 00094 } 00095 #endif 00096 00097 StkFloat *samples = &frames[channel]; 00098 unsigned int j, hop = frames.channels() - nChannels; 00099 if ( nChannels == 1 ) { 00100 for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) 00101 *samples++ = tick(); 00102 } 00103 else { 00104 for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) { 00105 *samples++ = tick(); 00106 for ( j=1; j<nChannels; j++ ) 00107 *samples++ = lastFrame_[j]; 00108 } 00109 } 00110 00111 return frames; 00112 } 00113 00114 } // stk namespace 00115 00116 #endif 00117
The Synthesis ToolKit in C++ (STK) |
©1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |