| @@ -44,8 +44,8 @@ struct Random : Module { | |||||
| NUM_LIGHTS | NUM_LIGHTS | ||||
| }; | }; | ||||
| float lastVoltage = 0.f; | |||||
| float nextVoltage = 0.f; | |||||
| float lastVoltage[16] = {}; | |||||
| float nextVoltage[16] = {}; | |||||
| /** Waits at 1 until reset */ | /** Waits at 1 until reset */ | ||||
| float phase = 0.f; | float phase = 0.f; | ||||
| float clockFreq = 0.f; | float clockFreq = 0.f; | ||||
| @@ -54,7 +54,7 @@ struct Random : Module { | |||||
| /** External clock timer */ | /** External clock timer */ | ||||
| dsp::Timer clockTimer; | dsp::Timer clockTimer; | ||||
| dsp::SchmittTrigger clockTrigger; | dsp::SchmittTrigger clockTrigger; | ||||
| dsp::PulseGenerator trigGenerator; | |||||
| dsp::PulseGenerator pulseGenerator; | |||||
| Random() { | Random() { | ||||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | ||||
| @@ -91,11 +91,9 @@ struct Random : Module { | |||||
| } | } | ||||
| void process(const ProcessArgs& args) override { | void process(const ProcessArgs& args) override { | ||||
| // Params | |||||
| float shape = params[SHAPE_PARAM].getValue(); | |||||
| shape += inputs[SHAPE_INPUT].getVoltage() / 10.f * params[SHAPE_CV_PARAM].getValue(); | |||||
| shape = clamp(shape, 0.f, 1.f); | |||||
| int channels = std::max(1, inputs[EXTERNAL_INPUT].getChannels()); | |||||
| // Params | |||||
| float rand = 0.f; | float rand = 0.f; | ||||
| if (!inputs[EXTERNAL_INPUT].isConnected()) { | if (!inputs[EXTERNAL_INPUT].isConnected()) { | ||||
| rand = params[RAND_PARAM].getValue(); | rand = params[RAND_PARAM].getValue(); | ||||
| @@ -117,21 +115,23 @@ struct Random : Module { | |||||
| return; | return; | ||||
| // Generate next random voltage | // Generate next random voltage | ||||
| lastVoltage = nextVoltage; | |||||
| // lastVoltage = nextVoltage; | |||||
| std::copy_n(nextVoltage, channels, lastVoltage); | |||||
| if (inputs[EXTERNAL_INPUT].isConnected()) { | if (inputs[EXTERNAL_INPUT].isConnected()) { | ||||
| nextVoltage = inputs[EXTERNAL_INPUT].getVoltage(); | |||||
| inputs[EXTERNAL_INPUT].readVoltages(nextVoltage); | |||||
| } | } | ||||
| else { | else { | ||||
| // Crossfade new random voltage with last | // Crossfade new random voltage with last | ||||
| float v = 10.f * random::uniform(); | float v = 10.f * random::uniform(); | ||||
| if (!uni) | if (!uni) | ||||
| v -= 5.f; | v -= 5.f; | ||||
| nextVoltage = crossfade(nextVoltage, v, rand); | |||||
| nextVoltage[0] = crossfade(nextVoltage[0], v, rand); | |||||
| } | } | ||||
| phase = 0.f; | phase = 0.f; | ||||
| trigGenerator.trigger(1e-3f); | |||||
| pulseGenerator.trigger(1e-3f); | |||||
| lights[PROB_LIGHT].setBrightness(3.f); | lights[PROB_LIGHT].setBrightness(3.f); | ||||
| }; | }; | ||||
| @@ -167,12 +167,24 @@ struct Random : Module { | |||||
| phase += deltaPhase; | phase += deltaPhase; | ||||
| phase = std::min(1.f, phase); | phase = std::min(1.f, phase); | ||||
| // Shape param | |||||
| float shape = params[SHAPE_PARAM].getValue(); | |||||
| shape += inputs[SHAPE_INPUT].getVoltage() / 10.f * params[SHAPE_CV_PARAM].getValue(); | |||||
| shape = clamp(shape, 0.f, 1.f); | |||||
| auto interpolateOutput = [&](Output& output, float v) { | |||||
| for (int c = 0; c < channels; c++) { | |||||
| float vc = rescale(v, 0.f, 1.f, lastVoltage[c], nextVoltage[c]); | |||||
| output.setVoltage(vc, c); | |||||
| } | |||||
| output.setChannels(channels); | |||||
| }; | |||||
| // Stepped | // Stepped | ||||
| if (outputs[STEPPED_OUTPUT].isConnected()) { | if (outputs[STEPPED_OUTPUT].isConnected()) { | ||||
| float steps = std::ceil(std::pow(shape, 2) * 15 + 1); | float steps = std::ceil(std::pow(shape, 2) * 15 + 1); | ||||
| float v = std::ceil(phase * steps) / steps; | float v = std::ceil(phase * steps) / steps; | ||||
| v = rescale(v, 0.f, 1.f, lastVoltage, nextVoltage); | |||||
| outputs[STEPPED_OUTPUT].setVoltage(v); | |||||
| interpolateOutput(outputs[STEPPED_OUTPUT], v); | |||||
| } | } | ||||
| // Linear | // Linear | ||||
| @@ -185,8 +197,7 @@ struct Random : Module { | |||||
| else { | else { | ||||
| v = 1.f; | v = 1.f; | ||||
| } | } | ||||
| v = rescale(v, 0.f, 1.f, lastVoltage, nextVoltage); | |||||
| outputs[LINEAR_OUTPUT].setVoltage(v); | |||||
| interpolateOutput(outputs[LINEAR_OUTPUT], v); | |||||
| } | } | ||||
| // Smooth | // Smooth | ||||
| @@ -200,8 +211,7 @@ struct Random : Module { | |||||
| else { | else { | ||||
| v = -1.f; | v = -1.f; | ||||
| } | } | ||||
| v = rescale(v, 1.f, -1.f, lastVoltage, nextVoltage); | |||||
| outputs[SMOOTH_OUTPUT].setVoltage(v); | |||||
| interpolateOutput(outputs[SMOOTH_OUTPUT], v); | |||||
| } | } | ||||
| // Exp | // Exp | ||||
| @@ -217,12 +227,12 @@ struct Random : Module { | |||||
| else { | else { | ||||
| v = 1.f; | v = 1.f; | ||||
| } | } | ||||
| v = rescale(v, 0.f, 1.f, lastVoltage, nextVoltage); | |||||
| outputs[EXPONENTIAL_OUTPUT].setVoltage(v); | |||||
| interpolateOutput(outputs[EXPONENTIAL_OUTPUT], v); | |||||
| } | } | ||||
| // Trigger output | // Trigger output | ||||
| outputs[TRIG_OUTPUT].setVoltage(trigGenerator.process(args.sampleTime) ? 10.f : 0.f); | |||||
| bool pulse = pulseGenerator.process(args.sampleTime); | |||||
| outputs[TRIG_OUTPUT].setVoltage(pulse ? 10.f : 0.f); | |||||
| // Lights | // Lights | ||||
| lights[RATE_LIGHT].setSmoothBrightness(0.f, args.sampleTime); | lights[RATE_LIGHT].setSmoothBrightness(0.f, args.sampleTime); | ||||