You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
2.6KB

  1. #include "dsp/digital.hpp"
  2. #include "qwelk.hpp"
  3. namespace rack_plugin_Qwelk {
  4. struct ModuleScaler : Module {
  5. enum ParamIds {
  6. NUM_PARAMS
  7. };
  8. enum InputIds {
  9. INPUT_SUB_5,
  10. INPUT_MUL_2,
  11. INPUT_DIV_2,
  12. INPUT_ADD_5,
  13. NUM_INPUTS
  14. };
  15. enum OutputIds {
  16. OUTPUT_SUB_5,
  17. OUTPUT_MUL_2,
  18. OUTPUT_DIV_2,
  19. OUTPUT_ADD_5,
  20. NUM_OUTPUTS
  21. };
  22. enum LightIds {
  23. NUM_LIGHTS
  24. };
  25. ModuleScaler() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  26. void step() override;
  27. };
  28. void ModuleScaler::step() {
  29. outputs[OUTPUT_SUB_5].value = inputs[INPUT_SUB_5].value - 5.0;
  30. outputs[OUTPUT_MUL_2].value = inputs[INPUT_MUL_2].normalize(outputs[OUTPUT_SUB_5].value) * 2.0;
  31. outputs[OUTPUT_DIV_2].value = inputs[INPUT_DIV_2].normalize(outputs[OUTPUT_MUL_2].value) * 0.5;
  32. outputs[OUTPUT_ADD_5].value = inputs[INPUT_ADD_5].normalize(outputs[OUTPUT_DIV_2].value) + 5.0;
  33. }
  34. struct WidgetScaler : ModuleWidget {
  35. WidgetScaler(ModuleScaler *module);
  36. };
  37. WidgetScaler::WidgetScaler(ModuleScaler *module) : ModuleWidget(module) {
  38. setPanel(SVG::load(assetPlugin(plugin, "res/Scaler.svg")));
  39. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  40. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  41. float x = box.size.x / 2.0 - 12, y = 0, ytop = 30, ystep = 30, mstep = 16;
  42. addInput(Port::create<PJ301MPort>( Vec(x, ytop + (y+=ystep)), Port::INPUT, module, ModuleScaler::INPUT_SUB_5));
  43. addOutput(Port::create<PJ301MPort>( Vec(x, ytop + (y+=ystep)), Port::OUTPUT, module, ModuleScaler::OUTPUT_SUB_5));
  44. ytop += mstep;
  45. addInput(Port::create<PJ301MPort>( Vec(x, ytop + (y+=ystep)), Port::INPUT, module, ModuleScaler::INPUT_MUL_2));
  46. addOutput(Port::create<PJ301MPort>( Vec(x, ytop + (y+=ystep)), Port::OUTPUT, module, ModuleScaler::OUTPUT_MUL_2));
  47. ytop += mstep;
  48. addInput(Port::create<PJ301MPort>( Vec(x, ytop + (y+=ystep)), Port::INPUT, module, ModuleScaler::INPUT_DIV_2));
  49. addOutput(Port::create<PJ301MPort>( Vec(x, ytop + (y+=ystep)), Port::OUTPUT, module, ModuleScaler::OUTPUT_DIV_2));
  50. ytop += mstep;
  51. addInput(Port::create<PJ301MPort>( Vec(x, ytop + (y+=ystep)), Port::INPUT, module, ModuleScaler::INPUT_ADD_5));
  52. addOutput(Port::create<PJ301MPort>( Vec(x, ytop + (y+=ystep)), Port::OUTPUT, module, ModuleScaler::OUTPUT_ADD_5));
  53. }
  54. } // namespace rack_plugin_Qwelk
  55. using namespace rack_plugin_Qwelk;
  56. RACK_PLUGIN_MODEL_INIT(Qwelk, Scaler) {
  57. Model *modelScaler = Model::create<ModuleScaler, WidgetScaler>(
  58. TOSTRING(SLUG), "Scaler", "Scaler", UTILITY_TAG);
  59. return modelScaler;
  60. }