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.

119 lines
3.3KB

  1. #include "HetrickCV.hpp"
  2. namespace rack_plugin_HetrickCV {
  3. struct ASR : Module
  4. {
  5. enum ParamIds
  6. {
  7. NUM_PARAMS
  8. };
  9. enum InputIds
  10. {
  11. MAIN_INPUT,
  12. CLK_INPUT,
  13. NUM_INPUTS
  14. };
  15. enum OutputIds
  16. {
  17. STAGE1_OUTPUT,
  18. STAGE2_OUTPUT,
  19. STAGE3_OUTPUT,
  20. STAGE4_OUTPUT,
  21. NUM_OUTPUTS
  22. };
  23. enum LightIds
  24. {
  25. OUT1_POS_LIGHT, OUT1_NEG_LIGHT,
  26. OUT2_POS_LIGHT, OUT2_NEG_LIGHT,
  27. OUT3_POS_LIGHT, OUT3_NEG_LIGHT,
  28. OUT4_POS_LIGHT, OUT4_NEG_LIGHT,
  29. NUM_LIGHTS
  30. };
  31. SchmittTrigger clockTrigger;
  32. float stages[4] = {};
  33. ASR() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS)
  34. {
  35. }
  36. void step() override;
  37. // For more advanced Module features, read Rack's engine.hpp header file
  38. // - toJson, fromJson: serialization of internal data
  39. // - onSampleRateChange: event triggered by a change of sample rate
  40. // - reset, randomize: implements special behavior when user clicks these from the context menu
  41. };
  42. void ASR::step()
  43. {
  44. if (clockTrigger.process(inputs[CLK_INPUT].value))
  45. {
  46. stages[3] = stages[2];
  47. stages[2] = stages[1];
  48. stages[1] = stages[0];
  49. stages[0] = inputs[MAIN_INPUT].value;
  50. }
  51. outputs[STAGE1_OUTPUT].value = stages[0];
  52. outputs[STAGE2_OUTPUT].value = stages[1];
  53. outputs[STAGE3_OUTPUT].value = stages[2];
  54. outputs[STAGE4_OUTPUT].value = stages[3];
  55. lights[OUT1_POS_LIGHT].setBrightnessSmooth(fmaxf(0.0, stages[0] / 5.0));
  56. lights[OUT1_NEG_LIGHT].setBrightnessSmooth(fmaxf(0.0, -stages[0] / 5.0));
  57. lights[OUT2_POS_LIGHT].setBrightnessSmooth(fmaxf(0.0, stages[1] / 5.0));
  58. lights[OUT2_NEG_LIGHT].setBrightnessSmooth(fmaxf(0.0, -stages[1] / 5.0));
  59. lights[OUT3_POS_LIGHT].setBrightnessSmooth(fmaxf(0.0, stages[2] / 5.0));
  60. lights[OUT3_NEG_LIGHT].setBrightnessSmooth(fmaxf(0.0, -stages[2] / 5.0));
  61. lights[OUT4_POS_LIGHT].setBrightnessSmooth(fmaxf(0.0, stages[3] / 5.0));
  62. lights[OUT4_NEG_LIGHT].setBrightnessSmooth(fmaxf(0.0, -stages[3] / 5.0));
  63. }
  64. struct ASRWidget : ModuleWidget { ASRWidget(ASR *module); };
  65. ASRWidget::ASRWidget(ASR *module) : ModuleWidget(module)
  66. {
  67. box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  68. {
  69. auto *panel = new SVGPanel();
  70. panel->box.size = box.size;
  71. panel->setBackground(SVG::load(assetPlugin(plugin, "res/ASR.svg")));
  72. addChild(panel);
  73. }
  74. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  75. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  76. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  77. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  78. //////PARAMS//////
  79. //////INPUTS//////
  80. addInput(Port::create<PJ301MPort>(Vec(10, 100), Port::INPUT, module, ASR::MAIN_INPUT));
  81. addInput(Port::create<PJ301MPort>(Vec(55, 100), Port::INPUT, module, ASR::CLK_INPUT));
  82. for(int i = 0; i < 4; i++)
  83. {
  84. const int yPos = i*45;
  85. addOutput(Port::create<PJ301MPort>(Vec(33, 150 + yPos), Port::OUTPUT, module, ASR::STAGE1_OUTPUT + i));
  86. addChild(ModuleLightWidget::create<SmallLight<GreenRedLight>>(Vec(70, 158 + yPos), module, ASR::OUT1_POS_LIGHT + i*2));
  87. }
  88. }
  89. } // namespace rack_plugin_HetrickCV
  90. using namespace rack_plugin_HetrickCV;
  91. RACK_PLUGIN_MODEL_INIT(HetrickCV, ASR) {
  92. Model *modelASR = Model::create<ASR, ASRWidget>("HetrickCV", "ASR", "ASR", SEQUENCER_TAG);
  93. return modelASR;
  94. }