From 506b8e7dedb80d79bf015e47d92e8b8dd8284584 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 16 Aug 2003 17:08:55 +0000 Subject: added files straight from Yves' sources svn path=/trunk/externals/unauthorized/; revision=864 --- stkdrone~/drone.cc | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 stkdrone~/drone.cc (limited to 'stkdrone~/drone.cc') diff --git a/stkdrone~/drone.cc b/stkdrone~/drone.cc new file mode 100644 index 0000000..ba065ad --- /dev/null +++ b/stkdrone~/drone.cc @@ -0,0 +1,77 @@ + /******************************************/ +/* Karplus-Strong drone string model */ +/* by Perry Cook, 1995-96 */ +/* */ +/* There exist at least two patents, */ +/* assigned to Stanford, bearing the */ +/* names of Karplus and/or Strong. */ +/******************************************/ + +#include "drone.h" + +drone :: drone(MY_FLOAT lowestFreq) +{ + length = (long) (SRATE / lowestFreq + 1); + loopGain = (MY_FLOAT) 0.999; + loopFilt = new OneZero(); + delayLine = new DLineA(length); + envelope = new ADSR(); + noise = new Noise; + envelope->setAllTimes(2.0,0.5,0.0,0.5); + this->clear(); +} + +drone :: ~drone() +{ + delete loopFilt; + delete delayLine; + delete envelope; + delete noise; +} + +void drone :: clear() +{ + loopFilt->clear(); + delayLine->clear(); +} + +void drone :: setFreq(MY_FLOAT frequency) +{ + MY_FLOAT delay; + delay = (SRATE / frequency); + delayLine->setDelay(delay - 0.5); + loopGain = (MY_FLOAT) 0.997 + (frequency * (MY_FLOAT) 0.000002); + if (loopGain>1.0) loopGain = (MY_FLOAT) 0.99999; +} + +void drone :: pluck(MY_FLOAT amplitude) +{ + envelope->keyOn(); +} + +void drone :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + this->setFreq(freq); + this->pluck(amp); +#if defined(_debug_) + printf("drone : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + +void drone :: noteOff(MY_FLOAT amp) +{ + loopGain = (MY_FLOAT) 1.0 - amp; +#if defined(_debug_) + printf("drone : NoteOff: Amp=%lf\n",amp); +#endif +} + +MY_FLOAT drone :: tick() +{ + /* check this out */ + /* here's the whole inner loop of the instrument!! */ + lastOutput = delayLine->tick(loopFilt->tick((delayLine->lastOut() * loopGain)) + + (0.005 * envelope->tick() * noise->tick())); + return lastOutput; +} + -- cgit v1.2.1