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.

171 lines
5.5KB

  1. #include "cf.hpp"
  2. #include "dsp/digital.hpp"
  3. using namespace std;
  4. namespace rack_plugin_cf {
  5. struct ALGEBRA : Module {
  6. enum ParamIds {
  7. OP_PARAM,
  8. NUM_PARAMS = OP_PARAM+6
  9. };
  10. enum InputIds {
  11. IN1_INPUT,
  12. IN2_INPUT,
  13. NUM_INPUTS
  14. };
  15. enum OutputIds {
  16. OUT_OUTPUT,
  17. NUM_OUTPUTS
  18. };
  19. enum LightIds {
  20. LED_LIGHT,
  21. NUM_LIGHTS = LED_LIGHT+6
  22. };
  23. int OP_STATE = 0 ;
  24. SchmittTrigger trTrigger[6];
  25. ALGEBRA() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { }
  26. void step() override;
  27. json_t *toJson() override {
  28. json_t *rootJ = json_object();
  29. json_object_set_new(rootJ, "opstate", json_integer(OP_STATE));
  30. return rootJ;
  31. }
  32. void fromJson(json_t *rootJ) override {
  33. json_t *opstateJ = json_object_get(rootJ, "opstate");
  34. if (opstateJ)
  35. OP_STATE = json_integer_value(opstateJ);
  36. }
  37. };
  38. void ALGEBRA::step() {
  39. for (int i=0; i<6; i++) {
  40. if (trTrigger[i].process(params[OP_PARAM+i].value)) OP_STATE= i;
  41. if (OP_STATE == i) lights[LED_LIGHT+i].value=1; else lights[LED_LIGHT+i].value=0;
  42. }
  43. if (OP_STATE==0) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value + inputs[IN2_INPUT].value;
  44. if (OP_STATE==1) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value - inputs[IN2_INPUT].value;
  45. if (OP_STATE==2) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value * inputs[IN2_INPUT].value;
  46. if ((OP_STATE==3) & (inputs[IN2_INPUT].value!=0)) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value / inputs[IN2_INPUT].value;
  47. if (OP_STATE==4) {
  48. if (inputs[IN1_INPUT].value>=inputs[IN2_INPUT].value) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value;
  49. else outputs[OUT_OUTPUT].value = inputs[IN2_INPUT].value;
  50. }
  51. if (OP_STATE==5) {
  52. if (inputs[IN1_INPUT].value<=inputs[IN2_INPUT].value) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value;
  53. else outputs[OUT_OUTPUT].value = inputs[IN2_INPUT].value;
  54. }
  55. }
  56. struct plusButton : SVGSwitch, MomentarySwitch {
  57. plusButton() {
  58. addFrame(SVG::load(assetPlugin(plugin, "res/plusButton.svg")));
  59. addFrame(SVG::load(assetPlugin(plugin, "res/plusButton.svg")));
  60. sw->wrap();
  61. box.size = sw->box.size;
  62. }
  63. };
  64. struct minusButton : SVGSwitch, MomentarySwitch {
  65. minusButton() {
  66. addFrame(SVG::load(assetPlugin(plugin, "res/minusButton.svg")));
  67. addFrame(SVG::load(assetPlugin(plugin, "res/minusButton.svg")));
  68. sw->wrap();
  69. box.size = sw->box.size;
  70. }
  71. };
  72. struct multButton : SVGSwitch, MomentarySwitch {
  73. multButton() {
  74. addFrame(SVG::load(assetPlugin(plugin, "res/multButton.svg")));
  75. addFrame(SVG::load(assetPlugin(plugin, "res/multButton.svg")));
  76. sw->wrap();
  77. box.size = sw->box.size;
  78. }
  79. };
  80. struct divButton : SVGSwitch, MomentarySwitch {
  81. divButton() {
  82. addFrame(SVG::load(assetPlugin(plugin, "res/divButton.svg")));
  83. addFrame(SVG::load(assetPlugin(plugin, "res/divButton.svg")));
  84. sw->wrap();
  85. box.size = sw->box.size;
  86. }
  87. };
  88. struct maxButton : SVGSwitch, MomentarySwitch {
  89. maxButton() {
  90. addFrame(SVG::load(assetPlugin(plugin, "res/maxButton.svg")));
  91. addFrame(SVG::load(assetPlugin(plugin, "res/maxButton.svg")));
  92. sw->wrap();
  93. box.size = sw->box.size;
  94. }
  95. };
  96. struct minButton : SVGSwitch, MomentarySwitch {
  97. minButton() {
  98. addFrame(SVG::load(assetPlugin(plugin, "res/minButton.svg")));
  99. addFrame(SVG::load(assetPlugin(plugin, "res/minButton.svg")));
  100. sw->wrap();
  101. box.size = sw->box.size;
  102. }
  103. };
  104. struct ALGEBRAWidget : ModuleWidget {
  105. ALGEBRAWidget(ALGEBRA *module);
  106. //void step() override;
  107. };
  108. ALGEBRAWidget::ALGEBRAWidget(ALGEBRA *module) : ModuleWidget(module) {
  109. setPanel(SVG::load(assetPlugin(plugin, "res/ALGEBRA.svg")));
  110. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  111. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  112. addInput(Port::create<PJ301MPort>(Vec(3, 31), Port::INPUT, module, ALGEBRA::IN1_INPUT));
  113. addInput(Port::create<PJ301MPort>(Vec(3, 95), Port::INPUT, module, ALGEBRA::IN2_INPUT));
  114. int i = 0;
  115. addChild(ModuleLightWidget::create<LargeLight<BlueLight>>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
  116. addParam(ParamWidget::create<plusButton>(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1;
  117. addChild(ModuleLightWidget::create<LargeLight<BlueLight>>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
  118. addParam(ParamWidget::create<minusButton>(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1;
  119. addChild(ModuleLightWidget::create<LargeLight<BlueLight>>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
  120. addParam(ParamWidget::create<multButton>(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1;
  121. addChild(ModuleLightWidget::create<LargeLight<BlueLight>>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
  122. addParam(ParamWidget::create<divButton>(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1;
  123. addChild(ModuleLightWidget::create<LargeLight<BlueLight>>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
  124. addParam(ParamWidget::create<maxButton>(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1;
  125. addChild(ModuleLightWidget::create<LargeLight<BlueLight>>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
  126. addParam(ParamWidget::create<minButton>(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0));
  127. addOutput(Port::create<PJ301MPort>(Vec(3, 321), Port::OUTPUT, module, ALGEBRA::OUT_OUTPUT));
  128. }
  129. } // namespace rack_plugin_cf
  130. using namespace rack_plugin_cf;
  131. RACK_PLUGIN_MODEL_INIT(cf, ALGEBRA) {
  132. Model *modelALGEBRA = Model::create<ALGEBRA, ALGEBRAWidget>("cf", "ALGEBRA", "Algebra", UTILITY_TAG);
  133. return modelALGEBRA;
  134. }