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.

79 lines
2.4KB

  1. #include "dsp/digital.hpp"
  2. #include <iostream>
  3. #include "RJModules.hpp"
  4. namespace rack_plugin_RJModules {
  5. struct Mono : Module {
  6. enum ParamIds {
  7. MONO_PARAM,
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. CH1_INPUT,
  12. CH2_INPUT,
  13. MONO_CV_INPUT,
  14. NUM_INPUTS
  15. };
  16. enum OutputIds {
  17. CH1_OUTPUT,
  18. CH2_OUTPUT,
  19. NUM_OUTPUTS
  20. };
  21. enum LightIds {
  22. NUM_LIGHTS
  23. };
  24. Mono() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  25. void step() override;
  26. };
  27. void Mono::step() {
  28. float mono_amount = params[MONO_PARAM].value * clamp(inputs[MONO_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  29. float mono_value = (inputs[CH1_INPUT].value + inputs[CH2_INPUT].value) / 2;
  30. outputs[CH1_OUTPUT].value = (mono_value * mono_amount) + (((1 - mono_amount)) * inputs[CH1_INPUT].value);
  31. outputs[CH2_OUTPUT].value = (mono_value * mono_amount) + (((1 - mono_amount)) * inputs[CH2_INPUT].value);
  32. }
  33. struct MonoWidget: ModuleWidget {
  34. MonoWidget(Mono *module);
  35. };
  36. MonoWidget::MonoWidget(Mono *module) : ModuleWidget(module) {
  37. box.size = Vec(15*10, 380);
  38. {
  39. SVGPanel *panel = new SVGPanel();
  40. panel->box.size = box.size;
  41. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Mono.svg")));
  42. addChild(panel);
  43. }
  44. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  45. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  46. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  47. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  48. addInput(Port::create<PJ301MPort>(Vec(22, 85), Port::INPUT, module, Mono::CH1_INPUT));
  49. addInput(Port::create<PJ301MPort>(Vec(104, 85), Port::INPUT, module, Mono::CH2_INPUT));
  50. addParam(ParamWidget::create<RoundHugeBlackKnob>(Vec(47, 143), module, Mono::MONO_PARAM, 0.0, 1.0, 0.1));
  51. addInput(Port::create<PJ301MPort>(Vec(22, 190), Port::INPUT, module, Mono::MONO_CV_INPUT));
  52. addOutput(Port::create<PJ301MPort>(Vec(22, 255), Port::OUTPUT, module, Mono::CH1_OUTPUT));
  53. addOutput(Port::create<PJ301MPort>(Vec(104, 255), Port::OUTPUT, module, Mono::CH2_OUTPUT));
  54. }
  55. } // namespace rack_plugin_RJModules
  56. using namespace rack_plugin_RJModules;
  57. RACK_PLUGIN_MODEL_INIT(RJModules, Mono) {
  58. Model *modelMono = Model::create<Mono, MonoWidget>("RJModules", "Mono", "[MIX] Mono", UTILITY_TAG);
  59. return modelMono;
  60. }