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.

259 lines
9.1KB

  1. #include "Renato.hpp"
  2. #include <sstream>
  3. namespace rack_plugin_TheXOR {
  4. bool Access(Renato *pr, bool is_x, int p) { return is_x ? pr->_accessX(p) : pr->_accessY(p); }
  5. void Renato::on_loaded()
  6. {
  7. #ifdef DIGITAL_EXT
  8. connected = 0;
  9. #endif
  10. load();
  11. }
  12. void Renato::load()
  13. {
  14. seqX.Reset();
  15. seqY.Reset();
  16. }
  17. void Renato::step()
  18. {
  19. if(resetTrigger.process(inputs[RESET].value))
  20. {
  21. seqX.Reset();
  22. seqY.Reset();
  23. } else
  24. {
  25. bool seek_mode = params[SEEKSLEEP].value > 0;
  26. int clkX = seqX.Step(inputs[XCLK].value, params[COUNTMODE_X].value, seek_mode, this, true);
  27. int clkY = seqY.Step(inputs[YCLK].value, params[COUNTMODE_Y].value, seek_mode, this, false);
  28. int n = xy(seqX.Position(), seqY.Position());
  29. if(_access(n))
  30. {
  31. bool on = false;
  32. if(_gateX(n))
  33. {
  34. if(seqX.Gate(clkX, &outputs[XGATE], &lights[LED_GATEX]))
  35. on = true;
  36. }
  37. if(_gateY(n))
  38. {
  39. if(seqY.Gate(clkY, &outputs[YGATE], &lights[LED_GATEY]))
  40. on = true;
  41. }
  42. outputs[CV].value = params[VOLTAGE_1 + n].value;
  43. outputs[CV_OUTSTEP1 + n].value = on ? LVL_ON : LVL_OFF;
  44. led(n);
  45. }
  46. }
  47. #ifdef DIGITAL_EXT
  48. bool dig_connected = false;
  49. #ifdef LAUNCHPAD
  50. if(drv->Connected())
  51. dig_connected = true;
  52. drv->ProcessLaunchpad();
  53. #endif
  54. #if defined(OSCTEST_MODULE)
  55. if(oscDrv->Connected())
  56. dig_connected = true;
  57. oscDrv->ProcessOSC();
  58. #endif
  59. connected = dig_connected ? 1.0 : 0.0;
  60. #endif
  61. }
  62. Menu *RenatoWidget::addContextMenu(Menu *menu)
  63. {
  64. menu->addChild(new SeqMenuItem<RenatoWidget>("Randomize Pitch", this, RANDOMIZE_PITCH));
  65. menu->addChild(new SeqMenuItem<RenatoWidget>("Randomize Gate Xs", this, RANDOMIZE_GATEX));
  66. menu->addChild(new SeqMenuItem<RenatoWidget>("Randomize Gate Ys", this, RANDOMIZE_GATEY));
  67. menu->addChild(new SeqMenuItem<RenatoWidget>("Randomize Access", this, RANDOMIZE_ACCESS));
  68. return menu;
  69. }
  70. void RenatoWidget::onMenu(int action)
  71. {
  72. switch(action)
  73. {
  74. case RANDOMIZE_PITCH: std_randomize(Renato::VOLTAGE_1, Renato::VOLTAGE_1 + 16); break;
  75. case RANDOMIZE_GATEX: std_randomize(Renato::GATEX_1, Renato::GATEX_1 + 16); break;
  76. case RANDOMIZE_GATEY: std_randomize(Renato::GATEY_1, Renato::GATEY_1 + 16); break;
  77. case RANDOMIZE_ACCESS: std_randomize(Renato::ACCESS_1, Renato::ACCESS_1 + 16); break;
  78. }
  79. }
  80. RenatoWidget::RenatoWidget(Renato *module ) : SequencerWidget(module)
  81. {
  82. #ifdef OSCTEST_MODULE
  83. char name[60];
  84. #endif
  85. box.size = Vec(39 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  86. SVGPanel *panel = new SVGPanel();
  87. panel->box.size = box.size;
  88. panel->setBackground(SVG::load(assetPlugin(plugin, "res/modules/RenatoModule.svg")));
  89. addChild(panel);
  90. addChild(Widget::create<ScrewBlack>(Vec(RACK_GRID_WIDTH, 0)));
  91. addChild(Widget::create<ScrewBlack>(Vec(box.size.x - 2*RACK_GRID_WIDTH, 0)));
  92. addChild(Widget::create<ScrewBlack>(Vec(RACK_GRID_WIDTH, box.size.y - RACK_GRID_WIDTH)));
  93. addChild(Widget::create<ScrewBlack>(Vec(box.size.x - 2*RACK_GRID_WIDTH, box.size.y - RACK_GRID_WIDTH)));
  94. addInput(Port::create<PJ301RPort>(Vec(mm2px(7.899), yncscape(115.267,8.255)), Port::INPUT, module, Renato::XCLK));
  95. addInput(Port::create<PJ301RPort>(Vec(mm2px(28.687), yncscape(115.267,8.255)), Port::INPUT, module, Renato::YCLK));
  96. addInput(Port::create<PJ301YPort>(Vec(mm2px(133.987), yncscape(115.267,8.255)), Port::INPUT, module, Renato::RESET));
  97. // page 0 (SESSION)
  98. ParamWidget *pwdg = ParamWidget::create<NKK2>(Vec(mm2px(71.102), yncscape(115.727+1, 8.467)), module, Renato::COUNTMODE_X, 0.0, 2.0, 0.0);
  99. addParam(pwdg);
  100. #ifdef LAUNCHPAD
  101. LaunchpadRadio *radio = new LaunchpadRadio(0, ILaunchpadPro::RC2Key(2, 1), 3, LaunchpadLed::Color(47), LaunchpadLed::Color(32));
  102. module->drv->Add(radio, pwdg);
  103. #endif
  104. #ifdef OSCTEST_MODULE
  105. sprintf(name, "/ModeX");
  106. oscControl *oc = new oscControl(name);
  107. module->oscDrv->Add(oc, pwdg);
  108. #endif
  109. pwdg = ParamWidget::create<NKK2>(Vec(mm2px(94.827), yncscape(115.727+1, 8.467)), module, Renato::COUNTMODE_Y, 0.0, 2.0, 0.0);
  110. addParam(pwdg);
  111. #ifdef LAUNCHPAD
  112. radio = new LaunchpadRadio(0, ILaunchpadPro::RC2Key(2, 3), 3, LaunchpadLed::Color(19), LaunchpadLed::Color(21));
  113. module->drv->Add(radio, pwdg);
  114. #endif
  115. #ifdef OSCTEST_MODULE
  116. sprintf(name, "/ModeY");
  117. oc = new oscControl(name);
  118. module->oscDrv->Add(oc, pwdg);
  119. #endif
  120. pwdg = ParamWidget::create<NKK2>(Vec(mm2px(118.551), yncscape(115.727+1, 8.467)), module, Renato::SEEKSLEEP, 0.0, 1.0, 0.0);
  121. addParam(pwdg);
  122. #ifdef LAUNCHPAD
  123. radio = new LaunchpadRadio(0, ILaunchpadPro::RC2Key(2, 5), 2, LaunchpadLed::Color(51), LaunchpadLed::Color(52));
  124. module->drv->Add(radio, pwdg);
  125. #endif
  126. #ifdef OSCTEST_MODULE
  127. sprintf(name, "/Seek");
  128. oc = new oscControl(name);
  129. module->oscDrv->Add(oc, pwdg);
  130. #endif
  131. addOutput(Port::create<PJ301GPort>(Vec(mm2px(181.436), yncscape(115.267, 8.255)), Port::OUTPUT, module, Renato::CV));
  132. addOutput(Port::create<PJ301WPort>(Vec(mm2px(150.245), yncscape(115.267, 8.255)), Port::OUTPUT, module, Renato::XGATE));
  133. ModuleLightWidget *plight = ModuleLightWidget::create<MediumLight<GreenLight>>(Vec(mm2px(157.888), yncscape(112.637, 3.176)), module, Renato::LED_GATEX);
  134. #ifdef OSCTEST_MODULE
  135. sprintf(name, "/LedGX");
  136. oc = new oscControl(name);
  137. module->oscDrv->Add(oc, plight);
  138. #endif
  139. addChild(plight);
  140. addOutput(Port::create<PJ301WPort>(Vec(mm2px(171.033), yncscape(115.267, 8.255)), Port::OUTPUT, module, Renato::YGATE));
  141. plight = ModuleLightWidget::create<MediumLight<GreenLight>>(Vec(mm2px(168.403), yncscape(112.637, 3.176)), module, Renato::LED_GATEY);
  142. #ifdef OSCTEST_MODULE
  143. sprintf(name, "/LedGY");
  144. oc = new oscControl(name);
  145. module->oscDrv->Add(oc, plight);
  146. #endif
  147. addChild(plight);
  148. // page 1 (NOTES)
  149. float groupdist_h = 47.343;
  150. float groupdist_v = -27.8;
  151. float x_sup[4] = {7.899, 18.293, 28.687, 39.330};
  152. float x_inf[4] = {7.899, 18.293, 28.687, 38.695};
  153. float x_led = 46.981;
  154. float y_led = 14.445;
  155. float y_sup = 100.419;
  156. float y_inf = 90.196;
  157. float y_pot = 89.561;
  158. for(int r = 0; r < 4; r++)
  159. {
  160. for(int c = 0; c < 4; c++)
  161. {
  162. int n = c + r * 4;
  163. addInput(Port::create<PJ301BPort>(Vec(mm2px(x_sup[0]+c* groupdist_h), yncscape(y_sup + r * groupdist_v, 8.255)), Port::INPUT, module, Renato::ACCESS_IN1+n));
  164. addInput(Port::create<PJ301BPort>(Vec(mm2px(x_sup[1] + c * groupdist_h), yncscape(y_sup+r*groupdist_v, 8.255)), Port::INPUT, module, Renato::GATEX_IN1 + n));
  165. addInput(Port::create<PJ301BPort>(Vec(mm2px(x_sup[2] + c * groupdist_h), yncscape(y_sup+r*groupdist_v, 8.255)), Port::INPUT, module, Renato::GATEY_IN1 + n));
  166. addOutput(Port::create<PJ301WPort>(Vec(mm2px(x_sup[3] + c * groupdist_h), yncscape(y_sup+r*groupdist_v, 8.255)), Port::OUTPUT, module, Renato::CV_OUTSTEP1 + n));
  167. ParamWidget *pwdg = ParamWidget::create<TL1105Sw>(Vec(mm2px(x_inf[0]+c*groupdist_h), yncscape(y_inf + r * groupdist_v, 8.255)), module, Renato::ACCESS_1 + n, 0.0, 1.0, 1.0);
  168. addParam(pwdg);
  169. #ifdef LAUNCHPAD
  170. LaunchpadSwitch *pswitch = new LaunchpadSwitch(1, ILaunchpadPro::RC2Key(r + 4, c), LaunchpadLed::Off(), LaunchpadLed::Color(17));
  171. module->drv->Add(pswitch, pwdg);
  172. #endif
  173. #ifdef OSCTEST_MODULE
  174. sprintf(name, "/Access%i", n + 1);
  175. oc = new oscControl(name);
  176. module->oscDrv->Add(oc, pwdg);
  177. #endif
  178. pwdg = ParamWidget::create<TL1105Sw>(Vec(mm2px(x_inf[1] + c * groupdist_h), yncscape(y_inf + r * groupdist_v, 8.255)), module, Renato::GATEX_1 + n, 0.0, 1.0, 1.0);
  179. addParam(pwdg);
  180. #ifdef LAUNCHPAD
  181. pswitch = new LaunchpadSwitch(1, ILaunchpadPro::RC2Key(r + 4, c + 4), LaunchpadLed::Off(), LaunchpadLed::Color(52));
  182. module->drv->Add(pswitch, pwdg);
  183. #endif
  184. #ifdef OSCTEST_MODULE
  185. sprintf(name, "/GateX%i", n + 1);
  186. oc = new oscControl(name);
  187. module->oscDrv->Add(oc, pwdg);
  188. #endif
  189. pwdg = ParamWidget::create<TL1105Sw>(Vec(mm2px(x_inf[2] + c * groupdist_h), yncscape(y_inf + r * groupdist_v, 8.255)), module, Renato::GATEY_1 + n, 0.0, 1.0, 1.0);
  190. addParam(pwdg);
  191. #ifdef LAUNCHPAD
  192. pswitch = new LaunchpadSwitch(1, ILaunchpadPro::RC2Key(r, c + 4), LaunchpadLed::Off(), LaunchpadLed::Color(62));
  193. module->drv->Add(pswitch, pwdg);
  194. #endif
  195. #ifdef OSCTEST_MODULE
  196. sprintf(name, "/GateY%i", n + 1);
  197. oc = new oscControl(name);
  198. module->oscDrv->Add(oc, pwdg);
  199. #endif
  200. pwdg = ParamWidget::create<Davies1900hFixBlackKnob>(Vec(mm2px(x_inf[3] + c * groupdist_h), yncscape(y_pot + r * groupdist_v, 9.525)), module, Renato::VOLTAGE_1 + n, 0.005, 6.0, 1.0);
  201. #ifdef OSCTEST_MODULE
  202. sprintf(name, "/Knob%i", n+1);
  203. oc = new oscControl(name);
  204. module->oscDrv->Add(oc, pwdg);
  205. #endif
  206. addParam(pwdg);
  207. ModuleLightWidget *plight = ModuleLightWidget::create<MediumLight<RedLight>>(Vec(mm2px(x_led + c * groupdist_h), yncscape(y_led+r*groupdist_v, 3.176)), module, Renato::LED_1 + n);
  208. addChild(plight);
  209. #ifdef LAUNCHPAD
  210. LaunchpadLight *ld1 = new LaunchpadLight(1, ILaunchpadPro::RC2Key(r, c), LaunchpadLed::Off(), LaunchpadLed::Color(4));
  211. module->drv->Add(ld1, plight);
  212. #endif
  213. #ifdef OSCTEST_MODULE
  214. sprintf(name, "/Led%i", n + 1);
  215. oc = new oscControl(name);
  216. module->oscDrv->Add(oc, plight);
  217. #endif
  218. }
  219. }
  220. #ifdef DIGITAL_EXT
  221. addChild(new DigitalLed(mm2px(50.616), yncscape(112.094, 3.867), &module->connected));
  222. #endif
  223. }
  224. } // namespace rack_plugin_TheXOR
  225. using namespace rack_plugin_TheXOR;
  226. RACK_PLUGIN_MODEL_INIT(TheXOR, Renato) {
  227. return Model::create<Renato, RenatoWidget>("TheXOR", "Renato", "Renato Sequencer", SEQUENCER_TAG);
  228. }