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.

176 lines
6.6KB

  1. #include "Z8K.hpp"
  2. #include <sstream>
  3. namespace rack_plugin_TheXOR {
  4. void Z8K::on_loaded()
  5. {
  6. #ifdef DIGITAL_EXT
  7. connected = 0;
  8. #endif
  9. load();
  10. }
  11. void Z8K::load()
  12. {
  13. // sequencer 1-4
  14. for(int k = 0; k < 4; k++)
  15. {
  16. int base = VOLTAGE_1 + 4 * k;
  17. std::vector<int> steps = {base, base + 1, base + 2, base + 3};
  18. seq[SEQ_1 + k].Init(&inputs[RESET_1 + k], &inputs[DIR_1 + k], &inputs[CLOCK_1 + k], &outputs[CV_1 + k], &lights[LED_ROW], params, steps);
  19. }
  20. // sequencer A-D
  21. for(int k = 0; k < 4; k++)
  22. {
  23. std::vector<int> steps = {k, k + 4, k + 8, k + 12};
  24. seq[SEQ_A + k].Init(&inputs[RESET_A + k], &inputs[DIR_A + k], &inputs[CLOCK_A + k], &outputs[CV_A + k], &lights[LED_COL], params, steps);
  25. }
  26. // horiz
  27. std::vector<int> steps_h = {0,1,2,3,7,6,5,4,8,9,10,11,15,14,13,12};
  28. seq[SEQ_HORIZ].Init(&inputs[RESET_HORIZ], &inputs[DIR_HORIZ], &inputs[CLOCK_HORIZ], &outputs[CV_HORIZ], &lights[LED_HORIZ], params, steps_h);
  29. //vert
  30. std::vector<int> steps_v = {0,4,8,12,13,9,5,1,2,6,10,14,15,11,7,3};
  31. seq[SEQ_VERT].Init(&inputs[RESET_VERT], &inputs[DIR_VERT], &inputs[CLOCK_VERT], &outputs[CV_VERT], &lights[LED_VERT], params, steps_v);
  32. }
  33. void Z8K::step()
  34. {
  35. bool activeSteps[16];
  36. for(int k = 0; k < 16; k++)
  37. activeSteps[k] = false;
  38. for(int k = 0; k < NUM_SEQUENCERS; k++)
  39. activeSteps[seq[k].Step()] = true;
  40. for(int k = 0; k < 16; k++)
  41. {
  42. outputs[ACTIVE_STEP + k].value = activeSteps[k] ? LVL_ON : LVL_OFF;
  43. }
  44. #ifdef DIGITAL_EXT
  45. bool dig_connected = false;
  46. /*#ifdef LAUNCHPAD
  47. if(drv->Connected())
  48. dig_connected = true;
  49. drv->ProcessLaunchpad();
  50. #endif*/
  51. #if defined(OSCTEST_MODULE)
  52. if(oscDrv->Connected())
  53. dig_connected = true;
  54. oscDrv->ProcessOSC();
  55. #endif
  56. connected = dig_connected ? 1.0 : 0.0;
  57. #endif
  58. }
  59. Z8KWidget::Z8KWidget(Z8K *module) : SequencerWidget(module)
  60. {
  61. #ifdef OSCTEST_MODULE
  62. char name[60];
  63. #endif
  64. box.size = Vec(34 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  65. SVGPanel *panel = new SVGPanel();
  66. panel->box.size = box.size;
  67. panel->setBackground(SVG::load(assetPlugin(plugin, "res/modules/Z8KModule.svg")));
  68. addChild(panel);
  69. addChild(Widget::create<ScrewBlack>(Vec(RACK_GRID_WIDTH, 0)));
  70. addChild(Widget::create<ScrewBlack>(Vec(box.size.x - 2*RACK_GRID_WIDTH, 0)));
  71. addChild(Widget::create<ScrewBlack>(Vec(RACK_GRID_WIDTH, box.size.y - RACK_GRID_WIDTH)));
  72. addChild(Widget::create<ScrewBlack>(Vec(box.size.x - 2*RACK_GRID_WIDTH, box.size.y - RACK_GRID_WIDTH)));
  73. float dist_h = 22.225;
  74. float dist_v = -18.697;
  75. for(int k = 0; k < 4; k++)
  76. {
  77. addInput(Port::create<PJ301YPort>(Vec(mm2px(5.738), yncscape(82.210+k*dist_v,8.255)), Port::INPUT, module, Z8K::RESET_1 + k));
  78. addInput(Port::create<PJ301BPort>(Vec(mm2px(16.544), yncscape(82.210+k*dist_v,8.255)), Port::INPUT, module, Z8K::DIR_1 + k));
  79. addInput(Port::create<PJ301RPort>(Vec(mm2px(27.349), yncscape(82.210+k*dist_v,8.255)), Port::INPUT, module, Z8K::CLOCK_1 + k));
  80. }
  81. for(int k = 0; k < 4; k++)
  82. {
  83. addInput(Port::create<PJ301YPort>(Vec(mm2px(52.168+k*dist_h), yncscape(115.442,8.255)), Port::INPUT, module, Z8K::RESET_A + k));
  84. addInput(Port::create<PJ301BPort>(Vec(mm2px(52.168+k*dist_h), yncscape(105.695,8.255)), Port::INPUT, module, Z8K::DIR_A + k));
  85. addInput(Port::create<PJ301RPort>(Vec(mm2px(52.168+k*dist_h), yncscape(95.948,8.255)), Port::INPUT, module, Z8K::CLOCK_A + k));
  86. }
  87. addInput(Port::create<PJ301YPort>( Vec(mm2px(135.416), yncscape(111.040,8.255)), Port::INPUT, module, Z8K::RESET_VERT ));
  88. addInput(Port::create<PJ301BPort>( Vec(mm2px(143.995), yncscape(102.785,8.255)), Port::INPUT, module, Z8K::DIR_VERT));
  89. addInput(Port::create<PJ301RPort>( Vec(mm2px(152.575), yncscape(111.040,8.255)), Port::INPUT, module, Z8K::CLOCK_VERT ));
  90. addOutput(Port::create<PJ301GPort>(Vec(mm2px(161.154), yncscape(102.785,8.255)), Port::OUTPUT, module, Z8K::CV_VERT) );
  91. addInput(Port::create<PJ301YPort> (Vec(mm2px(5.738), yncscape(10.941, 8.255)), Port::INPUT, module, Z8K::RESET_HORIZ));
  92. addInput(Port::create<PJ301BPort> (Vec(mm2px(14.318), yncscape(2.685, 8.255)), Port::INPUT, module, Z8K::DIR_HORIZ ));
  93. addInput(Port::create<PJ301RPort> (Vec(mm2px(22.897), yncscape(10.941, 8.255)), Port::INPUT, module, Z8K::CLOCK_HORIZ));
  94. addOutput(Port::create<PJ301GPort>(Vec(mm2px(31.477), yncscape(2.685, 8.255)), Port::OUTPUT, module, Z8K::CV_HORIZ));
  95. for(int r = 0; r < 4; r++)
  96. {
  97. for(int c = 0; c < 4; c++)
  98. {
  99. int n = c + r * 4;
  100. ParamWidget *pctrl = ParamWidget::create<Davies1900hFixBlackKnob>(Vec(mm2px(51.533 + dist_h * c), yncscape(81.575+ dist_v * r,9.525)), module, Z8K::VOLTAGE_1 + n, 0.0, 1.0, 0.5);
  101. #ifdef OSCTEST_MODULE
  102. sprintf(name, "/Knob%i", n + 1);
  103. oscControl *oc = new oscControl(name);
  104. module->oscDrv->Add(oc, pctrl);
  105. #endif
  106. addParam(pctrl);
  107. ModuleLightWidget *plight = ModuleLightWidget::create<SmallLight<RedLight>>(Vec(mm2px(62.116 + dist_h * c), yncscape(85.272 + dist_v * r, 2.132)), module, Z8K::LED_ROW + n);
  108. #ifdef OSCTEST_MODULE
  109. sprintf(name, "/LedR%i", n + 1);
  110. oc = new oscControl(name);
  111. module->oscDrv->Add(oc, plight);
  112. #endif
  113. addChild(plight);
  114. plight = ModuleLightWidget::create<SmallLight<GreenLight>>(Vec(mm2px(55.230 + dist_h * c), yncscape(78.385 + dist_v * r, 2.132)), module, Z8K::LED_COL + n);
  115. #ifdef OSCTEST_MODULE
  116. sprintf(name, "/LedC%i", n + 1);
  117. oc = new oscControl(name);
  118. module->oscDrv->Add(oc, plight);
  119. #endif
  120. addChild(plight);
  121. plight = ModuleLightWidget::create<SmallLight<YellowLight>>(Vec(mm2px(51.533 + dist_h * c), yncscape(78.385 + dist_v * r, 2.132)), module, Z8K::LED_VERT + n);
  122. #ifdef OSCTEST_MODULE
  123. sprintf(name, "/LedV%i", n + 1);
  124. oc = new oscControl(name);
  125. module->oscDrv->Add(oc, plight);
  126. #endif
  127. addChild(plight);
  128. plight = ModuleLightWidget::create<SmallLight<BlueLight>>(Vec(mm2px(62.116 + dist_h * c), yncscape(81.575 + dist_v * r, 2.132)), module, Z8K::LED_HORIZ + n);
  129. #ifdef OSCTEST_MODULE
  130. sprintf(name, "/LedH%i", n + 1);
  131. oc = new oscControl(name);
  132. module->oscDrv->Add(oc, plight);
  133. #endif
  134. addChild(plight);
  135. if(r == 3)
  136. addOutput(Port::create<PJ301GPort>(Vec(mm2px(52.168+ dist_h * c), yncscape(2.685, 8.255)), Port::OUTPUT, module, Z8K::CV_A + c));
  137. addOutput(Port::create<PJ301WPort>(Vec(mm2px(57.362 + dist_h * c), yncscape(73.320 + dist_v * r, 8.255)), Port::OUTPUT, module, Z8K::ACTIVE_STEP + n));
  138. }
  139. addOutput(Port::create<PJ301GPort>(Vec(mm2px(161.154), yncscape(82.210+r*dist_v, 8.255)), Port::OUTPUT, module, Z8K::CV_1 + r));
  140. }
  141. #ifdef DIGITAL_EXT
  142. addChild(new DigitalLed(mm2px(161.770), yncscape(6.879, 7.074), &module->connected));
  143. #endif
  144. }
  145. } // namespace rack_plugin_TheXOR
  146. using namespace rack_plugin_TheXOR;
  147. RACK_PLUGIN_MODEL_INIT(TheXOR, Z8K) {
  148. return Model::create<Z8K, Z8KWidget>("TheXOR", "Z8K", "Z8K Sequencer", SEQUENCER_TAG);
  149. }