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 /***************************************************/ 00020 /***************************************************/ 00021 00022 class BowTable : public Function 00023 { 00024 public: 00026 BowTable( void ) : offset_(0.0), slope_(0.1), minOutput_(0.01), maxOutput_(0.98) {}; 00027 00029 00035 void setOffset( StkFloat offset ) { offset_ = offset; }; 00036 00038 00042 void setSlope( StkFloat slope ) { slope_ = slope; }; 00043 00045 void setMinOutput( StkFloat minimum ) { minOutput_ = minimum; }; 00046 00048 void setMaxOutput( StkFloat maximum ) { maxOutput_ = maximum; }; 00049 00051 StkFloat tick( StkFloat input ); 00052 00054 00062 StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); 00063 00065 00073 StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); 00074 00075 protected: 00076 00077 StkFloat offset_; 00078 StkFloat slope_; 00079 StkFloat minOutput_; 00080 StkFloat maxOutput_; 00081 00082 }; 00083 00084 inline StkFloat BowTable :: tick( StkFloat input ) 00085 { 00086 // The input represents differential string vs. bow velocity. 00087 StkFloat sample = input + offset_; // add bias to input 00088 sample *= slope_; // then scale it 00089 lastFrame_[0] = (StkFloat) fabs( (double) sample ) + (StkFloat) 0.75; 00090 lastFrame_[0] = (StkFloat) pow( lastFrame_[0], (StkFloat) -4.0 ); 00091 00092 // Set minimum threshold 00093 if ( lastFrame_[0] < minOutput_ ) lastFrame_[0] = minOutput_; 00094 00095 // Set maximum threshold 00096 if ( lastFrame_[0] > maxOutput_ ) lastFrame_[0] = maxOutput_; 00097 00098 return lastFrame_[0]; 00099 } 00100 00101 inline StkFrames& BowTable :: tick( StkFrames& frames, unsigned int channel ) 00102 { 00103 #if defined(_STK_DEBUG_) 00104 if ( channel >= frames.channels() ) { 00105 oStream_ << "BowTable::tick(): channel and StkFrames arguments are incompatible!"; 00106 handleError( StkError::FUNCTION_ARGUMENT ); 00107 } 00108 #endif 00109 00110 StkFloat *samples = &frames[channel]; 00111 unsigned int hop = frames.channels(); 00112 for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) { 00113 *samples = *samples + offset_; 00114 *samples *= slope_; 00115 *samples = (StkFloat) fabs( (double) *samples ) + 0.75; 00116 *samples = (StkFloat) pow( *samples, (StkFloat) -4.0 ); 00117 if ( *samples > 1.0) *samples = 1.0; 00118 } 00119 00120 lastFrame_[0] = *(samples-hop); 00121 return frames; 00122 } 00123 00124 inline StkFrames& BowTable :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel ) 00125 { 00126 #if defined(_STK_DEBUG_) 00127 if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) { 00128 oStream_ << "BowTable::tick(): channel and StkFrames arguments are incompatible!"; 00129 handleError( StkError::FUNCTION_ARGUMENT ); 00130 } 00131 #endif 00132 00133 StkFloat *iSamples = &iFrames[iChannel]; 00134 StkFloat *oSamples = &oFrames[oChannel]; 00135 unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); 00136 for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) { 00137 *oSamples = *iSamples + offset_; 00138 *oSamples *= slope_; 00139 *oSamples = (StkFloat) fabs( (double) *oSamples ) + 0.75; 00140 *oSamples = (StkFloat) pow( *oSamples, (StkFloat) -4.0 ); 00141 if ( *oSamples > 1.0) *oSamples = 1.0; 00142 } 00143 00144 lastFrame_[0] = *(oSamples-oHop); 00145 return iFrames; 00146 } 00147 00148 } // stk namespace 00149 00150 #endif
The Synthesis ToolKit in C++ (STK) |
©1995-2011 Perry R. Cook and Gary P. Scavone. All Rights Reserved. |