mirror of
https://github.com/thestk/stk
synced 2026-01-15 22:11:52 +00:00
Version 3.0
This commit is contained in:
committed by
Stephen Sinclair
parent
7c0ee03d60
commit
868787a5f9
80
STK/Vibraphn.cpp
Normal file
80
STK/Vibraphn.cpp
Normal file
@@ -0,0 +1,80 @@
|
||||
/*******************************************/
|
||||
/* Vibraphone SubClass of Modal4 */
|
||||
/* Instrument, by Perry R. Cook, 1995-96 */
|
||||
/* */
|
||||
/* Controls: CONTROL1 = stickHardness */
|
||||
/* CONTROL2 = strikePosition*/
|
||||
/* CONTROL3 = vibFreq */
|
||||
/* MOD_WHEEL= vibAmt */
|
||||
/*******************************************/
|
||||
|
||||
#include "Vibraphn.h"
|
||||
#include "SKINI11.msg"
|
||||
|
||||
Vibraphn :: Vibraphn() : Modal4()
|
||||
{
|
||||
// Concatenate the STK RAWWAVE_PATH to the rawwave file
|
||||
char file[128];
|
||||
strcpy(file, RAWWAVE_PATH);
|
||||
wave = new RawWvIn(strcat(file,"rawwaves/marmstk1.raw"),"oneshot");
|
||||
wave->normalize();
|
||||
wave->setRate((MY_FLOAT) 13.33);
|
||||
vibr->setFreq((MY_FLOAT) 4.0);
|
||||
onepole->setPole((MY_FLOAT) 0.2);
|
||||
this->setRatioAndReson(0, (MY_FLOAT) 1.0,(MY_FLOAT) 0.99995); // Set
|
||||
this->setRatioAndReson(1, (MY_FLOAT) 2.01,(MY_FLOAT) 0.99991); // our
|
||||
this->setRatioAndReson(2, (MY_FLOAT) 3.9,(MY_FLOAT) 0.99992); // resonance
|
||||
this->setRatioAndReson(3,(MY_FLOAT) 14.37,(MY_FLOAT) 0.99990); // values here
|
||||
this->setFiltGain(0,(MY_FLOAT) 0.025);
|
||||
this->setFiltGain(1,(MY_FLOAT) 0.015);
|
||||
this->setFiltGain(2,(MY_FLOAT) 0.015);
|
||||
this->setFiltGain(3,(MY_FLOAT) 0.015);
|
||||
masterGain = (MY_FLOAT) 1.0;
|
||||
directGain = (MY_FLOAT) 0.0;
|
||||
vibrGain = (MY_FLOAT) 0.2;
|
||||
}
|
||||
|
||||
Vibraphn :: ~Vibraphn()
|
||||
{
|
||||
delete wave;
|
||||
}
|
||||
|
||||
void Vibraphn :: setStickHardness(MY_FLOAT hardness)
|
||||
{
|
||||
wave->setRate((MY_FLOAT) 2.0 + ((MY_FLOAT) 22.66 * hardness));
|
||||
masterGain = (MY_FLOAT) 0.2 + (hardness * (MY_FLOAT) 1.6);
|
||||
}
|
||||
|
||||
void Vibraphn :: setStrikePosition(MY_FLOAT position)
|
||||
{
|
||||
MY_FLOAT temp,temp2;
|
||||
temp2 = position * PI;
|
||||
strikePosition = position; /* Hack only first three modes */
|
||||
temp = (MY_FLOAT) sin(strikePosition * PI);
|
||||
this->setFiltGain(0,(MY_FLOAT) 0.025 * temp);
|
||||
temp = (MY_FLOAT) sin(0.1 + (2.01 * temp2));
|
||||
this->setFiltGain(1,(MY_FLOAT) 0.015 * temp);
|
||||
temp = (MY_FLOAT) sin(3.95 * temp2);
|
||||
this->setFiltGain(2,(MY_FLOAT) 0.015 * temp);
|
||||
}
|
||||
|
||||
void Vibraphn :: controlChange(int number, MY_FLOAT value)
|
||||
{
|
||||
#if defined(_debug_)
|
||||
printf("Vibraphn : ControlChange: Number=%i Value=%f\n",number,value);
|
||||
#endif
|
||||
if (number == __SK_StickHardness_)
|
||||
this->setStickHardness(value * NORM_7);
|
||||
else if (number == __SK_StrikePosition_)
|
||||
this->setStrikePosition(value * NORM_7);
|
||||
else if (number == __SK_ModFrequency_)
|
||||
vibr->setFreq((value * NORM_7 * (MY_FLOAT) 12.0));
|
||||
else if (number == __SK_ModWheel_)
|
||||
vibrGain = (value * NORM_7);
|
||||
else if (number == __SK_AfterTouch_Cont_)
|
||||
this->strike(value * NORM_7);
|
||||
else {
|
||||
printf("Vibraphn : Undefined Control Number!!\n");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user