Browse Source

Add labels to params. Update Unity to Rack v1 API.

tags/v1.0.1
Andrew Belt 4 years ago
parent
commit
c32f1cdef5
9 changed files with 87 additions and 90 deletions
  1. +3
    -2
      src/8vert.cpp
  2. +4
    -4
      src/ADSR.cpp
  3. +8
    -6
      src/LFO.cpp
  4. +6
    -4
      src/SEQ3.cpp
  5. +1
    -1
      src/Sum.cpp
  6. +45
    -38
      src/Unity.cpp
  7. +5
    -5
      src/VCF.cpp
  8. +8
    -6
      src/VCO.cpp
  9. +7
    -24
      src/Viz.cpp

+ 3
- 2
src/8vert.cpp View File

@@ -27,13 +27,14 @@ struct _8vert : Module {
}

void step() override {
float deltaTime = APP->engine->getSampleTime();
float lastIn = 10.f;
for (int i = 0; i < 8; i++) {
lastIn = inputs[i].getNormalVoltage(lastIn);
float out = lastIn * params[i].value;
outputs[i].value = out;
lights[2*i + 0].setBrightnessSmooth(std::max(0.f, out / 5.f));
lights[2*i + 1].setBrightnessSmooth(std::max(0.f, -out / 5.f));
lights[2*i + 0].setSmoothBrightness(out / 5.f, deltaTime);
lights[2*i + 1].setSmoothBrightness(-out / 5.f, deltaTime);
}
}
};


+ 4
- 4
src/ADSR.cpp View File

@@ -36,10 +36,10 @@ struct ADSR : Module {

ADSR() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
params[ATTACK_PARAM].config(0.f, 1.f, 0.5f);
params[DECAY_PARAM].config(0.f, 1.f, 0.5f);
params[SUSTAIN_PARAM].config(0.f, 1.f, 0.5f);
params[RELEASE_PARAM].config(0.f, 1.f, 0.5f);
params[ATTACK_PARAM].config(0.f, 1.f, 0.5f, "Attack");
params[DECAY_PARAM].config(0.f, 1.f, 0.5f, "Decay");
params[SUSTAIN_PARAM].config(0.f, 1.f, 0.5f, "Sustain");
params[RELEASE_PARAM].config(0.f, 1.f, 0.5f, "Release");
}

