@@ -106,13 +106,13 @@ struct LFO : Module { | |||||
LFO() { | LFO() { | ||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | ||||
configParam(OFFSET_PARAM, 0.f, 1.f, 1.f); | |||||
configParam(INVERT_PARAM, 0.f, 1.f, 1.f); | |||||
configParam(FREQ_PARAM, -8.f, 10.f, 1.f); | |||||
configParam(FM1_PARAM, 0.f, 1.f, 0.f); | |||||
configParam(PW_PARAM, 0.f, 1.f, 0.5f); | |||||
configParam(FM2_PARAM, 0.f, 1.f, 0.f); | |||||
configParam(PWM_PARAM, 0.f, 1.f, 0.f); | |||||
configParam(OFFSET_PARAM, 0.f, 1.f, 1.f, "Offset"); | |||||
configParam(INVERT_PARAM, 0.f, 1.f, 1.f, "Invert"); | |||||
configParam(FREQ_PARAM, -8.f, 10.f, 1.f, "Frequency", " Hz", 2, 1); | |||||
configParam(FM1_PARAM, 0.f, 1.f, 0.f, "Frequency modulation 1", "%", 0.f, 100.f); | |||||
configParam(PW_PARAM, 0.f, 1.f, 0.5f, "Pulse width", "%", 0.f, 100.f); | |||||
configParam(FM2_PARAM, 0.f, 1.f, 0.f, "Frequency modulation 2", "%", 0.f, 100.f); | |||||
configParam(PWM_PARAM, 0.f, 1.f, 0.f, "Pulse width modulation", "%", 0.f, 100.f); | |||||
lightDivider.setDivision(16); | lightDivider.setDivision(16); | ||||
} | } | ||||
@@ -259,11 +259,11 @@ struct LFO2 : Module { | |||||
LFO2() { | LFO2() { | ||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | ||||
configParam(OFFSET_PARAM, 0.f, 1.f, 1.f); | |||||
configParam(INVERT_PARAM, 0.f, 1.f, 1.f); | |||||
configParam(FREQ_PARAM, -8.f, 10.f, 1.f); | |||||
configParam(WAVE_PARAM, 0.f, 3.f, 1.5f); | |||||
configParam(FM_PARAM, 0.f, 1.f, 0.5f); | |||||
configParam(OFFSET_PARAM, 0.f, 1.f, 1.f, "Offset"); | |||||
configParam(INVERT_PARAM, 0.f, 1.f, 1.f, "Invert"); | |||||
configParam(FREQ_PARAM, -8.f, 10.f, 1.f, "Frequency", " Hz", 2, 1); | |||||
configParam(WAVE_PARAM, 0.f, 3.f, 1.5f, "Wave"); | |||||
configParam(FM_PARAM, 0.f, 1.f, 0.5f, "Frequency modulation", "%", 0.f, 100.f); | |||||
lightDivider.setDivision(16); | lightDivider.setDivision(16); | ||||
} | } | ||||
@@ -49,13 +49,14 @@ struct Scope : Module { | |||||
Scope() { | Scope() { | ||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | ||||
configParam(X_SCALE_PARAM, -2.f, 8.f, 0.f); | |||||
configParam(X_POS_PARAM, -10.f, 10.f, 0.f); | |||||
configParam(Y_SCALE_PARAM, -2.f, 8.f, 0.f); | |||||
configParam(Y_POS_PARAM, -10.f, 10.f, 0.f); | |||||
configParam(TIME_PARAM, 6.f, 16.f, 14.f); | |||||
configParam(X_SCALE_PARAM, -2.f, 8.f, 0.f, "X scale", " V/div", 1/2.f, 5); | |||||
configParam(X_POS_PARAM, -10.f, 10.f, 0.f, "X position", " V"); | |||||
configParam(Y_SCALE_PARAM, -2.f, 8.f, 0.f, "Y scale", " V/div", 1/2.f, 5); | |||||
configParam(Y_POS_PARAM, -10.f, 10.f, 0.f, "Y position", " V"); | |||||
const float timeBase = (float) BUFFER_SIZE / 6; | |||||
configParam(TIME_PARAM, 6.f, 16.f, 14.f, "Time", " ms/div", 1/2.f, 1000 * timeBase); | |||||
configParam(LISSAJOUS_PARAM, 0.f, 1.f, 0.f); | configParam(LISSAJOUS_PARAM, 0.f, 1.f, 0.f); | ||||
configParam(TRIG_PARAM, -10.f, 10.f, 0.f); | |||||
configParam(TRIG_PARAM, -10.f, 10.f, 0.f, "Trigger position", " V"); | |||||
configParam(EXTERNAL_PARAM, 0.f, 1.f, 0.f); | configParam(EXTERNAL_PARAM, 0.f, 1.f, 0.f); | ||||
} | } | ||||
@@ -32,7 +32,7 @@ struct LadderFilter { | |||||
} | } | ||||
void setCutoff(T cutoff) { | void setCutoff(T cutoff) { | ||||
omega0 = 2*M_PI * cutoff; | |||||
omega0 = 2 * T(M_PI) * cutoff; | |||||
} | } | ||||
void process(T input, T dt) { | void process(T input, T dt) { | ||||
@@ -93,11 +93,12 @@ struct VCF : Module { | |||||
VCF() { | VCF() { | ||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); | config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); | ||||
configParam(FREQ_PARAM, 0.f, 1.f, 0.5f, "Frequency"); | |||||
// Multiply and offset for backward patch compatibility | |||||
configParam(FREQ_PARAM, 0.f, 1.f, 0.5f, "Frequency", " Hz", std::pow(2, 10.f), dsp::FREQ_C4 / std::pow(2, 5.f)); | |||||
configParam(FINE_PARAM, 0.f, 1.f, 0.5f, "Fine frequency"); | configParam(FINE_PARAM, 0.f, 1.f, 0.5f, "Fine frequency"); | ||||
configParam(RES_PARAM, 0.f, 1.f, 0.f, "Resonance"); | |||||
configParam(FREQ_CV_PARAM, -1.f, 1.f, 0.f, "Frequency modulation"); | |||||
configParam(DRIVE_PARAM, 0.f, 1.f, 0.f, "Drive"); | |||||
configParam(RES_PARAM, 0.f, 1.f, 0.f, "Resonance", "%", 0.f, 100.f); | |||||
configParam(FREQ_CV_PARAM, -1.f, 1.f, 0.f, "Frequency modulation", "%", 0.f, 100.f); | |||||
configParam(DRIVE_PARAM, 0.f, 1.f, 0.f, "Drive", "", 0, 11); | |||||
} | } | ||||
void onReset() override { | void onReset() override { | ||||
@@ -127,11 +128,7 @@ struct VCF : Module { | |||||
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; | ||||
// Drive gain | // Drive gain | ||||
float_4 drive = driveParam; | |||||
if (inputs[DRIVE_INPUT].isPolyphonic()) | |||||
drive += float_4::load(inputs[DRIVE_INPUT].getVoltages(c)) / 10.f; | |||||
else | |||||
drive += inputs[DRIVE_INPUT].getVoltage() / 10.f; | |||||
float_4 drive = driveParam + inputs[DRIVE_INPUT].getPolyVoltageSimd<float_4>(c) / 10.f; | |||||
drive = clamp(drive, 0.f, 1.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; | ||||
@@ -140,22 +137,12 @@ 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 resonance = resParam; | |||||
if (inputs[RES_INPUT].isPolyphonic()) | |||||
resonance += float_4::load(inputs[RES_INPUT].getVoltages(c)) / 10.f; | |||||
else | |||||
resonance += inputs[RES_INPUT].getVoltage() / 10.f; | |||||
float_4 resonance = resParam + inputs[RES_INPUT].getPolyVoltageSimd<float_4>(c) / 10.f; | |||||
resonance = clamp(resonance, 0.f, 1.f); | resonance = clamp(resonance, 0.f, 1.f); | ||||
filter->resonance = simd::pow(resonance, 2) * 10.f; | filter->resonance = simd::pow(resonance, 2) * 10.f; | ||||
// Get pitch | // Get pitch | ||||
float_4 pitch = 0.f; | |||||
if (inputs[FREQ_INPUT].isPolyphonic()) | |||||
pitch += float_4::load(inputs[FREQ_INPUT].getVoltages(c)) * freqCvParam; | |||||
else | |||||
pitch += inputs[FREQ_INPUT].getVoltage() * freqCvParam; | |||||
pitch += freqParam; | |||||
pitch += fineParam; | |||||
float_4 pitch = freqParam + fineParam + inputs[FREQ_INPUT].getPolyVoltageSimd<float_4>(c) * freqCvParam; | |||||
// Set cutoff | // 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); | ||||
@@ -199,7 +199,7 @@ struct VCO : Module { | |||||
configParam(SYNC_PARAM, 0.f, 1.f, 1.f, "Hard sync"); | configParam(SYNC_PARAM, 0.f, 1.f, 1.f, "Hard sync"); | ||||
configParam(FREQ_PARAM, -54.f, 54.f, 0.f, "Frequency", " Hz", dsp::FREQ_SEMITONE, dsp::FREQ_C4); | configParam(FREQ_PARAM, -54.f, 54.f, 0.f, "Frequency", " Hz", dsp::FREQ_SEMITONE, dsp::FREQ_C4); | ||||
configParam(FINE_PARAM, -1.f, 1.f, 0.f, "Fine frequency"); | configParam(FINE_PARAM, -1.f, 1.f, 0.f, "Fine frequency"); | ||||
configParam(FM_PARAM, 0.f, 1.f, 0.f, "Frequency modulation"); | |||||
configParam(FM_PARAM, 0.f, 1.f, 0.f, "Frequency modulation", "%", 0.f, 100.f); | |||||
configParam(PW_PARAM, 0.f, 1.f, 0.5f, "Pulse width", "%", 0.f, 100.f); | configParam(PW_PARAM, 0.f, 1.f, 0.5f, "Pulse width", "%", 0.f, 100.f); | ||||
configParam(PWM_PARAM, 0.f, 1.f, 0.f, "Pulse width modulation", "%", 0.f, 100.f); | configParam(PWM_PARAM, 0.f, 1.f, 0.f, "Pulse width modulation", "%", 0.f, 100.f); | ||||
} | } | ||||
@@ -305,7 +305,7 @@ struct VCO2 : Module { | |||||
configParam(SYNC_PARAM, 0.f, 1.f, 1.f, "Hard sync"); | configParam(SYNC_PARAM, 0.f, 1.f, 1.f, "Hard sync"); | ||||
configParam(FREQ_PARAM, -54.f, 54.f, 0.f, "Frequency", " Hz", dsp::FREQ_SEMITONE, dsp::FREQ_C4); | configParam(FREQ_PARAM, -54.f, 54.f, 0.f, "Frequency", " Hz", dsp::FREQ_SEMITONE, dsp::FREQ_C4); | ||||
configParam(WAVE_PARAM, 0.f, 3.f, 1.5f, "Wave"); | configParam(WAVE_PARAM, 0.f, 3.f, 1.5f, "Wave"); | ||||
configParam(FM_PARAM, 0.f, 1.f, 0.f, "Frequency modulation"); | |||||
configParam(FM_PARAM, 0.f, 1.f, 0.f, "Frequency modulation", "%", 0.f, 100.f); | |||||
} | } | ||||
void process(const ProcessArgs &args) override { | void process(const ProcessArgs &args) override { | ||||