|
@@ -107,8 +107,6 @@ struct VCF : Module { |
|
|
|
|
|
|
|
|
void process(const ProcessArgs &args) override { |
|
|
void process(const ProcessArgs &args) override { |
|
|
if (!outputs[LPF_OUTPUT].isConnected() && !outputs[HPF_OUTPUT].isConnected()) { |
|
|
if (!outputs[LPF_OUTPUT].isConnected() && !outputs[HPF_OUTPUT].isConnected()) { |
|
|
outputs[LPF_OUTPUT].setVoltage(0.f); |
|
|
|
|
|
outputs[HPF_OUTPUT].setVoltage(0.f); |
|
|
|
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@@ -116,6 +114,10 @@ struct VCF : Module { |
|
|
float resParam = params[RES_PARAM].getValue(); |
|
|
float resParam = params[RES_PARAM].getValue(); |
|
|
float fineParam = params[FINE_PARAM].getValue(); |
|
|
float fineParam = params[FINE_PARAM].getValue(); |
|
|
fineParam = dsp::quadraticBipolar(fineParam * 2.f - 1.f) * 7.f / 12.f; |
|
|
fineParam = dsp::quadraticBipolar(fineParam * 2.f - 1.f) * 7.f / 12.f; |
|
|
|
|
|
float freqCvParam = params[FREQ_CV_PARAM].getValue(); |
|
|
|
|
|
freqCvParam = dsp::quadraticBipolar(freqCvParam); |
|
|
|
|
|
float freqParam = params[FREQ_PARAM].getValue(); |
|
|
|
|
|
freqParam = freqParam * 10.f - 5.f; |
|
|
|
|
|
|
|
|
int channels = std::max(1, inputs[IN_INPUT].getChannels()); |
|
|
int channels = std::max(1, inputs[IN_INPUT].getChannels()); |
|
|
|
|
|
|
|
@@ -123,7 +125,16 @@ struct VCF : Module { |
|
|
auto *filter = &filters[c / 4]; |
|
|
auto *filter = &filters[c / 4]; |
|
|
|
|
|
|
|
|
float_4 input = float_4::load(inputs[IN_INPUT].getVoltages(c)) / 5.f; |
|
|
float_4 input = float_4::load(inputs[IN_INPUT].getVoltages(c)) / 5.f; |
|
|
float_4 drive = clamp(driveParam + inputs[DRIVE_INPUT].getVoltage() / 10.f, 0.f, 1.f); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Drive gain |
|
|
|
|
|
float_4 drive = driveParam; |
|
|
|
|
|
if (inputs[DRIVE_INPUT].isConnected()) { |
|
|
|
|
|
if (inputs[DRIVE_INPUT].isMonophonic()) |
|
|
|
|
|
drive += inputs[DRIVE_INPUT].getVoltage() / 10.f; |
|
|
|
|
|
else |
|
|
|
|
|
drive += float_4::load(inputs[DRIVE_INPUT].getVoltages(c)) / 10.f; |
|
|
|
|
|
} |
|
|
|
|
|
drive = clamp(drive, 0.f, 1.f); |
|
|
float_4 gain = simd::pow(1.f + drive, 5); |
|
|
float_4 gain = simd::pow(1.f + drive, 5); |
|
|
input *= gain; |
|
|
input *= gain; |
|
|
|
|
|
|
|
@@ -131,19 +142,32 @@ struct VCF : Module { |
|
|
input += 1e-6f * (2.f * random::uniform() - 1.f); |
|
|
input += 1e-6f * (2.f * random::uniform() - 1.f); |
|
|
|
|
|
|
|
|
// Set resonance |
|
|
// Set resonance |
|
|
float_4 res = clamp(resParam + inputs[RES_INPUT].getVoltage() / 10.f, 0.f, 1.f); |
|
|
|
|
|
filter->resonance = simd::pow(res, 2) * 10.f; |
|
|
|
|
|
|
|
|
|
|
|
// Set cutoff frequency |
|
|
|
|
|
|
|
|
float_4 resonance = resParam; |
|
|
|
|
|
if (inputs[RES_INPUT].isConnected()) { |
|
|
|
|
|
if (inputs[RES_INPUT].isMonophonic()) |
|
|
|
|
|
resonance += inputs[RES_INPUT].getVoltage() / 10.f; |
|
|
|
|
|
else |
|
|
|
|
|
resonance += float_4::load(inputs[RES_INPUT].getVoltages(c)) / 10.f; |
|
|
|
|
|
} |
|
|
|
|
|
resonance = clamp(resonance, 0.f, 1.f); |
|
|
|
|
|
filter->resonance = simd::pow(resonance, 2) * 10.f; |
|
|
|
|
|
|
|
|
|
|
|
// Get pitch |
|
|
float_4 pitch = 0.f; |
|
|
float_4 pitch = 0.f; |
|
|
if (inputs[FREQ_INPUT].isConnected()) |
|
|
|
|
|
pitch += inputs[FREQ_INPUT].getVoltage() * dsp::quadraticBipolar(params[FREQ_CV_PARAM].getValue()); |
|
|
|
|
|
pitch += params[FREQ_PARAM].getValue() * 10.f - 5.f; |
|
|
|
|
|
|
|
|
if (inputs[FREQ_INPUT].isConnected()) { |
|
|
|
|
|
if (inputs[FREQ_INPUT].isMonophonic()) |
|
|
|
|
|
pitch += inputs[FREQ_INPUT].getVoltage() * freqCvParam; |
|
|
|
|
|
else |
|
|
|
|
|
pitch += float_4::load(inputs[FREQ_INPUT].getVoltages(c)) * freqCvParam; |
|
|
|
|
|
} |
|
|
|
|
|
pitch += freqParam; |
|
|
pitch += fineParam; |
|
|
pitch += fineParam; |
|
|
|
|
|
// Set cutoff |
|
|
float_4 cutoff = dsp::FREQ_C4 * simd::pow(2.f, pitch); |
|
|
float_4 cutoff = dsp::FREQ_C4 * simd::pow(2.f, pitch); |
|
|
cutoff = clamp(cutoff, 1.f, 8000.f); |
|
|
cutoff = clamp(cutoff, 1.f, 8000.f); |
|
|
filter->setCutoff(cutoff); |
|
|
filter->setCutoff(cutoff); |
|
|
|
|
|
|
|
|
|
|
|
// Set outputs |
|
|
filter->process(input, args.sampleTime); |
|
|
filter->process(input, args.sampleTime); |
|
|
float_4 lowpass = 5.f * filter->lowpass(); |
|
|
float_4 lowpass = 5.f * filter->lowpass(); |
|
|
lowpass.store(outputs[LPF_OUTPUT].getVoltages(c)); |
|
|
lowpass.store(outputs[LPF_OUTPUT].getVoltages(c)); |
|
@@ -153,7 +177,6 @@ struct VCF : Module { |
|
|
|
|
|
|
|
|
outputs[LPF_OUTPUT].setChannels(channels); |
|
|
outputs[LPF_OUTPUT].setChannels(channels); |
|
|
outputs[HPF_OUTPUT].setChannels(channels); |
|
|
outputs[HPF_OUTPUT].setChannels(channels); |
|
|
// DEBUG("%d", channels); |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
/* |
|
|
// Process sample |
|
|
// Process sample |
|
|