Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
00001 #ifndef STK_BOWED_H 00002 #define STK_BOWED_H 00003 00004 #include "Instrmnt.h" 00005 #include "DelayL.h" 00006 #include "BowTable.h" 00007 #include "OnePole.h" 00008 #include "BiQuad.h" 00009 #include "SineWave.h" 00010 #include "ADSR.h" 00011 00012 namespace stk { 00013 00014 /***************************************************/ 00035 /***************************************************/ 00036 00037 class Bowed : public Instrmnt 00038 { 00039 public: 00041 Bowed( StkFloat lowestFrequency ); 00042 00044 ~Bowed( void ); 00045 00047 void clear( void ); 00048 00050 void setFrequency( StkFloat frequency ); 00051 00053 void setVibrato( StkFloat gain ); 00054 00056 void startBowing( StkFloat amplitude, StkFloat rate ); 00057 00059 void stopBowing( StkFloat rate ); 00060 00062 void noteOn( StkFloat frequency, StkFloat amplitude ); 00063 00065 void noteOff( StkFloat amplitude ); 00066 00068 void controlChange( int number, StkFloat value ); 00069 00071 StkFloat tick( unsigned int channel = 0 ); 00072 00073 protected: 00074 00075 DelayL neckDelay_; 00076 DelayL bridgeDelay_; 00077 BowTable bowTable_; 00078 OnePole stringFilter_; 00079 BiQuad bodyFilter_; 00080 SineWave vibrato_; 00081 ADSR adsr_; 00082 StkFloat maxVelocity_; 00083 StkFloat baseDelay_; 00084 StkFloat vibratoGain_; 00085 StkFloat betaRatio_; 00086 00087 }; 00088 00089 inline StkFloat Bowed :: tick( unsigned int ) 00090 { 00091 StkFloat bowVelocity = maxVelocity_ * adsr_.tick(); 00092 StkFloat bridgeRefl = -stringFilter_.tick( bridgeDelay_.lastOut() ); 00093 StkFloat nutRefl = -neckDelay_.lastOut(); 00094 StkFloat stringVel = bridgeRefl + nutRefl; // Sum is string velocity 00095 StkFloat velDiff = bowVelocity - stringVel; // Differential velocity 00096 StkFloat newVel = velDiff * bowTable_.tick( velDiff ); // Non-Linear bow function 00097 neckDelay_.tick(bridgeRefl + newVel); // Do string propagations 00098 bridgeDelay_.tick(nutRefl + newVel); 00099 00100 if ( vibratoGain_ > 0.0 ) { 00101 neckDelay_.setDelay( (baseDelay_ * (1.0 - betaRatio_) ) + 00102 (baseDelay_ * vibratoGain_ * vibrato_.tick()) ); 00103 } 00104 00105 lastFrame_[0] = bodyFilter_.tick( bridgeDelay_.lastOut() ); 00106 00107 return lastFrame_[0]; 00108 } 00109 00110 } // stk namespace 00111 00112 #endif
The Synthesis ToolKit in C++ (STK) |
©1995-2010 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |