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.

114 lines
5.0KB

  1. #include "AddrSeq.hpp"
  2. void AddrSeq::onReset() {
  3. _step = 0;
  4. _clock.reset();
  5. _reset.reset();
  6. }
  7. void AddrSeq::step() {
  8. int steps = clamp(params[STEPS_PARAM].value, 2.0f, 8.0f);
  9. int reverse = 1 - 2 * (params[DIRECTION_PARAM].value == 0.0f);
  10. _step = (_step + reverse * _clock.process(inputs[CLOCK_INPUT].value)) % steps;
  11. _step += (_step < 0) * steps;
  12. _step -= _step * _reset.process(inputs[RESET_INPUT].value);
  13. int step = _step + (int)params[SELECT_PARAM].value;
  14. step += (int)(clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f);
  15. step = step % 8;
  16. float out = 0.0f;
  17. for (int i = 0; i < 8; ++i) {
  18. out += params[OUT1_PARAM + i].value * (step == i);
  19. lights[OUT1_LIGHT + i].value = step == i;
  20. }
  21. outputs[OUT_OUTPUT].value = out * 10.0f;
  22. }
  23. struct AddrSeqWidget : ModuleWidget {
  24. static constexpr int hp = 6;
  25. AddrSeqWidget(AddrSeq* module) : ModuleWidget(module) {
  26. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  27. {
  28. SVGPanel *panel = new SVGPanel();
  29. panel->box.size = box.size;
  30. panel->setBackground(SVG::load(assetPlugin(plugin, "res/AddrSeq.svg")));
  31. addChild(panel);
  32. }
  33. addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
  34. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
  35. // generated by svg_widgets.rb
  36. auto stepsParamPosition = Vec(15.5, 131.5);
  37. auto directionParamPosition = Vec(16.0, 167.5);
  38. auto selectParamPosition = Vec(9.0, 230.0);
  39. auto out1ParamPosition = Vec(58.5, 36.0);
  40. auto out2ParamPosition = Vec(58.5, 77.3);
  41. auto out3ParamPosition = Vec(58.5, 118.6);
  42. auto out4ParamPosition = Vec(58.5, 159.9);
  43. auto out5ParamPosition = Vec(58.5, 201.1);
  44. auto out6ParamPosition = Vec(58.5, 242.4);
  45. auto out7ParamPosition = Vec(58.5, 283.7);
  46. auto out8ParamPosition = Vec(58.5, 325.0);
  47. auto clockInputPosition = Vec(11.5, 35.0);
  48. auto resetInputPosition = Vec(11.5, 72.0);
  49. auto selectInputPosition = Vec(11.5, 270.0);
  50. auto outOutputPosition = Vec(11.5, 324.0);
  51. auto out1LightPosition = Vec(66.5, 58.5);
  52. auto out2LightPosition = Vec(66.5, 99.8);
  53. auto out3LightPosition = Vec(66.5, 141.1);
  54. auto out4LightPosition = Vec(66.5, 182.4);
  55. auto out5LightPosition = Vec(66.5, 223.6);
  56. auto out6LightPosition = Vec(66.5, 264.9);
  57. auto out7LightPosition = Vec(66.5, 306.2);
  58. auto out8LightPosition = Vec(66.5, 347.5);
  59. // end generated by svg_widgets.rb
  60. {
  61. auto w = ParamWidget::create<Knob16>(stepsParamPosition, module, AddrSeq::STEPS_PARAM, 2.0, 8.0, 8.0);
  62. dynamic_cast<Knob*>(w)->snap = true;
  63. addParam(w);
  64. }
  65. addParam(ParamWidget::create<SliderSwitch2State14>(directionParamPosition, module, AddrSeq::DIRECTION_PARAM, 0.0, 1.0, 1.0));
  66. {
  67. auto w = ParamWidget::create<Knob29>(selectParamPosition, module, AddrSeq::SELECT_PARAM, 0.0, 7.0, 0.0);
  68. dynamic_cast<Knob*>(w)->snap = true;
  69. addParam(w);
  70. }
  71. addParam(ParamWidget::create<Knob16>(out1ParamPosition, module, AddrSeq::OUT1_PARAM, -1.0, 1.0, 0.0));
  72. addParam(ParamWidget::create<Knob16>(out2ParamPosition, module, AddrSeq::OUT2_PARAM, -1.0, 1.0, 0.0));
  73. addParam(ParamWidget::create<Knob16>(out3ParamPosition, module, AddrSeq::OUT3_PARAM, -1.0, 1.0, 0.0));
  74. addParam(ParamWidget::create<Knob16>(out4ParamPosition, module, AddrSeq::OUT4_PARAM, -1.0, 1.0, 0.0));
  75. addParam(ParamWidget::create<Knob16>(out5ParamPosition, module, AddrSeq::OUT5_PARAM, -1.0, 1.0, 0.0));
  76. addParam(ParamWidget::create<Knob16>(out6ParamPosition, module, AddrSeq::OUT6_PARAM, -1.0, 1.0, 0.0));
  77. addParam(ParamWidget::create<Knob16>(out7ParamPosition, module, AddrSeq::OUT7_PARAM, -1.0, 1.0, 0.0));
  78. addParam(ParamWidget::create<Knob16>(out8ParamPosition, module, AddrSeq::OUT8_PARAM, -1.0, 1.0, 0.0));
  79. addInput(Port::create<Port24>(clockInputPosition, Port::INPUT, module, AddrSeq::CLOCK_INPUT));
  80. addInput(Port::create<Port24>(resetInputPosition, Port::INPUT, module, AddrSeq::RESET_INPUT));
  81. addInput(Port::create<Port24>(selectInputPosition, Port::INPUT, module, AddrSeq::SELECT_INPUT));
  82. addOutput(Port::create<Port24>(outOutputPosition, Port::OUTPUT, module, AddrSeq::OUT_OUTPUT));
  83. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out1LightPosition, module, AddrSeq::OUT1_LIGHT));
  84. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out2LightPosition, module, AddrSeq::OUT2_LIGHT));
  85. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out3LightPosition, module, AddrSeq::OUT3_LIGHT));
  86. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out4LightPosition, module, AddrSeq::OUT4_LIGHT));
  87. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out5LightPosition, module, AddrSeq::OUT5_LIGHT));
  88. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out6LightPosition, module, AddrSeq::OUT6_LIGHT));
  89. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out7LightPosition, module, AddrSeq::OUT7_LIGHT));
  90. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out8LightPosition, module, AddrSeq::OUT8_LIGHT));
  91. }
  92. };
  93. RACK_PLUGIN_MODEL_INIT(Bogaudio, AddrSeq) {
  94. Model* modelAddrSeq = createModel<AddrSeq, AddrSeqWidget>("Bogaudio-AddrSeq", "ADDR-SEQ", "voltage-addressable sequencer", SEQUENCER_TAG);
  95. return modelAddrSeq;
  96. }