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.

80 lines
2.7KB

  1. #include "AMRM.hpp"
  2. void AMRM::step() {
  3. if (!(outputs[OUT_OUTPUT].active || outputs[RECTIFY_OUTPUT].active)) {
  4. return;
  5. }
  6. float rectify = params[RECTIFY_PARAM].value;
  7. if (inputs[RECTIFY_INPUT].active) {
  8. rectify = clamp(rectify + inputs[RECTIFY_INPUT].value / 10.0f, 0.0f, 1.0f);
  9. }
  10. rectify = 1.0f - rectify;
  11. float depth = params[DRYWET_PARAM].value;
  12. if (inputs[DRYWET_INPUT].active) {
  13. depth = clamp(depth + inputs[DRYWET_INPUT].value / 10.0f, 0.0f, 1.0f);
  14. }
  15. float modulator = inputs[MODULATOR_INPUT].value;
  16. if (rectify < 1.0f) {
  17. rectify *= -5.0f;
  18. if (modulator < rectify) {
  19. modulator = rectify - (modulator - rectify);
  20. }
  21. }
  22. outputs[RECTIFY_OUTPUT].value = modulator;
  23. modulator *= depth;
  24. modulator += (1.0f - depth) * 5.0f;
  25. outputs[OUT_OUTPUT].value = _saturator.next(modulator * inputs[CARRIER_INPUT].value * 0.2f);
  26. }
  27. struct AMRMWidget : ModuleWidget {
  28. static constexpr int hp = 6;
  29. AMRMWidget(AMRM* module) : ModuleWidget(module) {
  30. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  31. {
  32. SVGPanel *panel = new SVGPanel();
  33. panel->box.size = box.size;
  34. panel->setBackground(SVG::load(assetPlugin(plugin, "res/AMRM.svg")));
  35. addChild(panel);
  36. }
  37. addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
  38. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
  39. // generated by svg_widgets.rb
  40. auto rectifyParamPosition = Vec(22.5, 66.5);
  41. auto drywetParamPosition = Vec(22.5, 165.5);
  42. auto modulatorInputPosition = Vec(16.0, 244.0);
  43. auto carrierInputPosition = Vec(50.0, 244.0);
  44. auto rectifyInputPosition = Vec(16.0, 280.0);
  45. auto drywetInputPosition = Vec(50.0, 280.0);
  46. auto rectifyOutputPosition = Vec(16.0, 320.0);
  47. auto outOutputPosition = Vec(50.0, 320.0);
  48. // end generated by svg_widgets.rb
  49. addParam(ParamWidget::create<Knob45>(rectifyParamPosition, module, AMRM::RECTIFY_PARAM, 0.0, 1.0, 0.0));
  50. addParam(ParamWidget::create<Knob45>(drywetParamPosition, module, AMRM::DRYWET_PARAM, 0.0, 1.0, 1.0));
  51. addInput(Port::create<Port24>(modulatorInputPosition, Port::INPUT, module, AMRM::MODULATOR_INPUT));
  52. addInput(Port::create<Port24>(carrierInputPosition, Port::INPUT, module, AMRM::CARRIER_INPUT));
  53. addInput(Port::create<Port24>(rectifyInputPosition, Port::INPUT, module, AMRM::RECTIFY_INPUT));
  54. addInput(Port::create<Port24>(drywetInputPosition, Port::INPUT, module, AMRM::DRYWET_INPUT));
  55. addOutput(Port::create<Port24>(rectifyOutputPosition, Port::OUTPUT, module, AMRM::RECTIFY_OUTPUT));
  56. addOutput(Port::create<Port24>(outOutputPosition, Port::OUTPUT, module, AMRM::OUT_OUTPUT));
  57. }
  58. };
  59. RACK_PLUGIN_MODEL_INIT(Bogaudio, AMRM) {
  60. Model* modelAMRM = createModel<AMRM, AMRMWidget>("Bogaudio-AMRM", "AM/RM", "ring modulator", RING_MODULATOR_TAG, EFFECT_TAG);
  61. return modelAMRM;
  62. }