void step() override {


+ 8
- 6
src/LFO.cpp View File

@@ -108,11 +108,12 @@ struct LFO : Module {
}

void step() override {
float deltaTime = APP->engine->getSampleTime();
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.offset = (params[OFFSET_PARAM].value > 0.f);
oscillator.invert = (params[INVERT_PARAM].value <= 0.f);
oscillator.step(APP->engine->getSampleTime());
oscillator.step(deltaTime);
oscillator.setReset(inputs[RESET_INPUT].value);

outputs[SIN_OUTPUT].value = 5.f * oscillator.sin();
@@ -120,8 +121,8 @@ struct LFO : Module {
outputs[SAW_OUTPUT].value = 5.f * oscillator.saw();
outputs[SQR_OUTPUT].value = 5.f * oscillator.sqr();

lights[PHASE_POS_LIGHT].setBrightnessSmooth(std::max(0.f, oscillator.light()));
lights[PHASE_NEG_LIGHT].setBrightnessSmooth(std::max(0.f, -oscillator.light()));
lights[PHASE_POS_LIGHT].setSmoothBrightness(oscillator.light(), deltaTime);
lights[PHASE_NEG_LIGHT].setSmoothBrightness(-oscillator.light(), deltaTime);
}

};
@@ -202,10 +203,11 @@ struct LFO2 : Module {
}

void step() override {
float deltaTime = APP->engine->getSampleTime();
oscillator.setPitch(params[FREQ_PARAM].value + params[FM_PARAM].value * inputs[FM_INPUT].value);
oscillator.offset = (params[OFFSET_PARAM].value > 0.f);
oscillator.invert = (params[INVERT_PARAM].value <= 0.f);
oscillator.step(APP->engine->getSampleTime());
oscillator.step(deltaTime);
oscillator.setReset(inputs[RESET_INPUT].value);

float wave = params[WAVE_PARAM].value + inputs[WAVE_INPUT].value;
@@ -219,8 +221,8 @@ struct LFO2 : Module {
interp = crossfade(oscillator.saw(), oscillator.sqr(), wave - 2.f);
outputs[INTERP_OUTPUT].value = 5.f * interp;

lights[PHASE_POS_LIGHT].setBrightnessSmooth(std::max(0.f, oscillator.light()));
lights[PHASE_NEG_LIGHT].setBrightnessSmooth(std::max(0.f, -oscillator.light()));
lights[PHASE_POS_LIGHT].setSmoothBrightness(oscillator.light(), deltaTime);
lights[PHASE_NEG_LIGHT].setSmoothBrightness(-oscillator.light(), deltaTime);
}
};



+ 6
- 4
src/SEQ3.cpp View File

@@ -118,6 +118,8 @@ struct SEQ3 : Module {
}

void step() override {
float deltaTime = APP->engine->getSampleTime();

// Run
if (runningTrigger.process(params[RUN_PARAM].value)) {
running = !running;
@@ -135,7 +137,7 @@ struct SEQ3 : Module {
else {
// Internal clock
float clockTime = std::pow(2.0f, params[CLOCK_PARAM].value + inputs[CLOCK_INPUT].value);
phase += clockTime * APP->engine->getSampleTime();
phase += clockTime * deltaTime;
if (phase >= 1.0f) {
setIndex(index + 1);
}
@@ -154,7 +156,7 @@ struct SEQ3 : Module {
gates[i] = !gates[i];
}
outputs[GATE_OUTPUT + i].value = (running && gateIn && i == index && gates[i]) ? 10.0f : 0.0f;
lights[GATE_LIGHTS + i].setBrightnessSmooth((gateIn && i == index) ? (gates[i] ? 1.f : 0.33) : (gates[i] ? 0.66 : 0.0));
lights[GATE_LIGHTS + i].setSmoothBrightness((gateIn && i == index) ? (gates[i] ? 1.f : 0.33) : (gates[i] ? 0.66 : 0.0), deltaTime);
}

// Outputs
@@ -163,8 +165,8 @@ struct SEQ3 : Module {
outputs[ROW3_OUTPUT].value = params[ROW3_PARAM + index].value;
outputs[GATES_OUTPUT].value = (gateIn && gates[index]) ? 10.0f : 0.0f;
lights[RUNNING_LIGHT].value = (running);
lights[RESET_LIGHT].setBrightnessSmooth(resetTrigger.isHigh());
lights[GATES_LIGHT].setBrightnessSmooth(gateIn);
lights[RESET_LIGHT].setSmoothBrightness(resetTrigger.isHigh(), deltaTime);
lights[GATES_LIGHT].setSmoothBrightness(gateIn, deltaTime);
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;


+ 1
- 1
src/Sum.cpp View File

@@ -21,7 +21,7 @@ struct Sum : Module {
};

int frame = 0;
dsp::VUMeter2 vuMeter;
dsp::VuMeter2 vuMeter;

Sum() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);


+ 45
- 38
src/Unity.cpp View File

@@ -8,9 +8,8 @@ struct Unity : Module {
NUM_PARAMS
};
enum InputIds {
IN1_INPUT,
IN2_INPUT = IN1_INPUT + 6,
NUM_INPUTS = IN2_INPUT + 6
ENUMS(IN_INPUTS, 2 * 6),
NUM_INPUTS
};
enum OutputIds {
MIX1_OUTPUT,
@@ -20,28 +19,32 @@ struct Unity : Module {
NUM_OUTPUTS
};
enum LightIds {
VU1_LIGHT,
VU2_LIGHT = VU1_LIGHT + 5,
NUM_LIGHTS = VU2_LIGHT + 5
ENUMS(VU_LIGHTS, 2 * 5),
NUM_LIGHTS
};

bool merge = false;
dsp::VuMeter2 vuMeters[2];
dsp::Counter vuCounter;

Unity() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
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");

vuCounter.setPeriod(256);
}

void step() override {
float deltaTime = APP->engine->getSampleTime();
float mix[2] = {};
int count[2] = {};

for (int i = 0; i < 2; i++) {
// Inputs
for (int j = 0; j < 6; j++) {
mix[i] += inputs[IN1_INPUT + 6*i + j].value;
if (inputs[IN1_INPUT + 6*i + j].active)
mix[i] += inputs[IN_INPUTS + 6 * i + j].value;
if (inputs[IN_INPUTS + 6 * i + j].active)
count[i]++;
}
}
@@ -56,18 +59,22 @@ struct Unity : Module {

for (int i = 0; i < 2; i++) {
// Params
if ((int) params[AVG1_PARAM + i].value == 1 && count[i] > 0)
if (count[i] > 0 && (int) std::round(params[AVG1_PARAM + i].value) == 1)
mix[i] /= count[i];

// Outputs
outputs[MIX1_OUTPUT + 2*i].value = mix[i];
outputs[INV1_OUTPUT + 2*i].value = -mix[i];
outputs[MIX1_OUTPUT + 2 * i].value = mix[i];
outputs[INV1_OUTPUT + 2 * i].value = -mix[i];
vuMeters[i].process(deltaTime, mix[i] / 10.f);
}

if (vuCounter.process()) {
// Lights
dsp::VUMeter vuMeter;
vuMeter.dBInterval = 6.0f;
vuMeter.setValue(mix[i] / 10.0f);
for (int j = 0; j < 5; j++) {
lights[VU1_LIGHT + 5*i + j].setBrightnessSmooth(vuMeter.getBrightness(j));
for (int i = 0; i < 2; i++) {
lights[VU_LIGHTS + 5 * i + 0].setBrightness(vuMeters[i].getBrightness(0.f, 0.f));
for (int j = 1; j < 5; j++) {
lights[VU_LIGHTS + 5 * i + j].setBrightness(vuMeters[i].getBrightness(-6.f * (j + 1), -6.f * j));
}
}
}
}
@@ -116,34 +123,34 @@ struct UnityWidget : ModuleWidget {
addParam(createParam<CKSS>(mm2px(Vec(12.867, 52.961)), module, Unity::AVG1_PARAM));
addParam(createParam<CKSS>(mm2px(Vec(12.867, 107.006)), module, Unity::AVG2_PARAM));

addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 17.144)), module, Unity::IN1_INPUT + 0));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 17.144)), module, Unity::IN1_INPUT + 1));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 28.145)), module, Unity::IN1_INPUT + 2));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 28.145)), module, Unity::IN1_INPUT + 3));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 39.145)), module, Unity::IN1_INPUT + 4));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 39.145)), module, Unity::IN1_INPUT + 5));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 71.145)), module, Unity::IN2_INPUT + 0));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 71.145)), module, Unity::IN2_INPUT + 1));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 82.145)), module, Unity::IN2_INPUT + 2));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 82.145)), module, Unity::IN2_INPUT + 3));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 93.144)), module, Unity::IN2_INPUT + 4));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 93.144)), module, Unity::IN2_INPUT + 5));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 17.144)), module, Unity::IN_INPUTS + 0 * 6 + 0));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 17.144)), module, Unity::IN_INPUTS + 0 * 6 + 1));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 28.145)), module, Unity::IN_INPUTS + 0 * 6 + 2));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 28.145)), module, Unity::IN_INPUTS + 0 * 6 + 3));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 39.145)), module, Unity::IN_INPUTS + 0 * 6 + 4));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 39.145)), module, Unity::IN_INPUTS + 0 * 6 + 5));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 71.145)), module, Unity::IN_INPUTS + 1 * 6 + 0));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 71.145)), module, Unity::IN_INPUTS + 1 * 6 + 1));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 82.145)), module, Unity::IN_INPUTS + 1 * 6 + 2));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 82.145)), module, Unity::IN_INPUTS + 1 * 6 + 3));
addInput(createInput<PJ301MPort>(mm2px(Vec(2.361, 93.144)), module, Unity::IN_INPUTS + 1 * 6 + 4));
addInput(createInput<PJ301MPort>(mm2px(Vec(19.907, 93.144)), module, Unity::IN_INPUTS + 1 * 6 + 5));

