@@ -23,10 +23,15 @@ struct ABC : Module { | |||
OUT2_OUTPUT, | |||
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; | |||
}; | |||
@@ -44,7 +49,7 @@ void ABC::step() { | |||
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 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; | |||
// Set outputs | |||
@@ -57,8 +62,12 @@ void ABC::step() { | |||
if (outputs[OUT2_OUTPUT].active) { | |||
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)); | |||
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, | |||
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; | |||
}; | |||
@@ -35,8 +40,10 @@ void DualAtenuverter::step() { | |||
outputs[OUT1_OUTPUT].value = out1; | |||
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)); | |||
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, | |||
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; | |||
}; | |||
@@ -38,7 +41,8 @@ void Mixer::step() { | |||
float out = in1 + in2 + in3 + in4; | |||
outputs[OUT1_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(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, | |||
MIN_OUTPUT, | |||
MAX_OUTPUT, | |||
NUM_OUTPUTS | |||
}; | |||
enum LightIds { | |||
COMPARATOR_LIGHT, | |||
MIN_LIGHT, | |||
MAX_LIGHT, | |||
@@ -55,7 +58,7 @@ struct Rampage : Module { | |||
RISING_B_LIGHT, | |||
FALLING_A_LIGHT, | |||
FALLING_B_LIGHT, | |||
NUM_OUTPUTS | |||
NUM_LIGHTS | |||
}; | |||
float out[2] = {}; | |||
@@ -63,7 +66,7 @@ struct Rampage : Module { | |||
SchmittTrigger trigger[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++) { | |||
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[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[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 | |||
@@ -163,9 +166,9 @@ void Rampage::step() { | |||
outputs[MIN_OUTPUT].value = fminf(a, b); | |||
outputs[MAX_OUTPUT].value = fmaxf(a, b); | |||
// 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(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, | |||
NUM_OUTPUTS | |||
}; | |||
enum LightIds { | |||
PEAK_LIGHT, | |||
VU1_LIGHT, | |||
NUM_LIGHTS = VU1_LIGHT + 7 | |||
}; | |||
RealTimeConvolver *convolver = NULL; | |||
SampleRateConverter<1> inputSrc; | |||
@@ -168,8 +173,6 @@ struct SpringReverb : Module { | |||
RCFilter dryFilter; | |||
PeakFilter vuFilter; | |||
PeakFilter lightFilter; | |||
float vuLights[7] = {}; | |||
float lights[1] = {}; | |||
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->setKernel(springReverbIR, springReverbIRLen); | |||
} | |||
@@ -253,9 +256,9 @@ void SpringReverb::step() { | |||
float vuValue = vuFilter.peak(); | |||
for (int i = 0; i < 7; i++) { | |||
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)); | |||
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)); | |||
} |