@@ -28,16 +28,16 @@ struct Delay : Module { | |||
dsp::DoubleRingBuffer<float, HISTORY_SIZE> historyBuffer; | |||
dsp::DoubleRingBuffer<float, 16> outBuffer; | |||
SRC_STATE *src; | |||
float lastWet = 0.0f; | |||
float lastWet = 0.f; | |||
dsp::RCFilter lowpassFilter; | |||
dsp::RCFilter highpassFilter; | |||
Delay() { | |||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); | |||
params[TIME_PARAM].config(0.0f, 1.0f, 0.5f, "Time"); | |||
params[FEEDBACK_PARAM].config(0.0f, 1.0f, 0.5f, "Feedback"); | |||
params[COLOR_PARAM].config(0.0f, 1.0f, 0.5f, "Color"); | |||
params[MIX_PARAM].config(0.0f, 1.0f, 0.5f, "Mix", "%", 0, 100); | |||
params[TIME_PARAM].config(0.f, 1.f, 0.5f, "Time"); | |||
params[FEEDBACK_PARAM].config(0.f, 1.f, 0.5f, "Feedback"); | |||
params[COLOR_PARAM].config(0.f, 1.f, 0.5f, "Color"); | |||
params[MIX_PARAM].config(0.f, 1.f, 0.5f, "Mix", "%", 0, 100); | |||
src = src_new(SRC_SINC_FASTEST, 1, NULL); | |||
assert(src); | |||
@@ -50,11 +50,11 @@ struct Delay : Module { | |||
void process(const ProcessArgs &args) override { | |||
// Get input to delay block | |||
float in = inputs[IN_INPUT].getVoltage(); | |||
float feedback = clamp(params[FEEDBACK_PARAM].getValue() + inputs[FEEDBACK_INPUT].getVoltage() / 10.0f, 0.0f, 1.0f); | |||
float feedback = clamp(params[FEEDBACK_PARAM].getValue() + inputs[FEEDBACK_INPUT].getVoltage() / 10.f, 0.f, 1.f); | |||
float dry = in + lastWet * feedback; | |||
// Compute delay time in seconds | |||
float delay = 1e-3 * std::pow(10.0f / 1e-3, clamp(params[TIME_PARAM].getValue() + inputs[TIME_INPUT].getVoltage() / 10.0f, 0.0f, 1.0f)); | |||
float delay = 1e-3 * std::pow(10.f / 1e-3, clamp(params[TIME_PARAM].getValue() + inputs[TIME_INPUT].getVoltage() / 10.f, 0.f, 1.f)); | |||
// Number of delay samples | |||
float index = delay * args.sampleRate; | |||
@@ -84,26 +84,26 @@ struct Delay : Module { | |||
outBuffer.endIncr(srcData.output_frames_gen); | |||
} | |||
float wet = 0.0f; | |||
float wet = 0.f; | |||
if (!outBuffer.empty()) { | |||
wet = outBuffer.shift(); | |||
} | |||
// Apply color to delay wet output | |||
// TODO Make it sound better | |||
float color = clamp(params[COLOR_PARAM].getValue() + inputs[COLOR_INPUT].getVoltage() / 10.0f, 0.0f, 1.0f); | |||
float lowpassFreq = 10000.0f * std::pow(10.0f, clamp(2.0f*color, 0.0f, 1.0f)); | |||
float color = clamp(params[COLOR_PARAM].getValue() + inputs[COLOR_INPUT].getVoltage() / 10.f, 0.f, 1.f); | |||
float lowpassFreq = 10000.f * std::pow(10.f, clamp(2.f*color, 0.f, 1.f)); | |||
lowpassFilter.setCutoff(lowpassFreq / args.sampleRate); | |||
lowpassFilter.process(wet); | |||
wet = lowpassFilter.lowpass(); | |||
float highpassFreq = 10.0f * std::pow(100.0f, clamp(2.0f*color - 1.0f, 0.0f, 1.0f)); | |||
float highpassFreq = 10.f * std::pow(100.f, clamp(2.f*color - 1.f, 0.f, 1.f)); | |||
highpassFilter.setCutoff(highpassFreq / args.sampleRate); | |||
highpassFilter.process(wet); | |||
wet = highpassFilter.highpass(); | |||
lastWet = wet; | |||
float mix = clamp(params[MIX_PARAM].getValue() + inputs[MIX_INPUT].getVoltage() / 10.0f, 0.0f, 1.0f); | |||
float mix = clamp(params[MIX_PARAM].getValue() + inputs[MIX_INPUT].getVoltage() / 10.f, 0.f, 1.f); | |||
float out = crossfade(in, wet, mix); | |||
outputs[OUT_OUTPUT].setVoltage(out); | |||
} | |||
@@ -49,15 +49,15 @@ struct SEQ3 : Module { | |||
SEQ3() { | |||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
params[CLOCK_PARAM].config(-2.0f, 6.0f, 2.0f); | |||
params[RUN_PARAM].config(0.0f, 1.0f, 0.0f); | |||
params[RESET_PARAM].config(0.0f, 1.0f, 0.0f); | |||
params[STEPS_PARAM].config(1.0f, 8.0f, 8.0f); | |||
params[CLOCK_PARAM].config(-2.f, 6.f, 2.f); | |||
params[RUN_PARAM].config(0.f, 1.f, 0.f); | |||
params[RESET_PARAM].config(0.f, 1.f, 0.f); | |||
params[STEPS_PARAM].config(1.f, 8.f, 8.f); | |||
for (int i = 0; i < 8; i++) { | |||
params[ROW1_PARAM + i].config(0.0f, 10.0f, 0.0f); | |||
params[ROW2_PARAM + i].config(0.0f, 10.0f, 0.0f); | |||
params[ROW3_PARAM + i].config(0.0f, 10.0f, 0.0f); | |||
params[GATE_PARAM + i].config(0.0f, 1.0f, 0.0f); | |||
params[ROW1_PARAM + i].config(0.f, 10.f, 0.f); | |||
params[ROW2_PARAM + i].config(0.f, 10.f, 0.f); | |||
params[ROW3_PARAM + i].config(0.f, 10.f, 0.f); | |||
params[GATE_PARAM + i].config(0.f, 1.f, 0.f); | |||
} | |||
@@ -110,7 +110,7 @@ struct SEQ3 : Module { | |||
} | |||
void setIndex(int index) { | |||
int numSteps = (int) clamp(std::round(params[STEPS_PARAM].getValue() + inputs[STEPS_INPUT].getVoltage()), 1.0f, 8.0f); | |||
int numSteps = (int) clamp(std::round(params[STEPS_PARAM].getValue() + inputs[STEPS_INPUT].getVoltage()), 1.f, 8.f); | |||
phase = 0.f; | |||
this->index = index; | |||
if (this->index >= numSteps) | |||
@@ -134,9 +134,9 @@ struct SEQ3 : Module { | |||
} | |||
else { | |||
// Internal clock | |||
float clockTime = std::pow(2.0f, params[CLOCK_PARAM].getValue() + inputs[CLOCK_INPUT].getVoltage()); | |||
float clockTime = std::pow(2.f, params[CLOCK_PARAM].getValue() + inputs[CLOCK_INPUT].getVoltage()); | |||
phase += clockTime * args.sampleTime; | |||
if (phase >= 1.0f) { | |||
if (phase >= 1.f) { | |||
setIndex(index + 1); | |||
} | |||
gateIn = (phase < 0.5f); | |||
@@ -153,7 +153,7 @@ struct SEQ3 : Module { | |||
if (gateTriggers[i].process(params[GATE_PARAM + i].getValue())) { | |||
gates[i] = !gates[i]; | |||
} | |||
outputs[GATE_OUTPUT + i].setVoltage((running && gateIn && i == index && gates[i]) ? 10.0f : 0.0f); | |||
outputs[GATE_OUTPUT + i].setVoltage((running && gateIn && i == index && gates[i]) ? 10.f : 0.f); | |||
lights[GATE_LIGHTS + i].setSmoothBrightness((gateIn && i == index) ? (gates[i] ? 1.f : 0.33) : (gates[i] ? 0.66 : 0.0), args.sampleTime); | |||
} | |||
@@ -161,13 +161,13 @@ struct SEQ3 : Module { | |||
outputs[ROW1_OUTPUT].setVoltage(params[ROW1_PARAM + index].getValue()); | |||
outputs[ROW2_OUTPUT].setVoltage(params[ROW2_PARAM + index].getValue()); | |||
outputs[ROW3_OUTPUT].setVoltage(params[ROW3_PARAM + index].getValue()); | |||
outputs[GATES_OUTPUT].setVoltage((gateIn && gates[index]) ? 10.0f : 0.0f); | |||
outputs[GATES_OUTPUT].setVoltage((gateIn && gates[index]) ? 10.f : 0.f); | |||
lights[RUNNING_LIGHT].value = (running); | |||
lights[RESET_LIGHT].setSmoothBrightness(resetTrigger.isHigh(), args.sampleTime); | |||
lights[GATES_LIGHT].setSmoothBrightness(gateIn, args.sampleTime); | |||
lights[ROW_LIGHTS].value = outputs[ROW1_OUTPUT].value / 10.0f; | |||
lights[ROW_LIGHTS + 1].value = outputs[ROW2_OUTPUT].value / 10.0f; | |||
lights[ROW_LIGHTS + 2].value = outputs[ROW3_OUTPUT].value / 10.0f; | |||
lights[ROW_LIGHTS].value = outputs[ROW1_OUTPUT].value / 10.f; | |||
lights[ROW_LIGHTS + 1].value = outputs[ROW2_OUTPUT].value / 10.f; | |||
lights[ROW_LIGHTS + 2].value = outputs[ROW3_OUTPUT].value / 10.f; | |||
} | |||
}; | |||
@@ -39,40 +39,40 @@ struct Scope : Module { | |||
int bufferIndex = 0; | |||
float frameIndex = 0; | |||
dsp::SchmittTrigger sumTrigger; | |||
dsp::SchmittTrigger extTrigger; | |||
dsp::BooleanTrigger sumTrigger; | |||
dsp::BooleanTrigger extTrigger; | |||
bool lissajous = false; | |||
bool external = false; | |||
dsp::SchmittTrigger resetTrigger; | |||
Scope() { | |||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
params[X_SCALE_PARAM].config(-2.0f, 8.0f, 0.0f); | |||
params[X_POS_PARAM].config(-10.0f, 10.0f, 0.0f); | |||
params[Y_SCALE_PARAM].config(-2.0f, 8.0f, 0.0f); | |||
params[Y_POS_PARAM].config(-10.0f, 10.0f, 0.0f); | |||
params[TIME_PARAM].config(6.0f, 16.0f, 14.0f); | |||
params[LISSAJOUS_PARAM].config(0.0f, 1.0f, 0.0f); | |||
params[TRIG_PARAM].config(-10.0f, 10.0f, 0.0f); | |||
params[EXTERNAL_PARAM].config(0.0f, 1.0f, 0.0f); | |||
params[X_SCALE_PARAM].config(-2.f, 8.f, 0.f); | |||
params[X_POS_PARAM].config(-10.f, 10.f, 0.f); | |||
params[Y_SCALE_PARAM].config(-2.f, 8.f, 0.f); | |||
params[Y_POS_PARAM].config(-10.f, 10.f, 0.f); | |||
params[TIME_PARAM].config(6.f, 16.f, 14.f); | |||
params[LISSAJOUS_PARAM].config(0.f, 1.f, 0.f); | |||
params[TRIG_PARAM].config(-10.f, 10.f, 0.f); | |||
params[EXTERNAL_PARAM].config(0.f, 1.f, 0.f); | |||
} | |||
void process(const ProcessArgs &args) override { | |||
// Modes | |||
if (sumTrigger.process(params[LISSAJOUS_PARAM].getValue())) { | |||
if (sumTrigger.process(params[LISSAJOUS_PARAM].getValue() > 0.f)) { | |||
lissajous = !lissajous; | |||
} | |||
lights[PLOT_LIGHT].value = lissajous ? 0.0f : 1.0f; | |||
lights[LISSAJOUS_LIGHT].value = lissajous ? 1.0f : 0.0f; | |||
lights[PLOT_LIGHT].value = lissajous ? 0.f : 1.f; | |||
lights[LISSAJOUS_LIGHT].value = lissajous ? 1.f : 0.f; | |||
if (extTrigger.process(params[EXTERNAL_PARAM].getValue())) { | |||
if (extTrigger.process(params[EXTERNAL_PARAM].getValue() > 0.f)) { | |||
external = !external; | |||
} | |||
lights[INTERNAL_LIGHT].value = external ? 0.0f : 1.0f; | |||
lights[EXTERNAL_LIGHT].value = external ? 1.0f : 0.0f; | |||
lights[INTERNAL_LIGHT].value = external ? 0.f : 1.f; | |||
lights[EXTERNAL_LIGHT].value = external ? 1.f : 0.f; | |||
// Compute time | |||
float deltaTime = std::pow(2.0f, -params[TIME_PARAM].getValue()); | |||
float deltaTime = std::pow(2.f, -params[TIME_PARAM].getValue()); | |||
int frameCount = (int) std::ceil(deltaTime * args.sampleRate); | |||
// Add frame to buffer | |||
@@ -151,7 +151,7 @@ struct ScopeDisplay : TransparentWidget { | |||
float vmin = 0.f; | |||
float vmax = 0.f; | |||
void calculate(float *values) { | |||
vrms = 0.0f; | |||
vrms = 0.f; | |||
vmax = -INFINITY; | |||
vmin = INFINITY; | |||
for (int i = 0; i < BUFFER_SIZE; i++) { | |||
@@ -181,23 +181,23 @@ struct ScopeDisplay : TransparentWidget { | |||
for (int i = 0; i < BUFFER_SIZE; i++) { | |||
float x, y; | |||
if (valuesY) { | |||
x = valuesX[i] / 2.0f + 0.5f; | |||
y = valuesY[i] / 2.0f + 0.5f; | |||
x = valuesX[i] / 2.f + 0.5f; | |||
y = valuesY[i] / 2.f + 0.5f; | |||
} | |||
else { | |||
x = (float)i / (BUFFER_SIZE - 1); | |||
y = valuesX[i] / 2.0f + 0.5f; | |||
y = valuesX[i] / 2.f + 0.5f; | |||
} | |||
Vec p; | |||
p.x = b.pos.x + b.size.x * x; | |||
p.y = b.pos.y + b.size.y * (1.0f - y); | |||
p.y = b.pos.y + b.size.y * (1.f - y); | |||
if (i == 0) | |||
nvgMoveTo(args.vg, p.x, p.y); | |||
else | |||
nvgLineTo(args.vg, p.x, p.y); | |||
} | |||
nvgLineCap(args.vg, NVG_ROUND); | |||
nvgMiterLimit(args.vg, 2.0f); | |||
nvgMiterLimit(args.vg, 2.f); | |||
nvgStrokeWidth(args.vg, 1.5f); | |||
nvgGlobalCompositeOperation(args.vg, NVG_LIGHTER); | |||
nvgStroke(args.vg); | |||
@@ -209,8 +209,8 @@ struct ScopeDisplay : TransparentWidget { | |||
Rect b = Rect(Vec(0, 15), box.size.minus(Vec(0, 15*2))); | |||
nvgScissor(args.vg, b.pos.x, b.pos.y, b.size.x, b.size.y); | |||
value = value / 2.0f + 0.5f; | |||
Vec p = Vec(box.size.x, b.pos.y + b.size.y * (1.0f - value)); | |||
value = value / 2.f + 0.5f; | |||
Vec p = Vec(box.size.x, b.pos.y + b.size.y * (1.f - value)); | |||
// Draw line | |||
nvgStrokeColor(args.vg, nvgRGBA(0xff, 0xff, 0xff, 0x10)); | |||
@@ -260,8 +260,8 @@ struct ScopeDisplay : TransparentWidget { | |||
if (!module) | |||
return; | |||
float gainX = std::pow(2.0f, std::round(module->params[Scope::X_SCALE_PARAM].getValue())); | |||
float gainY = std::pow(2.0f, std::round(module->params[Scope::Y_SCALE_PARAM].getValue())); | |||
float gainX = std::pow(2.f, std::round(module->params[Scope::X_SCALE_PARAM].getValue())); | |||
float gainY = std::pow(2.f, std::round(module->params[Scope::Y_SCALE_PARAM].getValue())); | |||
float offsetX = module->params[Scope::X_POS_PARAM].getValue(); | |||
float offsetY = module->params[Scope::Y_POS_PARAM].getValue(); | |||
@@ -272,8 +272,8 @@ struct ScopeDisplay : TransparentWidget { | |||
// Lock display to buffer if buffer update deltaTime <= 2^-11 | |||
if (module->lissajous) | |||
j = (i + module->bufferIndex) % BUFFER_SIZE; | |||
valuesX[i] = (module->bufferX[j] + offsetX) * gainX / 10.0f; | |||
valuesY[i] = (module->bufferY[j] + offsetY) * gainY / 10.0f; | |||
valuesX[i] = (module->bufferX[j] + offsetX) * gainX / 10.f; | |||
valuesY[i] = (module->bufferY[j] + offsetY) * gainY / 10.f; | |||
} | |||
// Draw waveforms | |||
@@ -297,7 +297,7 @@ struct ScopeDisplay : TransparentWidget { | |||
drawWaveform(args, valuesX, NULL); | |||
} | |||
float valueTrig = (module->params[Scope::TRIG_PARAM].getValue() + offsetX) * gainX / 10.0f; | |||
float valueTrig = (module->params[Scope::TRIG_PARAM].getValue() + offsetX) * gainX / 10.f; | |||
drawTrig(args, valueTrig); | |||
} | |||
@@ -7,7 +7,7 @@ static float clip(float x) { | |||
struct LadderFilter { | |||
float omega0; | |||
float resonance = 1.0f; | |||
float resonance = 1.f; | |||
float state[4]; | |||
float input; | |||
float lowpass; | |||