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.

135 lines
3.6KB

  1. #include "HetrickCV.hpp"
  2. namespace rack_plugin_HetrickCV {
  3. struct FlipFlop : Module
  4. {
  5. enum ParamIds
  6. {
  7. NUM_PARAMS
  8. };
  9. enum InputIds
  10. {
  11. INT_INPUT,
  12. IND_INPUT,
  13. NUM_INPUTS
  14. };
  15. enum OutputIds
  16. {
  17. FFT_OUTPUT,
  18. FFD_OUTPUT,
  19. FFTNOT_OUTPUT,
  20. FFDNOT_OUTPUT,
  21. NUM_OUTPUTS
  22. };
  23. enum LightIds
  24. {
  25. FFT_LIGHT,
  26. FFD_LIGHT,
  27. FFTNOT_LIGHT,
  28. FFDNOT_LIGHT,
  29. TOGGLE_LIGHT,
  30. DATA_LIGHT,
  31. NUM_LIGHTS
  32. };
  33. SchmittTrigger clockTrigger;
  34. float outs[4] = {};
  35. bool toggle = false;
  36. bool dataIn = false;
  37. FlipFlop() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS)
  38. {
  39. reset();
  40. }
  41. void step() override;
  42. void reset() override
  43. {
  44. lights[DATA_LIGHT].value = 0.0f;
  45. outs[0] = 0.0f;
  46. outs[1] = lights[DATA_LIGHT].value;
  47. outs[2] = 5.0f;
  48. outs[3] = 5.0f;
  49. }
  50. // For more advanced Module features, read Rack's engine.hpp header file
  51. // - toJson, fromJson: serialization of internal data
  52. // - onSampleRateChange: event triggered by a change of sample rate
  53. // - reset, randomize: implements special behavior when user clicks these from the context menu
  54. };
  55. void FlipFlop::step()
  56. {
  57. dataIn = (inputs[IND_INPUT].value >= 1.0f);
  58. lights[DATA_LIGHT].value = dataIn ? 5.0f : 0.0f;
  59. lights[TOGGLE_LIGHT].value = (inputs[INT_INPUT].value >= 1.0f) ? 5.0f : 0.0f;
  60. if (clockTrigger.process(inputs[INT_INPUT].value))
  61. {
  62. toggle = !toggle;
  63. outs[0] = toggle ? 5.0f : 0.0f;
  64. outs[1] = lights[DATA_LIGHT].value;
  65. outs[2] = 5.0f - outs[0];
  66. outs[3] = 5.0f - outs[1];
  67. }
  68. outputs[FFT_OUTPUT].value = outs[0];
  69. outputs[FFD_OUTPUT].value = outs[1];
  70. outputs[FFTNOT_OUTPUT].value = outs[2];
  71. outputs[FFDNOT_OUTPUT].value = outs[3];
  72. lights[FFT_LIGHT].value = outs[0];
  73. lights[FFD_LIGHT].value = outs[1];
  74. lights[FFTNOT_LIGHT].value = outs[2];
  75. lights[FFDNOT_LIGHT].value = outs[3];
  76. }
  77. struct FlipFlopWidget : ModuleWidget { FlipFlopWidget(FlipFlop *module); };
  78. FlipFlopWidget::FlipFlopWidget(FlipFlop *module) : ModuleWidget(module)
  79. {
  80. box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  81. {
  82. auto *panel = new SVGPanel();
  83. panel->box.size = box.size;
  84. panel->setBackground(SVG::load(assetPlugin(plugin, "res/FlipFlop.svg")));
  85. addChild(panel);
  86. }
  87. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  88. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  89. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  90. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  91. //////PARAMS//////
  92. //////INPUTS//////
  93. addInput(Port::create<PJ301MPort>(Vec(10, 100), Port::INPUT, module, FlipFlop::INT_INPUT));
  94. addInput(Port::create<PJ301MPort>(Vec(55, 100), Port::INPUT, module, FlipFlop::IND_INPUT));
  95. addChild(ModuleLightWidget::create<SmallLight<RedLight>>(Vec(18, 87), module, FlipFlop::TOGGLE_LIGHT));
  96. addChild(ModuleLightWidget::create<SmallLight<RedLight>>(Vec(63, 87), module, FlipFlop::DATA_LIGHT));
  97. for(int i = 0; i < 4; i++)
  98. {
  99. const int yPos = i*45;
  100. addOutput(Port::create<PJ301MPort>(Vec(33, 150 + yPos), Port::OUTPUT, module, FlipFlop::FFT_OUTPUT + i));
  101. addChild(ModuleLightWidget::create<SmallLight<RedLight>>(Vec(70, 158 + yPos), module, FlipFlop::FFT_LIGHT + i));
  102. }
  103. }
  104. } // namespace rack_plugin_HetrickCV
  105. using namespace rack_plugin_HetrickCV;
  106. RACK_PLUGIN_MODEL_INIT(HetrickCV, FlipFlop) {
  107. Model *modelFlipFlop = Model::create<FlipFlop, FlipFlopWidget>("HetrickCV", "FlipFlop", "Flip-Flop", LOGIC_TAG);
  108. return modelFlipFlop;
  109. }