Version 4.0

This commit is contained in:
Gary Scavone
2013-09-25 14:50:19 +02:00
committed by Stephen Sinclair
parent 3f126af4e5
commit 81475b04c5
473 changed files with 36355 additions and 28396 deletions

View File

@@ -1,32 +1,41 @@
/*******************************************/
/* 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 */
/*******************************************/
/***************************************************/
/*! \class Simple
\brief STK wavetable/noise instrument.
This class combines a looped wave, a
noise source, a biquad resonance filter,
a one-pole filter, and an ADSR envelope
to create some interesting sounds.
Control Change Numbers:
- Filter Pole Position = 2
- Noise/Pitched Cross-Fade = 4
- Envelope Rate = 11
- Gain = 128
by Perry R. Cook and Gary P. Scavone, 1995 - 2002.
*/
/***************************************************/
#include "Simple.h"
#include "SKINI.msg"
#include <string.h>
Simple :: Simple()
{
MY_FLOAT coeffs[2];
adsr = new ADSR;
baseFreq = (MY_FLOAT) 440.0;
baseFrequency = (MY_FLOAT) 440.0;
// Concatenate the STK RAWWAVE_PATH to the rawwave file
char file[128];
strcpy(file, RAWWAVE_PATH);
loop = new RawWvIn(strcat(file,"rawwaves/impuls10.raw"),"looping");
filter = new OnePole;
loop = new WaveLoop( strcat(file,"rawwaves/impuls10.raw"), TRUE );
filter = new OnePole(0.5);
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);
biquad = new BiQuad();
setFrequency(baseFrequency);
loopGain = 0.5;
}
@@ -35,8 +44,7 @@ Simple :: ~Simple()
delete adsr;
delete loop;
delete filter;
delete bqzeroes;
delete bqpoles;
delete biquad;
}
void Simple :: keyOn()
@@ -49,66 +57,69 @@ void Simple :: keyOff()
adsr->keyOff();
}
void Simple :: noteOn(MY_FLOAT freq, MY_FLOAT amp)
void Simple :: noteOn(MY_FLOAT frequency, MY_FLOAT amplitude)
{
this->keyOn();
this->setFreq(freq);
filter->setGain(amp);
#if defined(_debug_)
printf("Simple : NoteOn: Freq= %lf, Amp=%lf\n",freq, amp);
#endif
keyOn();
setFrequency(frequency);
filter->setGain(amplitude);
#if defined(_STK_DEBUG_)
cerr << "Simple: NoteOn frequency = " << frequency << ", amplitude = " << amplitude << endl;
#endif
}
void Simple :: noteOff(MY_FLOAT amplitude)
{
this->keyOff();
#if defined(_debug_)
printf("Simple : NoteOff: Amp=%lf\n",amplitude);
#endif
keyOff();
#if defined(_STK_DEBUG_)
cerr << "Simple: NoteOff amplitude = " << amplitude << endl;
#endif
}
void Simple :: setFreq(MY_FLOAT frequency)
void Simple :: setFrequency(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);
biquad->setResonance( frequency, 0.98, true );
loop->setFrequency(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);
biquad->tick( noise->tick() );
lastOutput += (1.0 - loopGain) * biquad->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);
MY_FLOAT norm = value * ONE_OVER_128;
if ( norm < 0 ) {
norm = 0.0;
cerr << "Clarinet: Control value less than zero!" << endl;
}
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");
}
else if ( norm > 1.0 ) {
norm = 1.0;
cerr << "Clarinet: Control value greater than 128.0!" << endl;
}
if (number == __SK_Breath_) // 2
filter->setPole( 0.99 * (1.0 - (norm * 2.0)) );
else if (number == __SK_NoiseLevel_) // 4
loopGain = norm;
else if (number == __SK_ModFrequency_) { // 11
norm /= 0.2 * Stk::sampleRate();
adsr->setAttackRate( norm );
adsr->setDecayRate( norm );
adsr->setReleaseRate( norm );
}
else if (number == __SK_AfterTouch_Cont_) // 128
adsr->setTarget( norm );
else
cerr << "Simple: Undefined Control Number (" << number << ")!!" << endl;
#if defined(_STK_DEBUG_)
cerr << "Simple: controlChange number = " << number << ", value = " << value << endl;
#endif
}