addOutput(createOutput<PJ301MPort>(mm2px(Vec(2.361, 54.15)), module, Unity::MIX1_OUTPUT));
addOutput(createOutput<PJ301MPort>(mm2px(Vec(19.907, 54.15)), module, Unity::INV1_OUTPUT));
addOutput(createOutput<PJ301MPort>(mm2px(Vec(2.361, 108.144)), module, Unity::MIX2_OUTPUT));
addOutput(createOutput<PJ301MPort>(mm2px(Vec(19.907, 108.144)), module, Unity::INV2_OUTPUT));

addChild(createLight<MediumLight<RedLight>>(mm2px(Vec(13.652, 19.663)), module, Unity::VU1_LIGHT + 0));
addChild(createLight<MediumLight<YellowLight>>(mm2px(Vec(13.652, 25.163)), module, Unity::VU1_LIGHT + 1));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 30.663)), module, Unity::VU1_LIGHT + 2));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 36.162)), module, Unity::VU1_LIGHT + 3));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 41.662)), module, Unity::VU1_LIGHT + 4));
addChild(createLight<MediumLight<RedLight>>(mm2px(Vec(13.652, 73.663)), module, Unity::VU2_LIGHT + 0));
addChild(createLight<MediumLight<YellowLight>>(mm2px(Vec(13.652, 79.163)), module, Unity::VU2_LIGHT + 1));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 84.663)), module, Unity::VU2_LIGHT + 2));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 90.162)), module, Unity::VU2_LIGHT + 3));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 95.662)), module, Unity::VU2_LIGHT + 4));
addChild(createLight<MediumLight<RedLight>>(mm2px(Vec(13.652, 19.663)), module, Unity::VU_LIGHTS + 0 * 5 + 0));
addChild(createLight<MediumLight<YellowLight>>(mm2px(Vec(13.652, 25.163)), module, Unity::VU_LIGHTS + 0 * 5 + 1));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 30.663)), module, Unity::VU_LIGHTS + 0 * 5 + 2));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 36.162)), module, Unity::VU_LIGHTS + 0 * 5 + 3));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 41.662)), module, Unity::VU_LIGHTS + 0 * 5 + 4));
addChild(createLight<MediumLight<RedLight>>(mm2px(Vec(13.652, 73.663)), module, Unity::VU_LIGHTS + 1 * 5 + 0));
addChild(createLight<MediumLight<YellowLight>>(mm2px(Vec(13.652, 79.163)), module, Unity::VU_LIGHTS + 1 * 5 + 1));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 84.663)), module, Unity::VU_LIGHTS + 1 * 5 + 2));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 90.162)), module, Unity::VU_LIGHTS + 1 * 5 + 3));
addChild(createLight<MediumLight<GreenLight>>(mm2px(Vec(13.652, 95.662)), module, Unity::VU_LIGHTS + 1 * 5 + 4));
}

