mirror of
https://github.com/thestk/stk
synced 2026-01-13 13:01:52 +00:00
Version 4.0
This commit is contained in:
committed by
Stephen Sinclair
parent
3f126af4e5
commit
81475b04c5
137
src/Simple.cpp
137
src/Simple.cpp
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user