| @@ -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 { | ||||