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.

159 lines
4.5KB

  1. #include "cf.hpp"
  2. #include "dsp/digital.hpp"
  3. namespace rack_plugin_cf {
  4. struct MASTER : Module {
  5. enum ParamIds {
  6. GAIN_PARAM,
  7. ON_PARAM,
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. ONT_INPUT,
  12. GAIN_INPUT,
  13. LEFT_INPUT,
  14. RIGHT_INPUT,
  15. NUM_INPUTS
  16. };
  17. enum OutputIds {
  18. LEFT_OUTPUT,
  19. RIGHT_OUTPUT,
  20. LEFT_MAIN_OUTPUT,
  21. RIGHT_MAIN_OUTPUT,
  22. NUM_OUTPUTS
  23. };
  24. enum LightIds {
  25. ON_LIGHT,
  26. L_LEVEL_LIGHTS,
  27. R_LEVEL_LIGHTS = L_LEVEL_LIGHTS +11,
  28. NUM_LIGHTS = R_LEVEL_LIGHTS +11
  29. };
  30. float SIGNAL_LEFT = 0.0 ;
  31. float SIGNAL_RIGHT = 0.0 ;
  32. bool ON_STATE = false ;
  33. int l_lightState[11] = {};
  34. int r_lightState[11] = {};
  35. SchmittTrigger onTrigger;
  36. SchmittTrigger oninTrigger;
  37. MASTER() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {onReset();}
  38. void step() override;
  39. void onReset() override {
  40. ON_STATE = true;
  41. }
  42. json_t *toJson() override {
  43. json_t *rootJ = json_object();
  44. // solo
  45. json_object_set_new(rootJ, "onstate", json_integer(ON_STATE));
  46. return rootJ;
  47. }
  48. void fromJson(json_t *rootJ) override {
  49. // solo
  50. json_t *onstateJ = json_object_get(rootJ, "onstate");
  51. if (onstateJ)
  52. ON_STATE = json_integer_value(onstateJ);
  53. }
  54. };
  55. void MASTER::step() {
  56. SIGNAL_LEFT = inputs[LEFT_INPUT].value ;
  57. SIGNAL_RIGHT = inputs[RIGHT_INPUT].value ;
  58. outputs[LEFT_OUTPUT].value = SIGNAL_LEFT ;
  59. outputs[RIGHT_OUTPUT].value = SIGNAL_RIGHT ;
  60. if (onTrigger.process(params[ON_PARAM].value)+oninTrigger.process(inputs[ONT_INPUT].value))
  61. {if (ON_STATE == 0) ON_STATE = 1; else ON_STATE = 0;}
  62. SIGNAL_LEFT = SIGNAL_LEFT * ON_STATE * params[GAIN_PARAM].value/5.0;
  63. SIGNAL_RIGHT = SIGNAL_RIGHT * ON_STATE * params[GAIN_PARAM].value/5.0;
  64. outputs[LEFT_MAIN_OUTPUT].value = SIGNAL_LEFT ;
  65. outputs[RIGHT_MAIN_OUTPUT].value = SIGNAL_RIGHT ;
  66. if (ON_STATE==1) lights[ON_LIGHT].value=true; else lights[ON_LIGHT].value=false;
  67. for (int i = 0; i < 11; i++) {
  68. if (SIGNAL_LEFT> i) {if (i<10) l_lightState[i]=5000;else l_lightState[i]=20000;}
  69. }
  70. for (int i = 0; i < 11; i++) {
  71. if (l_lightState[i]> 0) {l_lightState[i]=l_lightState[i]-1;lights[L_LEVEL_LIGHTS + i].value=true;} else lights[L_LEVEL_LIGHTS + i].value=false;
  72. }
  73. for (int i = 0; i < 11; i++) {
  74. if (SIGNAL_RIGHT> i) {if (i<10) r_lightState[i]=5000;else r_lightState[i]=20000;}
  75. }
  76. for (int i = 0; i < 11; i++) {
  77. if (r_lightState[i]> 0) {r_lightState[i]=r_lightState[i]-1;lights[R_LEVEL_LIGHTS + i].value=true;} else lights[R_LEVEL_LIGHTS + i].value=false;
  78. }
  79. }
  80. struct MASTERWidget : ModuleWidget {
  81. MASTERWidget(MASTER *module);
  82. };
  83. MASTERWidget::MASTERWidget(MASTER *module) : ModuleWidget(module) {
  84. setPanel(SVG::load(assetPlugin(plugin, "res/MASTER.svg")));
  85. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  86. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  87. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  88. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  89. addParam(ParamWidget::create<RoundLargeBlackKnob>(Vec(27, 247), module, MASTER::GAIN_PARAM, 0.0, 10.0, 5.0));
  90. addParam(ParamWidget::create<LEDButton>(Vec(38, 208), module, MASTER::ON_PARAM, 0.0, 1.0, 0.0));
  91. addChild(ModuleLightWidget::create<MediumLight<BlueLight>>(Vec(42.4, 212.4), module, MASTER::ON_LIGHT));
  92. addOutput(Port::create<PJ301MPort>(Vec(54, 61), Port::OUTPUT, module, MASTER::LEFT_OUTPUT));
  93. addOutput(Port::create<PJ301MPort>(Vec(54, 91), Port::OUTPUT, module, MASTER::RIGHT_OUTPUT));
  94. addOutput(Port::create<PJ301MPort>(Vec(54, 308), Port::OUTPUT, module, MASTER::LEFT_MAIN_OUTPUT));
  95. addOutput(Port::create<PJ301MPort>(Vec(54, 334), Port::OUTPUT, module, MASTER::RIGHT_MAIN_OUTPUT));
  96. addInput(Port::create<PJ301MPort>(Vec(11, 61), Port::INPUT, module, MASTER::LEFT_INPUT));
  97. addInput(Port::create<PJ301MPort>(Vec(11, 91), Port::INPUT, module, MASTER::RIGHT_INPUT));
  98. for (int i = 0; i < 11; i++) {
  99. if (i<10) addChild(ModuleLightWidget::create<MediumLight<BlueLight>>(Vec(15, 242-i*12), module, MASTER::L_LEVEL_LIGHTS + i));
  100. else addChild(ModuleLightWidget::create<MediumLight<RedLight>>(Vec(15, 242-i*12), module, MASTER::L_LEVEL_LIGHTS + i));
  101. if (i<10) addChild(ModuleLightWidget::create<MediumLight<BlueLight>>(Vec(68, 242-i*12), module, MASTER::R_LEVEL_LIGHTS + i));
  102. else addChild(ModuleLightWidget::create<MediumLight<RedLight>>(Vec(68, 242-i*12), module, MASTER::R_LEVEL_LIGHTS + i));
  103. }
  104. }
  105. } // namespace rack_plugin_cf
  106. using namespace rack_plugin_cf;
  107. RACK_PLUGIN_MODEL_INIT(cf, MASTER) {
  108. Model *modelMASTER = Model::create<MASTER, MASTERWidget>("cf", "MASTER", "Master", MIXER_TAG);
  109. return modelMASTER;
  110. }