//************************************************************************************** //Volt rescale module module for VCV Rack by Alfredo Santamaria - AS - https://github.com/AScustomWorks/AS // //************************************************************************************** #include "AS.hpp" struct ReScale: Module { enum ParamIds { CONVERT_PARAM, NUM_PARAMS }; enum InputIds { INPUT_0, INPUT_1, INPUT_2, INPUT_3, NUM_INPUTS }; enum OutputIds { OUTPUT, NUM_OUTPUTS }; enum LightIds { NUM_LIGHTS }; int selection = 0; float rescaled_value = 0.0f; float input_value = 0.0f; float getNoteInVolts(float noteValue) { int octaveInVolts = int(floorf(noteValue)); float voltMinusOct = noteValue - octaveInVolts; return voltMinusOct; } ReScale() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { } void step() override; }; void ReScale::step() { selection = params[CONVERT_PARAM].value; if(inputs[INPUT_0].active){ input_value = clamp(inputs[INPUT_0].value, -5.0f,5.0f); if(selection==0){ rescaled_value = input_value; }else if(selection==1){ rescaled_value = rescale(input_value, -5.0f, 5.0f, 0.0f, 5.0f); }else if(selection==2){ rescaled_value = rescale(input_value, -5.0f, 5.0f, -10.0f, 10.0f); }else if(selection==3){ rescaled_value = rescale(input_value, -5.0f, 5.0f, 0.0f, 10.0f); } }else if(inputs[INPUT_1].active){ input_value = clamp(inputs[INPUT_1].value, 0.0f, 5.0f); if(selection==0){ rescaled_value = rescale(input_value, 0.0f, 5.0f, -5.0f, 5.0f); }else if(selection==1){ rescaled_value = input_value; }else if(selection==2){ rescaled_value = rescale(input_value, 0.0f, 5.0f, -10.0f, 10.0f); }else if(selection==3){ rescaled_value = rescale(input_value, -5.0f, 5.0f, 0.0f, 10.0f); } }else if(inputs[INPUT_2].active){ input_value = clamp(inputs[INPUT_2].value, 0.0f, 10.0f); if(selection==0){ rescaled_value = rescale(input_value, 0.0f, 10.0f, -5.0f, 5.0f); }else if(selection==1){ rescaled_value = rescale(input_value, 0.0f, 10.0f, 0.0f, 5.0f); }else if(selection==2){ rescaled_value = rescale(input_value, 0.0f, 10.0f, -10.0f, 10.0f); }else if(selection==3){ rescaled_value = input_value; } }else if(inputs[INPUT_3].active){ input_value = inputs[INPUT_3].value; if(selection==0){ rescaled_value = input_value; }else if(selection==1){ rescaled_value = input_value; }else if(selection==2){ rescaled_value = input_value; }else if(selection==3){ //take the input of a midi KB, get the voltage minus octave, convert it to 1V/KEY float ext_key = getNoteInVolts(input_value); rescaled_value = clamp( rescale( ext_key, 0.0f, 1.0f, 0.0f, 11.0f ), 0.0f, 10.0f ); } } outputs[OUTPUT].value = rescaled_value; } //////////////////////////////////// struct ReScaleWidget : ModuleWidget { ReScaleWidget(ReScale *module); }; ReScaleWidget::ReScaleWidget(ReScale *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/ReScale.svg"))); //SCREWS - SPECIAL SPACING FOR RACK WIDTH*4 addChild(Widget::create(Vec(0, 0))); addChild(Widget::create(Vec(box.size.x - RACK_GRID_WIDTH, 0))); addChild(Widget::create(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addChild(Widget::create(Vec(box.size.x - RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); //PORTS addInput(Port::create(Vec(18, 65), Port::INPUT, module, ReScale::INPUT_0)); addInput(Port::create(Vec(18, 105), Port::INPUT, module, ReScale::INPUT_1)); addInput(Port::create(Vec(18, 145), Port::INPUT, module, ReScale::INPUT_2)); addInput(Port::create(Vec(18, 185), Port::INPUT, module, ReScale::INPUT_3)); addParam(ParamWidget::create(Vec(12, 230), module, ReScale::CONVERT_PARAM, 0.0f, 3.0f, 0.0f)); addOutput(Port::create(Vec(18, 280), Port::OUTPUT, module, ReScale::OUTPUT)); } RACK_PLUGIN_MODEL_INIT(AS, ReScale) { Model *modelReScale = Model::create("AS", "ReScale", "Voltage Converter", UTILITY_TAG); return modelReScale; }