#include "AudibleInstruments.hpp" #include "dsp/digital.hpp" struct Kinks : Module { enum ParamIds { NUM_PARAMS }; enum InputIds { SIGN_INPUT, LOGIC_A_INPUT, LOGIC_B_INPUT, SH_INPUT, TRIG_INPUT, NUM_INPUTS }; enum OutputIds { INVERT_OUTPUT, HALF_RECTIFY_OUTPUT, FULL_RECTIFY_OUTPUT, MAX_OUTPUT, MIN_OUTPUT, NOISE_OUTPUT, SH_OUTPUT, NUM_OUTPUTS }; SchmittTrigger trigger; float sample = 0.0; float lights[3] = {}; Kinks() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) { trigger.setThresholds(0.0, 0.7); } void step() override; }; void Kinks::step() { // Gaussian noise generator float noise = 2.0 * randomNormal(); // S&H if (trigger.process(inputs[TRIG_INPUT].value)) { sample = inputs[SH_INPUT].normalize(noise); } // lights lights[0] = inputs[SIGN_INPUT].value; lights[1] = inputs[LOGIC_A_INPUT].value + inputs[LOGIC_B_INPUT].value; lights[2] = sample; // outputs outputs[INVERT_OUTPUT].value = -inputs[SIGN_INPUT].value; outputs[HALF_RECTIFY_OUTPUT].value = fmaxf(0.0, inputs[SIGN_INPUT].value); outputs[FULL_RECTIFY_OUTPUT].value = fabsf(inputs[SIGN_INPUT].value); outputs[MAX_OUTPUT].value = fmaxf(inputs[LOGIC_A_INPUT].value, inputs[LOGIC_B_INPUT].value); outputs[MIN_OUTPUT].value = fminf(inputs[LOGIC_A_INPUT].value, inputs[LOGIC_B_INPUT].value); outputs[NOISE_OUTPUT].value = noise; outputs[SH_OUTPUT].value = sample; } KinksWidget::KinksWidget() { Kinks *module = new Kinks(); setModule(module); box.size = Vec(15*4, 380); { Panel *panel = new LightPanel(); panel->backgroundImage = Image::load(assetPlugin(plugin, "res/Kinks.png")); panel->box.size = box.size; addChild(panel); } addChild(createScrew(Vec(15, 0))); addChild(createScrew(Vec(15, 365))); addInput(createInput(Vec(4, 75), module, Kinks::SIGN_INPUT)); addOutput(createOutput(Vec(31, 75), module, Kinks::INVERT_OUTPUT)); addOutput(createOutput(Vec(4, 113), module, Kinks::HALF_RECTIFY_OUTPUT)); addOutput(createOutput(Vec(31, 113), module, Kinks::FULL_RECTIFY_OUTPUT)); addInput(createInput(Vec(4, 177), module, Kinks::LOGIC_A_INPUT)); addInput(createInput(Vec(31, 177), module, Kinks::LOGIC_B_INPUT)); addOutput(createOutput(Vec(4, 214), module, Kinks::MAX_OUTPUT)); addOutput(createOutput(Vec(31, 214), module, Kinks::MIN_OUTPUT)); addInput(createInput(Vec(4, 278), module, Kinks::SH_INPUT)); addInput(createInput(Vec(31, 278), module, Kinks::TRIG_INPUT)); addOutput(createOutput(Vec(4, 316), module, Kinks::NOISE_OUTPUT)); addOutput(createOutput(Vec(31, 316), module, Kinks::SH_OUTPUT)); addChild(createValueLight>(Vec(11, 59), &module->lights[0])); addChild(createValueLight>(Vec(11, 161), &module->lights[1])); addChild(createValueLight>(Vec(11, 262), &module->lights[2])); }