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.

237 lines
7.9KB

  1. #include "Spiralone.hpp"
  2. #include "SpiraloneModule.hpp"
  3. #include <math.h>
  4. namespace rack_plugin_TheXOR {
  5. float AccessParam(Spiralone *p, int seq, int id) { return p->params[id + seq].value; }
  6. float AccessParam(Spiralone *p, int id) { return p->params[id].value; }
  7. Input *AccessInput(Spiralone *p, int seq, int id) { return &p->inputs[id + seq]; }
  8. float *AccessOutput(Spiralone *p, int seq, int id) { return &p->outputs[id + seq].value; }
  9. float *AccessLight(Spiralone *p, int id) { return &p->lights[id].value; }
  10. void Spiralone::on_loaded()
  11. {
  12. #ifdef DIGITAL_EXT
  13. connected = 0;
  14. #endif
  15. load();
  16. }
  17. void Spiralone::load()
  18. {
  19. for(int k = 0; k < NUM_SEQUENCERS; k++)
  20. sequencer[k].Reset(k, this);
  21. }
  22. void Spiralone::step()
  23. {
  24. if(masterReset.process(params[M_RESET].value))
  25. {
  26. load();
  27. } else
  28. {
  29. for(int k = 0; k < NUM_SEQUENCERS; k++)
  30. sequencer[k].Step(k, this);
  31. }
  32. #ifdef DIGITAL_EXT
  33. bool dig_connected = false;
  34. #ifdef LAUNCHPAD
  35. if(drv->Connected())
  36. dig_connected = true;
  37. drv->ProcessLaunchpad();
  38. #endif
  39. #if defined(OSCTEST_MODULE)
  40. if(oscDrv->Connected())
  41. dig_connected = true;
  42. oscDrv->ProcessOSC();
  43. #endif
  44. connected = dig_connected ? 1.0 : 0.0;
  45. #endif
  46. }
  47. SpiraloneWidget::SpiraloneWidget(Spiralone *module) : SequencerWidget(module)
  48. {
  49. #ifdef OSCTEST_MODULE
  50. char name[60];
  51. #endif
  52. color[0] = COLOR_RED;
  53. color[1] = COLOR_WHITE;
  54. color[2] = COLOR_BLUE;
  55. color[3] = COLOR_YELLOW;
  56. color[4] = COLOR_GREEN;
  57. box.size = Vec(51 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  58. SVGPanel *panel = new SVGPanel();
  59. panel->box.size = box.size;
  60. panel->setBackground(SVG::load(assetPlugin(plugin, "res/modules/SpiraloneModule.svg")));
  61. addChild(panel);
  62. addChild(Widget::create<ScrewBlack>(Vec(RACK_GRID_WIDTH, 0)));
  63. addChild(Widget::create<ScrewBlack>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  64. addChild(Widget::create<ScrewBlack>(Vec(RACK_GRID_WIDTH, box.size.y - RACK_GRID_WIDTH)));
  65. addChild(Widget::create<ScrewBlack>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y - RACK_GRID_WIDTH)));
  66. float step = 2 * M_PI / TOTAL_STEPS;
  67. float angle = M_PI / 2.0;
  68. for(int k = 0; k < TOTAL_STEPS; k++)
  69. {
  70. float r = 56.0;
  71. float cx = cos(angle);
  72. float cy = sin(angle);
  73. float center_y = 64.250;
  74. float center_x = 66.894;
  75. ParamWidget *pctrl = ParamWidget::create<Davies1900hFixWhiteKnobSmall>(Vec(mm2px(center_x-4.0+r*cx), yncscape(center_y-4.0 +r*cy, 8.0)), module, Spiralone::VOLTAGE_1 + k, 0.0, 6.0, 1.0);
  76. #ifdef OSCTEST_MODULE
  77. sprintf(name, "/Knob%i", k + 1);
  78. oscControl *oc = new oscControl(name);
  79. module->oscDrv->Add(oc, pctrl);
  80. #endif
  81. addParam(pctrl);
  82. r -= 2;
  83. for(int s = 0; s < NUM_SEQUENCERS; s++)
  84. {
  85. int n = s * TOTAL_STEPS + k;
  86. r -= 6;
  87. ModuleLightWidget *plight = createLed(s, Vec(mm2px(center_x-1.088+ r*cx), yncscape(center_y-1.088 + r*cy, 2.176)), module, Spiralone::LED_SEQUENCE_1 + n);
  88. #ifdef OSCTEST_MODULE
  89. sprintf(name, "/Led%i_%i", s+1, n + 1);
  90. oc = new oscControl(name);
  91. module->oscDrv->Add(oc, plight);
  92. #endif
  93. addChild(plight);
  94. if(k == 0)
  95. createSequencer(s);
  96. }
  97. angle += step;
  98. }
  99. addParam(ParamWidget::create<BefacoPushBig>(Vec(mm2px(7.970), yncscape(113.627, 8.999)), module, Spiralone::M_RESET, 0.0, 1.0, 0.0));
  100. #ifdef DIGITAL_EXT
  101. addChild(new DigitalLed(mm2px(6.894), yncscape(8.250,3.867), &module->connected));
  102. #endif
  103. }
  104. void SpiraloneWidget::createSequencer(int seq)
  105. {
  106. #ifdef OSCTEST_MODULE
  107. char name[60];
  108. #endif
  109. float dist_v = -25.206;
  110. addInput(Port::create<PJ301RPort>(Vec(mm2px(143.251), yncscape(115.825+dist_v*seq,8.255)), Port::INPUT, module, Spiralone::CLOCK_1 + seq));
  111. addInput(Port::create<PJ301YPort>(Vec(mm2px(143.251), yncscape(104.395+dist_v*seq,8.255)), Port::INPUT, module, Spiralone::RESET_1 + seq));
  112. ParamWidget *pwdg = ParamWidget::create<BefacoSnappedSwitch>(Vec(mm2px(158.607), yncscape(109.773 + dist_v*seq, 7.883)), module, Spiralone::MODE_1 + seq, 0.0, 1.0, 0.0);
  113. addParam(pwdg);
  114. #ifdef LAUNCHPAD
  115. int color_launchpad[NUM_SEQUENCERS][2];
  116. color_launchpad[0][0] = 11; color_launchpad[0][1] = 5;
  117. color_launchpad[1][0] = 1; color_launchpad[1][1] = 3;
  118. color_launchpad[2][0] = 47; color_launchpad[2][1] = 37;
  119. color_launchpad[3][0] = 15; color_launchpad[3][1] = 12;
  120. color_launchpad[4][0] = 19; color_launchpad[4][1] = 21;
  121. LaunchpadRadio *sw = new LaunchpadRadio(0, 0, ILaunchpadPro::RC2Key(0, seq), 2, LaunchpadLed::Color(color_launchpad[seq][0]), LaunchpadLed::Color(color_launchpad[seq][1]));
  122. ((Spiralone *)module)->drv->Add(sw, pwdg);
  123. #endif
  124. #ifdef OSCTEST_MODULE
  125. sprintf(name, "/Mode%i", seq + 1);
  126. oscControl *oc = new oscControl(name);
  127. ((Spiralone *)module)->oscDrv->Add(oc, pwdg);
  128. #endif
  129. pwdg = ParamWidget::create<Davies1900hFixWhiteKnobSmall>(Vec(mm2px(175.427), yncscape(115.953 + dist_v*seq, 8.0)), module, Spiralone::LENGHT_1 + seq, 1.0, TOTAL_STEPS, TOTAL_STEPS);
  130. ((Davies1900hKnob *)pwdg)->snap = true;
  131. #ifdef OSCTEST_MODULE
  132. sprintf(name, "/Lenght%i", seq + 1);
  133. oc = new oscControl(name);
  134. ((Spiralone *)module)->oscDrv->Add(oc, pwdg);
  135. #endif
  136. addParam(pwdg);
  137. addInput(Port::create<PJ301BPort>(Vec(mm2px(181.649), yncscape(104.395 + dist_v*seq, 8.0)), Port::INPUT, module, Spiralone::INLENGHT_1 + seq));
  138. pwdg = ParamWidget::create<Davies1900hFixWhiteKnobSmall>(Vec(mm2px(195.690), yncscape(115.953 + dist_v*seq, 8.255)), module, Spiralone::STRIDE_1 + seq, 1.0, 8.0, 1.0);
  139. ((Davies1900hKnob *)pwdg)->snap = true;
  140. #ifdef OSCTEST_MODULE
  141. sprintf(name, "/Stride%i", seq + 1);
  142. oc = new oscControl(name);
  143. ((Spiralone *)module)->oscDrv->Add(oc, pwdg);
  144. #endif
  145. addParam(pwdg);
  146. addInput(Port::create<PJ301BPort>(Vec(mm2px(201.913), yncscape(104.395 + dist_v*seq, 8.255)), Port::INPUT, module, Spiralone::INSTRIDE_1 + seq));
  147. pwdg = ParamWidget::create<Davies1900hFixWhiteKnobSmall>(Vec(mm2px(215.954), yncscape(115.953 + dist_v*seq, 8.0)), module, Spiralone::XPOSE_1 + seq, -3.0, 3.0, 0.0);
  148. #ifdef OSCTEST_MODULE
  149. sprintf(name, "/Transpose%i", seq + 1);
  150. oc = new oscControl(name);
  151. ((Spiralone *)module)->oscDrv->Add(oc, pwdg);
  152. #endif
  153. addParam(pwdg);
  154. addInput(Port::create<PJ301BPort>(Vec(mm2px(222.177), yncscape(104.395 + dist_v*seq, 8.255)), Port::INPUT, module, Spiralone::INXPOSE_1 + seq));
  155. addOutput(Port::create<PJ301GPort>(Vec(mm2px(238.996), yncscape(115.825 + dist_v*seq, 8.255)), Port::OUTPUT, module, Spiralone::CV_1 + seq));
  156. addOutput(Port::create<PJ301WPort>(Vec(mm2px(238.996), yncscape(104.395 + dist_v*seq, 8.255)), Port::OUTPUT, module, Spiralone::GATE_1 + seq));
  157. }
  158. ModuleLightWidget *SpiraloneWidget::createLed(int seq, Vec pos, Module *module, int firstLightId, bool big)
  159. {
  160. ModuleLightWidget * rv = new ModuleLightWidget();
  161. if(big)
  162. rv->box.size = mm2px(Vec(3, 3));
  163. else
  164. rv->box.size = mm2px(Vec(2.176, 2.176));
  165. rv->box.pos = pos;
  166. rv->addBaseColor(color[seq]);
  167. rv->module = module;
  168. rv->firstLightId = firstLightId;
  169. //rv->bgColor = COLOR_BLACK_TRANSPARENT;
  170. return rv;
  171. }
  172. Menu *SpiraloneWidget::addContextMenu(Menu *menu)
  173. {
  174. menu->addChild(new SeqMenuItem<SpiraloneWidget>("Randomize Pitch", this, RANDOMIZE_PITCH));
  175. menu->addChild(new SeqMenuItem<SpiraloneWidget>("Randomize Length", this, RANDOMIZE_LEN));
  176. menu->addChild(new SeqMenuItem<SpiraloneWidget>("Randomize Stride", this, RANDOMIZE_STRIDE));
  177. menu->addChild(new SeqMenuItem<SpiraloneWidget>("Randomize Transpose", this, RANDOMIZE_XPOSE));
  178. return menu;
  179. }
  180. void SpiraloneWidget::onMenu(int action)
  181. {
  182. switch(action)
  183. {
  184. case RANDOMIZE_PITCH:
  185. std_randomize(Spiralone::VOLTAGE_1, Spiralone::VOLTAGE_1 + TOTAL_STEPS);
  186. break;
  187. case RANDOMIZE_LEN:
  188. std_randomize(Spiralone::LENGHT_1, Spiralone::LENGHT_1 + NUM_SEQUENCERS);
  189. break;
  190. case RANDOMIZE_STRIDE:
  191. std_randomize(Spiralone::STRIDE_1, Spiralone::STRIDE_1 + NUM_SEQUENCERS);
  192. break;
  193. case RANDOMIZE_XPOSE:
  194. std_randomize(Spiralone::XPOSE_1, Spiralone::XPOSE_1 + NUM_SEQUENCERS);
  195. break;
  196. }
  197. }
  198. } // namespace rack_plugin_TheXOR
  199. using namespace rack_plugin_TheXOR;
  200. RACK_PLUGIN_MODEL_INIT(TheXOR, Spiralone) {
  201. return Model::create<Spiralone, SpiraloneWidget>("TheXOR", "Spiralone", "Spiralone Sequencer", SEQUENCER_TAG);
  202. }