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

📄 shakers.cpp

📁 Mobile STK for Symbian OS V0.1
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }    else if (inst == 18) { // Mug + Franc      nFreqs_ = 6;      gains_[4] = temp*0.7;      gains_[5] = temp*0.4;      gains_[6] = temp*0.3;      setFreqAndReson(4,FRANC_FREQ0,FRANC_RES);      setFreqAndReson(5,FRANC_FREQ1,FRANC_RES);      setFreqAndReson(6,FRANC_FREQ2,FRANC_RES);    }    else if (inst == 19) { // Mug + Peso      nFreqs_ = 6;      gains_[4] = temp;      gains_[5] = temp*1.2;      gains_[6] = temp*0.7;      setFreqAndReson(4,PESO_FREQ0,PESO_RES);      setFreqAndReson(5,PESO_FREQ1,PESO_RES);      setFreqAndReson(6,PESO_FREQ2,PESO_RES);    }  }  else if (inst == 20) { // Big Rocks    nFreqs_ = 1;    rv = inst;    nObjects_ = BIGROCKS_NUM_PARTS;    defObjs_[inst] = BIGROCKS_NUM_PARTS;    setDecays(BIGROCKS_SOUND_DECAY,BIGROCKS_SYSTEM_DECAY);    defDecays_[inst] = BIGROCKS_SYSTEM_DECAY;    decayScale_[inst] = 0.95;    baseGain_ = BIGROCKS_GAIN;    temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_;    gains_[0]=temp;    freqalloc_[0] = 1;    freq_rand_[0] = 0.11;    setFreqAndReson(0,BIGROCKS_FREQ,BIGROCKS_RES);    setFinalZs(1.0,0.0,-1.0);  }  else if (inst == 21) { // Little Rocks    nFreqs_ = 1;    rv = inst;    nObjects_ = LITLROCKS_NUM_PARTS;    defObjs_[inst] = LITLROCKS_NUM_PARTS;    setDecays(LITLROCKS_SOUND_DECAY,LITLROCKS_SYSTEM_DECAY);    defDecays_[inst] = LITLROCKS_SYSTEM_DECAY;    decayScale_[inst] = 0.95;    baseGain_ = LITLROCKS_GAIN;    temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_;    gains_[0]=temp;    freqalloc_[0] = 1;    freq_rand_[0] = 0.18;    setFreqAndReson(0,LITLROCKS_FREQ,LITLROCKS_RES);    setFinalZs(1.0,0.0,-1.0);  }  else if (inst == 22) { // Tuned Bamboo    rv = inst;    nObjects_ = TBAMB_NUM_TUBES;    defObjs_[inst] = TBAMB_NUM_TUBES;    setDecays(TBAMB_SOUND_DECAY, TBAMB_SYSTEM_DECAY);    defDecays_[inst] = TBAMB_SYSTEM_DECAY;    decayScale_[inst] = 0.7;    nFreqs_ = 7;    baseGain_ = TBAMB_GAIN;    temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_;    gains_[0]=temp;    gains_[1]=temp;    gains_[2]=temp;    gains_[3]=temp;    gains_[4]=temp;    gains_[5]=temp;    gains_[6]=temp;    freqalloc_[0] = 0;    freqalloc_[1] = 0;    freqalloc_[2] = 0;    freqalloc_[3] = 0;    freqalloc_[4] = 0;    freqalloc_[5] = 0;    freqalloc_[6] = 0;    freq_rand_[0] = 0.0;    freq_rand_[1] = 0.0;    freq_rand_[2] = 0.0;    freq_rand_[3] = 0.0;    freq_rand_[4] = 0.0;    freq_rand_[5] = 0.0;    freq_rand_[6] = 0.0;    setFreqAndReson(0,TBAMB_CENTER_FREQ0,TBAMB_RESON);    setFreqAndReson(1,TBAMB_CENTER_FREQ1,TBAMB_RESON);    setFreqAndReson(2,TBAMB_CENTER_FREQ2,TBAMB_RESON);    setFreqAndReson(3,TBAMB_CENTER_FREQ3,TBAMB_RESON);    setFreqAndReson(4,TBAMB_CENTER_FREQ4,TBAMB_RESON);    setFreqAndReson(5,TBAMB_CENTER_FREQ5,TBAMB_RESON);    setFreqAndReson(6,TBAMB_CENTER_FREQ6,TBAMB_RESON);    setFinalZs(1.0,0.0,-1.0);  }  else { // Maraca (inst == 0) or default    rv = 0;    nObjects_ = MARA_NUM_BEANS;    defObjs_[0] = MARA_NUM_BEANS;    setDecays(MARA_SOUND_DECAY,MARA_SYSTEM_DECAY);    defDecays_[0] = MARA_SYSTEM_DECAY;    decayScale_[inst] = 0.9;    nFreqs_ = 1;    baseGain_ = MARA_GAIN;    temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_;    gains_[0]=temp;    freqalloc_[0] = 0;    setFreqAndReson(0,MARA_CENTER_FREQ,MARA_RESON);    setFinalZs(1.0,-1.0,0.0);  }  return rv;}void Shakers :: noteOn(StkFloat frequency, StkFloat amplitude){  // Yep ... pretty kludgey, but it works!  int noteNum = (int) ((12*log(frequency/220.0)/log(2.0)) + 57.01) % 32;  if (instType_ !=  noteNum) instType_ = this->setupNum(noteNum);  shakeEnergy_ += amplitude * MAX_SHAKE * 0.1;  if (shakeEnergy_ > MAX_SHAKE) shakeEnergy_ = MAX_SHAKE;  if (instType_==10 || instType_==3) ratchetPos_ += 1;#if defined(_STK_DEBUG_)  errorString_ << "Shakers::NoteOn: frequency = " << frequency << ", amplitude = " << amplitude << '.';  handleError( StkError::DEBUG_WARNING );#endif}void Shakers :: noteOff(StkFloat amplitude){  shakeEnergy_ = 0.0;  if (instType_==10 || instType_==3) ratchetPos_ = 0;}const StkFloat MIN_ENERGY = 0.3;StkFloat Shakers :: computeSample(){  StkFloat data;  StkFloat temp_rand;  int i;  if (instType_ == 4) {  	if (shakeEnergy_ > MIN_ENERGY)	{      lastOutput_ = wuter_tick();      lastOutput_ *= 0.0001;    }    else {      lastOutput_ = 0.0;    }  }  else if (instType_ == 22) {    lastOutput_ = tbamb_tick();  }  else if (instType_ == 10 || instType_ == 3) {    if (ratchetPos_ > 0) {      ratchet_ -= (ratchetDelta_ + (0.002*totalEnergy_));      if (ratchet_ < 0.0) {        ratchet_ = 1.0;        ratchetPos_ -= 1;	    }      totalEnergy_ = ratchet_;      lastOutput_ = ratchet_tick();      lastOutput_ *= 0.0001;    }    else lastOutput_ = 0.0;  }  else  { // generic_tick()    if (shakeEnergy_ > MIN_ENERGY) {      shakeEnergy_ *= systemDecay_;               // Exponential system decay      if (float_random(1024.0) < nObjects_) {        sndLevel_ += shakeEnergy_;           for (i=0;i<nFreqs_;i++) {          if (freqalloc_[i])	{            temp_rand = t_center_freqs_[i] * (1.0 + (freq_rand_[i] * noise_tick()));            coeffs_[i][0] = -resons_[i] * 2.0 * cos(temp_rand * TWO_PI / Stk::sampleRate());          }        }    	}      inputs_[0] = sndLevel_ * noise_tick();      // Actual Sound is Random      for (i=1; i<nFreqs_; i++)	{        inputs_[i] = inputs_[0];      }      sndLevel_ *= soundDecay_;                   // Exponential Sound decay       finalZ_[2] = finalZ_[1];      finalZ_[1] = finalZ_[0];      finalZ_[0] = 0;      for (i=0;i<nFreqs_;i++)	{        inputs_[i] -= outputs_[i][0]*coeffs_[i][0];  // Do        inputs_[i] -= outputs_[i][1]*coeffs_[i][1];  // resonant        outputs_[i][1] = outputs_[i][0];            // filter        outputs_[i][0] = inputs_[i];                // calculations        finalZ_[0] += gains_[i] * outputs_[i][1];      }      data = finalZCoeffs_[0] * finalZ_[0];     // Extra zero(s) for shape      data += finalZCoeffs_[1] * finalZ_[1];    // Extra zero(s) for shape      data += finalZCoeffs_[2] * finalZ_[2];    // Extra zero(s) for shape      if (data > 10000.0)	data = 10000.0;      if (data < -10000.0) data = -10000.0;      lastOutput_ = data * 0.0001;    }    else lastOutput_ = 0.0;  }  return lastOutput_;}void Shakers :: controlChange(int number, StkFloat value){  StkFloat norm = value * ONE_OVER_128;  if ( norm < 0 ) {    norm = 0.0;#if !defined(SYMBIAN)    errorString_ << "Shakers::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_ << "Shakers::controlChange: control value greater than 128.0 ... setting to 128.0!";    handleError( StkError::WARNING );#endif  }  StkFloat temp;  int i;  if (number == __SK_Breath_) { // 2 ... energy    shakeEnergy_ += norm * MAX_SHAKE * 0.1;    if (shakeEnergy_ > MAX_SHAKE) shakeEnergy_ = MAX_SHAKE;    if (instType_==10 || instType_==3) {	    ratchetPos_ = (int) fabs(value - lastRatchetPos_);	    ratchetDelta_ = 0.0002 * ratchetPos_;	    lastRatchetPos_ = (int) value;    }  }  else if (number == __SK_ModFrequency_) { // 4 ... decay    if (instType_ != 3 && instType_ != 10) {      systemDecay_ = defDecays_[instType_] + ((value - 64.0) *                                           decayScale_[instType_] *                                           (1.0 - defDecays_[instType_]) / 64.0 );      gains_[0] = log(nObjects_) * baseGain_ / (StkFloat) nObjects_;      for (i=1;i<nFreqs_;i++) gains_[i] = gains_[0];      if (instType_ == 6) { // tambourine        gains_[0] *= TAMB_SHELL_GAIN;        gains_[1] *= 0.8;      }      else if (instType_ == 7) { // sleighbell        gains_[3] *= 0.5;        gains_[4] *= 0.3;      }      else if (instType_ == 12) { // cokecan        for (i=1;i<nFreqs_;i++) gains_[i] *= 1.8;      }      for (i=0;i<nFreqs_;i++) gains_[i] *= ((128-value)/100.0 + 0.36);    }  }  else if (number == __SK_FootControl_) { // 11 ... number of objects    if (instType_ == 5) // bamboo      nObjects_ = (StkFloat) (value * defObjs_[instType_] / 64.0) + 0.3;    else      nObjects_ = (StkFloat) (value * defObjs_[instType_] / 64.0) + 1.1;    gains_[0] = log(nObjects_) * baseGain_ / (StkFloat) nObjects_;    for (i=1;i<nFreqs_;i++) gains_[i] = gains_[0];    if (instType_ == 6) { // tambourine      gains_[0] *= TAMB_SHELL_GAIN;      gains_[1] *= 0.8;    }    else if (instType_ == 7) { // sleighbell      gains_[3] *= 0.5;      gains_[4] *= 0.3;    }    else if (instType_ == 12) { // cokecan      for (i=1;i<nFreqs_;i++) gains_[i] *= 1.8;    }    if (instType_ != 3 && instType_ != 10) {      // reverse calculate decay setting      double temp = (double) (64.0 * (systemDecay_-defDecays_[instType_])/(decayScale_[instType_]*(1-defDecays_[instType_])) + 64.0);      // scale gains_ by decay setting      for (i=0;i<nFreqs_;i++) gains_[i] *= ((128-temp)/100.0 + 0.36);    }  }  else if (number == __SK_ModWheel_) { // 1 ... resonance frequency    for (i=0; i<nFreqs_; i++)	{      if (instType_ == 6 || instType_ == 2 || instType_ == 7) // limit range a bit for tambourine        temp = center_freqs_[i] * pow (1.008,value-64);      else        temp = center_freqs_[i] * pow (1.015,value-64);      t_center_freqs_[i] = temp;      coeffs_[i][0] = -resons_[i] * 2.0 * cos(temp * TWO_PI / Stk::sampleRate());      coeffs_[i][1] = resons_[i]*resons_[i];    }  }  else if (number == __SK_AfterTouch_Cont_) { // 128    shakeEnergy_ += norm * MAX_SHAKE * 0.1;    if (shakeEnergy_ > MAX_SHAKE) shakeEnergy_ = MAX_SHAKE;    if (instType_==10 || instType_==3)	{	    ratchetPos_ = (int) fabs(value - lastRatchetPos_);	    ratchetDelta_ = 0.0002 * ratchetPos_;	    lastRatchetPos_ = (int) value;    }  }  else  if (number == __SK_ShakerInst_) { // 1071    instType_ = (int) (value + 0.5);	//  Just to be safe    this->setupNum(instType_);  }                                         else {#if !defined(SYMBIAN)    errorString_ << "Shakers::controlChange: undefined control number (" << number << ")!";    handleError( StkError::WARNING );#endif  }#if defined(_STK_DEBUG_)#if !defined(SYMBIAN)    errorString_ << "Shakers::controlChange: number = " << number << ", value = " << value << '.';	handleError( StkError::DEBUG_WARNING );#endif#endif}// KLUDGE-O-MATIC-O-RAMAStkFloat Shakers :: wuter_tick() {  StkFloat data;  int j;  shakeEnergy_ *= systemDecay_;               // Exponential system decay  if (my_random(32767) < nObjects_) {         sndLevel_ = shakeEnergy_;       j = my_random(3);	  if (j == 0)   {      center_freqs_[0] = WUTR_CENTER_FREQ1 * (0.75 + (0.25 * noise_tick()));	    gains_[0] = fabs(noise_tick());	  }	  else if (j == 1)      {      center_freqs_[1] = WUTR_CENTER_FREQ1 * (1.0 + (0.25 * noise_tick()));	    gains_[1] = fabs(noise_tick());	  }	  else  {      center_freqs_[2] = WUTR_CENTER_FREQ1 * (1.25 + (0.25 * noise_tick()));	    gains_[2] = fabs(noise_tick());	  }	}	  gains_[0] *= resons_[0];  if (gains_[0] >  0.001) {    center_freqs_[0]  *= WUTR_FREQ_SWEEP;    coeffs_[0][0] = -resons_[0] * 2.0 *       cos(center_freqs_[0] * TWO_PI / Stk::sampleRate());  }  gains_[1] *= resons_[1];  if (gains_[1] > 0.001) {    center_freqs_[1] *= WUTR_FREQ_SWEEP;    coeffs_[1][0] = -resons_[1] * 2.0 *       cos(center_freqs_[1] * TWO_PI / Stk::sampleRate());  }  gains_[2] *= resons_[2];  if (gains_[2] > 0.001) {    center_freqs_[2] *= WUTR_FREQ_SWEEP;    coeffs_[2][0] = -resons_[2] * 2.0 *       cos(center_freqs_[2] * TWO_PI / Stk::sampleRate());  }	  sndLevel_ *= soundDecay_;        // Each (all) event(s)                                    // decay(s) exponentially   inputs_[0] = sndLevel_;  inputs_[0] *= noise_tick();     // Actual Sound is Random  inputs_[1] = inputs_[0] * gains_[1];  inputs_[2] = inputs_[0] * gains_[2];  inputs_[0] *= gains_[0];  inputs_[0] -= outputs_[0][0]*coeffs_[0][0];  inputs_[0] -= outputs_[0][1]*coeffs_[0][1];  outputs_[0][1] = outputs_[0][0];  outputs_[0][0] = inputs_[0];  data = gains_[0]*outputs_[0][0];  inputs_[1] -= outputs_[1][0]*coeffs_[1][0];  inputs_[1] -= outputs_[1][1]*coeffs_[1][1];  outputs_[1][1] = outputs_[1][0];  outputs_[1][0] = inputs_[1];  data += gains_[1]*outputs_[1][0];  inputs_[2] -= outputs_[2][0]*coeffs_[2][0];  inputs_[2] -= outputs_[2][1]*coeffs_[2][1];  outputs_[2][1] = outputs_[2][0];  outputs_[2][0] = inputs_[2];  data += gains_[2]*outputs_[2][0];   finalZ_[2] = finalZ_[1];  finalZ_[1] = finalZ_[0];  finalZ_[0] = data * 4;  data = finalZ_[2] - finalZ_[0];  return data;}StkFloat Shakers :: ratchet_tick() {  StkFloat data;  if (my_random(1024) < nObjects_) {    sndLevel_ += 512 * ratchet_ * totalEnergy_;  }  inputs_[0] = sndLevel_;  inputs_[0] *= noise_tick() * ratchet_;  sndLevel_ *= soundDecay_;		   inputs_[1] = inputs_[0];  inputs_[0] -= outputs_[0][0]*coeffs_[0][0];  inputs_[0] -= outputs_[0][1]*coeffs_[0][1];  outputs_[0][1] = outputs_[0][0];  outputs_[0][0] = inputs_[0];  inputs_[1] -= outputs_[1][0]*coeffs_[1][0];  inputs_[1] -= outputs_[1][1]*coeffs_[1][1];  outputs_[1][1] = outputs_[1][0];  outputs_[1][0] = inputs_[1];       finalZ_[2] = finalZ_[1];  finalZ_[1] = finalZ_[0];  finalZ_[0] = gains_[0]*outputs_[0][1] + gains_[1]*outputs_[1][1];  data = finalZ_[0] - finalZ_[2];  return data;}StkFloat Shakers :: tbamb_tick() {  StkFloat data, temp;#if !defined(SYMBIAN)  static int which = 0;#endif  int i;  if (shakeEnergy_ > MIN_ENERGY)	{      shakeEnergy_ *= systemDecay_;    // Exponential system decay      if (float_random(1024.0) < nObjects_) {	    sndLevel_ += shakeEnergy_;	    which = my_random(7);	  }        temp = sndLevel_ * noise_tick();      // Actual Sound is Random	  for (i=0;i<nFreqs_;i++)	inputs_[i] = 0;	  inputs_[which] = temp;      sndLevel_ *= soundDecay_;                   // Exponential Sound decay       finalZ_[2] = finalZ_[1];      finalZ_[1] = finalZ_[0];      finalZ_[0] = 0;      for (i=0;i<nFreqs_;i++)	{        inputs_[i] -= outputs_[i][0]*coeffs_[i][0];  // Do        inputs_[i] -= outputs_[i][1]*coeffs_[i][1];  // resonant        outputs_[i][1] = outputs_[i][0];            // filter        outputs_[i][0] = inputs_[i];                // calculations        finalZ_[0] += gains_[i] * outputs_[i][1];      }      data = finalZCoeffs_[0] * finalZ_[0];     // Extra zero(s) for shape      data += finalZCoeffs_[1] * finalZ_[1];    // Extra zero(s) for shape      data += finalZCoeffs_[2] * finalZ_[2];    // Extra zero(s) for shape      if (data > 10000.0)	data = 10000.0;      if (data < -10000.0) data = -10000.0;      data = data * 0.0001;  }  else data = 0.0;  return data;}

⌨️ 快捷键说明

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