mirror of
https://github.com/thestk/stk
synced 2026-01-11 20:11:52 +00:00
91 lines
2.4 KiB
C++
91 lines
2.4 KiB
C++
/******************************************/
|
|
/* Enhanced (Jaffe-Smith, Smith, others) */
|
|
/* Karplus-Strong plucked model */
|
|
/* by Perry Cook, 1995-96 */
|
|
/* This is the super-class, with no */
|
|
/* excitation specified. So this one by */
|
|
/* itself doesn't make any sound. */
|
|
/******************************************/
|
|
|
|
#include "Plucked2.h"
|
|
|
|
Plucked2 :: Plucked2(MY_FLOAT lowestFreq)
|
|
{
|
|
length = (long) (SRATE / lowestFreq + 1);
|
|
baseLoopGain = (MY_FLOAT) 0.995;
|
|
loopGain = (MY_FLOAT) 0.999;
|
|
delayLine = new DLineA(length);
|
|
delayLine2 = new DLineA(length);
|
|
combDelay = new DLineL(length);
|
|
filter = new OneZero;
|
|
filter2 = new OneZero;
|
|
pluckAmp = (MY_FLOAT) 0.3;
|
|
pluckPos = (MY_FLOAT) 0.4;
|
|
detuning = (MY_FLOAT) 0.995;
|
|
lastFreq = lowestFreq * (MY_FLOAT) 2.0;
|
|
lastLength = length * (MY_FLOAT) 0.5;
|
|
}
|
|
|
|
Plucked2 :: ~Plucked2()
|
|
{
|
|
delete delayLine;
|
|
delete delayLine2;
|
|
delete combDelay;
|
|
delete filter;
|
|
delete filter2;
|
|
}
|
|
|
|
void Plucked2 :: clear()
|
|
{
|
|
delayLine->clear();
|
|
delayLine2->clear();
|
|
combDelay->clear();
|
|
filter->clear();
|
|
filter2->clear();
|
|
}
|
|
|
|
void Plucked2 :: setFreq(MY_FLOAT frequency)
|
|
{
|
|
lastFreq = frequency;
|
|
lastLength = ((MY_FLOAT) SRATE / lastFreq); /* length - delays */
|
|
delayLine->setDelay((lastLength / detuning) - (MY_FLOAT) 0.5);
|
|
delayLine2->setDelay((lastLength * detuning) - (MY_FLOAT) 0.5);
|
|
loopGain = baseLoopGain + (frequency * (MY_FLOAT) 0.000005);
|
|
if (loopGain>1.0) loopGain = (MY_FLOAT) 0.99999;
|
|
}
|
|
|
|
void Plucked2 :: setDetune(MY_FLOAT detune)
|
|
{
|
|
detuning = detune;
|
|
delayLine->setDelay((lastLength / detuning) - (MY_FLOAT) 0.5);
|
|
delayLine2->setDelay((lastLength * detuning) - (MY_FLOAT) 0.5);
|
|
}
|
|
|
|
void Plucked2 :: setFreqAndDetune(MY_FLOAT frequency,MY_FLOAT detune)
|
|
{
|
|
lastFreq = frequency;
|
|
detuning = detune;
|
|
this->setFreq(frequency);
|
|
}
|
|
|
|
void Plucked2 :: setPluckPos(MY_FLOAT position)
|
|
{
|
|
pluckPos = position;
|
|
}
|
|
|
|
void Plucked2 :: setBaseLoopGain(MY_FLOAT aGain)
|
|
{
|
|
baseLoopGain = aGain;
|
|
loopGain = baseLoopGain + (lastFreq * (MY_FLOAT) 0.000005);
|
|
if (loopGain>1.0) loopGain = (MY_FLOAT) 0.99999;
|
|
}
|
|
|
|
void Plucked2 :: noteOff(MY_FLOAT amp)
|
|
{
|
|
loopGain = ((MY_FLOAT) 1.0 - amp) * (MY_FLOAT) 0.5;
|
|
#if defined(_debug_)
|
|
printf("Plucked2 : NoteOff: Amp=%lf\n",amp);
|
|
#endif
|
|
}
|
|
|