#include "Bidoo.hpp" #include "BidooComponents.hpp" #include "dsp/digital.hpp" using namespace std; namespace rack_plugin_Bidoo { struct RABBIT : Module { enum ParamIds { BITOFF_PARAM, BITREV_PARAM = BITOFF_PARAM + 8, NUM_PARAMS = BITREV_PARAM + 8 }; enum InputIds { L_INPUT, R_INPUT, BITOFF_INPUT, BITREV_INPUT = BITOFF_INPUT + 8, NUM_INPUTS = BITREV_INPUT + 8 }; enum OutputIds { L_OUTPUT, R_OUTPUT, NUM_OUTPUTS }; enum LightIds { BITOFF_LIGHTS, BITREV_LIGHTS = BITOFF_LIGHTS + 8, NUM_LIGHTS = BITREV_LIGHTS + 8 }; SchmittTrigger bitOffTrigger[8], bitRevTrigger[8]; bool bitOff[8]; bool bitRev[8]; RABBIT() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { memset(&bitOff,0,8*sizeof(bool)); memset(&bitRev,0,8*sizeof(bool)); } ~RABBIT() { } json_t *toJson() override { json_t *rootJ = json_object(); for (int i=0; i<8; i++) { json_object_set_new(rootJ, ("bitOff" + to_string(i)).c_str(), json_boolean(bitOff[i])); json_object_set_new(rootJ, ("bitRev" + to_string(i)).c_str(), json_boolean(bitRev[i])); } return rootJ; } void fromJson(json_t *rootJ) override { for (int i=0; i<8; i++) { json_t *jbitOff = json_object_get(rootJ, ("bitOff" + to_string(i)).c_str()); if (jbitOff) { bitOff[i] = json_is_true(jbitOff) ? 1 : 0; } json_t *jbitRev = json_object_get(rootJ, ("bitRev" + to_string(i)).c_str()); if (jbitRev) { bitRev[i] = json_is_true(jbitRev) ? 1 : 0; } } } void step() override; }; void RABBIT::step() { float in_L = clamp(inputs[L_INPUT].value,-10.0f,10.0f); float in_R = clamp(inputs[R_INPUT].value,-10.0f,10.0f); in_L = roundf(clamp(in_L / 20.0f + 0.5f, 0.0f, 1.0f) * 255); in_R = roundf(clamp(in_R / 20.0f + 0.5f, 0.0f, 1.0f) * 255); unsigned char red_L = in_L; unsigned char red_R = in_R; for (int i = 0 ; i < 8 ; i++ ) { if (bitOffTrigger[i].process(params[BITOFF_PARAM+i].value + inputs[BITOFF_INPUT+i].value)) { bitOff[i] = !bitOff[i]; } if (bitRevTrigger[i].process(params[BITREV_PARAM+i].value + inputs[BITREV_INPUT+i].value)) { bitRev[i] = !bitRev[i]; } if (bitOff[i]) { red_L &= ~(1 << i); red_R &= ~(1 << i); } else { if (bitRev[i]) { red_L ^= ~(1 << i); red_R ^= ~(1 << i); } } lights[BITOFF_LIGHTS + i].value = bitOff[i] ? 1.0f : 0.0f; lights[BITREV_LIGHTS + i].value = bitRev[i] ? 1.0f : 0.0f; } outputs[L_OUTPUT].value = clamp(((((float)red_L/255.0f))-0.5f)*20.0f,-10.0f,10.0f); outputs[R_OUTPUT].value = clamp(((((float)red_R/255.0f))-0.5f)*20.0f,-10.0f,10.0f); } template struct RabbitLight : BASE { RabbitLight() { this->box.size = mm2px(Vec(6.0f, 6.0f)); } }; struct RABBITWidget : ModuleWidget { RABBITWidget(RABBIT *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/RABBIT.svg"))); addChild(Widget::create(Vec(RACK_GRID_WIDTH, 0))); addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); for (int i = 0; i<8; i++) { addParam(ParamWidget::create(Vec(27.0f, 50.0f + 32.0f * i), module, RABBIT::BITOFF_PARAM + i, 0.0f, 1.0f, 0.0f)); addChild(ModuleLightWidget::create>(Vec(29.0f, 52.0f + 32.0f * i), module, RABBIT::BITOFF_LIGHTS + i)); addInput(Port::create(Vec(8.0f, 54.0f + 32.0f * i), Port::INPUT, module, RABBIT::BITOFF_INPUT + i)); addInput(Port::create(Vec(83.0f, 54.0f + 32.0f * i), Port::INPUT, module, RABBIT::BITREV_INPUT + i)); addParam(ParamWidget::create(Vec(57.0f, 50.0f + 32.0f * i), module, RABBIT::BITREV_PARAM + i, 0.0f, 1.0f, 0.0f)); addChild(ModuleLightWidget::create>(Vec(59.0f, 52.0f + 32.0f * i), module, RABBIT::BITREV_LIGHTS + i)); } addInput(Port::create(Vec(24.0f, 319.0f), Port::INPUT, module, RABBIT::L_INPUT)); addInput(Port::create(Vec(24.0f, 339.0f), Port::INPUT, module, RABBIT::R_INPUT)); addOutput(Port::create(Vec(78.0f, 319.0f),Port::OUTPUT, module, RABBIT::L_OUTPUT)); addOutput(Port::create(Vec(78.0f, 339.0f),Port::OUTPUT, module, RABBIT::R_OUTPUT)); } }; } // namespace rack_plugin_Bidoo using namespace rack_plugin_Bidoo; RACK_PLUGIN_MODEL_INIT(Bidoo, RABBIT) { Model *modelRABBIT = Model::create("Bidoo", "rabBIT", "rabBIT bit crusher", EFFECT_TAG, DIGITAL_TAG, DISTORTION_TAG); return modelRABBIT; }