@@ -28,16 +28,16 @@ struct Delay : Module { | |||||
dsp::DoubleRingBuffer<float, HISTORY_SIZE> historyBuffer; | dsp::DoubleRingBuffer<float, HISTORY_SIZE> historyBuffer; | ||||
dsp::DoubleRingBuffer<float, 16> outBuffer; | dsp::DoubleRingBuffer<float, 16> outBuffer; | ||||
SRC_STATE *src; | SRC_STATE *src; | ||||
float lastWet = 0.0f; | |||||
float lastWet = 0.f; | |||||
dsp::RCFilter lowpassFilter; | dsp::RCFilter lowpassFilter; | ||||
dsp::RCFilter highpassFilter; | dsp::RCFilter highpassFilter; | ||||
Delay() { | Delay() { | ||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); | 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); | src = src_new(SRC_SINC_FASTEST, 1, NULL); | ||||
assert(src); | assert(src); | ||||
@@ -50,11 +50,11 @@ struct Delay : Module { | |||||
void process(const ProcessArgs &args) override { | void process(const ProcessArgs &args) override { | ||||
// Get input to delay block | // Get input to delay block | ||||
float in = inputs[IN_INPUT].getVoltage(); | 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; | float dry = in + lastWet * feedback; | ||||
// Compute delay time in seconds | // 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 | // Number of delay samples | ||||
float index = delay * args.sampleRate; | float index = delay * args.sampleRate; | ||||
@@ -84,26 +84,26 @@ struct Delay : Module { | |||||
outBuffer.endIncr(srcData.output_frames_gen); | outBuffer.endIncr(srcData.output_frames_gen); | ||||
} | } | ||||
float wet = 0.0f; | |||||
float wet = 0.f; | |||||
if (!outBuffer.empty()) { | if (!outBuffer.empty()) { | ||||
wet = outBuffer.shift(); | wet = outBuffer.shift(); | ||||
} | } | ||||
// Apply color to delay wet output | // Apply color to delay wet output | ||||
// TODO Make it sound better | // 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.setCutoff(lowpassFreq / args.sampleRate); | ||||
lowpassFilter.process(wet); | lowpassFilter.process(wet); | ||||
wet = lowpassFilter.lowpass(); | 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.setCutoff(highpassFreq / args.sampleRate); | ||||
highpassFilter.process(wet); | highpassFilter.process(wet); | ||||
wet = highpassFilter.highpass(); | wet = highpassFilter.highpass(); | ||||
lastWet = wet; | 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); | float out = crossfade(in, wet, mix); | ||||
outputs[OUT_OUTPUT].setVoltage(out); | outputs[OUT_OUTPUT].setVoltage(out); | ||||
} | } | ||||
@@ -49,15 +49,15 @@ struct SEQ3 : Module { | |||||
SEQ3() { | SEQ3() { | ||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | 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++) { | 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) { | 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; | phase = 0.f; | ||||
this->index = index; | this->index = index; | ||||
if (this->index >= numSteps) | if (this->index >= numSteps) | ||||
@@ -134,9 +134,9 @@ struct SEQ3 : Module { | |||||
} | } | ||||
else { | else { | ||||
// Internal clock | // 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; | phase += clockTime * args.sampleTime; | ||||
if (phase >= 1.0f) { | |||||
if (phase >= 1.f) { | |||||
setIndex(index + 1); | setIndex(index + 1); | ||||
} | } | ||||
gateIn = (phase < 0.5f); | gateIn = (phase < 0.5f); | ||||
@@ -153,7 +153,7 @@ struct SEQ3 : Module { | |||||
if (gateTriggers[i].process(params[GATE_PARAM + i].getValue())) { | if (gateTriggers[i].process(params[GATE_PARAM + i].getValue())) { | ||||
gates[i] = !gates[i]; | 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); | 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[ROW1_OUTPUT].setVoltage(params[ROW1_PARAM + index].getValue()); | ||||
outputs[ROW2_OUTPUT].setVoltage(params[ROW2_PARAM + index].getValue()); | outputs[ROW2_OUTPUT].setVoltage(params[ROW2_PARAM + index].getValue()); | ||||
outputs[ROW3_OUTPUT].setVoltage(params[ROW3_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[RUNNING_LIGHT].value = (running); | ||||
lights[RESET_LIGHT].setSmoothBrightness(resetTrigger.isHigh(), args.sampleTime); | lights[RESET_LIGHT].setSmoothBrightness(resetTrigger.isHigh(), args.sampleTime); | ||||
lights[GATES_LIGHT].setSmoothBrightness(gateIn, 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; | int bufferIndex = 0; | ||||
float frameIndex = 0; | float frameIndex = 0; | ||||
dsp::SchmittTrigger sumTrigger; | |||||
dsp::SchmittTrigger extTrigger; | |||||
dsp::BooleanTrigger sumTrigger; | |||||
dsp::BooleanTrigger extTrigger; | |||||
bool lissajous = false; | bool lissajous = false; | ||||
bool external = false; | bool external = false; | ||||
dsp::SchmittTrigger resetTrigger; | dsp::SchmittTrigger resetTrigger; | ||||
Scope() { | Scope() { | ||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | 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 { | void process(const ProcessArgs &args) override { | ||||
// Modes | // Modes | ||||
if (sumTrigger.process(params[LISSAJOUS_PARAM].getValue())) { | |||||
if (sumTrigger.process(params[LISSAJOUS_PARAM].getValue() > 0.f)) { | |||||
lissajous = !lissajous; | 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; | 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 | // 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); | int frameCount = (int) std::ceil(deltaTime * args.sampleRate); | ||||
// Add frame to buffer | // Add frame to buffer | ||||
@@ -151,7 +151,7 @@ struct ScopeDisplay : TransparentWidget { | |||||
float vmin = 0.f; | float vmin = 0.f; | ||||
float vmax = 0.f; | float vmax = 0.f; | ||||
void calculate(float *values) { | void calculate(float *values) { | ||||
vrms = 0.0f; | |||||
vrms = 0.f; | |||||
vmax = -INFINITY; | vmax = -INFINITY; | ||||
vmin = INFINITY; | vmin = INFINITY; | ||||
for (int i = 0; i < BUFFER_SIZE; i++) { | for (int i = 0; i < BUFFER_SIZE; i++) { | ||||
@@ -181,23 +181,23 @@ struct ScopeDisplay : TransparentWidget { | |||||
for (int i = 0; i < BUFFER_SIZE; i++) { | for (int i = 0; i < BUFFER_SIZE; i++) { | ||||
float x, y; | float x, y; | ||||
if (valuesY) { | 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 { | else { | ||||
x = (float)i / (BUFFER_SIZE - 1); | x = (float)i / (BUFFER_SIZE - 1); | ||||
y = valuesX[i] / 2.0f + 0.5f; | |||||
y = valuesX[i] / 2.f + 0.5f; | |||||
} | } | ||||
Vec p; | Vec p; | ||||
p.x = b.pos.x + b.size.x * x; | 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) | if (i == 0) | ||||
nvgMoveTo(args.vg, p.x, p.y); | nvgMoveTo(args.vg, p.x, p.y); | ||||
else | else | ||||
nvgLineTo(args.vg, p.x, p.y); | nvgLineTo(args.vg, p.x, p.y); | ||||
} | } | ||||
nvgLineCap(args.vg, NVG_ROUND); | nvgLineCap(args.vg, NVG_ROUND); | ||||
nvgMiterLimit(args.vg, 2.0f); | |||||
nvgMiterLimit(args.vg, 2.f); | |||||
nvgStrokeWidth(args.vg, 1.5f); | nvgStrokeWidth(args.vg, 1.5f); | ||||
nvgGlobalCompositeOperation(args.vg, NVG_LIGHTER); | nvgGlobalCompositeOperation(args.vg, NVG_LIGHTER); | ||||
nvgStroke(args.vg); | nvgStroke(args.vg); | ||||
@@ -209,8 +209,8 @@ struct ScopeDisplay : TransparentWidget { | |||||
Rect b = Rect(Vec(0, 15), box.size.minus(Vec(0, 15*2))); | 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); | 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 | // Draw line | ||||
nvgStrokeColor(args.vg, nvgRGBA(0xff, 0xff, 0xff, 0x10)); | nvgStrokeColor(args.vg, nvgRGBA(0xff, 0xff, 0xff, 0x10)); | ||||
@@ -260,8 +260,8 @@ struct ScopeDisplay : TransparentWidget { | |||||
if (!module) | if (!module) | ||||
return; | 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 offsetX = module->params[Scope::X_POS_PARAM].getValue(); | ||||
float offsetY = module->params[Scope::Y_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 | // Lock display to buffer if buffer update deltaTime <= 2^-11 | ||||
if (module->lissajous) | if (module->lissajous) | ||||
j = (i + module->bufferIndex) % BUFFER_SIZE; | 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 | // Draw waveforms | ||||
@@ -297,7 +297,7 @@ struct ScopeDisplay : TransparentWidget { | |||||
drawWaveform(args, valuesX, NULL); | 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); | drawTrig(args, valueTrig); | ||||
} | } | ||||
@@ -7,7 +7,7 @@ static float clip(float x) { | |||||
struct LadderFilter { | struct LadderFilter { | ||||
float omega0; | float omega0; | ||||
float resonance = 1.0f; | |||||
float resonance = 1.f; | |||||
float state[4]; | float state[4]; | ||||
float input; | float input; | ||||
float lowpass; | float lowpass; | ||||