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.

257 lines
7.4KB

  1. #include "cf.hpp"
  2. #include "dsp/digital.hpp"
  3. namespace rack_plugin_cf {
  4. struct MONO : Module {
  5. enum ParamIds {
  6. PAN_PARAM,
  7. GAIN_PARAM,
  8. SOLO_PARAM,
  9. ON_PARAM,
  10. NUM_PARAMS
  11. };
  12. enum InputIds {
  13. SOLOT_INPUT,
  14. ONT_INPUT,
  15. PAN_INPUT,
  16. GAIN_INPUT,
  17. EXTSOLO_INPUT,
  18. LEFT_INPUT,
  19. RIGHT_INPUT,
  20. PANPOT_INPUT,
  21. IN1_INPUT,
  22. NUM_INPUTS
  23. };
  24. enum OutputIds {
  25. EXTSOLO_OUTPUT,
  26. LEFT_OUTPUT,
  27. RIGHT_OUTPUT,
  28. OUT1_OUTPUT,
  29. NUM_OUTPUTS
  30. };
  31. enum LightIds {
  32. SOLO_LIGHT,
  33. ON_LIGHT,
  34. LEVEL_LIGHTS,
  35. NUM_LIGHTS = LEVEL_LIGHTS +11
  36. };
  37. float SIGNAL = 0.0 ;
  38. bool ON_STATE = false ;
  39. bool SOLO_STATE = false ;
  40. bool soloed = false;
  41. int lightState[11] = {};
  42. int cligno =0;
  43. int retard =0;
  44. int retard2 =0;
  45. SchmittTrigger onTrigger;
  46. SchmittTrigger oninTrigger;
  47. SchmittTrigger soloTrigger;
  48. SchmittTrigger soloinTrigger;
  49. float or_gain ;
  50. int or_affi ;
  51. float orp_gain ;
  52. int orp_affi ;
  53. MONO() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {onReset();}
  54. void step() override;
  55. void onReset() override {
  56. ON_STATE = true;
  57. SOLO_STATE = false;
  58. }
  59. json_t *toJson() override {
  60. json_t *rootJ = json_object();
  61. // solo
  62. json_object_set_new(rootJ, "solostate", json_integer(SOLO_STATE));
  63. // solo
  64. json_object_set_new(rootJ, "onstate", json_integer(ON_STATE));
  65. return rootJ;
  66. }
  67. void fromJson(json_t *rootJ) override {
  68. // solo
  69. json_t *solostateJ = json_object_get(rootJ, "solostate");
  70. if (solostateJ)
  71. SOLO_STATE = json_integer_value(solostateJ);
  72. // solo
  73. json_t *onstateJ = json_object_get(rootJ, "onstate");
  74. if (onstateJ)
  75. ON_STATE = json_integer_value(onstateJ);
  76. }
  77. };
  78. void MONO::step() {
  79. SIGNAL = inputs[IN1_INPUT].value ;
  80. if (!inputs[GAIN_INPUT].active)
  81. {SIGNAL = SIGNAL * params[GAIN_PARAM].value/5.0 ;or_affi=0;}
  82. else {SIGNAL = SIGNAL * clamp(inputs[GAIN_INPUT].value/5.0f,0.0f,2.0f) ; or_affi=1;or_gain=clamp(inputs[GAIN_INPUT].value,0.0f,10.0f);}
  83. if (onTrigger.process(params[ON_PARAM].value)+oninTrigger.process(inputs[ONT_INPUT].value))
  84. {if (ON_STATE == 0) ON_STATE = 1; else ON_STATE = 0;}
  85. if (inputs[EXTSOLO_INPUT].value == 0) soloed = 0;
  86. if (inputs[EXTSOLO_INPUT].value == 10) soloed = 1;
  87. if (soloTrigger.process(params[SOLO_PARAM].value)+soloinTrigger.process(inputs[SOLOT_INPUT].value))
  88. {if (SOLO_STATE == 0) {SOLO_STATE = 1;} else {SOLO_STATE = 0;soloed=0;}}
  89. #define and &&
  90. if ((!SOLO_STATE and !soloed) and (retard > 0)) retard = 0; else if (retard < 1000) retard = retard + 1;
  91. #undef and
  92. outputs[EXTSOLO_OUTPUT].value=round(10*retard/1000);
  93. if (!SOLO_STATE) SIGNAL = SIGNAL * ON_STATE ;
  94. #define and &&
  95. if (soloed and !SOLO_STATE) SIGNAL = 0;
  96. #undef and
  97. outputs[OUT1_OUTPUT].value = SIGNAL;
  98. if (!inputs[PAN_INPUT].active) {
  99. outputs[LEFT_OUTPUT].value = inputs[LEFT_INPUT].value + SIGNAL*(1-clamp(params[PAN_PARAM].value,0.0f,1.0f));
  100. outputs[RIGHT_OUTPUT].value = inputs[RIGHT_INPUT].value + SIGNAL*(1-clamp(-params[PAN_PARAM].value,0.0f,1.0f));
  101. orp_affi = 0;
  102. } else {
  103. outputs[LEFT_OUTPUT].value = inputs[LEFT_INPUT].value + SIGNAL*(1-(clamp(inputs[PAN_INPUT].value,5.0f,10.0f)-5)/5);
  104. outputs[RIGHT_OUTPUT].value = inputs[RIGHT_INPUT].value + SIGNAL*(1-(clamp(inputs[PAN_INPUT].value,0.0f,5.0f)+5)/5);
  105. orp_affi = 1;orp_gain = clamp(inputs[PAN_INPUT].value,0.0f,10.0f);
  106. }
  107. if (ON_STATE==1) lights[ON_LIGHT].value=true; else lights[ON_LIGHT].value=false;
  108. if (SOLO_STATE==1) {if (cligno == 0) cligno =20000; else cligno=cligno-1;} else cligno = 0;
  109. if (cligno>5000) lights[SOLO_LIGHT].value =1; else lights[SOLO_LIGHT].value =0;
  110. for (int i = 0; i < 11; i++) {
  111. if (SIGNAL> i) {if (i<10) lightState[i]=5000;else lightState[i]=20000;}
  112. }
  113. for (int i = 0; i < 11; i++) {
  114. if (lightState[i]> 0) {lightState[i]=lightState[i]-1;lights[LEVEL_LIGHTS + i].value=true;} else lights[LEVEL_LIGHTS + i].value=false;
  115. }
  116. }
  117. struct MOTORPOTDisplay : TransparentWidget {
  118. float d;
  119. float *gainX ;
  120. int *affich;
  121. MOTORPOTDisplay() {
  122. }
  123. void draw(NVGcontext *vg) {
  124. if (*affich==1) {
  125. float xx = d*sin(-(*gainX*0.17+0.15)*M_PI) ;
  126. float yy = d*cos((*gainX*0.17+0.15)*M_PI) ;
  127. nvgBeginPath(vg);
  128. nvgCircle(vg, 0,0, d);
  129. nvgFillColor(vg, nvgRGBA(0x00, 0x00, 0x00, 0xff));
  130. nvgFill(vg);
  131. nvgStrokeWidth(vg,1.2);
  132. nvgStrokeColor(vg, nvgRGBA(0xff, 0xff, 0xff, 0xff));
  133. {
  134. nvgBeginPath(vg);
  135. nvgMoveTo(vg, 0,0);
  136. nvgLineTo(vg, xx,yy);
  137. nvgClosePath(vg);
  138. }
  139. nvgStroke(vg);
  140. }
  141. }
  142. };
  143. struct MONOWidget : ModuleWidget {
  144. MONOWidget(MONO *module);
  145. };
  146. MONOWidget::MONOWidget(MONO *module) : ModuleWidget(module) {
  147. setPanel(SVG::load(assetPlugin(plugin, "res/MONO.svg")));
  148. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  149. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  150. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  151. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  152. addParam(ParamWidget::create<Trimpot>(Vec(38, 127), module, MONO::PAN_PARAM, -1.0f, 1.0f, 0.0f));
  153. addInput(Port::create<PJ301MPort>(Vec(11, 131), Port::INPUT, module, MONO::PAN_INPUT));
  154. {
  155. MOTORPOTDisplay *pdisplay = new MOTORPOTDisplay();
  156. pdisplay->box.pos = Vec(47, 136);
  157. pdisplay->d = 9.2;
  158. pdisplay->gainX = &module->orp_gain;
  159. pdisplay->affich = &module->orp_affi;
  160. addChild(pdisplay);
  161. }
  162. addParam(ParamWidget::create<RoundLargeBlackKnob>(Vec(27, 247), module, MONO::GAIN_PARAM, 0.0f, 10.0f, 5.0f));
  163. addInput(Port::create<PJ301MPort>(Vec(11, 281), Port::INPUT, module, MONO::GAIN_INPUT));
  164. {
  165. MOTORPOTDisplay *display = new MOTORPOTDisplay();
  166. display->box.pos = Vec(46, 266);
  167. display->d = 19.1;
  168. display->gainX = &module->or_gain;
  169. display->affich = &module->or_affi;
  170. addChild(display);
  171. }
  172. addParam(ParamWidget::create<LEDButton>(Vec(38, 167), module, MONO::SOLO_PARAM, 0.0, 1.0, 0.0));
  173. addChild(ModuleLightWidget::create<MediumLight<BlueLight>>(Vec(42.4, 171.4), module, MONO::SOLO_LIGHT));
  174. addInput(Port::create<PJ301MPort>(Vec(11, 171), Port::INPUT, module, MONO::SOLOT_INPUT));
  175. addParam(ParamWidget::create<LEDButton>(Vec(38, 208), module, MONO::ON_PARAM, 0.0, 1.0, 0.0));
  176. addChild(ModuleLightWidget::create<MediumLight<BlueLight>>(Vec(42.4, 212.4), module, MONO::ON_LIGHT));
  177. addInput(Port::create<PJ301MPort>(Vec(11, 211), Port::INPUT, module, MONO::ONT_INPUT));
  178. addInput(Port::create<PJ301MPort>(Vec(11, 321), Port::INPUT, module, MONO::IN1_INPUT));
  179. addOutput(Port::create<PJ301MPort>(Vec(54, 321), Port::OUTPUT, module, MONO::OUT1_OUTPUT));
  180. addOutput(Port::create<PJ301MPort>(Vec(54, 31), Port::OUTPUT, module, MONO::EXTSOLO_OUTPUT));
  181. addOutput(Port::create<PJ301MPort>(Vec(54, 61), Port::OUTPUT, module, MONO::LEFT_OUTPUT));
  182. addOutput(Port::create<PJ301MPort>(Vec(54, 91), Port::OUTPUT, module, MONO::RIGHT_OUTPUT));
  183. addInput(Port::create<PJ301MPort>(Vec(11, 31), Port::INPUT, module, MONO::EXTSOLO_INPUT));
  184. addInput(Port::create<PJ301MPort>(Vec(11, 61), Port::INPUT, module, MONO::LEFT_INPUT));
  185. addInput(Port::create<PJ301MPort>(Vec(11, 91), Port::INPUT, module, MONO::RIGHT_INPUT));
  186. for (int i = 0; i < 11; i++) {
  187. if (i<10) addChild(ModuleLightWidget::create<MediumLight<BlueLight>>(Vec(70, 242-i*12), module, MONO::LEVEL_LIGHTS + i));
  188. else addChild(ModuleLightWidget::create<MediumLight<RedLight>>(Vec(70, 242-i*12), module, MONO::LEVEL_LIGHTS + i));
  189. }
  190. }
  191. } // namespace rack_plugin_cf
  192. using namespace rack_plugin_cf;
  193. RACK_PLUGIN_MODEL_INIT(cf, MONO) {
  194. Model *modelMONO = Model::create<MONO, MONOWidget>("cf", "MONO", "Mono", MIXER_TAG);
  195. return modelMONO;
  196. }