@@ -23,10 +23,15 @@ struct ABC : Module { | |||||
OUT2_OUTPUT, | OUT2_OUTPUT, | ||||
NUM_OUTPUTS | NUM_OUTPUTS | ||||
}; | }; | ||||
enum LightIds { | |||||
OUT1_POS_LIGHT, | |||||
OUT1_NEG_LIGHT, | |||||
OUT2_POS_LIGHT, | |||||
OUT2_NEG_LIGHT, | |||||
NUM_LIGHTS | |||||
}; | |||||
float lights[2] = {}; | |||||
ABC() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} | |||||
ABC() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} | |||||
void step() override; | void step() override; | ||||
}; | }; | ||||
@@ -44,7 +49,7 @@ void ABC::step() { | |||||
float a2 = inputs[A2_INPUT].value; | float a2 = inputs[A2_INPUT].value; | ||||
float b2 = inputs[B2_INPUT].normalize(5.0) * 2.0*exponentialBipolar(80.0, params[B2_LEVEL_PARAM].value); | float b2 = inputs[B2_INPUT].normalize(5.0) * 2.0*exponentialBipolar(80.0, params[B2_LEVEL_PARAM].value); | ||||
float c2 = inputs[C2_INPUT].normalize(20.0) * exponentialBipolar(80.0, params[C2_LEVEL_PARAM].value); | |||||
float c2 = inputs[C2_INPUT].normalize(10.0) * exponentialBipolar(80.0, params[C2_LEVEL_PARAM].value); | |||||
float out2 = a2 * b2 / 5.0 + c2; | float out2 = a2 * b2 / 5.0 + c2; | ||||
// Set outputs | // Set outputs | ||||
@@ -57,8 +62,12 @@ void ABC::step() { | |||||
if (outputs[OUT2_OUTPUT].active) { | if (outputs[OUT2_OUTPUT].active) { | ||||
outputs[OUT2_OUTPUT].value = clip(out2 / 10.0) * 10.0; | outputs[OUT2_OUTPUT].value = clip(out2 / 10.0) * 10.0; | ||||
} | } | ||||
lights[0] = out1 / 5.0; | |||||
lights[1] = out2 / 5.0; | |||||
// Lights | |||||
lights[OUT1_POS_LIGHT].value = fmaxf(0.0, out1 / 5.0); | |||||
lights[OUT1_NEG_LIGHT].value = fmaxf(0.0, -out1 / 5.0); | |||||
lights[OUT2_POS_LIGHT].value = fmaxf(0.0, out2 / 5.0); | |||||
lights[OUT2_NEG_LIGHT].value = fmaxf(0.0, -out2 / 5.0); | |||||
} | } | ||||
@@ -91,6 +100,6 @@ ABCWidget::ABCWidget() { | |||||
addInput(createInput<PJ301MPort>(Vec(7, 279), module, ABC::C2_INPUT)); | addInput(createInput<PJ301MPort>(Vec(7, 279), module, ABC::C2_INPUT)); | ||||
addOutput(createOutput<PJ301MPort>(Vec(7, 321), module, ABC::OUT2_OUTPUT)); | addOutput(createOutput<PJ301MPort>(Vec(7, 321), module, ABC::OUT2_OUTPUT)); | ||||
addChild(createValueLight<SmallLight<GreenRedPolarityLight>>(Vec(38, 162), &module->lights[0])); | |||||
addChild(createValueLight<SmallLight<GreenRedPolarityLight>>(Vec(38, 330), &module->lights[1])); | |||||
addChild(createLight<SmallLight<GreenRedLight>>(Vec(38, 162), module, ABC::OUT1_POS_LIGHT)); | |||||
addChild(createLight<SmallLight<GreenRedLight>>(Vec(38, 330), module, ABC::OUT2_POS_LIGHT)); | |||||
} | } |
@@ -19,10 +19,15 @@ struct DualAtenuverter : Module { | |||||
OUT2_OUTPUT, | OUT2_OUTPUT, | ||||
NUM_OUTPUTS | NUM_OUTPUTS | ||||
}; | }; | ||||
enum LightIds { | |||||
OUT1_POS_LIGHT, | |||||
OUT1_NEG_LIGHT, | |||||
OUT2_POS_LIGHT, | |||||
OUT2_NEG_LIGHT, | |||||
NUM_LIGHTS | |||||
}; | |||||
float lights[2] = {}; | |||||
DualAtenuverter() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} | |||||
DualAtenuverter() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} | |||||
void step() override; | void step() override; | ||||
}; | }; | ||||
@@ -35,8 +40,10 @@ void DualAtenuverter::step() { | |||||
outputs[OUT1_OUTPUT].value = out1; | outputs[OUT1_OUTPUT].value = out1; | ||||
outputs[OUT2_OUTPUT].value = out2; | outputs[OUT2_OUTPUT].value = out2; | ||||
lights[0] = out1 / 5.0; | |||||
lights[1] = out2 / 5.0; | |||||
lights[OUT1_POS_LIGHT].value = fmaxf(0.0, out1 / 5.0); | |||||
lights[OUT1_NEG_LIGHT].value = fmaxf(0.0, -out1 / 5.0); | |||||
lights[OUT2_POS_LIGHT].value = fmaxf(0.0, out2 / 5.0); | |||||
lights[OUT2_NEG_LIGHT].value = fmaxf(0.0, -out2 / 5.0); | |||||
} | } | ||||
@@ -66,6 +73,6 @@ DualAtenuverterWidget::DualAtenuverterWidget() { | |||||
addInput(createInput<PJ301MPort>(Vec(7, 319), module, DualAtenuverter::IN2_INPUT)); | addInput(createInput<PJ301MPort>(Vec(7, 319), module, DualAtenuverter::IN2_INPUT)); | ||||
addOutput(createOutput<PJ301MPort>(Vec(43, 319), module, DualAtenuverter::OUT2_OUTPUT)); | addOutput(createOutput<PJ301MPort>(Vec(43, 319), module, DualAtenuverter::OUT2_OUTPUT)); | ||||
addChild(createValueLight<SmallLight<GreenRedPolarityLight>>(Vec(33, 143), &module->lights[0])); | |||||
addChild(createValueLight<SmallLight<GreenRedPolarityLight>>(Vec(33, 311), &module->lights[1])); | |||||
addChild(createLight<SmallLight<GreenRedLight>>(Vec(33, 143), module, DualAtenuverter::OUT1_POS_LIGHT)); | |||||
addChild(createLight<SmallLight<GreenRedLight>>(Vec(33, 311), module, DualAtenuverter::OUT2_POS_LIGHT)); | |||||
} | } |
@@ -21,10 +21,13 @@ struct Mixer : Module { | |||||
OUT2_OUTPUT, | OUT2_OUTPUT, | ||||
NUM_OUTPUTS | NUM_OUTPUTS | ||||
}; | }; | ||||
enum LightIds { | |||||
OUT_POS_LIGHT, | |||||
OUT_NEG_LIGHT, | |||||
NUM_LIGHTS | |||||
}; | |||||
float lights[1] = {}; | |||||
Mixer() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} | |||||
Mixer() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} | |||||
void step() override; | void step() override; | ||||
}; | }; | ||||
@@ -38,7 +41,8 @@ void Mixer::step() { | |||||
float out = in1 + in2 + in3 + in4; | float out = in1 + in2 + in3 + in4; | ||||
outputs[OUT1_OUTPUT].value = out; | outputs[OUT1_OUTPUT].value = out; | ||||
outputs[OUT2_OUTPUT].value = -out; | outputs[OUT2_OUTPUT].value = -out; | ||||
lights[0] = out / 5.0; | |||||
lights[OUT_POS_LIGHT].value = fmaxf(0.0, out / 5.0); | |||||
lights[OUT_NEG_LIGHT].value = fmaxf(0.0, -out / 5.0); | |||||
} | } | ||||
@@ -71,5 +75,5 @@ MixerWidget::MixerWidget() { | |||||
addOutput(createOutput<PJ301MPort>(Vec(7, 324), module, Mixer::OUT1_OUTPUT)); | addOutput(createOutput<PJ301MPort>(Vec(7, 324), module, Mixer::OUT1_OUTPUT)); | ||||
addOutput(createOutput<PJ301MPort>(Vec(43, 324), module, Mixer::OUT2_OUTPUT)); | addOutput(createOutput<PJ301MPort>(Vec(43, 324), module, Mixer::OUT2_OUTPUT)); | ||||
addChild(createValueLight<MediumLight<GreenRedPolarityLight>>(Vec(31, 309), &module->lights[0])); | |||||
addChild(createLight<MediumLight<GreenRedLight>>(Vec(31, 309), module, Mixer::OUT_POS_LIGHT)); | |||||
} | } |
@@ -46,6 +46,9 @@ struct Rampage : Module { | |||||
COMPARATOR_OUTPUT, | COMPARATOR_OUTPUT, | ||||
MIN_OUTPUT, | MIN_OUTPUT, | ||||
MAX_OUTPUT, | MAX_OUTPUT, | ||||
NUM_OUTPUTS | |||||
}; | |||||
enum LightIds { | |||||
COMPARATOR_LIGHT, | COMPARATOR_LIGHT, | ||||
MIN_LIGHT, | MIN_LIGHT, | ||||
MAX_LIGHT, | MAX_LIGHT, | ||||
@@ -55,7 +58,7 @@ struct Rampage : Module { | |||||
RISING_B_LIGHT, | RISING_B_LIGHT, | ||||
FALLING_A_LIGHT, | FALLING_A_LIGHT, | ||||
FALLING_B_LIGHT, | FALLING_B_LIGHT, | ||||
NUM_OUTPUTS | |||||
NUM_LIGHTS | |||||
}; | }; | ||||
float out[2] = {}; | float out[2] = {}; | ||||
@@ -63,7 +66,7 @@ struct Rampage : Module { | |||||
SchmittTrigger trigger[2]; | SchmittTrigger trigger[2]; | ||||
PulseGenerator endOfCyclePulse[2]; | PulseGenerator endOfCyclePulse[2]; | ||||
Rampage() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) { | |||||
Rampage() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { | |||||
for (int c = 0; c < 2; c++) { | for (int c = 0; c < 2; c++) { | ||||
trigger[c].setThresholds(0.0, 4.0); | trigger[c].setThresholds(0.0, 4.0); | ||||
} | } | ||||
@@ -144,11 +147,11 @@ void Rampage::step() { | |||||
outputs[RISING_A_OUTPUT + c].value = (rising ? 10.0 : 0.0); | outputs[RISING_A_OUTPUT + c].value = (rising ? 10.0 : 0.0); | ||||
outputs[FALLING_A_OUTPUT + c].value = (falling ? 10.0 : 0.0); | outputs[FALLING_A_OUTPUT + c].value = (falling ? 10.0 : 0.0); | ||||
outputs[RISING_A_LIGHT + c].value = (rising ? 1.0 : 0.0); | |||||
outputs[FALLING_A_LIGHT + c].value = (falling ? 1.0 : 0.0); | |||||
lights[RISING_A_LIGHT + c].value = (rising ? 1.0 : 0.0); | |||||
lights[FALLING_A_LIGHT + c].value = (falling ? 1.0 : 0.0); | |||||
outputs[EOC_A_OUTPUT + c].value = (endOfCyclePulse[c].process(1.0 / engineGetSampleRate()) ? 10.0 : 0.0); | outputs[EOC_A_OUTPUT + c].value = (endOfCyclePulse[c].process(1.0 / engineGetSampleRate()) ? 10.0 : 0.0); | ||||
outputs[OUT_A_OUTPUT + c].value = out[c]; | outputs[OUT_A_OUTPUT + c].value = out[c]; | ||||
outputs[OUT_A_LIGHT + c].value = out[c] / 10.0; | |||||
lights[OUT_A_LIGHT + c].value = out[c] / 10.0; | |||||
} | } | ||||
// Logic | // Logic | ||||
@@ -163,9 +166,9 @@ void Rampage::step() { | |||||
outputs[MIN_OUTPUT].value = fminf(a, b); | outputs[MIN_OUTPUT].value = fminf(a, b); | ||||
outputs[MAX_OUTPUT].value = fmaxf(a, b); | outputs[MAX_OUTPUT].value = fmaxf(a, b); | ||||
// Lights | // Lights | ||||
outputs[COMPARATOR_LIGHT].value = outputs[COMPARATOR_OUTPUT].value / 10.0; | |||||
outputs[MIN_LIGHT].value = outputs[MIN_OUTPUT].value / 10.0; | |||||
outputs[MAX_LIGHT].value = outputs[MAX_OUTPUT].value / 10.0; | |||||
lights[COMPARATOR_LIGHT].value = outputs[COMPARATOR_OUTPUT].value / 10.0; | |||||
lights[MIN_LIGHT].value = outputs[MIN_OUTPUT].value / 10.0; | |||||
lights[MAX_LIGHT].value = outputs[MAX_OUTPUT].value / 10.0; | |||||
} | } | ||||
@@ -225,13 +228,13 @@ RampageWidget::RampageWidget() { | |||||
addOutput(createOutput<PJ301MPort>(Vec(89, 157), module, Rampage::MIN_OUTPUT)); | addOutput(createOutput<PJ301MPort>(Vec(89, 157), module, Rampage::MIN_OUTPUT)); | ||||
addOutput(createOutput<PJ301MPort>(Vec(155, 157), module, Rampage::MAX_OUTPUT)); | addOutput(createOutput<PJ301MPort>(Vec(155, 157), module, Rampage::MAX_OUTPUT)); | ||||
addChild(createValueLight<SmallLight<RedValueLight>>(Vec(131, 167), &module->outputs[Rampage::COMPARATOR_LIGHT].value)); | |||||
addChild(createValueLight<SmallLight<RedValueLight>>(Vec(122, 174), &module->outputs[Rampage::MIN_LIGHT].value)); | |||||
addChild(createValueLight<SmallLight<RedValueLight>>(Vec(140, 174), &module->outputs[Rampage::MAX_LIGHT].value)); | |||||
addChild(createValueLight<SmallLight<RedValueLight>>(Vec(125, 185), &module->outputs[Rampage::OUT_A_LIGHT].value)); | |||||
addChild(createValueLight<SmallLight<RedValueLight>>(Vec(137, 185), &module->outputs[Rampage::OUT_B_LIGHT].value)); | |||||
addChild(createValueLight<SmallLight<RedValueLight>>(Vec(17, 312), &module->outputs[Rampage::RISING_A_LIGHT].value)); | |||||
addChild(createValueLight<SmallLight<RedValueLight>>(Vec(77, 312), &module->outputs[Rampage::FALLING_A_LIGHT].value)); | |||||
addChild(createValueLight<SmallLight<RedValueLight>>(Vec(186, 312), &module->outputs[Rampage::RISING_B_LIGHT].value)); | |||||
addChild(createValueLight<SmallLight<RedValueLight>>(Vec(246, 312), &module->outputs[Rampage::FALLING_B_LIGHT].value)); | |||||
addChild(createLight<SmallLight<RedLight>>(Vec(131, 167), module, Rampage::COMPARATOR_LIGHT)); | |||||
addChild(createLight<SmallLight<RedLight>>(Vec(122, 174), module, Rampage::MIN_LIGHT)); | |||||
addChild(createLight<SmallLight<RedLight>>(Vec(140, 174), module, Rampage::MAX_LIGHT)); | |||||
addChild(createLight<SmallLight<RedLight>>(Vec(125, 185), module, Rampage::OUT_A_LIGHT)); | |||||
addChild(createLight<SmallLight<RedLight>>(Vec(137, 185), module, Rampage::OUT_B_LIGHT)); | |||||
addChild(createLight<SmallLight<RedLight>>(Vec(17, 312), module, Rampage::RISING_A_LIGHT)); | |||||
addChild(createLight<SmallLight<RedLight>>(Vec(77, 312), module, Rampage::FALLING_A_LIGHT)); | |||||
addChild(createLight<SmallLight<RedLight>>(Vec(186, 312), module, Rampage::RISING_B_LIGHT)); | |||||
addChild(createLight<SmallLight<RedLight>>(Vec(246, 312), module, Rampage::FALLING_B_LIGHT)); | |||||
} | } |
@@ -158,6 +158,11 @@ struct SpringReverb : Module { | |||||
WET_OUTPUT, | WET_OUTPUT, | ||||
NUM_OUTPUTS | NUM_OUTPUTS | ||||
}; | }; | ||||
enum LightIds { | |||||
PEAK_LIGHT, | |||||
VU1_LIGHT, | |||||
NUM_LIGHTS = VU1_LIGHT + 7 | |||||
}; | |||||
RealTimeConvolver *convolver = NULL; | RealTimeConvolver *convolver = NULL; | ||||
SampleRateConverter<1> inputSrc; | SampleRateConverter<1> inputSrc; | ||||
@@ -168,8 +173,6 @@ struct SpringReverb : Module { | |||||
RCFilter dryFilter; | RCFilter dryFilter; | ||||
PeakFilter vuFilter; | PeakFilter vuFilter; | ||||
PeakFilter lightFilter; | PeakFilter lightFilter; | ||||
float vuLights[7] = {}; | |||||
float lights[1] = {}; | |||||
SpringReverb(); | SpringReverb(); | ||||
~SpringReverb(); | ~SpringReverb(); | ||||
@@ -177,7 +180,7 @@ struct SpringReverb : Module { | |||||
}; | }; | ||||
SpringReverb::SpringReverb() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) { | |||||
SpringReverb::SpringReverb() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { | |||||
convolver = new RealTimeConvolver(BLOCKSIZE); | convolver = new RealTimeConvolver(BLOCKSIZE); | ||||
convolver->setKernel(springReverbIR, springReverbIRLen); | convolver->setKernel(springReverbIR, springReverbIRLen); | ||||
} | } | ||||
@@ -253,9 +256,9 @@ void SpringReverb::step() { | |||||
float vuValue = vuFilter.peak(); | float vuValue = vuFilter.peak(); | ||||
for (int i = 0; i < 7; i++) { | for (int i = 0; i < 7; i++) { | ||||
float light = powf(1.413, i) * vuValue / 10.0 - 1.0; | float light = powf(1.413, i) * vuValue / 10.0 - 1.0; | ||||
vuLights[i] = clampf(light, 0.0, 1.0); | |||||
lights[VU1_LIGHT + i].value = clampf(light, 0.0, 1.0); | |||||
} | } | ||||
lights[0] = lightFilter.peak(); | |||||
lights[PEAK_LIGHT].value = lightFilter.peak(); | |||||
} | } | ||||
@@ -292,13 +295,12 @@ SpringReverbWidget::SpringReverbWidget() { | |||||
addInput(createInput<PJ301MPort>(Vec(47, 324), module, SpringReverb::MIX_CV_INPUT)); | addInput(createInput<PJ301MPort>(Vec(47, 324), module, SpringReverb::MIX_CV_INPUT)); | ||||
addOutput(createOutput<PJ301MPort>(Vec(88, 317), module, SpringReverb::WET_OUTPUT)); | addOutput(createOutput<PJ301MPort>(Vec(88, 317), module, SpringReverb::WET_OUTPUT)); | ||||
addChild(createValueLight<SmallLight<RedValueLight>>(Vec(56, 114), &module->vuLights[0])); | |||||
addChild(createValueLight<SmallLight<YellowValueLight>>(Vec(56, 127), &module->vuLights[1])); | |||||
addChild(createValueLight<SmallLight<YellowValueLight>>(Vec(56, 139), &module->vuLights[2])); | |||||
addChild(createValueLight<SmallLight<GreenValueLight>>(Vec(56, 151), &module->vuLights[3])); | |||||
addChild(createValueLight<SmallLight<GreenValueLight>>(Vec(56, 164), &module->vuLights[4])); | |||||
addChild(createValueLight<SmallLight<GreenValueLight>>(Vec(56, 176), &module->vuLights[5])); | |||||
addChild(createValueLight<SmallLight<GreenValueLight>>(Vec(56, 189), &module->vuLights[6])); | |||||
addChild(createValueLight<SmallLight<GreenRedPolarityLight>>(Vec(56, 270), &module->lights[0])); | |||||
addChild(createLight<SmallLight<GreenRedLight>>(Vec(56, 270), module, SpringReverb::PEAK_LIGHT)); | |||||
addChild(createLight<SmallLight<RedLight>>(Vec(56, 114), module, SpringReverb::VU1_LIGHT + 0)); | |||||
addChild(createLight<SmallLight<YellowLight>>(Vec(56, 127), module, SpringReverb::VU1_LIGHT + 1)); | |||||
addChild(createLight<SmallLight<YellowLight>>(Vec(56, 139), module, SpringReverb::VU1_LIGHT + 2)); | |||||
addChild(createLight<SmallLight<GreenLight>>(Vec(56, 151), module, SpringReverb::VU1_LIGHT + 3)); | |||||
addChild(createLight<SmallLight<GreenLight>>(Vec(56, 164), module, SpringReverb::VU1_LIGHT + 4)); | |||||
addChild(createLight<SmallLight<GreenLight>>(Vec(56, 176), module, SpringReverb::VU1_LIGHT + 5)); | |||||
addChild(createLight<SmallLight<GreenLight>>(Vec(56, 189), module, SpringReverb::VU1_LIGHT + 6)); | |||||
} | } |