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.

90 lines
2.1KB

  1. #include "DS.hpp"
  2. namespace rack_plugin_SubmarineFree {
  3. struct BB_120 : DS_Module {
  4. static const int deviceCount = 20;
  5. enum ParamIds {
  6. NUM_PARAMS
  7. };
  8. enum InputIds {
  9. INPUT_CLK,
  10. INPUT_CV,
  11. NUM_INPUTS
  12. };
  13. enum OutputIds {
  14. OUTPUT_1,
  15. OUTPUT_2,
  16. OUTPUT_3,
  17. OUTPUT_4,
  18. OUTPUT_5,
  19. OUTPUT_6,
  20. OUTPUT_7,
  21. OUTPUT_8,
  22. OUTPUT_9,
  23. OUTPUT_10,
  24. OUTPUT_11,
  25. OUTPUT_12,
  26. OUTPUT_13,
  27. OUTPUT_14,
  28. OUTPUT_15,
  29. OUTPUT_16,
  30. OUTPUT_17,
  31. OUTPUT_18,
  32. OUTPUT_19,
  33. OUTPUT_20,
  34. NUM_OUTPUTS
  35. };
  36. enum LightIds {
  37. NUM_LIGHTS
  38. };
  39. float sample[deviceCount] = {};
  40. DS_Schmitt schmittTrigger;
  41. BB_120() : DS_Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  42. void step() override;
  43. };
  44. void BB_120::step() {
  45. int triggered = true;
  46. if (inputs[INPUT_CLK].active) {
  47. triggered = schmittTrigger.redge(this, inputs[INPUT_CLK].value);
  48. }
  49. if (triggered) {
  50. for (int i = deviceCount - 1; i; i--)
  51. sample[i] = sample[i - 1];
  52. sample[0] = inputs[INPUT_CV].value;
  53. }
  54. for (int i = 0; i < deviceCount; i++)
  55. outputs[OUTPUT_1 + i].value = sample[i];
  56. }
  57. struct BB120 : ModuleWidget {
  58. BB120(BB_120 *module) : ModuleWidget(module) {
  59. setPanel(SVG::load(assetPlugin(plugin, "res/BB-120.svg")));
  60. addInput(Port::create<sub_port_blue>(Vec(4.5,19), Port::INPUT, module, BB_120::INPUT_CLK));
  61. addInput(Port::create<sub_port>(Vec(31.5,34), Port::INPUT, module, BB_120::INPUT_CV));
  62. for (int i = 0; i < BB_120::deviceCount; i+=2) {
  63. int offset = 15 * i;
  64. addOutput(Port::create<sub_port>(Vec(4,53 + offset), Port::OUTPUT, module, BB_120::OUTPUT_1 + i));
  65. addOutput(Port::create<sub_port>(Vec(31,68 + offset), Port::OUTPUT, module, BB_120::OUTPUT_1 + i + 1));
  66. }
  67. }
  68. void appendContextMenu(Menu *menu) override {
  69. ((DS_Module *)module)->appendContextMenu(menu);
  70. }
  71. };
  72. } // namespace rack_plugin_SubmarineFree
  73. using namespace rack_plugin_SubmarineFree;
  74. RACK_PLUGIN_MODEL_INIT(SubmarineFree, BB120) {
  75. Model *modelBB120 = Model::create<BB_120, BB120>("SubmarineFree", "BB-120", "BB-120 20-Stage Bucket Brigade Sample and Hold", LOGIC_TAG, DELAY_TAG, SAMPLE_AND_HOLD_TAG, MULTIPLE_TAG);
  76. return modelBB120;
  77. }