void appendContextMenu(Menu *menu) override {


+ 5
- 5
src/VCF.cpp View File

@@ -80,11 +80,11 @@ struct VCF : Module {

VCF() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
params[FREQ_PARAM].config(0.f, 1.f, 0.5f);
params[FINE_PARAM].config(0.f, 1.f, 0.5f);
params[RES_PARAM].config(0.f, 1.f, 0.f);
params[FREQ_CV_PARAM].config(-1.f, 1.f, 0.f);
params[DRIVE_PARAM].config(0.f, 1.f, 0.f);
params[FREQ_PARAM].config(0.f, 1.f, 0.5f, "Frequency");
params[FINE_PARAM].config(0.f, 1.f, 0.5f, "Fine frequency");
params[RES_PARAM].config(0.f, 1.f, 0.f, "Resonance");
params[FREQ_CV_PARAM].config(-1.f, 1.f, 0.f, "Frequency modulation");
params[DRIVE_PARAM].config(0.f, 1.f, 0.f, "Drive");
}

void onReset() override {


+ 8
- 6
src/VCO.cpp View File

@@ -205,6 +205,7 @@ struct VCO : Module {
}

void step() override {
float deltaTime = APP->engine->getSampleTime();
oscillator.analog = params[MODE_PARAM].value > 0.f;
oscillator.soft = params[SYNC_PARAM].value <= 0.f;

@@ -217,7 +218,7 @@ struct VCO : Module {
oscillator.setPulseWidth(params[PW_PARAM].value + params[PWM_PARAM].value * inputs[PW_INPUT].value / 10.f);
oscillator.syncEnabled = inputs[SYNC_INPUT].active;

oscillator.process(APP->engine->getSampleTime(), inputs[SYNC_INPUT].value);
oscillator.process(deltaTime, inputs[SYNC_INPUT].value);

// Set output
if (outputs[SIN_OUTPUT].active)
@@ -229,8 +230,8 @@ struct VCO : Module {
if (outputs[SQR_OUTPUT].active)
outputs[SQR_OUTPUT].value = 5.f * oscillator.sqr();

lights[PHASE_POS_LIGHT].setBrightnessSmooth(std::fmax(0.f, oscillator.light()));
lights[PHASE_NEG_LIGHT].setBrightnessSmooth(std::fmax(0.f, -oscillator.light()));
lights[PHASE_POS_LIGHT].setSmoothBrightness(oscillator.light(), deltaTime);
lights[PHASE_NEG_LIGHT].setSmoothBrightness(-oscillator.light(), deltaTime);
}
};

@@ -309,6 +310,7 @@ struct VCO2 : Module {
}

void step() override {
float deltaTime = APP->engine->getSampleTime();
oscillator.analog = params[MODE_PARAM].value > 0.f;
oscillator.soft = params[SYNC_PARAM].value <= 0.f;

@@ -316,7 +318,7 @@ struct VCO2 : Module {
oscillator.setPitch(0.f, pitchCv);
oscillator.syncEnabled = inputs[SYNC_INPUT].active;

oscillator.process(APP->engine->getSampleTime(), inputs[SYNC_INPUT].value);
oscillator.process(deltaTime, inputs[SYNC_INPUT].value);

// Set output
float wave = clamp(params[WAVE_PARAM].value + inputs[WAVE_INPUT].value, 0.f, 3.f);
@@ -329,8 +331,8 @@ struct VCO2 : Module {
out = crossfade(oscillator.saw(), oscillator.sqr(), wave - 2.f);
outputs[OUT_OUTPUT].value = 5.f * out;

lights[PHASE_POS_LIGHT].setBrightnessSmooth(std::fmax(0.f, oscillator.light()));
lights[PHASE_NEG_LIGHT].setBrightnessSmooth(std::fmax(0.f, -oscillator.light()));
lights[PHASE_POS_LIGHT].setSmoothBrightness(oscillator.light(), deltaTime);
lights[PHASE_NEG_LIGHT].setSmoothBrightness(-oscillator.light(), deltaTime);
}
};



+ 7
- 24
src/Viz.cpp View File

@@ -18,43 +18,26 @@ struct Viz : Module {
};

int channels = 0;
dsp::VUMeter2 vuMeter[16];
int frame = 0;
dsp::Counter counter;

Viz() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);

for (int c = 0; c < 16; c++) {
vuMeter[c].lambda = 1 / 0.1f;
}
counter.period = 16;
}

void step() override {
if (frame % 16 == 0) {
if (counter.process()) {
channels = inputs[POLY_INPUT].getChannels();
float deltaTime = APP->engine->getSampleTime() * 16;
float deltaTime = APP->engine->getSampleTime() * counter.period;

// Process VU meters
for (int c = 0; c < channels; c++) {
float value = inputs[POLY_INPUT].getVoltage(c) / 10.f;
vuMeter[c].process(deltaTime, value);
}
for (int c = channels; c < 16; c++) {
vuMeter[c].reset();
}
}

if (frame % 256 == 0) {
// Set lights
for (int c = 0; c < 16; c++) {
float green = vuMeter[c].getBrightness(-24.f, -6.f);
float red = vuMeter[c].getBrightness(-6.f, 0.f);
lights[VU_LIGHTS + c*2 + 0].setBrightness(green - red);
lights[VU_LIGHTS + c*2 + 1].setBrightness(red);
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);
}
}

frame++;
}
};



Loading…
Cancel
Save