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.

245 lines
7.2KB

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