mirror of
https://github.com/thestk/stk
synced 2026-01-12 04:21:52 +00:00
109 lines
2.9 KiB
C++
109 lines
2.9 KiB
C++
/******************************************/
|
|
/* Test Sampler Subclass of */
|
|
/* Sampling Synthesizer Class */
|
|
/* by Perry R. Cook, 1995-96 */
|
|
/* */
|
|
/* Controls: CONTROL1 = filterQ */
|
|
/* CONTROL2 = filterRate */
|
|
/* CONTROL3 = vibFreq */
|
|
/* MOD_WHEEL= vibAmt */
|
|
/******************************************/
|
|
|
|
#include "Moog1.h"
|
|
|
|
Moog1 :: Moog1() : SamplFlt()
|
|
{
|
|
attacks[0] = new RawWave("rawwaves/mandpluk.raw");
|
|
loops[0] = new RawWave("rawwaves/impuls20.raw");
|
|
loops[1] = new RawWave("rawwaves/sinewave.raw"); /* Steal one for vibrato */
|
|
attacks[0]->normalize();
|
|
loops[0]->normalize();
|
|
loops[0]->setLooping(1);
|
|
loops[1]->normalize();
|
|
loops[1]->setLooping(1);
|
|
loops[1]->setFreq(6.122);
|
|
adsr->setAll(0.05,0.00003,0.6,0.0002);
|
|
filterQ = 0.85;
|
|
filterRate = 0.0001;
|
|
modDepth = 0.0;
|
|
}
|
|
|
|
Moog1 :: ~Moog1()
|
|
{
|
|
delete attacks[0];
|
|
delete loops[0];
|
|
delete loops[1];
|
|
}
|
|
|
|
void Moog1 :: setFreq(MY_FLOAT frequency)
|
|
{
|
|
baseFreq = frequency;
|
|
attacks[0]->setFreq(baseFreq * 0.01);
|
|
loops[0]->setFreq(baseFreq);
|
|
}
|
|
|
|
void Moog1 :: noteOn(MY_FLOAT freq, MY_FLOAT amp)
|
|
{
|
|
MY_FLOAT temp;
|
|
|
|
this->setFreq(freq);
|
|
this->keyOn();
|
|
attackGain = amp * 0.5;
|
|
loopGain = amp;
|
|
|
|
temp = filterQ+0.05;
|
|
filters[0]->setStates(2000,temp,2.0 * (1.0 - temp));
|
|
filters[1]->setStates(2000,temp,2.0 * (1.0 - temp));
|
|
temp = filterQ+0.099;
|
|
filters[0]->setTargets( 0,temp,2.0 * (1.0 - temp));
|
|
filters[1]->setTargets( 0,temp,2.0 * (1.0 - temp));
|
|
filters[0]->setSweepRate(filterRate * RATE_NORM);
|
|
filters[1]->setSweepRate(filterRate * RATE_NORM);
|
|
#if defined(_debug_)
|
|
printf("Moog1 : NoteOn: Freq=%lf Amp=%lf\n",freq,amp);
|
|
#endif
|
|
}
|
|
|
|
void Moog1 :: setModulationSpeed(MY_FLOAT mSpeed)
|
|
{
|
|
loops[1]->setFreq(mSpeed);
|
|
}
|
|
|
|
void Moog1 :: setModulationDepth(MY_FLOAT mDepth)
|
|
{
|
|
modDepth = mDepth * 0.5;
|
|
}
|
|
|
|
void Moog1 :: controlChange(int number, MY_FLOAT value)
|
|
{
|
|
#if defined(_debug_)
|
|
printf("Moog1 : ControlChange: Number=%i Value=%f\n",number,value);
|
|
#endif
|
|
if (number == MIDI_control1)
|
|
filterQ = 0.80 + (0.1 * value * NORM_7);
|
|
else if (number == MIDI_control2)
|
|
filterRate = (value * NORM_7 * 0.0002);
|
|
else if (number == MIDI_control3)
|
|
this->setModulationSpeed(value * NORM_7 * 12.0);
|
|
else if (number == MIDI_mod_wheel)
|
|
this->setModulationDepth(value * NORM_7);
|
|
else if (number == MIDI_after_touch)
|
|
adsr->setTarget(value * NORM_7);
|
|
else {
|
|
printf("Moog1 : Undefined Control Number!!\n");
|
|
}
|
|
}
|
|
|
|
MY_FLOAT Moog1 :: tick()
|
|
{
|
|
MY_FLOAT temp;
|
|
|
|
if (modDepth!=0.0) {
|
|
temp = loops[1]->tick() * modDepth;
|
|
loops[0]->setFreq(baseFreq * (1.0 + temp));
|
|
}
|
|
lastOutput = SamplFlt :: tick();
|
|
return lastOutput;
|
|
}
|
|
|