Files
stk/Simple.cpp
Gary Scavone ea749b71d2 Version 2.01
2013-09-29 22:39:45 +02:00

112 lines
2.7 KiB
C++

/*******************************************/
/* Master Class for Simple Instrument */
/* by Perry R. Cook, 1995-96 */
/* This instrument contains 1 looped */
/* wave, 1 noise source, 1 biquad filter */
/* 1 one-pole filter, and 1 ADSR envelope */
/*******************************************/
#include "Simple.h"
Simple :: Simple()
{
MY_FLOAT coeffs[2];
adsr = new ADSR;
baseFreq = (MY_FLOAT) 440.0;
loop = new RawLoop("rawwaves/impuls10.raw");
loop->normalize();
filter = new OnePole;
noise = new Noise;
bqpoles = new TwoPole;
bqzeroes = new TwoZero;
coeffs[0] = 0;
coeffs[1] = -1;
bqzeroes->setZeroCoeffs(coeffs);
filter->setPole(0.5);
this->setFreq(baseFreq);
loopGain = 0.5;
}
Simple :: ~Simple()
{
delete adsr;
delete loop;
delete filter;
delete bqzeroes;
delete bqpoles;
}
void Simple :: keyOn()
{
adsr->keyOn();
}
void Simple :: keyOff()
{
adsr->keyOff();
}
void Simple :: noteOn(MY_FLOAT freq, MY_FLOAT amp)
{
this->keyOn();
this->setFreq(freq);
filter->setGain(amp);
#if defined(_debug_)
printf("Simple : NoteOn: Freq= %lf, Amp=%lf\n",freq, amp);
#endif
}
void Simple :: noteOff(MY_FLOAT amplitude)
{
this->keyOff();
#if defined(_debug_)
printf("Simple : NoteOff: Amp=%lf\n",amplitude);
#endif
}
void Simple :: setFreq(MY_FLOAT frequency)
{
#define R 0.98
MY_FLOAT coeffs[2];
coeffs[0] = 2 * R * cos(TWO_PI * ONE_OVER_SRATE * frequency);
coeffs[1] = - R * R;
bqpoles->setPoleCoeffs(coeffs);
bqpoles->setGain(1.0 - R);
loop->setFreq(frequency);
}
MY_FLOAT Simple :: tick()
{
lastOutput = loopGain * loop->tick();
bqzeroes->tick(bqpoles->tick(noise->tick()));
lastOutput += (1.0 - loopGain) * bqzeroes->lastOut();
lastOutput = filter->tick(lastOutput);
lastOutput *= adsr->tick();
return lastOutput;
}
#include "SKINI11.msg"
void Simple :: controlChange(int number, MY_FLOAT value)
{
#if defined(_debug_)
printf("Simple : ControlChange: Number=%i Value=%f\n",number,value);
#endif
if (number == __SK_Breath_)
filter->setPole(0.99 * (1.0 - (value * NORM_7 * 2.0)));
else if (number == __SK_NoiseLevel_)
loopGain = 1.0 - (NORM_7 * value);
else if (number == __SK_ModFrequency_) {
adsr->setAttackRate(value * NORM_7);
adsr->setDecayRate(value * NORM_7);
adsr->setReleaseRate(value * NORM_7);
}
else if (number == __SK_ModWheel_)
printf("Mod Wheel Unimplemented\n");
else if (number == __SK_AfterTouch_Cont_)
adsr->setTarget(value * NORM_7);
else {
printf("Simple : Undefined Control Number!!\n");
}
}