📄 shakers.cpp
字号:
#define PESO_FREQ1 8150#define PESO_FREQ2 10060#define PESO_RES 0.9996// Big Gravel#define BIGROCKS_SOUND_DECAY 0.98#define BIGROCKS_SYSTEM_DECAY 0.9965#define BIGROCKS_GAIN 20.0#define BIGROCKS_NUM_PARTS 23#define BIGROCKS_FREQ 6460#define BIGROCKS_RES 0.932// Little Gravel#define LITLROCKS_SOUND_DECAY 0.98#define LITLROCKS_SYSTEM_DECAY 0.99586#define LITLROCKS_GAIN 20.0#define LITLROCKS_NUM_PARTS 1600#define LITLROCKS_FREQ 9000#define LITLROCKS_RES 0.843*///#endif// Finally ... the class code!#include "Shakers.h"#include "SKINI.msg"Shakers :: Shakers(){ int i; instType_ = 0; shakeEnergy_ = 0.0; nFreqs_ = 0; sndLevel_ = 0.0; for ( i=0; i<MAX_FREQS; i++ ) { inputs_[i] = 0.0; outputs_[i][0] = 0.0; outputs_[i][1] = 0.0; coeffs_[i][0] = 0.0; coeffs_[i][1] = 0.0; gains_[i] = 0.0; center_freqs_[i] = 0.0; resons_[i] = 0.0; freq_rand_[i] = 0.0; freqalloc_[i] = 0; } soundDecay_ = 0.0; systemDecay_ = 0.0; nObjects_ = 0.0; totalEnergy_ = 0.0; ratchet_ = 0.0; ratchetDelta_ = 0.0005; lastRatchetPos_ = 0; finalZ_[0] = 0.0; finalZ_[1] = 0.0; finalZ_[2] = 0.0; finalZCoeffs_[0] = 1.0; finalZCoeffs_[1] = 0.0; finalZCoeffs_[2] = 0.0; this->setupNum(instType_);#if defined(SYMBIAN) strcpy(instrs[0],"Maraca"); strcpy(instrs[1],"Cabasa"); strcpy(instrs[2],"Sekere"); strcpy(instrs[3],"Guiro"); strcpy(instrs[4],"Waterdrp"); strcpy(instrs[5],"Bamboo"); strcpy(instrs[6],"Tambourn"); strcpy(instrs[7],"Sleighbl"); strcpy(instrs[8],"CokeCan"); strcpy(instrs[9],"NextMug"); strcpy(instrs[10],"PennyMug"); strcpy(instrs[11],"NicklMug"); strcpy(instrs[12],"DimeMug"); strcpy(instrs[13],"QuartMug"); strcpy(instrs[14],"FrancMug"); strcpy(instrs[15],"PesoMug"); strcpy(instrs[16],"BigRocks"); strcpy(instrs[17],"LitlRoks"); strcpy(instrs[18],"TBamboo"); which = 0;#endif}Shakers :: ~Shakers(){}const StkFloat MAX_SHAKE = 2000.0;#if !defined(SYMBIAN)char instrs[NUM_INSTR][10] = { "Maraca", "Cabasa", "Sekere", "Guiro", "Waterdrp", "Bamboo", "Tambourn", "Sleighbl", "Stix1", "Crunch1", "Wrench", "SandPapr", "CokeCan", "NextMug", "PennyMug", "NicklMug", "DimeMug", "QuartMug", "FrancMug", "PesoMug", "BigRocks", "LitlRoks", "TBamboo"};#endifint Shakers :: setupName(char* instr){ int which = 0; for (int i=0;i<NUM_INSTR;i++) { if ( !strcmp(instr,instrs[i]) ) which = i; }#if defined(_STK_DEBUG_) errorString_ << "Shakers::setupName: setting instrument to " << instrs[which] << '.'; handleError( StkError::DEBUG_WARNING );#endif return this->setupNum(which);}void Shakers :: setFinalZs(StkFloat z0, StkFloat z1, StkFloat z2){ finalZCoeffs_[0] = z0; finalZCoeffs_[1] = z1; finalZCoeffs_[2] = z2;}void Shakers :: setDecays(StkFloat sndDecay_, StkFloat sysDecay_){ soundDecay_ = sndDecay_; systemDecay_ = sysDecay_;}int Shakers :: setFreqAndReson(int which, StkFloat freq, StkFloat reson){ if (which < MAX_FREQS) { resons_[which] = reson; center_freqs_[which] = freq; t_center_freqs_[which] = freq; coeffs_[which][1] = reson * reson; coeffs_[which][0] = -reson * 2.0 * cos(freq * TWO_PI / Stk::sampleRate()); return 1; } else return 0;}int Shakers :: setupNum(int inst){ int i, rv = 0; StkFloat temp; if (inst == 1) { // Cabasa rv = inst; nObjects_ = CABA_NUM_BEADS; defObjs_[inst] = CABA_NUM_BEADS; setDecays(CABA_SOUND_DECAY, CABA_SYSTEM_DECAY); defDecays_[inst] = CABA_SYSTEM_DECAY; decayScale_[inst] = 0.97; nFreqs_ = 1; baseGain_ = CABA_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0] = temp; freqalloc_[0] = 0; setFreqAndReson(0,CABA_CENTER_FREQ,CABA_RESON); setFinalZs(1.0,-1.0,0.0); } else if (inst == 2) { // Sekere rv = inst; nObjects_ = SEKE_NUM_BEANS; defObjs_[inst] = SEKE_NUM_BEANS; this->setDecays(SEKE_SOUND_DECAY,SEKE_SYSTEM_DECAY); defDecays_[inst] = SEKE_SYSTEM_DECAY; decayScale_[inst] = 0.94; nFreqs_ = 1; baseGain_ = SEKE_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0] = temp; freqalloc_[0] = 0; this->setFreqAndReson(0,SEKE_CENTER_FREQ,SEKE_RESON); this->setFinalZs(1.0, 0.0, -1.0); } else if (inst == 3) { // Guiro rv = inst; nObjects_ = GUIR_NUM_PARTS; defObjs_[inst] = GUIR_NUM_PARTS; setDecays(GUIR_SOUND_DECAY,1.0); defDecays_[inst] = 0.9999; decayScale_[inst] = 1.0; nFreqs_ = 2; baseGain_ = GUIR_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0]=temp; gains_[1]=temp; freqalloc_[0] = 0; freqalloc_[1] = 0; freq_rand_[0] = 0.0; freq_rand_[1] = 0.0; setFreqAndReson(0,GUIR_GOURD_FREQ,GUIR_GOURD_RESON); setFreqAndReson(1,GUIR_GOURD_FREQ2,GUIR_GOURD_RESON2); ratchet_ = 0; ratchetPos_ = 10; } else if (inst == 4) { // Water Drops rv = inst; nObjects_ = WUTR_NUM_SOURCES; defObjs_[inst] = WUTR_NUM_SOURCES; setDecays(WUTR_SOUND_DECAY,WUTR_SYSTEM_DECAY); defDecays_[inst] = WUTR_SYSTEM_DECAY; decayScale_[inst] = 0.8; nFreqs_ = 3; baseGain_ = WUTR_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0]=temp; gains_[1]=temp; gains_[2]=temp; freqalloc_[0] = 1; freqalloc_[1] = 1; freqalloc_[2] = 1; freq_rand_[0] = 0.2; freq_rand_[1] = 0.2; freq_rand_[2] = 0.2; setFreqAndReson(0,WUTR_CENTER_FREQ0,WUTR_RESON); setFreqAndReson(1,WUTR_CENTER_FREQ0,WUTR_RESON); setFreqAndReson(2,WUTR_CENTER_FREQ0,WUTR_RESON); setFinalZs(1.0,0.0,0.0); } else if (inst == 5) { // Bamboo rv = inst; nObjects_ = BAMB_NUM_TUBES; defObjs_[inst] = BAMB_NUM_TUBES; setDecays(BAMB_SOUND_DECAY, BAMB_SYSTEM_DECAY); defDecays_[inst] = BAMB_SYSTEM_DECAY; decayScale_[inst] = 0.7; nFreqs_ = 3; baseGain_ = BAMB_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0]=temp; gains_[1]=temp; gains_[2]=temp; freqalloc_[0] = 1; freqalloc_[1] = 1; freqalloc_[2] = 1; freq_rand_[0] = 0.2; freq_rand_[1] = 0.2; freq_rand_[2] = 0.2; setFreqAndReson(0,BAMB_CENTER_FREQ0,BAMB_RESON); setFreqAndReson(1,BAMB_CENTER_FREQ1,BAMB_RESON); setFreqAndReson(2,BAMB_CENTER_FREQ2,BAMB_RESON); setFinalZs(1.0,0.0,0.0); } else if (inst == 6) { // Tambourine rv = inst; nObjects_ = TAMB_NUM_TIMBRELS; defObjs_[inst] = TAMB_NUM_TIMBRELS; setDecays(TAMB_SOUND_DECAY,TAMB_SYSTEM_DECAY); defDecays_[inst] = TAMB_SYSTEM_DECAY; decayScale_[inst] = 0.95; nFreqs_ = 3; baseGain_ = TAMB_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0]=temp*TAMB_SHELL_GAIN; gains_[1]=temp*0.8; gains_[2]=temp; freqalloc_[0] = 0; freqalloc_[1] = 1; freqalloc_[2] = 1; freq_rand_[0] = 0.0; freq_rand_[1] = 0.05; freq_rand_[2] = 0.05; setFreqAndReson(0,TAMB_SHELL_FREQ,TAMB_SHELL_RESON); setFreqAndReson(1,TAMB_CYMB_FREQ1,TAMB_CYMB_RESON); setFreqAndReson(2,TAMB_CYMB_FREQ2,TAMB_CYMB_RESON); setFinalZs(1.0,0.0,-1.0); } else if (inst == 7) { // Sleighbell rv = inst; nObjects_ = SLEI_NUM_BELLS; defObjs_[inst] = SLEI_NUM_BELLS; setDecays(SLEI_SOUND_DECAY,SLEI_SYSTEM_DECAY); defDecays_[inst] = SLEI_SYSTEM_DECAY; decayScale_[inst] = 0.9; nFreqs_ = 5; baseGain_ = SLEI_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0]=temp; gains_[1]=temp; gains_[2]=temp; gains_[3]=temp*0.5; gains_[4]=temp*0.3; for (i=0;i<nFreqs_;i++) { freqalloc_[i] = 1; freq_rand_[i] = 0.03; } setFreqAndReson(0,SLEI_CYMB_FREQ0,SLEI_CYMB_RESON); setFreqAndReson(1,SLEI_CYMB_FREQ1,SLEI_CYMB_RESON); setFreqAndReson(2,SLEI_CYMB_FREQ2,SLEI_CYMB_RESON); setFreqAndReson(3,SLEI_CYMB_FREQ3,SLEI_CYMB_RESON); setFreqAndReson(4,SLEI_CYMB_FREQ4,SLEI_CYMB_RESON); setFinalZs(1.0,0.0,-1.0); } else if (inst == 8) { // Stix1 rv = inst; nObjects_ = STIX1_NUM_BEANS; defObjs_[inst] = STIX1_NUM_BEANS; setDecays(STIX1_SOUND_DECAY,STIX1_SYSTEM_DECAY); defDecays_[inst] = STIX1_SYSTEM_DECAY; decayScale_[inst] = 0.96; nFreqs_ = 1; baseGain_ = STIX1_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0]=temp; freqalloc_[0] = 0; setFreqAndReson(0,STIX1_CENTER_FREQ,STIX1_RESON); setFinalZs(1.0,0.0,-1.0); } else if (inst == 9) { // Crunch1 rv = inst; nObjects_ = CRUNCH1_NUM_BEADS; defObjs_[inst] = CRUNCH1_NUM_BEADS; setDecays(CRUNCH1_SOUND_DECAY,CRUNCH1_SYSTEM_DECAY); defDecays_[inst] = CRUNCH1_SYSTEM_DECAY; decayScale_[inst] = 0.96; nFreqs_ = 1; baseGain_ = CRUNCH1_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0]=temp; freqalloc_[0] = 0; setFreqAndReson(0,CRUNCH1_CENTER_FREQ,CRUNCH1_RESON); setFinalZs(1.0,-1.0,0.0); } else if (inst == 10) { // Wrench rv = inst; nObjects_ = WRENCH_NUM_PARTS; defObjs_[inst] = WRENCH_NUM_PARTS; setDecays(WRENCH_SOUND_DECAY,1.0); defDecays_[inst] = 0.9999; decayScale_[inst] = 0.98; nFreqs_ = 2; baseGain_ = WRENCH_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0]=temp; gains_[1]=temp; freqalloc_[0] = 0; freqalloc_[1] = 0; freq_rand_[0] = 0.0; freq_rand_[1] = 0.0; setFreqAndReson(0,WRENCH_FREQ,WRENCH_RESON); setFreqAndReson(1,WRENCH_FREQ2,WRENCH_RESON2); ratchet_ = 0; ratchetPos_ = 10; } else if (inst == 11) { // Sandpapr rv = inst; nObjects_ = SANDPAPR_NUM_GRAINS; defObjs_[inst] = SANDPAPR_NUM_GRAINS; this->setDecays(SANDPAPR_SOUND_DECAY,SANDPAPR_SYSTEM_DECAY); defDecays_[inst] = SANDPAPR_SYSTEM_DECAY; decayScale_[inst] = 0.97; nFreqs_ = 1; baseGain_ = SANDPAPR_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0] = temp; freqalloc_[0] = 0; this->setFreqAndReson(0,SANDPAPR_CENTER_FREQ,SANDPAPR_RESON); this->setFinalZs(1.0, 0.0, -1.0); } else if (inst == 12) { // Cokecan rv = inst; nObjects_ = COKECAN_NUM_PARTS; defObjs_[inst] = COKECAN_NUM_PARTS; setDecays(COKECAN_SOUND_DECAY,COKECAN_SYSTEM_DECAY); defDecays_[inst] = COKECAN_SYSTEM_DECAY; decayScale_[inst] = 0.95; nFreqs_ = 5; baseGain_ = COKECAN_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0]=temp; gains_[1]=temp*1.8; gains_[2]=temp*1.8; gains_[3]=temp*1.8; gains_[4]=temp*1.8; freqalloc_[0] = 0; freqalloc_[1] = 0; freqalloc_[2] = 0; freqalloc_[3] = 0; freqalloc_[4] = 0; setFreqAndReson(0,COKECAN_HELMFREQ,COKECAN_HELM_RES); setFreqAndReson(1,COKECAN_METLFREQ0,COKECAN_METL_RES); setFreqAndReson(2,COKECAN_METLFREQ1,COKECAN_METL_RES); setFreqAndReson(3,COKECAN_METLFREQ2,COKECAN_METL_RES); setFreqAndReson(4,COKECAN_METLFREQ3,COKECAN_METL_RES); setFinalZs(1.0,0.0,-1.0); } else if (inst>12 && inst<20) { // Nextmug rv = inst; nObjects_ = NEXTMUG_NUM_PARTS; defObjs_[inst] = NEXTMUG_NUM_PARTS; setDecays(NEXTMUG_SOUND_DECAY,NEXTMUG_SYSTEM_DECAY); defDecays_[inst] = NEXTMUG_SYSTEM_DECAY; decayScale_[inst] = 0.95; nFreqs_ = 4; baseGain_ = NEXTMUG_GAIN; temp = log(nObjects_) * baseGain_ / (StkFloat) nObjects_; gains_[0]=temp; gains_[1]=temp*0.8; gains_[2]=temp*0.6; gains_[3]=temp*0.4; freqalloc_[0] = 0; freqalloc_[1] = 0; freqalloc_[2] = 0; freqalloc_[3] = 0; freqalloc_[4] = 0; freqalloc_[5] = 0; setFreqAndReson(0,NEXTMUG_FREQ0,NEXTMUG_RES); setFreqAndReson(1,NEXTMUG_FREQ1,NEXTMUG_RES); setFreqAndReson(2,NEXTMUG_FREQ2,NEXTMUG_RES); setFreqAndReson(3,NEXTMUG_FREQ3,NEXTMUG_RES); setFinalZs(1.0,0.0,-1.0); if (inst == 14) { // Mug + Penny nFreqs_ = 7; gains_[4] = temp; gains_[5] = temp*0.8; gains_[6] = temp*0.5; setFreqAndReson(4,PENNY_FREQ0,PENNY_RES); setFreqAndReson(5,PENNY_FREQ1,PENNY_RES); setFreqAndReson(6,PENNY_FREQ2,PENNY_RES); } else if (inst == 15) { // Mug + Nickel nFreqs_ = 6; gains_[4] = temp; gains_[5] = temp*0.8; gains_[6] = temp*0.5; setFreqAndReson(4,NICKEL_FREQ0,NICKEL_RES); setFreqAndReson(5,NICKEL_FREQ1,NICKEL_RES); setFreqAndReson(6,NICKEL_FREQ2,NICKEL_RES); } else if (inst == 16) { // Mug + Dime nFreqs_ = 6; gains_[4] = temp; gains_[5] = temp*0.8; gains_[6] = temp*0.5; setFreqAndReson(4,DIME_FREQ0,DIME_RES); setFreqAndReson(5,DIME_FREQ1,DIME_RES); setFreqAndReson(6,DIME_FREQ2,DIME_RES); } else if (inst == 17) { // Mug + Quarter nFreqs_ = 6; gains_[4] = temp*1.3; gains_[5] = temp*1.0; gains_[6] = temp*0.8; setFreqAndReson(4,QUARTER_FREQ0,QUARTER_RES); setFreqAndReson(5,QUARTER_FREQ1,QUARTER_RES); setFreqAndReson(6,QUARTER_FREQ2,QUARTER_RES);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -