⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm.cpp

📁 Mobile STK for Symbian OS V0.1
💻 CPP
字号:
/***************************************************//*! \class FM    \brief STK abstract FM synthesis base class.    This class controls an arbitrary number of    waves and envelopes, determined via a    constructor argument.    Control Change Numbers:        - Control One = 2       - Control Two = 4       - LFO Speed = 11       - LFO Depth = 1       - ADSR 2 & 4 Target = 128    The basic Chowning/Stanford FM patent expired    in 1995, but there exist follow-on patents,    mostly assigned to Yamaha.  If you are of the    type who should worry about this (making    money) worry away.    by Perry R. Cook and Gary P. Scavone, 1995 - 2005.*//***************************************************/#include "FM.h"//#if !defined(SYMBIAN)#include "SKINI.msg"FM :: FM( unsigned int operators )  : nOperators_(operators){  if ( nOperators_ == 0 ) {#if !defined(SYMBIAN)    errorString_ << "FM: Invalid number of operators (" << operators << ") argument to constructor!";    handleError( StkError::FUNCTION_ARGUMENT );#endif  }  twozero_.setB2( -1.0 );  twozero_.setGain( 0.0 );  vibrato_.setFrequency( 6.0 );  unsigned int j;  adsr_.resize( nOperators_ );  waves_.resize( nOperators_ );  for (j=0; j<nOperators_; j++ ) {    ratios_.push_back( 1.0 );    gains_.push_back( 1.0 );    adsr_[j] = (new ADSR());  }  modDepth_ = 0.0;  control1_ = 1.0;  control2_ = 1.0;  baseFrequency_ = 440.0;  int i;  StkFloat temp = 1.0;  for (i=99; i>=0; i--) {    fmGains_[i] = temp;    temp *= 0.933033;  }  temp = 1.0;  for (i=15; i>=0; i--) {    fmSusLevels_[i] = temp;    temp *= 0.707101;  }  temp = 8.498186;  for (i=0; i<32; i++) {    fmAttTimes_[i] = temp;    temp *= 0.707101;  }}FM :: ~FM(){  for (unsigned int i=0; i<nOperators_; i++ ) {    delete waves_[i];    delete adsr_[i];  }}void FM :: loadWaves(const char **filenames ){  for (unsigned int i=0; i<nOperators_; i++ )    waves_[i] = (new WaveLoop( filenames[i], true ));}void FM :: setFrequency(StkFloat frequency){      baseFrequency_ = frequency;  for (unsigned int i=0; i<nOperators_; i++ )    waves_[i]->setFrequency( baseFrequency_ * ratios_[i] );}void FM :: setRatio(unsigned int waveIndex, StkFloat ratio){  if ( waveIndex < 0 ) {#if !defined(SYMBIAN)    errorString_ << "FM::setRatio: waveIndex parameter is less than zero!";    handleError( StkError::WARNING );#endif    return;  }  else if ( waveIndex >= nOperators_ ) {#if !defined(SYMBIAN)    errorString_ << "FM:setRatio: waveIndex parameter is greater than the number of operators!";    handleError( StkError::WARNING );#endif    return;  }  ratios_[waveIndex] = ratio;  if (ratio > 0.0)     waves_[waveIndex]->setFrequency( baseFrequency_ * ratio );  else    waves_[waveIndex]->setFrequency( ratio );}void FM :: setGain(unsigned int waveIndex, StkFloat gain){  if ( waveIndex < 0 ) {#if !defined(SYMBIAN)    errorString_ << "FM::setGain: waveIndex parameter is less than zero!";    handleError( StkError::WARNING );#endif    return;  }  else if ( waveIndex >= nOperators_ ) {#if !defined(SYMBIAN)    errorString_ << "FM::setGain: waveIndex parameter is greater than the number of operators!";    handleError( StkError::WARNING );#endif    return;  }  gains_[waveIndex] = gain;}void FM :: setModulationSpeed(StkFloat mSpeed){  vibrato_.setFrequency( mSpeed );}void FM :: setModulationDepth(StkFloat mDepth){  modDepth_ = mDepth;}void FM :: setControl1(StkFloat cVal){  control1_ = cVal * 2.0;}void FM :: setControl2(StkFloat cVal){  control2_ = cVal * 2.0;}void FM :: keyOn(){  for (unsigned int i=0; i<nOperators_; i++ )    adsr_[i]->keyOn();}void FM :: keyOff(){  for (unsigned int i=0; i<nOperators_; i++ )    adsr_[i]->keyOff();}void FM :: noteOff(StkFloat amplitude){  this->keyOff();#if defined(_STK_DEBUG_)  errorString_ << "FM::NoteOff: amplitude = " << amplitude << ".";  handleError( StkError::DEBUG_WARNING );#endif}void FM :: controlChange(int number, StkFloat value){  StkFloat norm = value * ONE_OVER_128;  if ( norm < 0 ) {    norm = 0.0;#if !defined(SYMBIAN)    errorString_ << "FM::controlChange: control value less than zero ... setting to zero!";    handleError( StkError::WARNING );#endif  }  else if ( norm > 1.0 ) {    norm = 1.0;#if !defined(SYMBIAN)    errorString_ << "FM::controlChange: control value greater than 128.0 ... setting to 128.0!";    handleError( StkError::WARNING );#endif  }  if (number == __SK_Breath_) // 2    this->setControl1( norm );  else if (number == __SK_FootControl_) // 4    this->setControl2( norm );  else if (number == __SK_ModFrequency_) // 11    this->setModulationSpeed( norm * 12.0);  else if (number == __SK_ModWheel_) // 1    this->setModulationDepth( norm );  else if (number == __SK_AfterTouch_Cont_)	{ // 128    //adsr_[0]->setTarget( norm );    adsr_[1]->setTarget( norm );    //adsr_[2]->setTarget( norm );    adsr_[3]->setTarget( norm );  }  else {#if !defined(SYMBIAN)    errorString_ << "FM::controlChange: undefined control number (" << number << ")!";    handleError( StkError::WARNING );#endif  }#if defined(_STK_DEBUG_)    errorString_ << "FM::controlChange: number = " << number << ", value = " << value << '.';    handleError( StkError::DEBUG_WARNING );#endif}//#endif // SYMBIAN

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -