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.

243 lines
5.4KB

  1. #include "cf.hpp"
  2. #include "dsp/digital.hpp"
  3. namespace rack_plugin_cf {
  4. struct CUTS : Module {
  5. enum ParamIds {
  6. POTF_PARAM,
  7. POTR_PARAM,
  8. LINK_PARAM,
  9. POLE_PARAM,
  10. NUM_PARAMS
  11. };
  12. enum InputIds {
  13. IN_INPUT,
  14. IN2_INPUT,
  15. F_INPUT,
  16. R_INPUT,
  17. NUM_INPUTS
  18. };
  19. enum OutputIds {
  20. OUT_OUTPUT,
  21. OUT2_OUTPUT,
  22. NUM_OUTPUTS
  23. };
  24. enum LightIds {
  25. LINK_LIGHT,
  26. NUM_LIGHTS
  27. };
  28. int poles = 4;
  29. float prevf1[8];
  30. float prevf2[8];
  31. float prevf3[8];
  32. float prevf4[8];
  33. float delta=0.0;
  34. float temp1=0.0;
  35. float temp2=0.0;
  36. float temp3=0.0;
  37. float temp4=0.0;
  38. float rin=0;
  39. bool rv =false;
  40. float fin=0;
  41. bool fv =false;
  42. bool LINK_STATE =false;
  43. float link_delta;
  44. SchmittTrigger linkTrigger;
  45. CUTS() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {reset();}
  46. void step() override;
  47. json_t *toJson() override {
  48. json_t *rootJ = json_object();
  49. json_object_set_new(rootJ, "linkstate", json_integer(LINK_STATE));
  50. json_object_set_new(rootJ, "linkdelta", json_real(link_delta));
  51. return rootJ;
  52. }
  53. void fromJson(json_t *rootJ) override {
  54. json_t *linkstateJ = json_object_get(rootJ, "linkstate");
  55. if (linkstateJ)
  56. LINK_STATE = json_integer_value(linkstateJ);
  57. json_t *ldJ = json_object_get(rootJ, "linkdelta");
  58. if (ldJ)
  59. link_delta = json_real_value(ldJ);
  60. }
  61. };
  62. struct Slide : LEDSliderBlue {
  63. float *deltax ;
  64. bool *visi ;
  65. float xorigin = 0.0;
  66. Slide() {
  67. //setSVG(SVG::load(assetPlugin(plugin, "res/spiral.svg")));
  68. }
  69. void step() override{
  70. if (xorigin==0) xorigin=box.pos.x;
  71. dirty = true;
  72. if(*visi) {value= *deltax; box.pos.x = xorigin;}
  73. else {value =value; box.pos.x = xorigin+100;}
  74. LEDSliderBlue::step();
  75. }
  76. //void draw(NVGcontext *vg) override {LEDSliderBlue::draw(vg);}
  77. };
  78. void CUTS::step() {
  79. poles = int(params[POLE_PARAM].value);
  80. if (linkTrigger.process(params[LINK_PARAM].value))
  81. {if (LINK_STATE == 0) {LINK_STATE = 1; link_delta = fin-rin;} else LINK_STATE = 0;}
  82. lights[LINK_LIGHT].value=LINK_STATE;
  83. if (inputs[R_INPUT].active) {
  84. rv = true;
  85. rin = clamp(inputs[R_INPUT].value,0.0,10.0)/10.0;
  86. } else {
  87. rv = false;
  88. rin = params[POTR_PARAM].value;
  89. }
  90. if (!LINK_STATE) {
  91. if (inputs[F_INPUT].active) {
  92. fv = true;
  93. fin = clamp(inputs[F_INPUT].value,0.0,10.0)/10.0;
  94. } else {
  95. fv = false;
  96. fin = params[POTF_PARAM].value;
  97. }
  98. } else {
  99. if (inputs[R_INPUT].active) {
  100. fv = true;
  101. fin = clamp(inputs[R_INPUT].value/10.0+link_delta,0.0f,1.0f);
  102. } else {
  103. if (inputs[F_INPUT].active) {
  104. rv = true;
  105. rin = clamp(inputs[F_INPUT].value/10-link_delta,0.0f,1.0f);
  106. fv = true;
  107. fin = clamp(inputs[F_INPUT].value/10,0.0f,1.0f);
  108. } else {
  109. fv = true;
  110. fin = clamp(params[POTR_PARAM].value+link_delta,0.0f,1.0f);
  111. }
  112. }
  113. }
  114. if (inputs[IN_INPUT].active) {
  115. temp1 = inputs[IN_INPUT].value;
  116. for (int i=0;i<poles;i++){
  117. delta = temp1 - prevf1[i];
  118. delta = delta * fin;
  119. prevf1[i] = prevf1[i] + delta ;
  120. temp1= prevf1[i];
  121. }
  122. temp2=temp1;
  123. for (int i=0;i<poles;i++){
  124. delta = temp2 - prevf2[i];
  125. delta = delta * rin;
  126. prevf2[i] = prevf2[i] + delta ;
  127. temp2= prevf2[i];
  128. }
  129. outputs[OUT_OUTPUT].value = temp1 - temp2;
  130. } else outputs[OUT_OUTPUT].value =0;
  131. if (inputs[IN2_INPUT].active) {
  132. temp3 = inputs[IN2_INPUT].value;
  133. for (int i=0;i<poles;i++){
  134. delta = temp3 - prevf3[i];
  135. delta = delta * fin;
  136. prevf3[i] = prevf3[i] + delta ;
  137. temp3= prevf3[i];
  138. }
  139. temp4=temp3;
  140. for (int i=0;i<poles;i++){
  141. delta = temp4 - prevf4[i];
  142. delta = delta * rin;
  143. prevf4[i] = prevf4[i] + delta ;
  144. temp4= prevf4[i];
  145. }
  146. outputs[OUT2_OUTPUT].value = temp3 - temp4;
  147. } else outputs[OUT2_OUTPUT].value =0;
  148. }
  149. struct CUTSWidget : ModuleWidget {
  150. CUTSWidget(CUTS *module);
  151. };
  152. CUTSWidget::CUTSWidget(CUTS *module) : ModuleWidget(module) {
  153. setPanel(SVG::load(assetPlugin(plugin, "res/CUTS.svg")));
  154. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  155. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  156. addInput(Port::create<PJ301MPort>(Vec(3, 308), Port::INPUT, module, CUTS::IN_INPUT));
  157. addInput(Port::create<PJ301MPort>(Vec(3, 334), Port::INPUT, module, CUTS::IN2_INPUT));
  158. addOutput(Port::create<PJ301MPort>(Vec(32, 308), Port::OUTPUT, module, CUTS::OUT_OUTPUT));
  159. addOutput(Port::create<PJ301MPort>(Vec(32, 334), Port::OUTPUT, module, CUTS::OUT2_OUTPUT));
  160. addParam(ParamWidget::create<RoundBlackSnapKnob>(Vec(15.5, 54), module, CUTS::POLE_PARAM, 1.0f, 8.0f, 4.0f));
  161. addParam(ParamWidget::create<LEDSliderWhite>(Vec(5, 131), module, CUTS::POTR_PARAM, 0.0f, 1.0f, 0.0f));
  162. addInput(Port::create<PJ301MPort>(Vec(3, 252), Port::INPUT, module, CUTS::R_INPUT));
  163. addParam(ParamWidget::create<LEDSliderWhite>(Vec(35, 131), module, CUTS::POTF_PARAM, 0.0f, 1.0f, 1.0f));
  164. addInput(Port::create<PJ301MPort>(Vec(32, 252), Port::INPUT, module, CUTS::F_INPUT));
  165. Slide *rslider = new Slide();
  166. rslider->box.pos = Vec(5,131);
  167. rslider->deltax = &module->rin;
  168. rslider->visi = &module->rv;
  169. addChild(rslider);
  170. Slide *fslider = new Slide();
  171. fslider->box.pos = Vec(35,131);
  172. fslider->deltax = &module->fin;
  173. fslider->visi = &module->fv;
  174. addChild(fslider);
  175. addParam(ParamWidget::create<LEDButton>(Vec(21.5, 104), module, CUTS::LINK_PARAM, 0.0, 1.0, 0.0));
  176. addChild(ModuleLightWidget::create<MediumLight<BlueLight>>(Vec(25.9, 108.4), module, CUTS::LINK_LIGHT));
  177. }
  178. } // namespace rack_plugin_cf
  179. using namespace rack_plugin_cf;
  180. RACK_PLUGIN_MODEL_INIT(cf, CUTS) {
  181. Model *modelCUTS = Model::create<CUTS, CUTSWidget>("cf", "CUTS", "Cuts", FILTER_TAG);
  182. return modelCUTS;
  183. }