|
|
@@ -44,8 +44,8 @@ struct Random : Module { |
|
|
|
NUM_LIGHTS |
|
|
|
}; |
|
|
|
|
|
|
|
float lastVoltage = 0.f; |
|
|
|
float nextVoltage = 0.f; |
|
|
|
float lastVoltage[16] = {}; |
|
|
|
float nextVoltage[16] = {}; |
|
|
|
/** Waits at 1 until reset */ |
|
|
|
float phase = 0.f; |
|
|
|
float clockFreq = 0.f; |
|
|
@@ -54,7 +54,7 @@ struct Random : Module { |
|
|
|
/** External clock timer */ |
|
|
|
dsp::Timer clockTimer; |
|
|
|
dsp::SchmittTrigger clockTrigger; |
|
|
|
dsp::PulseGenerator trigGenerator; |
|
|
|
dsp::PulseGenerator pulseGenerator; |
|
|
|
|
|
|
|
Random() { |
|
|
|
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); |
|
|
@@ -91,11 +91,9 @@ struct Random : Module { |
|
|
|
} |
|
|
|
|
|
|
|
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; |
|
|
|
if (!inputs[EXTERNAL_INPUT].isConnected()) { |
|
|
|
rand = params[RAND_PARAM].getValue(); |
|
|
@@ -117,21 +115,23 @@ struct Random : Module { |
|
|
|
return; |
|
|
|
|
|
|
|
// Generate next random voltage |
|
|
|
lastVoltage = nextVoltage; |
|
|
|
// lastVoltage = nextVoltage; |
|
|
|
std::copy_n(nextVoltage, channels, lastVoltage); |
|
|
|
|
|
|
|
if (inputs[EXTERNAL_INPUT].isConnected()) { |
|
|
|
nextVoltage = inputs[EXTERNAL_INPUT].getVoltage(); |
|
|
|
inputs[EXTERNAL_INPUT].readVoltages(nextVoltage); |
|
|
|
} |
|
|
|
else { |
|
|
|
// Crossfade new random voltage with last |
|
|
|
float v = 10.f * random::uniform(); |
|
|
|
if (!uni) |
|
|
|
v -= 5.f; |
|
|
|
nextVoltage = crossfade(nextVoltage, v, rand); |
|
|
|
nextVoltage[0] = crossfade(nextVoltage[0], v, rand); |
|
|
|
} |
|
|
|
|
|
|
|
phase = 0.f; |
|
|
|
|
|
|
|
trigGenerator.trigger(1e-3f); |
|
|
|
pulseGenerator.trigger(1e-3f); |
|
|
|
lights[PROB_LIGHT].setBrightness(3.f); |
|
|
|
}; |
|
|
|
|
|
|
@@ -167,12 +167,24 @@ struct Random : Module { |
|
|
|
phase += deltaPhase; |
|
|
|
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 |
|
|
|
if (outputs[STEPPED_OUTPUT].isConnected()) { |
|
|
|
float steps = std::ceil(std::pow(shape, 2) * 15 + 1); |
|
|
|
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 |
|
|
@@ -185,8 +197,7 @@ struct Random : Module { |
|
|
|
else { |
|
|
|
v = 1.f; |
|
|
|
} |
|
|
|
v = rescale(v, 0.f, 1.f, lastVoltage, nextVoltage); |
|
|
|
outputs[LINEAR_OUTPUT].setVoltage(v); |
|
|
|
interpolateOutput(outputs[LINEAR_OUTPUT], v); |
|
|
|
} |
|
|
|
|
|
|
|
// Smooth |
|
|
@@ -200,8 +211,7 @@ struct Random : Module { |
|
|
|
else { |
|
|
|
v = -1.f; |
|
|
|
} |
|
|
|
v = rescale(v, 1.f, -1.f, lastVoltage, nextVoltage); |
|
|
|
outputs[SMOOTH_OUTPUT].setVoltage(v); |
|
|
|
interpolateOutput(outputs[SMOOTH_OUTPUT], v); |
|
|
|
} |
|
|
|
|
|
|
|
// Exp |
|
|
@@ -217,12 +227,12 @@ struct Random : Module { |
|
|
|
else { |
|
|
|
v = 1.f; |
|
|
|
} |
|
|
|
v = rescale(v, 0.f, 1.f, lastVoltage, nextVoltage); |
|
|
|
outputs[EXPONENTIAL_OUTPUT].setVoltage(v); |
|
|
|
interpolateOutput(outputs[EXPONENTIAL_OUTPUT], v); |
|
|
|
} |
|
|
|
|
|
|
|
// 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[RATE_LIGHT].setSmoothBrightness(0.f, args.sampleTime); |
|
|
|