Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
00001 #ifndef STK_BOWTABL_H 00002 #define STK_BOWTABL_H 00003 00004 #include "Function.h" 00005 #include <cmath> 00006 00007 namespace stk { 00008 00009 /***************************************************/ 00018 /***************************************************/ 00019 00020 class BowTable : public Function 00021 { 00022 public: 00024 BowTable( void ) : offset_(0.0), slope_(0.1) {}; 00025 00027 00033 void setOffset( StkFloat offset ) { offset_ = offset; }; 00034 00036 00040 void setSlope( StkFloat slope ) { slope_ = slope; }; 00041 00043 StkFloat tick( StkFloat input ); 00044 00046 00054 StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); 00055 00057 00065 StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); 00066 00067 protected: 00068 00069 StkFloat offset_; 00070 StkFloat slope_; 00071 00072 }; 00073 00074 inline StkFloat BowTable :: tick( StkFloat input ) 00075 { 00076 // The input represents differential string vs. bow velocity. 00077 StkFloat sample = input + offset_; // add bias to input 00078 sample *= slope_; // then scale it 00079 lastFrame_[0] = (StkFloat) fabs( (double) sample ) + (StkFloat) 0.75; 00080 lastFrame_[0] = (StkFloat) pow( lastFrame_[0], (StkFloat) -4.0 ); 00081 00082 // Set minimum friction to 0.0 00083 // if ( lastFrame_[0] < 0.0 ) lastFrame_[0] = 0.0; 00084 00085 // Set maximum friction to 1.0. 00086 if ( lastFrame_[0] > 1.0 ) lastFrame_[0] = (StkFloat) 1.0; 00087 00088 return lastFrame_[0]; 00089 } 00090 00091 inline StkFrames& BowTable :: tick( StkFrames& frames, unsigned int channel ) 00092 { 00093 #if defined(_STK_DEBUG_) 00094 if ( channel >= frames.channels() ) { 00095 errorString_ << "BowTable::tick(): channel and StkFrames arguments are incompatible!"; 00096 handleError( StkError::FUNCTION_ARGUMENT ); 00097 } 00098 #endif 00099 00100 StkFloat *samples = &frames[channel]; 00101 unsigned int hop = frames.channels(); 00102 for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) { 00103 *samples = *samples + offset_; 00104 *samples *= slope_; 00105 *samples = (StkFloat) fabs( (double) *samples ) + 0.75; 00106 *samples = (StkFloat) pow( *samples, (StkFloat) -4.0 ); 00107 if ( *samples > 1.0) *samples = 1.0; 00108 } 00109 00110 lastFrame_[0] = *(samples-hop); 00111 return frames; 00112 } 00113 00114 inline StkFrames& BowTable :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel ) 00115 { 00116 #if defined(_STK_DEBUG_) 00117 if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) { 00118 errorString_ << "BowTable::tick(): channel and StkFrames arguments are incompatible!"; 00119 handleError( StkError::FUNCTION_ARGUMENT ); 00120 } 00121 #endif 00122 00123 StkFloat *iSamples = &iFrames[iChannel]; 00124 StkFloat *oSamples = &oFrames[oChannel]; 00125 unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); 00126 for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) { 00127 *oSamples = *iSamples + offset_; 00128 *oSamples *= slope_; 00129 *oSamples = (StkFloat) fabs( (double) *oSamples ) + 0.75; 00130 *oSamples = (StkFloat) pow( *oSamples, (StkFloat) -4.0 ); 00131 if ( *oSamples > 1.0) *oSamples = 1.0; 00132 } 00133 00134 lastFrame_[0] = *(oSamples-oHop); 00135 return iFrames; 00136 } 00137 00138 } // stk namespace 00139 00140 #endif
The Synthesis ToolKit in C++ (STK) |
©1995-2010 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |