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.

215 lines
5.4KB

  1. #include "cf.hpp"
  2. #include "dsp/digital.hpp"
  3. namespace rack_plugin_cf {
  4. struct EACH : Module {
  5. enum ParamIds {
  6. DIV_PARAM,
  7. BEAT_PARAM,
  8. ON_PARAM,
  9. NUM_PARAMS
  10. };
  11. enum InputIds {
  12. DOUZE_INPUT,
  13. START_INPUT,
  14. ON_INPUT,
  15. DIV_INPUT,
  16. NUM_INPUTS
  17. };
  18. enum OutputIds {
  19. DOUZE_OUTPUT,
  20. RESET_OUTPUT,
  21. BEAT_OUTPUT,
  22. START_OUTPUT,
  23. NUM_OUTPUTS
  24. };
  25. enum LightIds {
  26. ON_LIGHT,
  27. BEAT_LIGHT,
  28. NUM_LIGHTS
  29. };
  30. int max_EACH = 3 ;
  31. int stepa = 0 ;
  32. int lum = 0 ;
  33. int note = 0;
  34. SchmittTrigger stTrigger;
  35. SchmittTrigger dzTrigger;
  36. float or_gain ;
  37. int or_affi ;
  38. EACH() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  39. void step() override;
  40. };
  41. void EACH::step() {
  42. if (!inputs[DIV_INPUT].active) {
  43. max_EACH = floor(params[DIV_PARAM].value);
  44. or_affi=0;
  45. } else {
  46. max_EACH = round(clamp((inputs[DIV_INPUT].value * 1.2)+1,1.0f,12.0f));
  47. or_gain = round(clamp(inputs[DIV_INPUT].value,0.0f,10.0f));
  48. or_affi=1;
  49. }
  50. if (inputs[START_INPUT].active) {
  51. outputs[START_OUTPUT].value = inputs[START_INPUT].value;
  52. outputs[RESET_OUTPUT].value = inputs[START_INPUT].value;
  53. if (dzTrigger.process(inputs[START_INPUT].value)) stepa = max_EACH-1 ;
  54. }
  55. if (stTrigger.process(inputs[DOUZE_INPUT].value)) stepa = stepa +1 ;
  56. if (inputs[DOUZE_INPUT].active) {
  57. if (stepa == max_EACH) {
  58. note = 5;
  59. stepa = 0;
  60. lum = 2000;
  61. }
  62. outputs[DOUZE_OUTPUT].value = inputs[DOUZE_INPUT].value;
  63. }
  64. if (note >0) {outputs[BEAT_OUTPUT].value = 10.f;note = note -1;} else outputs[BEAT_OUTPUT].value = 0.f;
  65. if (lum>0) {lights[BEAT_LIGHT].value = true;lum = lum -1;} else lights[BEAT_LIGHT].value = false;
  66. }
  67. struct NuDisplayWidget : TransparentWidget {
  68. int *value;
  69. std::shared_ptr<Font> font;
  70. NuDisplayWidget() {
  71. font = Font::load(assetPlugin(plugin, "res/Segment7Standard.ttf"));
  72. };
  73. void draw(NVGcontext *vg) {
  74. // Background
  75. NVGcolor backgroundColor = nvgRGB(0x44, 0x44, 0x44);
  76. NVGcolor borderColor = nvgRGB(0x10, 0x10, 0x10);
  77. nvgBeginPath(vg);
  78. nvgRoundedRect(vg, 0.0, 0.0, box.size.x, box.size.y, 4.0);
  79. nvgFillColor(vg, backgroundColor);
  80. nvgFill(vg);
  81. nvgStrokeWidth(vg, 1.0);
  82. nvgStrokeColor(vg, borderColor);
  83. nvgStroke(vg);
  84. nvgFontSize(vg, 18);
  85. nvgFontFaceId(vg, font->handle);
  86. nvgTextLetterSpacing(vg, 2.5);
  87. std::string to_display = std::to_string(*value);
  88. while(to_display.length()<3) to_display = ' ' + to_display;
  89. Vec textPos = Vec(6.0f, 17.0f);
  90. NVGcolor textColor = nvgRGB(0xdf, 0xd2, 0x2c);
  91. nvgFillColor(vg, nvgTransRGBA(textColor, 16));
  92. nvgText(vg, textPos.x, textPos.y, "~~~", NULL);
  93. textColor = nvgRGB(0xda, 0xe9, 0x29);
  94. nvgFillColor(vg, nvgTransRGBA(textColor, 16));
  95. nvgText(vg, textPos.x, textPos.y, "\\\\\\", NULL);
  96. textColor = nvgRGB(0x28, 0xb0, 0xf3);
  97. nvgFillColor(vg, textColor);
  98. nvgText(vg, textPos.x, textPos.y, to_display.c_str(), NULL);
  99. }
  100. };
  101. struct MOTORPOTDisplay : TransparentWidget {
  102. float d;
  103. float *gainX ;
  104. int *affich;
  105. MOTORPOTDisplay() {
  106. }
  107. void draw(NVGcontext *vg) {
  108. if (*affich==1) {
  109. float xx = d*sin(-(*gainX*0.17+0.15)*M_PI) ;
  110. float yy = d*cos((*gainX*0.17+0.15)*M_PI) ;
  111. nvgBeginPath(vg);
  112. nvgCircle(vg, 0,0, d);
  113. nvgFillColor(vg, nvgRGBA(0x00, 0x00, 0x00, 0xff));
  114. nvgFill(vg);
  115. nvgStrokeWidth(vg,1.2);
  116. nvgStrokeColor(vg, nvgRGBA(0xff, 0xff, 0xff, 0xff));
  117. {
  118. nvgBeginPath(vg);
  119. nvgMoveTo(vg, 0,0);
  120. nvgLineTo(vg, xx,yy);
  121. nvgClosePath(vg);
  122. }
  123. nvgStroke(vg);
  124. }
  125. }
  126. };
  127. struct EACHWidget : ModuleWidget {
  128. EACHWidget(EACH *module);
  129. };
  130. EACHWidget::EACHWidget(EACH *module) : ModuleWidget(module) {
  131. setPanel(SVG::load(assetPlugin(plugin, "res/EACH.svg")));
  132. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  133. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  134. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  135. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  136. addInput(Port::create<PJ301MPort>(Vec(11, 26), Port::INPUT, module, EACH::START_INPUT));
  137. addOutput(Port::create<PJ301MPort>(Vec(35, 275), Port::OUTPUT, module, EACH::RESET_OUTPUT));
  138. addOutput(Port::create<PJ301MPort>(Vec(11, 321), Port::OUTPUT, module, EACH::START_OUTPUT));
  139. addInput(Port::create<PJ301MPort>(Vec(54, 26), Port::INPUT, module, EACH::DOUZE_INPUT));
  140. addOutput(Port::create<PJ301MPort>(Vec(54, 321), Port::OUTPUT, module, EACH::DOUZE_OUTPUT));
  141. addOutput(Port::create<PJ301MPort>(Vec(35, 235), Port::OUTPUT, module, EACH::BEAT_OUTPUT));
  142. addParam(ParamWidget::create<RoundLargeBlackKnob>(Vec(27, 107), module, EACH::DIV_PARAM, 1.0f, 12.1f, 3.1f));
  143. addInput(Port::create<PJ301MPort>(Vec(11, 141), Port::INPUT, module, EACH::DIV_INPUT));
  144. {
  145. MOTORPOTDisplay *display = new MOTORPOTDisplay();
  146. display->box.pos = Vec(46, 126);
  147. display->d = 19.1;
  148. display->gainX = &module->or_gain;
  149. display->affich = &module->or_affi;
  150. addChild(display);
  151. }
  152. addParam(ParamWidget::create<LEDButton>(Vec(38, 197), module, EACH::BEAT_PARAM, 0.0f, 1.0f, 0.0f));
  153. addChild(ModuleLightWidget::create<MediumLight<BlueLight>>(Vec(42.4, 201.4), module, EACH::BEAT_LIGHT));
  154. NuDisplayWidget *display = new NuDisplayWidget();
  155. display->box.pos = Vec(20,56);
  156. display->box.size = Vec(50, 20);
  157. display->value = &module->max_EACH;
  158. addChild(display);
  159. }
  160. } // namespace rack_plugin_cf
  161. using namespace rack_plugin_cf;
  162. RACK_PLUGIN_MODEL_INIT(cf, EACH) {
  163. Model *modelEACH = Model::create<EACH, EACHWidget>("cf", "EACH", "Each", CLOCK_TAG);
  164. return modelEACH;
  165. }