Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
00001 #ifndef STK_BRASS_H 00002 #define STK_BRASS_H 00003 00004 #include "Instrmnt.h" 00005 #include "DelayA.h" 00006 #include "BiQuad.h" 00007 #include "PoleZero.h" 00008 #include "ADSR.h" 00009 #include "SineWave.h" 00010 00011 namespace stk { 00012 00013 /***************************************************/ 00033 /***************************************************/ 00034 00035 class Brass: public Instrmnt 00036 { 00037 public: 00039 00042 Brass( StkFloat lowestFrequency ); 00043 00045 ~Brass( ); 00046 00048 void clear( ); 00049 00051 void setFrequency( StkFloat frequency ); 00052 00054 void setLip( StkFloat frequency ); 00055 00057 void startBlowing( StkFloat amplitude, StkFloat rate ); 00058 00060 void stopBlowing( StkFloat rate ); 00061 00063 void noteOn( StkFloat frequency, StkFloat amplitude ); 00064 00066 void noteOff( StkFloat amplitude ); 00067 00069 void controlChange( int number, StkFloat value ); 00070 00072 StkFloat tick( unsigned int channel = 0 ); 00073 00074 protected: 00075 00076 DelayA delayLine_; 00077 BiQuad lipFilter_; 00078 PoleZero dcBlock_; 00079 ADSR adsr_; 00080 SineWave vibrato_; 00081 unsigned long length_; 00082 StkFloat lipTarget_; 00083 StkFloat slideTarget_; 00084 StkFloat vibratoGain_; 00085 StkFloat maxPressure_; 00086 00087 }; 00088 00089 inline StkFloat Brass :: tick( unsigned int ) 00090 { 00091 StkFloat breathPressure = maxPressure_ * adsr_.tick(); 00092 breathPressure += vibratoGain_ * vibrato_.tick(); 00093 00094 StkFloat mouthPressure = 0.3 * breathPressure; 00095 StkFloat borePressure = 0.85 * delayLine_.lastOut(); 00096 StkFloat deltaPressure = mouthPressure - borePressure; // Differential pressure. 00097 deltaPressure = lipFilter_.tick( deltaPressure ); // Force - > position. 00098 deltaPressure *= deltaPressure; // Basic position to area mapping. 00099 if ( deltaPressure > 1.0 ) deltaPressure = 1.0; // Non-linear saturation. 00100 00101 // The following input scattering assumes the mouthPressure = area. 00102 lastFrame_[0] = deltaPressure * mouthPressure + ( 1.0 - deltaPressure) * borePressure; 00103 lastFrame_[0] = delayLine_.tick( dcBlock_.tick( lastFrame_[0] ) ); 00104 00105 return lastFrame_[0]; 00106 } 00107 00108 } // stk namespace 00109 00110 #endif
The Synthesis ToolKit in C++ (STK) |
©1995-2010 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |