Browse Source

Use Rack's new MinBlepGenerator instead of hard coded lookup table

tags/v1.1.0
Andrew Belt 6 years ago
parent
commit
3e145a0959
1 changed files with 17 additions and 30 deletions
  1. +17
    -30
      src/EvenVCO.cpp

+ 17
- 30
src/EvenVCO.cpp View File

@@ -33,12 +33,12 @@ struct EvenVCO : Module {
/** Whether we are past the pulse width already */
bool halfPhase = false;

dsp::MinBLEP<16> triSquareMinBLEP;
dsp::MinBLEP<16> triMinBLEP;
dsp::MinBLEP<16> sineMinBLEP;
dsp::MinBLEP<16> doubleSawMinBLEP;
dsp::MinBLEP<16> sawMinBLEP;
dsp::MinBLEP<16> squareMinBLEP;
dsp::MinBlepGenerator<16, 32> triSquareMinBlep;
dsp::MinBlepGenerator<16, 32> triMinBlep;
dsp::MinBlepGenerator<16, 32> sineMinBlep;
dsp::MinBlepGenerator<16, 32> doubleSawMinBlep;
dsp::MinBlepGenerator<16, 32> sawMinBlep;
dsp::MinBlepGenerator<16, 32> squareMinBlep;

dsp::RCFilter triFilter;

@@ -47,19 +47,6 @@ struct EvenVCO : Module {
params[OCTAVE_PARAM].config(-5.0, 4.0, 0.0, "Octave", "'", 0.5);
params[TUNE_PARAM].config(-7.0, 7.0, 0.0, "Tune", " semitones");
params[PWM_PARAM].config(-1.0, 1.0, 0.0, "Pulse width");

triSquareMinBLEP.minblep = dsp::minblep_16_32;
triSquareMinBLEP.oversample = 32;
triMinBLEP.minblep = dsp::minblep_16_32;
triMinBLEP.oversample = 32;
sineMinBLEP.minblep = dsp::minblep_16_32;
sineMinBLEP.oversample = 32;
doubleSawMinBLEP.minblep = dsp::minblep_16_32;
doubleSawMinBLEP.oversample = 32;
sawMinBLEP.minblep = dsp::minblep_16_32;
sawMinBLEP.oversample = 32;
squareMinBLEP.minblep = dsp::minblep_16_32;
squareMinBLEP.oversample = 32;
}

void step() override {
@@ -82,13 +69,13 @@ struct EvenVCO : Module {

if (oldPhase < 0.5 && phase >= 0.5) {
float crossing = -(phase - 0.5) / deltaPhase;
triSquareMinBLEP.jump(crossing, 2.f);
doubleSawMinBLEP.jump(crossing, -2.f);
triSquareMinBlep.insertDiscontinuity(crossing, 2.f);
doubleSawMinBlep.insertDiscontinuity(crossing, -2.f);
}

if (!halfPhase && phase >= pw) {
float crossing = -(phase - pw) / deltaPhase;
squareMinBLEP.jump(crossing, 2.f);
squareMinBlep.insertDiscontinuity(crossing, 2.f);
halfPhase = true;
}

@@ -96,16 +83,16 @@ struct EvenVCO : Module {
if (phase >= 1.f) {
phase -= 1.f;
float crossing = -phase / deltaPhase;
triSquareMinBLEP.jump(crossing, -2.f);
doubleSawMinBLEP.jump(crossing, -2.f);
squareMinBLEP.jump(crossing, -2.f);
sawMinBLEP.jump(crossing, -2.f);
triSquareMinBlep.insertDiscontinuity(crossing, -2.f);
doubleSawMinBlep.insertDiscontinuity(crossing, -2.f);
squareMinBlep.insertDiscontinuity(crossing, -2.f);
sawMinBlep.insertDiscontinuity(crossing, -2.f);
halfPhase = false;
}

// Outputs
float triSquare = (phase < 0.5) ? -1.f : 1.f;
triSquare += triSquareMinBLEP.shift();
triSquare += triSquareMinBlep.process();

// Integrate square for triangle
tri += 4.f * triSquare * freq * app()->engine->getSampleTime();
@@ -113,12 +100,12 @@ struct EvenVCO : Module {

float sine = -std::cos(2*M_PI * phase);
float doubleSaw = (phase < 0.5) ? (-1.f + 4.f*phase) : (-1.f + 4.f*(phase - 0.5));
doubleSaw += doubleSawMinBLEP.shift();
doubleSaw += doubleSawMinBlep.process();
float even = 0.55 * (doubleSaw + 1.27 * sine);
float saw = -1.f + 2.f*phase;
saw += sawMinBLEP.shift();
saw += sawMinBlep.process();
float square = (phase < pw) ? -1.f : 1.f;
square += squareMinBLEP.shift();
square += squareMinBlep.process();

// Set outputs
outputs[TRI_OUTPUT].value = 5.f*tri;


Loading…
Cancel
Save