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.

96 lines
2.7KB

  1. #include "SampleHold.hpp"
  2. void SampleHold::onReset() {
  3. _trigger1.reset();
  4. _value1 = 0.0;
  5. _trigger2.reset();
  6. _value1 = 0.0;
  7. }
  8. void SampleHold::step() {
  9. step(
  10. params[TRIGGER1_PARAM],
  11. inputs[TRIGGER1_INPUT],
  12. inputs[IN1_INPUT],
  13. outputs[OUT1_OUTPUT],
  14. _trigger1,
  15. _value1
  16. );
  17. step(
  18. params[TRIGGER2_PARAM],
  19. inputs[TRIGGER2_INPUT],
  20. inputs[IN2_INPUT],
  21. outputs[OUT2_OUTPUT],
  22. _trigger2,
  23. _value2
  24. );
  25. }
  26. void SampleHold::step(
  27. Param& triggerParam,
  28. Input& triggerInput,
  29. Input& in,
  30. Output& out,
  31. SchmittTrigger& trigger,
  32. float& value
  33. ) {
  34. if (trigger.process(triggerParam.value + triggerInput.value)) {
  35. if (in.active) {
  36. value = in.value;
  37. }
  38. else {
  39. value = abs(_noise.next()) * 10.0;
  40. }
  41. }
  42. out.value = value;
  43. }
  44. struct SampleHoldWidget : ModuleWidget {
  45. static constexpr int hp = 3;
  46. SampleHoldWidget(SampleHold* module) : ModuleWidget(module) {
  47. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  48. {
  49. SVGPanel *panel = new SVGPanel();
  50. panel->box.size = box.size;
  51. panel->setBackground(SVG::load(assetPlugin(plugin, "res/SampleHold.svg")));
  52. addChild(panel);
  53. }
  54. addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
  55. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
  56. // generated by svg_widgets.rb
  57. auto trigger1ParamPosition = Vec(13.5, 36.0);
  58. auto trigger2ParamPosition = Vec(13.5, 195.0);
  59. auto trigger1InputPosition = Vec(10.5, 58.0);
  60. auto in1InputPosition = Vec(10.5, 95.0);
  61. auto trigger2InputPosition = Vec(10.5, 217.0);
  62. auto in2InputPosition = Vec(10.5, 254.0);
  63. auto out1OutputPosition = Vec(10.5, 133.0);
  64. auto out2OutputPosition = Vec(10.5, 292.0);
  65. // end generated by svg_widgets.rb
  66. addParam(ParamWidget::create<Button18>(trigger1ParamPosition, module, SampleHold::TRIGGER1_PARAM, 0.0, 1.0, 0.0));
  67. addParam(ParamWidget::create<Button18>(trigger2ParamPosition, module, SampleHold::TRIGGER2_PARAM, 0.0, 1.0, 0.0));
  68. addInput(Port::create<Port24>(trigger1InputPosition, Port::INPUT, module, SampleHold::TRIGGER1_INPUT));
  69. addInput(Port::create<Port24>(in1InputPosition, Port::INPUT, module, SampleHold::IN1_INPUT));
  70. addInput(Port::create<Port24>(trigger2InputPosition, Port::INPUT, module, SampleHold::TRIGGER2_INPUT));
  71. addInput(Port::create<Port24>(in2InputPosition, Port::INPUT, module, SampleHold::IN2_INPUT));
  72. addOutput(Port::create<Port24>(out1OutputPosition, Port::OUTPUT, module, SampleHold::OUT1_OUTPUT));
  73. addOutput(Port::create<Port24>(out2OutputPosition, Port::OUTPUT, module, SampleHold::OUT2_OUTPUT));
  74. }
  75. };
  76. RACK_PLUGIN_MODEL_INIT(Bogaudio, SampleHold) {
  77. Model *modelSampleHold = createModel<SampleHold, SampleHoldWidget>("Bogaudio-SampleHold", "S&H", "dual sample and hold", SAMPLE_AND_HOLD_TAG, DUAL_TAG);
  78. return modelSampleHold;
  79. }