@@ -26,15 +26,14 @@ struct _8vert : Module { | |||||
} | } | ||||
} | } | ||||
void step() override { | |||||
float deltaTime = APP->engine->getSampleTime(); | |||||
void process(const ProcessArgs &args) override { | |||||
float lastIn = 10.f; | float lastIn = 10.f; | ||||
for (int i = 0; i < 8; i++) { | for (int i = 0; i < 8; i++) { | ||||
lastIn = inputs[i].getNormalVoltage(lastIn); | lastIn = inputs[i].getNormalVoltage(lastIn); | ||||
float out = lastIn * params[i].value; | float out = lastIn * params[i].value; | ||||
outputs[i].value = out; | outputs[i].value = out; | ||||
lights[2*i + 0].setSmoothBrightness(out / 5.f, deltaTime); | |||||
lights[2*i + 1].setSmoothBrightness(-out / 5.f, deltaTime); | |||||
lights[2*i + 0].setSmoothBrightness(out / 5.f, args.sampleTime); | |||||
lights[2*i + 1].setSmoothBrightness(-out / 5.f, args.sampleTime); | |||||
} | } | ||||
} | } | ||||
}; | }; | ||||
@@ -42,7 +42,7 @@ struct ADSR : Module { | |||||
params[RELEASE_PARAM].config(0.f, 1.f, 0.5f, "Release"); | params[RELEASE_PARAM].config(0.f, 1.f, 0.5f, "Release"); | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
float attack = clamp(params[ATTACK_PARAM].value + inputs[ATTACK_INPUT].value / 10.f, 0.f, 1.f); | float attack = clamp(params[ATTACK_PARAM].value + inputs[ATTACK_INPUT].value / 10.f, 0.f, 1.f); | ||||
float decay = clamp(params[DECAY_PARAM].value + inputs[DECAY_INPUT].value / 10.f, 0.f, 1.f); | float decay = clamp(params[DECAY_PARAM].value + inputs[DECAY_INPUT].value / 10.f, 0.f, 1.f); | ||||
float sustain = clamp(params[SUSTAIN_PARAM].value + inputs[SUSTAIN_INPUT].value / 10.f, 0.f, 1.f); | float sustain = clamp(params[SUSTAIN_PARAM].value + inputs[SUSTAIN_INPUT].value / 10.f, 0.f, 1.f); | ||||
@@ -62,7 +62,7 @@ struct ADSR : Module { | |||||
env = sustain; | env = sustain; | ||||
} | } | ||||
else { | else { | ||||
env += std::pow(base, 1 - decay) / maxTime * (sustain - env) * APP->engine->getSampleTime(); | |||||
env += std::pow(base, 1 - decay) / maxTime * (sustain - env) * args.sampleTime; | |||||
} | } | ||||
} | } | ||||
else { | else { | ||||
@@ -72,7 +72,7 @@ struct ADSR : Module { | |||||
env = 1.f; | env = 1.f; | ||||
} | } | ||||
else { | else { | ||||
env += std::pow(base, 1 - attack) / maxTime * (1.01f - env) * APP->engine->getSampleTime(); | |||||
env += std::pow(base, 1 - attack) / maxTime * (1.01f - env) * args.sampleTime; | |||||
} | } | ||||
if (env >= 1.f) { | if (env >= 1.f) { | ||||
env = 1.f; | env = 1.f; | ||||
@@ -86,7 +86,7 @@ struct ADSR : Module { | |||||
env = 0.f; | env = 0.f; | ||||
} | } | ||||
else { | else { | ||||
env += std::pow(base, 1 - release) / maxTime * (0.f - env) * APP->engine->getSampleTime(); | |||||
env += std::pow(base, 1 - release) / maxTime * (0.f - env) * args.sampleTime; | |||||
} | } | ||||
decaying = false; | decaying = false; | ||||
} | } | ||||
@@ -47,7 +47,7 @@ struct Delay : Module { | |||||
src_delete(src); | src_delete(src); | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
// Get input to delay block | // Get input to delay block | ||||
float in = inputs[IN_INPUT].value; | float in = inputs[IN_INPUT].value; | ||||
float feedback = clamp(params[FEEDBACK_PARAM].value + inputs[FEEDBACK_INPUT].value / 10.0f, 0.0f, 1.0f); | float feedback = clamp(params[FEEDBACK_PARAM].value + inputs[FEEDBACK_INPUT].value / 10.0f, 0.0f, 1.0f); | ||||
@@ -56,7 +56,7 @@ struct Delay : Module { | |||||
// Compute delay time in seconds | // Compute delay time in seconds | ||||
float delay = 1e-3 * std::pow(10.0f / 1e-3, clamp(params[TIME_PARAM].value + inputs[TIME_INPUT].value / 10.0f, 0.0f, 1.0f)); | float delay = 1e-3 * std::pow(10.0f / 1e-3, clamp(params[TIME_PARAM].value + inputs[TIME_INPUT].value / 10.0f, 0.0f, 1.0f)); | ||||
// Number of delay samples | // Number of delay samples | ||||
float index = delay * APP->engine->getSampleRate(); | |||||
float index = delay * args.sampleRate; | |||||
// Push dry sample into history buffer | // Push dry sample into history buffer | ||||
if (!historyBuffer.full()) { | if (!historyBuffer.full()) { | ||||
@@ -93,11 +93,11 @@ struct Delay : Module { | |||||
// TODO Make it sound better | // TODO Make it sound better | ||||
float color = clamp(params[COLOR_PARAM].value + inputs[COLOR_INPUT].value / 10.0f, 0.0f, 1.0f); | float color = clamp(params[COLOR_PARAM].value + inputs[COLOR_INPUT].value / 10.0f, 0.0f, 1.0f); | ||||
float lowpassFreq = 10000.0f * std::pow(10.0f, clamp(2.0f*color, 0.0f, 1.0f)); | float lowpassFreq = 10000.0f * std::pow(10.0f, clamp(2.0f*color, 0.0f, 1.0f)); | ||||
lowpassFilter.setCutoff(lowpassFreq / APP->engine->getSampleRate()); | |||||
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.0f * std::pow(100.0f, clamp(2.0f*color - 1.0f, 0.0f, 1.0f)); | ||||
highpassFilter.setCutoff(highpassFreq / APP->engine->getSampleRate()); | |||||
highpassFilter.setCutoff(highpassFreq / args.sampleRate); | |||||
highpassFilter.process(wet); | highpassFilter.process(wet); | ||||
wet = highpassFilter.highpass(); | wet = highpassFilter.highpass(); | ||||
@@ -107,13 +107,12 @@ struct LFO : Module { | |||||
params[PWM_PARAM].config(0.f, 1.f, 0.f); | params[PWM_PARAM].config(0.f, 1.f, 0.f); | ||||
} | } | ||||
void step() override { | |||||
float deltaTime = APP->engine->getSampleTime(); | |||||
void process(const ProcessArgs &args) override { | |||||
oscillator.setPitch(params[FREQ_PARAM].value + params[FM1_PARAM].value * inputs[FM1_INPUT].value + params[FM2_PARAM].value * inputs[FM2_INPUT].value); | oscillator.setPitch(params[FREQ_PARAM].value + params[FM1_PARAM].value * inputs[FM1_INPUT].value + params[FM2_PARAM].value * inputs[FM2_INPUT].value); | ||||
oscillator.setPulseWidth(params[PW_PARAM].value + params[PWM_PARAM].value * inputs[PW_INPUT].value / 10.f); | oscillator.setPulseWidth(params[PW_PARAM].value + params[PWM_PARAM].value * inputs[PW_INPUT].value / 10.f); | ||||
oscillator.offset = (params[OFFSET_PARAM].value > 0.f); | oscillator.offset = (params[OFFSET_PARAM].value > 0.f); | ||||
oscillator.invert = (params[INVERT_PARAM].value <= 0.f); | oscillator.invert = (params[INVERT_PARAM].value <= 0.f); | ||||
oscillator.step(deltaTime); | |||||
oscillator.step(args.sampleTime); | |||||
oscillator.setReset(inputs[RESET_INPUT].value); | oscillator.setReset(inputs[RESET_INPUT].value); | ||||
outputs[SIN_OUTPUT].value = 5.f * oscillator.sin(); | outputs[SIN_OUTPUT].value = 5.f * oscillator.sin(); | ||||
@@ -121,8 +120,8 @@ struct LFO : Module { | |||||
outputs[SAW_OUTPUT].value = 5.f * oscillator.saw(); | outputs[SAW_OUTPUT].value = 5.f * oscillator.saw(); | ||||
outputs[SQR_OUTPUT].value = 5.f * oscillator.sqr(); | outputs[SQR_OUTPUT].value = 5.f * oscillator.sqr(); | ||||
lights[PHASE_POS_LIGHT].setSmoothBrightness(oscillator.light(), deltaTime); | |||||
lights[PHASE_NEG_LIGHT].setSmoothBrightness(-oscillator.light(), deltaTime); | |||||
lights[PHASE_POS_LIGHT].setSmoothBrightness(oscillator.light(), args.sampleTime); | |||||
lights[PHASE_NEG_LIGHT].setSmoothBrightness(-oscillator.light(), args.sampleTime); | |||||
} | } | ||||
}; | }; | ||||
@@ -202,8 +201,8 @@ struct LFO2 : Module { | |||||
params[FM_PARAM].config(0.f, 1.f, 0.5f); | params[FM_PARAM].config(0.f, 1.f, 0.5f); | ||||
} | } | ||||
void step() override { | |||||
float deltaTime = APP->engine->getSampleTime(); | |||||
void process(const ProcessArgs &args) override { | |||||
float deltaTime = args.sampleTime; | |||||
oscillator.setPitch(params[FREQ_PARAM].value + params[FM_PARAM].value * inputs[FM_INPUT].value); | oscillator.setPitch(params[FREQ_PARAM].value + params[FM_PARAM].value * inputs[FM_INPUT].value); | ||||
oscillator.offset = (params[OFFSET_PARAM].value > 0.f); | oscillator.offset = (params[OFFSET_PARAM].value > 0.f); | ||||
oscillator.invert = (params[INVERT_PARAM].value <= 0.f); | oscillator.invert = (params[INVERT_PARAM].value <= 0.f); | ||||
@@ -24,7 +24,7 @@ struct Merge : Module { | |||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
int lastChannel = -1; | int lastChannel = -1; | ||||
for (int c = 0; c < 16; c++) { | for (int c = 0; c < 16; c++) { | ||||
if (inputs[MONO_INPUTS + c].isConnected()) { | if (inputs[MONO_INPUTS + c].isConnected()) { | ||||
@@ -34,7 +34,7 @@ struct Mutes : Module { | |||||
onReset(); | onReset(); | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
float out = 0.f; | float out = 0.f; | ||||
for (int i = 0; i < NUM_CHANNELS; i++) { | for (int i = 0; i < NUM_CHANNELS; i++) { | ||||
if (muteTrigger[i].process(params[MUTE_PARAM + i].value)) | if (muteTrigger[i].process(params[MUTE_PARAM + i].value)) | ||||
@@ -117,9 +117,7 @@ struct SEQ3 : Module { | |||||
this->index = 0; | this->index = 0; | ||||
} | } | ||||
void step() override { | |||||
float deltaTime = APP->engine->getSampleTime(); | |||||
void process(const ProcessArgs &args) override { | |||||
// Run | // Run | ||||
if (runningTrigger.process(params[RUN_PARAM].value)) { | if (runningTrigger.process(params[RUN_PARAM].value)) { | ||||
running = !running; | running = !running; | ||||
@@ -137,7 +135,7 @@ struct SEQ3 : Module { | |||||
else { | else { | ||||
// Internal clock | // Internal clock | ||||
float clockTime = std::pow(2.0f, params[CLOCK_PARAM].value + inputs[CLOCK_INPUT].value); | float clockTime = std::pow(2.0f, params[CLOCK_PARAM].value + inputs[CLOCK_INPUT].value); | ||||
phase += clockTime * deltaTime; | |||||
phase += clockTime * args.sampleTime; | |||||
if (phase >= 1.0f) { | if (phase >= 1.0f) { | ||||
setIndex(index + 1); | setIndex(index + 1); | ||||
} | } | ||||
@@ -156,7 +154,7 @@ struct SEQ3 : Module { | |||||
gates[i] = !gates[i]; | gates[i] = !gates[i]; | ||||
} | } | ||||
outputs[GATE_OUTPUT + i].value = (running && gateIn && i == index && gates[i]) ? 10.0f : 0.0f; | outputs[GATE_OUTPUT + i].value = (running && gateIn && i == index && gates[i]) ? 10.0f : 0.0f; | ||||
lights[GATE_LIGHTS + i].setSmoothBrightness((gateIn && i == index) ? (gates[i] ? 1.f : 0.33) : (gates[i] ? 0.66 : 0.0), deltaTime); | |||||
lights[GATE_LIGHTS + i].setSmoothBrightness((gateIn && i == index) ? (gates[i] ? 1.f : 0.33) : (gates[i] ? 0.66 : 0.0), args.sampleTime); | |||||
} | } | ||||
// Outputs | // Outputs | ||||
@@ -165,8 +163,8 @@ struct SEQ3 : Module { | |||||
outputs[ROW3_OUTPUT].value = params[ROW3_PARAM + index].value; | outputs[ROW3_OUTPUT].value = params[ROW3_PARAM + index].value; | ||||
outputs[GATES_OUTPUT].value = (gateIn && gates[index]) ? 10.0f : 0.0f; | outputs[GATES_OUTPUT].value = (gateIn && gates[index]) ? 10.0f : 0.0f; | ||||
lights[RUNNING_LIGHT].value = (running); | lights[RUNNING_LIGHT].value = (running); | ||||
lights[RESET_LIGHT].setSmoothBrightness(resetTrigger.isHigh(), deltaTime); | |||||
lights[GATES_LIGHT].setSmoothBrightness(gateIn, deltaTime); | |||||
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].value = outputs[ROW1_OUTPUT].value / 10.0f; | ||||
lights[ROW_LIGHTS + 1].value = outputs[ROW2_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 + 2].value = outputs[ROW3_OUTPUT].value / 10.0f; | ||||
@@ -57,7 +57,7 @@ struct Scope : Module { | |||||
params[EXTERNAL_PARAM].config(0.0f, 1.0f, 0.0f); | params[EXTERNAL_PARAM].config(0.0f, 1.0f, 0.0f); | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
// Modes | // Modes | ||||
if (sumTrigger.process(params[LISSAJOUS_PARAM].value)) { | if (sumTrigger.process(params[LISSAJOUS_PARAM].value)) { | ||||
lissajous = !lissajous; | lissajous = !lissajous; | ||||
@@ -73,7 +73,7 @@ struct Scope : Module { | |||||
// Compute time | // Compute time | ||||
float deltaTime = std::pow(2.0f, -params[TIME_PARAM].value); | float deltaTime = std::pow(2.0f, -params[TIME_PARAM].value); | ||||
int frameCount = (int) std::ceil(deltaTime * APP->engine->getSampleRate()); | |||||
int frameCount = (int) std::ceil(deltaTime * args.sampleRate); | |||||
// Add frame to buffer | // Add frame to buffer | ||||
if (bufferIndex < BUFFER_SIZE) { | if (bufferIndex < BUFFER_SIZE) { | ||||
@@ -105,12 +105,12 @@ struct Scope : Module { | |||||
// Reset if triggered | // Reset if triggered | ||||
float holdTime = 0.1f; | float holdTime = 0.1f; | ||||
if (resetTrigger.process(rescale(gate, params[TRIG_PARAM].value - 0.1f, params[TRIG_PARAM].value, 0.f, 1.f)) || (frameIndex >= APP->engine->getSampleRate() * holdTime)) { | |||||
if (resetTrigger.process(rescale(gate, params[TRIG_PARAM].value - 0.1f, params[TRIG_PARAM].value, 0.f, 1.f)) || (frameIndex >= args.sampleRate * holdTime)) { | |||||
bufferIndex = 0; frameIndex = 0; return; | bufferIndex = 0; frameIndex = 0; return; | ||||
} | } | ||||
// Reset if we've waited too long | // Reset if we've waited too long | ||||
if (frameIndex >= APP->engine->getSampleRate() * holdTime) { | |||||
if (frameIndex >= args.sampleRate * holdTime) { | |||||
bufferIndex = 0; frameIndex = 0; return; | bufferIndex = 0; frameIndex = 0; return; | ||||
} | } | ||||
} | } | ||||
@@ -170,13 +170,13 @@ struct ScopeDisplay : TransparentWidget { | |||||
font = APP->window->loadFont(asset::plugin(pluginInstance, "res/sudo/Sudo.ttf")); | font = APP->window->loadFont(asset::plugin(pluginInstance, "res/sudo/Sudo.ttf")); | ||||
} | } | ||||
void drawWaveform(const DrawContext &ctx, float *valuesX, float *valuesY) { | |||||
void drawWaveform(const DrawArgs &args, float *valuesX, float *valuesY) { | |||||
if (!valuesX) | if (!valuesX) | ||||
return; | return; | ||||
nvgSave(ctx.vg); | |||||
nvgSave(args.vg); | |||||
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(ctx.vg, b.pos.x, b.pos.y, b.size.x, b.size.y); | |||||
nvgBeginPath(ctx.vg); | |||||
nvgScissor(args.vg, b.pos.x, b.pos.y, b.size.x, b.size.y); | |||||
nvgBeginPath(args.vg); | |||||
// Draw maximum display left to right | // Draw maximum display left to right | ||||
for (int i = 0; i < BUFFER_SIZE; i++) { | for (int i = 0; i < BUFFER_SIZE; i++) { | ||||
float x, y; | float x, y; | ||||
@@ -192,71 +192,71 @@ struct ScopeDisplay : TransparentWidget { | |||||
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.0f - y); | ||||
if (i == 0) | if (i == 0) | ||||
nvgMoveTo(ctx.vg, p.x, p.y); | |||||
nvgMoveTo(args.vg, p.x, p.y); | |||||
else | else | ||||
nvgLineTo(ctx.vg, p.x, p.y); | |||||
nvgLineTo(args.vg, p.x, p.y); | |||||
} | } | ||||
nvgLineCap(ctx.vg, NVG_ROUND); | |||||
nvgMiterLimit(ctx.vg, 2.0f); | |||||
nvgStrokeWidth(ctx.vg, 1.5f); | |||||
nvgGlobalCompositeOperation(ctx.vg, NVG_LIGHTER); | |||||
nvgStroke(ctx.vg); | |||||
nvgResetScissor(ctx.vg); | |||||
nvgRestore(ctx.vg); | |||||
nvgLineCap(args.vg, NVG_ROUND); | |||||
nvgMiterLimit(args.vg, 2.0f); | |||||
nvgStrokeWidth(args.vg, 1.5f); | |||||
nvgGlobalCompositeOperation(args.vg, NVG_LIGHTER); | |||||
nvgStroke(args.vg); | |||||
nvgResetScissor(args.vg); | |||||
nvgRestore(args.vg); | |||||
} | } | ||||
void drawTrig(const DrawContext &ctx, float value) { | |||||
void drawTrig(const DrawArgs &args, float value) { | |||||
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(ctx.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; | value = value / 2.0f + 0.5f; | ||||
Vec p = Vec(box.size.x, b.pos.y + b.size.y * (1.0f - value)); | Vec p = Vec(box.size.x, b.pos.y + b.size.y * (1.0f - value)); | ||||
// Draw line | // Draw line | ||||
nvgStrokeColor(ctx.vg, nvgRGBA(0xff, 0xff, 0xff, 0x10)); | |||||
nvgStrokeColor(args.vg, nvgRGBA(0xff, 0xff, 0xff, 0x10)); | |||||
{ | { | ||||
nvgBeginPath(ctx.vg); | |||||
nvgMoveTo(ctx.vg, p.x - 13, p.y); | |||||
nvgLineTo(ctx.vg, 0, p.y); | |||||
nvgClosePath(ctx.vg); | |||||
nvgBeginPath(args.vg); | |||||
nvgMoveTo(args.vg, p.x - 13, p.y); | |||||
nvgLineTo(args.vg, 0, p.y); | |||||
nvgClosePath(args.vg); | |||||
} | } | ||||
nvgStroke(ctx.vg); | |||||
nvgStroke(args.vg); | |||||
// Draw indicator | // Draw indicator | ||||
nvgFillColor(ctx.vg, nvgRGBA(0xff, 0xff, 0xff, 0x60)); | |||||
nvgFillColor(args.vg, nvgRGBA(0xff, 0xff, 0xff, 0x60)); | |||||
{ | { | ||||
nvgBeginPath(ctx.vg); | |||||
nvgMoveTo(ctx.vg, p.x - 2, p.y - 4); | |||||
nvgLineTo(ctx.vg, p.x - 9, p.y - 4); | |||||
nvgLineTo(ctx.vg, p.x - 13, p.y); | |||||
nvgLineTo(ctx.vg, p.x - 9, p.y + 4); | |||||
nvgLineTo(ctx.vg, p.x - 2, p.y + 4); | |||||
nvgClosePath(ctx.vg); | |||||
nvgBeginPath(args.vg); | |||||
nvgMoveTo(args.vg, p.x - 2, p.y - 4); | |||||
nvgLineTo(args.vg, p.x - 9, p.y - 4); | |||||
nvgLineTo(args.vg, p.x - 13, p.y); | |||||
nvgLineTo(args.vg, p.x - 9, p.y + 4); | |||||
nvgLineTo(args.vg, p.x - 2, p.y + 4); | |||||
nvgClosePath(args.vg); | |||||
} | } | ||||
nvgFill(ctx.vg); | |||||
nvgFill(args.vg); | |||||
nvgFontSize(ctx.vg, 9); | |||||
nvgFontFaceId(ctx.vg, font->handle); | |||||
nvgFillColor(ctx.vg, nvgRGBA(0x1e, 0x28, 0x2b, 0xff)); | |||||
nvgText(ctx.vg, p.x - 8, p.y + 3, "T", NULL); | |||||
nvgResetScissor(ctx.vg); | |||||
nvgFontSize(args.vg, 9); | |||||
nvgFontFaceId(args.vg, font->handle); | |||||
nvgFillColor(args.vg, nvgRGBA(0x1e, 0x28, 0x2b, 0xff)); | |||||
nvgText(args.vg, p.x - 8, p.y + 3, "T", NULL); | |||||
nvgResetScissor(args.vg); | |||||
} | } | ||||
void drawStats(const DrawContext &ctx, Vec pos, const char *title, Stats *stats) { | |||||
nvgFontSize(ctx.vg, 13); | |||||
nvgFontFaceId(ctx.vg, font->handle); | |||||
nvgTextLetterSpacing(ctx.vg, -2); | |||||
void drawStats(const DrawArgs &args, Vec pos, const char *title, Stats *stats) { | |||||
nvgFontSize(args.vg, 13); | |||||
nvgFontFaceId(args.vg, font->handle); | |||||
nvgTextLetterSpacing(args.vg, -2); | |||||
nvgFillColor(ctx.vg, nvgRGBA(0xff, 0xff, 0xff, 0x40)); | |||||
nvgText(ctx.vg, pos.x + 6, pos.y + 11, title, NULL); | |||||
nvgFillColor(args.vg, nvgRGBA(0xff, 0xff, 0xff, 0x40)); | |||||
nvgText(args.vg, pos.x + 6, pos.y + 11, title, NULL); | |||||
nvgFillColor(ctx.vg, nvgRGBA(0xff, 0xff, 0xff, 0x80)); | |||||
nvgFillColor(args.vg, nvgRGBA(0xff, 0xff, 0xff, 0x80)); | |||||
char text[128]; | char text[128]; | ||||
snprintf(text, sizeof(text), "pp % 06.2f max % 06.2f min % 06.2f", stats->vpp, stats->vmax, stats->vmin); | snprintf(text, sizeof(text), "pp % 06.2f max % 06.2f min % 06.2f", stats->vpp, stats->vmax, stats->vmin); | ||||
nvgText(ctx.vg, pos.x + 22, pos.y + 11, text, NULL); | |||||
nvgText(args.vg, pos.x + 22, pos.y + 11, text, NULL); | |||||
} | } | ||||
void draw(const DrawContext &ctx) override { | |||||
void draw(const DrawArgs &args) override { | |||||
if (!module) | if (!module) | ||||
return; | return; | ||||
@@ -280,25 +280,25 @@ struct ScopeDisplay : TransparentWidget { | |||||
if (module->lissajous) { | if (module->lissajous) { | ||||
// X x Y | // X x Y | ||||
if (module->inputs[Scope::X_INPUT].active || module->inputs[Scope::Y_INPUT].active) { | if (module->inputs[Scope::X_INPUT].active || module->inputs[Scope::Y_INPUT].active) { | ||||
nvgStrokeColor(ctx.vg, nvgRGBA(0x9f, 0xe4, 0x36, 0xc0)); | |||||
drawWaveform(ctx, valuesX, valuesY); | |||||
nvgStrokeColor(args.vg, nvgRGBA(0x9f, 0xe4, 0x36, 0xc0)); | |||||
drawWaveform(args, valuesX, valuesY); | |||||
} | } | ||||
} | } | ||||
else { | else { | ||||
// Y | // Y | ||||
if (module->inputs[Scope::Y_INPUT].active) { | if (module->inputs[Scope::Y_INPUT].active) { | ||||
nvgStrokeColor(ctx.vg, nvgRGBA(0xe1, 0x02, 0x78, 0xc0)); | |||||
drawWaveform(ctx, valuesY, NULL); | |||||
nvgStrokeColor(args.vg, nvgRGBA(0xe1, 0x02, 0x78, 0xc0)); | |||||
drawWaveform(args, valuesY, NULL); | |||||
} | } | ||||
// X | // X | ||||
if (module->inputs[Scope::X_INPUT].active) { | if (module->inputs[Scope::X_INPUT].active) { | ||||
nvgStrokeColor(ctx.vg, nvgRGBA(0x28, 0xb0, 0xf3, 0xc0)); | |||||
drawWaveform(ctx, valuesX, NULL); | |||||
nvgStrokeColor(args.vg, nvgRGBA(0x28, 0xb0, 0xf3, 0xc0)); | |||||
drawWaveform(args, valuesX, NULL); | |||||
} | } | ||||
float valueTrig = (module->params[Scope::TRIG_PARAM].value + offsetX) * gainX / 10.0f; | float valueTrig = (module->params[Scope::TRIG_PARAM].value + offsetX) * gainX / 10.0f; | ||||
drawTrig(ctx, valueTrig); | |||||
drawTrig(args, valueTrig); | |||||
} | } | ||||
// Calculate and draw stats | // Calculate and draw stats | ||||
@@ -307,8 +307,8 @@ struct ScopeDisplay : TransparentWidget { | |||||
statsX.calculate(module->bufferX); | statsX.calculate(module->bufferX); | ||||
statsY.calculate(module->bufferY); | statsY.calculate(module->bufferY); | ||||
} | } | ||||
drawStats(ctx, Vec(0, 0), "X", &statsX); | |||||
drawStats(ctx, Vec(0, box.size.y - 15), "Y", &statsY); | |||||
drawStats(args, Vec(0, 0), "X", &statsX); | |||||
drawStats(args, Vec(0, box.size.y - 15), "Y", &statsY); | |||||
} | } | ||||
}; | }; | ||||
@@ -37,7 +37,7 @@ struct SequentialSwitch : Module { | |||||
} | } | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
// Determine current channel | // Determine current channel | ||||
if (clockTrigger.process(inputs[CLOCK_INPUT].value / 2.f)) { | if (clockTrigger.process(inputs[CLOCK_INPUT].value / 2.f)) { | ||||
channel++; | channel++; | ||||
@@ -24,7 +24,7 @@ struct Split : Module { | |||||
int lightFrame = 0; | int lightFrame = 0; | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
for (int c = 0; c < 16; c++) { | for (int c = 0; c < 16; c++) { | ||||
float v = inputs[POLY_INPUT].getVoltage(c); | float v = inputs[POLY_INPUT].getVoltage(c); | ||||
outputs[MONO_OUTPUTS + c].setVoltage(v); | outputs[MONO_OUTPUTS + c].setVoltage(v); | ||||
@@ -22,15 +22,19 @@ struct Sum : Module { | |||||
int frame = 0; | int frame = 0; | ||||
dsp::VuMeter2 vuMeter; | dsp::VuMeter2 vuMeter; | ||||
dsp::Counter vuCounter; | |||||
dsp::Counter lightCounter; | |||||
Sum() { | Sum() { | ||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | ||||
params[LEVEL_PARAM].config(0.f, 1.f, 1.f, "Level", "%", 0.f, 100.f); | params[LEVEL_PARAM].config(0.f, 1.f, 1.f, "Level", "%", 0.f, 100.f); | ||||
vuMeter.lambda = 1 / 0.1f; | vuMeter.lambda = 1 / 0.1f; | ||||
vuCounter.setPeriod(16); | |||||
lightCounter.setPeriod(256); | |||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
int channels = inputs[POLY_INPUT].getChannels(); | int channels = inputs[POLY_INPUT].getChannels(); | ||||
float sum = 0.f; | float sum = 0.f; | ||||
for (int c = 0; c < channels; c++) { | for (int c = 0; c < channels; c++) { | ||||
@@ -40,12 +44,12 @@ struct Sum : Module { | |||||
sum *= params[LEVEL_PARAM].getValue(); | sum *= params[LEVEL_PARAM].getValue(); | ||||
outputs[MONO_OUTPUT].setVoltage(sum); | outputs[MONO_OUTPUT].setVoltage(sum); | ||||
if (frame % 16 == 0) { | |||||
vuMeter.process(APP->engine->getSampleTime() * 16, sum / 10.f); | |||||
if (vuCounter.process()) { | |||||
vuMeter.process(args.sampleTime * vuCounter.period, sum / 10.f); | |||||
} | } | ||||
// Set channel lights infrequently | // Set channel lights infrequently | ||||
if (frame % 256 == 0) { | |||||
if (lightCounter.process()) { | |||||
for (int c = 0; c < 16; c++) { | for (int c = 0; c < 16; c++) { | ||||
bool active = (c < inputs[POLY_INPUT].getChannels()); | bool active = (c < inputs[POLY_INPUT].getChannels()); | ||||
lights[CHANNEL_LIGHTS + c].setBrightness(active); | lights[CHANNEL_LIGHTS + c].setBrightness(active); | ||||
@@ -56,8 +60,6 @@ struct Sum : Module { | |||||
lights[VU_LIGHTS + i].setBrightness(vuMeter.getBrightness(-3.f * i, -3.f * (i - 1))); | lights[VU_LIGHTS + i].setBrightness(vuMeter.getBrightness(-3.f * i, -3.f * (i - 1))); | ||||
} | } | ||||
} | } | ||||
frame++; | |||||
} | } | ||||
}; | }; | ||||
@@ -25,18 +25,17 @@ struct Unity : Module { | |||||
bool merge = false; | bool merge = false; | ||||
dsp::VuMeter2 vuMeters[2]; | dsp::VuMeter2 vuMeters[2]; | ||||
dsp::Counter vuCounter; | |||||
dsp::Counter lightCounter; | |||||
Unity() { | Unity() { | ||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | ||||
params[AVG1_PARAM].config(0.0, 1.0, 0.0, "Ch 1 average mode"); | params[AVG1_PARAM].config(0.0, 1.0, 0.0, "Ch 1 average mode"); | ||||
params[AVG2_PARAM].config(0.0, 1.0, 0.0, "Ch 2 average mode"); | params[AVG2_PARAM].config(0.0, 1.0, 0.0, "Ch 2 average mode"); | ||||
vuCounter.setPeriod(256); | |||||
lightCounter.setPeriod(256); | |||||
} | } | ||||
void step() override { | |||||
float deltaTime = APP->engine->getSampleTime(); | |||||
void process(const ProcessArgs &args) override { | |||||
float mix[2] = {}; | float mix[2] = {}; | ||||
int count[2] = {}; | int count[2] = {}; | ||||
@@ -65,10 +64,10 @@ struct Unity : Module { | |||||
// Outputs | // Outputs | ||||
outputs[MIX1_OUTPUT + 2 * i].value = mix[i]; | outputs[MIX1_OUTPUT + 2 * i].value = mix[i]; | ||||
outputs[INV1_OUTPUT + 2 * i].value = -mix[i]; | outputs[INV1_OUTPUT + 2 * i].value = -mix[i]; | ||||
vuMeters[i].process(deltaTime, mix[i] / 10.f); | |||||
vuMeters[i].process(args.sampleTime, mix[i] / 10.f); | |||||
} | } | ||||
if (vuCounter.process()) { | |||||
if (lightCounter.process()) { | |||||
// Lights | // Lights | ||||
for (int i = 0; i < 2; i++) { | for (int i = 0; i < 2; i++) { | ||||
lights[VU_LIGHTS + 5 * i + 0].setBrightness(vuMeters[i].getBrightness(0.f, 0.f)); | lights[VU_LIGHTS + 5 * i + 0].setBrightness(vuMeters[i].getBrightness(0.f, 0.f)); | ||||
@@ -38,7 +38,7 @@ struct VCA : Module { | |||||
outputs[out].value = v; | outputs[out].value = v; | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
stepChannel(IN1_INPUT, LEVEL1_PARAM, LIN1_INPUT, EXP1_INPUT, OUT1_OUTPUT); | stepChannel(IN1_INPUT, LEVEL1_PARAM, LIN1_INPUT, EXP1_INPUT, OUT1_OUTPUT); | ||||
stepChannel(IN2_INPUT, LEVEL2_PARAM, LIN2_INPUT, EXP2_INPUT, OUT2_OUTPUT); | stepChannel(IN2_INPUT, LEVEL2_PARAM, LIN2_INPUT, EXP2_INPUT, OUT2_OUTPUT); | ||||
} | } | ||||
@@ -102,7 +102,7 @@ struct VCA_1 : Module { | |||||
params[EXP_PARAM].config(0.0, 1.0, 1.0, "Response mode"); | params[EXP_PARAM].config(0.0, 1.0, 1.0, "Response mode"); | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
float cv = inputs[CV_INPUT].getNormalVoltage(10.f) / 10.f; | float cv = inputs[CV_INPUT].getNormalVoltage(10.f) / 10.f; | ||||
if ((int) params[EXP_PARAM].value == 0) | if ((int) params[EXP_PARAM].value == 0) | ||||
cv = std::pow(cv, 4.f); | cv = std::pow(cv, 4.f); | ||||
@@ -119,13 +119,13 @@ struct VCA_1VUKnob : SliderKnob { | |||||
box.size = mm2px(Vec(10, 46)); | box.size = mm2px(Vec(10, 46)); | ||||
} | } | ||||
void draw(const DrawContext &ctx) override { | |||||
void draw(const DrawArgs &args) override { | |||||
float lastCv = module ? module->lastCv : 1.f; | float lastCv = module ? module->lastCv : 1.f; | ||||
nvgBeginPath(ctx.vg); | |||||
nvgRoundedRect(ctx.vg, 0, 0, box.size.x, box.size.y, 2.0); | |||||
nvgFillColor(ctx.vg, nvgRGB(0, 0, 0)); | |||||
nvgFill(ctx.vg); | |||||
nvgBeginPath(args.vg); | |||||
nvgRoundedRect(args.vg, 0, 0, box.size.x, box.size.y, 2.0); | |||||
nvgFillColor(args.vg, nvgRGB(0, 0, 0)); | |||||
nvgFill(args.vg); | |||||
const int segs = 25; | const int segs = 25; | ||||
const Vec margin = Vec(3, 3); | const Vec margin = Vec(3, 3); | ||||
@@ -136,16 +136,16 @@ struct VCA_1VUKnob : SliderKnob { | |||||
float segValue = clamp(value * segs - (segs - i - 1), 0.f, 1.f); | float segValue = clamp(value * segs - (segs - i - 1), 0.f, 1.f); | ||||
float amplitude = value * lastCv; | float amplitude = value * lastCv; | ||||
float segAmplitude = clamp(amplitude * segs - (segs - i - 1), 0.f, 1.f); | float segAmplitude = clamp(amplitude * segs - (segs - i - 1), 0.f, 1.f); | ||||
nvgBeginPath(ctx.vg); | |||||
nvgRect(ctx.vg, r.pos.x, r.pos.y + r.size.y / segs * i + 0.5, | |||||
nvgBeginPath(args.vg); | |||||
nvgRect(args.vg, r.pos.x, r.pos.y + r.size.y / segs * i + 0.5, | |||||
r.size.x, r.size.y / segs - 1.0); | r.size.x, r.size.y / segs - 1.0); | ||||
if (segValue > 0.f) { | if (segValue > 0.f) { | ||||
nvgFillColor(ctx.vg, color::alpha(nvgRGBf(0.33, 0.33, 0.33), segValue)); | |||||
nvgFill(ctx.vg); | |||||
nvgFillColor(args.vg, color::alpha(nvgRGBf(0.33, 0.33, 0.33), segValue)); | |||||
nvgFill(args.vg); | |||||
} | } | ||||
if (segAmplitude > 0.f) { | if (segAmplitude > 0.f) { | ||||
nvgFillColor(ctx.vg, color::alpha(component::GREEN, segAmplitude)); | |||||
nvgFill(ctx.vg); | |||||
nvgFillColor(args.vg, color::alpha(component::GREEN, segAmplitude)); | |||||
nvgFill(args.vg); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -91,7 +91,7 @@ struct VCF : Module { | |||||
filter.reset(); | filter.reset(); | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
if (!outputs[LPF_OUTPUT].active && !outputs[HPF_OUTPUT].active) { | if (!outputs[LPF_OUTPUT].active && !outputs[HPF_OUTPUT].active) { | ||||
outputs[LPF_OUTPUT].value = 0.f; | outputs[LPF_OUTPUT].value = 0.f; | ||||
outputs[HPF_OUTPUT].value = 0.f; | outputs[HPF_OUTPUT].value = 0.f; | ||||
@@ -100,7 +100,7 @@ struct VCF : Module { | |||||
float input = inputs[IN_INPUT].value / 5.f; | float input = inputs[IN_INPUT].value / 5.f; | ||||
float drive = clamp(params[DRIVE_PARAM].value + inputs[DRIVE_INPUT].value / 10.f, 0.f, 1.f); | float drive = clamp(params[DRIVE_PARAM].value + inputs[DRIVE_INPUT].value / 10.f, 0.f, 1.f); | ||||
float gain = powf(1.f + drive, 5); | |||||
float gain = std::pow(1.f + drive, 5); | |||||
input *= gain; | input *= gain; | ||||
// Add -60dB noise to bootstrap self-oscillation | // Add -60dB noise to bootstrap self-oscillation | ||||
@@ -108,7 +108,7 @@ struct VCF : Module { | |||||
// Set resonance | // Set resonance | ||||
float res = clamp(params[RES_PARAM].value + inputs[RES_INPUT].value / 10.f, 0.f, 1.f); | float res = clamp(params[RES_PARAM].value + inputs[RES_INPUT].value / 10.f, 0.f, 1.f); | ||||
filter.resonance = powf(res, 2) * 10.f; | |||||
filter.resonance = std::pow(res, 2) * 10.f; | |||||
// Set cutoff frequency | // Set cutoff frequency | ||||
float pitch = 0.f; | float pitch = 0.f; | ||||
@@ -116,13 +116,13 @@ struct VCF : Module { | |||||
pitch += inputs[FREQ_INPUT].value * dsp::quadraticBipolar(params[FREQ_CV_PARAM].value); | pitch += inputs[FREQ_INPUT].value * dsp::quadraticBipolar(params[FREQ_CV_PARAM].value); | ||||
pitch += params[FREQ_PARAM].value * 10.f - 5.f; | pitch += params[FREQ_PARAM].value * 10.f - 5.f; | ||||
pitch += dsp::quadraticBipolar(params[FINE_PARAM].value * 2.f - 1.f) * 7.f / 12.f; | pitch += dsp::quadraticBipolar(params[FINE_PARAM].value * 2.f - 1.f) * 7.f / 12.f; | ||||
float cutoff = 261.626f * powf(2.f, pitch); | |||||
float cutoff = 261.626f * std::pow(2.f, pitch); | |||||
cutoff = clamp(cutoff, 1.f, 8000.f); | cutoff = clamp(cutoff, 1.f, 8000.f); | ||||
filter.setCutoff(cutoff); | filter.setCutoff(cutoff); | ||||
/* | /* | ||||
// Process sample | // Process sample | ||||
float dt = APP->engine->getSampleTime() / UPSAMPLE; | |||||
float dt = args.sampleTime / UPSAMPLE; | |||||
float inputBuf[UPSAMPLE]; | float inputBuf[UPSAMPLE]; | ||||
float lowpassBuf[UPSAMPLE]; | float lowpassBuf[UPSAMPLE]; | ||||
float highpassBuf[UPSAMPLE]; | float highpassBuf[UPSAMPLE]; | ||||
@@ -142,7 +142,7 @@ struct VCF : Module { | |||||
outputs[HPF_OUTPUT].value = 5.f * highpassDecimator.process(highpassBuf); | outputs[HPF_OUTPUT].value = 5.f * highpassDecimator.process(highpassBuf); | ||||
} | } | ||||
*/ | */ | ||||
filter.process(input, APP->engine->getSampleTime()); | |||||
filter.process(input, args.sampleTime); | |||||
outputs[LPF_OUTPUT].value = 5.f * filter.lowpass; | outputs[LPF_OUTPUT].value = 5.f * filter.lowpass; | ||||
outputs[HPF_OUTPUT].value = 5.f * filter.highpass; | outputs[HPF_OUTPUT].value = 5.f * filter.highpass; | ||||
} | } | ||||
@@ -28,7 +28,7 @@ struct VCMixer : Module { | |||||
params[LVL_PARAM + 3].config(0.0, 1.0, 1.0, "Ch 4 level"); | params[LVL_PARAM + 3].config(0.0, 1.0, 1.0, "Ch 4 level"); | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
float mix = 0.f; | float mix = 0.f; | ||||
for (int i = 0; i < 4; i++) { | for (int i = 0; i < 4; i++) { | ||||
float ch = inputs[CH_INPUT + i].value; | float ch = inputs[CH_INPUT + i].value; | ||||
@@ -58,7 +58,7 @@ struct VoltageControlledOscillator { | |||||
// Adjust pitch slew | // Adjust pitch slew | ||||
if (++pitchSlewIndex > 32) { | if (++pitchSlewIndex > 32) { | ||||
const float pitchSlewTau = 100.f; // Time constant for leaky integrator in seconds | const float pitchSlewTau = 100.f; // Time constant for leaky integrator in seconds | ||||
pitchSlew += (random::normal() - pitchSlew / pitchSlewTau) * APP->engine->getSampleTime(); | |||||
pitchSlew += (random::normal() - pitchSlew / pitchSlewTau) * deltaTime; | |||||
pitchSlewIndex = 0; | pitchSlewIndex = 0; | ||||
} | } | ||||
} | } | ||||
@@ -204,8 +204,7 @@ struct VCO : Module { | |||||
params[PWM_PARAM].config(0.f, 1.f, 0.f, "Pulse width modulation", "%", 0.f, 100.f); | params[PWM_PARAM].config(0.f, 1.f, 0.f, "Pulse width modulation", "%", 0.f, 100.f); | ||||
} | } | ||||
void step() override { | |||||
float deltaTime = APP->engine->getSampleTime(); | |||||
void process(const ProcessArgs &args) override { | |||||
oscillator.analog = params[MODE_PARAM].value > 0.f; | oscillator.analog = params[MODE_PARAM].value > 0.f; | ||||
oscillator.soft = params[SYNC_PARAM].value <= 0.f; | oscillator.soft = params[SYNC_PARAM].value <= 0.f; | ||||
@@ -218,7 +217,7 @@ struct VCO : Module { | |||||
oscillator.setPulseWidth(params[PW_PARAM].value + params[PWM_PARAM].value * inputs[PW_INPUT].value / 10.f); | oscillator.setPulseWidth(params[PW_PARAM].value + params[PWM_PARAM].value * inputs[PW_INPUT].value / 10.f); | ||||
oscillator.syncEnabled = inputs[SYNC_INPUT].active; | oscillator.syncEnabled = inputs[SYNC_INPUT].active; | ||||
oscillator.process(deltaTime, inputs[SYNC_INPUT].value); | |||||
oscillator.process(args.sampleTime, inputs[SYNC_INPUT].value); | |||||
// Set output | // Set output | ||||
if (outputs[SIN_OUTPUT].active) | if (outputs[SIN_OUTPUT].active) | ||||
@@ -230,8 +229,8 @@ struct VCO : Module { | |||||
if (outputs[SQR_OUTPUT].active) | if (outputs[SQR_OUTPUT].active) | ||||
outputs[SQR_OUTPUT].value = 5.f * oscillator.sqr(); | outputs[SQR_OUTPUT].value = 5.f * oscillator.sqr(); | ||||
lights[PHASE_POS_LIGHT].setSmoothBrightness(oscillator.light(), deltaTime); | |||||
lights[PHASE_NEG_LIGHT].setSmoothBrightness(-oscillator.light(), deltaTime); | |||||
lights[PHASE_POS_LIGHT].setSmoothBrightness(oscillator.light(), args.sampleTime); | |||||
lights[PHASE_NEG_LIGHT].setSmoothBrightness(-oscillator.light(), args.sampleTime); | |||||
} | } | ||||
}; | }; | ||||
@@ -309,8 +308,8 @@ struct VCO2 : Module { | |||||
params[FM_PARAM].config(0.f, 1.f, 0.f, "Frequency modulation"); | params[FM_PARAM].config(0.f, 1.f, 0.f, "Frequency modulation"); | ||||
} | } | ||||
void step() override { | |||||
float deltaTime = APP->engine->getSampleTime(); | |||||
void process(const ProcessArgs &args) override { | |||||
float deltaTime = args.sampleTime; | |||||
oscillator.analog = params[MODE_PARAM].value > 0.f; | oscillator.analog = params[MODE_PARAM].value > 0.f; | ||||
oscillator.soft = params[SYNC_PARAM].value <= 0.f; | oscillator.soft = params[SYNC_PARAM].value <= 0.f; | ||||
@@ -27,15 +27,15 @@ struct Viz : Module { | |||||
counter.period = 16; | counter.period = 16; | ||||
} | } | ||||
void step() override { | |||||
void process(const ProcessArgs &args) override { | |||||
if (counter.process()) { | if (counter.process()) { | ||||
channels = inputs[POLY_INPUT].getChannels(); | channels = inputs[POLY_INPUT].getChannels(); | ||||
float deltaTime = APP->engine->getSampleTime() * counter.period; | |||||
float deltaTime = args.sampleTime * counter.period; | |||||
for (int c = 0; c < 16; c++) { | for (int c = 0; c < 16; c++) { | ||||
float v = inputs[POLY_INPUT].getVoltage(c) / 10.f; | float v = inputs[POLY_INPUT].getVoltage(c) / 10.f; | ||||
lights[VU_LIGHTS + c*2 + 0].setSmoothBrightness(v, deltaTime); | |||||
lights[VU_LIGHTS + c*2 + 1].setSmoothBrightness(-v, deltaTime); | |||||
lights[VU_LIGHTS + c*2 + 0].setSmoothBrightness(v, deltaTime * counter.period); | |||||
lights[VU_LIGHTS + c*2 + 1].setSmoothBrightness(-v, deltaTime * counter.period); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -51,20 +51,20 @@ struct VizDisplay : Widget { | |||||
font = APP->window->loadFont(asset::plugin(pluginInstance, "res/nunito/Nunito-Bold.ttf")); | font = APP->window->loadFont(asset::plugin(pluginInstance, "res/nunito/Nunito-Bold.ttf")); | ||||
} | } | ||||
void draw(const widget::DrawContext &ctx) override { | |||||
void draw(const DrawArgs &args) override { | |||||
for (int c = 0; c < 16; c++) { | for (int c = 0; c < 16; c++) { | ||||
Vec p = Vec(15, 16 + (float) c / 16 * (box.size.y - 10)); | Vec p = Vec(15, 16 + (float) c / 16 * (box.size.y - 10)); | ||||
std::string text = string::f("%d", c + 1); | std::string text = string::f("%d", c + 1); | ||||
nvgFontFaceId(ctx.vg, font->handle); | |||||
nvgFontSize(ctx.vg, 11); | |||||
nvgTextLetterSpacing(ctx.vg, 0.0); | |||||
nvgTextAlign(ctx.vg, NVG_ALIGN_CENTER | NVG_ALIGN_BASELINE); | |||||
nvgFontFaceId(args.vg, font->handle); | |||||
nvgFontSize(args.vg, 11); | |||||
nvgTextLetterSpacing(args.vg, 0.0); | |||||
nvgTextAlign(args.vg, NVG_ALIGN_CENTER | NVG_ALIGN_BASELINE); | |||||
if (module && c < module->channels) | if (module && c < module->channels) | ||||
nvgFillColor(ctx.vg, nvgRGB(255, 255, 255)); | |||||
nvgFillColor(args.vg, nvgRGB(255, 255, 255)); | |||||
else | else | ||||
nvgFillColor(ctx.vg, nvgRGB(99, 99, 99)); | |||||
nvgText(ctx.vg, p.x, p.y, text.c_str(), NULL); | |||||
nvgFillColor(args.vg, nvgRGB(99, 99, 99)); | |||||
nvgText(args.vg, p.x, p.y, text.c_str(), NULL); | |||||
} | } | ||||
} | } | ||||
}; | }; | ||||