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.6KB

  1. #include "RM.hpp"
  2. void RM::step() {
  3. if (!(outputs[OUT_OUTPUT].active && (inputs[MODULATOR_INPUT].active || inputs[CARRIER_INPUT].active))) {
  4. return;
  5. }
  6. if (inputs[MODULATOR_INPUT].active != inputs[CARRIER_INPUT].active) {
  7. if (inputs[MODULATOR_INPUT].active) {
  8. outputs[OUT_OUTPUT].value = inputs[MODULATOR_INPUT].value;
  9. }
  10. else {
  11. outputs[OUT_OUTPUT].value = inputs[CARRIER_INPUT].value;
  12. }
  13. return;
  14. }
  15. float modulator = inputs[MODULATOR_INPUT].value;
  16. modulator *= params[MODULATOR_DEPTH_PARAM].value;
  17. if (inputs[MODULATOR_DEPTH_INPUT].active) {
  18. modulator *= clamp(inputs[MODULATOR_DEPTH_INPUT].value / 10.0f, 0.0f, 1.0f);
  19. }
  20. float carrier = inputs[CARRIER_INPUT].value;
  21. float mix = params[MIX_PARAM].value;
  22. if (inputs[MIX_INPUT].active) {
  23. mix *= clamp(inputs[MIX_INPUT].value / 5.0f, -1.0f, 1.0f);
  24. }
  25. _mix.setParams(mix, 0.889f, false);
  26. outputs[OUT_OUTPUT].value = _mix.next(carrier, modulator * carrier * 0.2f);
  27. }
  28. struct RMWidget : ModuleWidget {
  29. static constexpr int hp = 3;
  30. RMWidget(RM* module) : ModuleWidget(module) {
  31. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  32. {
  33. SVGPanel *panel = new SVGPanel();
  34. panel->box.size = box.size;
  35. panel->setBackground(SVG::load(assetPlugin(plugin, "res/RM.svg")));
  36. addChild(panel);
  37. }
  38. addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
  39. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
  40. // generated by svg_widgets.rb
  41. auto modulatorDepthParamPosition = Vec(8.0, 36.0);
  42. auto mixParamPosition = Vec(8.0, 142.0);
  43. auto modulatorDepthInputPosition = Vec(10.5, 77.0);
  44. auto mixInputPosition = Vec(10.5, 183.0);
  45. auto modulatorInputPosition = Vec(10.5, 233.0);
  46. auto carrierInputPosition = Vec(10.5, 268.0);
  47. auto outOutputPosition = Vec(10.5, 306.0);
  48. // end generated by svg_widgets.rb
  49. addParam(ParamWidget::create<Knob29>(modulatorDepthParamPosition, module, RM::MODULATOR_DEPTH_PARAM, 0.0, 1.0, 1.0));
  50. addParam(ParamWidget::create<Knob29>(mixParamPosition, module, RM::MIX_PARAM, -1.0, 1.0, 1.0));
  51. addInput(Port::create<Port24>(modulatorInputPosition, Port::INPUT, module, RM::MODULATOR_INPUT));
  52. addInput(Port::create<Port24>(carrierInputPosition, Port::INPUT, module, RM::CARRIER_INPUT));
  53. addInput(Port::create<Port24>(modulatorDepthInputPosition, Port::INPUT, module, RM::MODULATOR_DEPTH_INPUT));
  54. addInput(Port::create<Port24>(mixInputPosition, Port::INPUT, module, RM::MIX_INPUT));
  55. addOutput(Port::create<Port24>(outOutputPosition, Port::OUTPUT, module, RM::OUT_OUTPUT));
  56. }
  57. };
  58. RACK_PLUGIN_MODEL_INIT(Bogaudio, RM) {
  59. Model *modelRM = createModel<RM, RMWidget>("Bogaudio-RM", "RM", "ring modulator", RING_MODULATOR_TAG);
  60. return modelRM;
  61. }