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.

92 lines
3.6KB

  1. #include "plugin.hpp"
  2. struct Split : Module {
  3. enum ParamIds {
  4. NUM_PARAMS
  5. };
  6. enum InputIds {
  7. POLY_INPUT,
  8. NUM_INPUTS
  9. };
  10. enum OutputIds {
  11. ENUMS(MONO_OUTPUTS, 16),
  12. NUM_OUTPUTS
  13. };
  14. enum LightIds {
  15. ENUMS(CHANNEL_LIGHTS, 16),
  16. NUM_LIGHTS
  17. };
  18. int lastChannels = 0;
  19. dsp::ClockDivider lightDivider;
  20. Split() {
  21. config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
  22. configInput(POLY_INPUT, "Polyphonic");
  23. for (int i = 0; i < 16; i++)
  24. configOutput(MONO_OUTPUTS + i, string::f("Channel %d", i + 1));
  25. lightDivider.setDivision(512);
  26. }
  27. void process(const ProcessArgs& args) override {
  28. for (int c = 0; c < 16; c++) {
  29. float v = inputs[POLY_INPUT].getVoltage(c);
  30. // To allow users to debug buggy modules, don't assume that undefined channel voltages are 0V.
  31. outputs[MONO_OUTPUTS + c].setVoltage(v);
  32. }
  33. lastChannels = inputs[POLY_INPUT].getChannels();
  34. }
  35. };
  36. struct SplitChannelDisplay : ChannelDisplay {
  37. Split* module;
  38. void step() override {
  39. int channels = module ? module->lastChannels : 16;
  40. text = string::f("%d", channels);
  41. }
  42. };
  43. struct SplitWidget : ModuleWidget {
  44. SplitWidget(Split* module) {
  45. setModule(module);
  46. setPanel(createPanel(asset::plugin(pluginInstance, "res/Split.svg")));
  47. addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  48. addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  49. addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  50. addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  51. addInput(createInputCentered<PJ301MPort>(mm2px(Vec(7.281, 21.967)), module, Split::POLY_INPUT));
  52. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(7.281, 41.995)), module, Split::MONO_OUTPUTS + 0));
  53. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(7.281, 52.155)), module, Split::MONO_OUTPUTS + 1));
  54. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(7.281, 62.315)), module, Split::MONO_OUTPUTS + 2));
  55. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(7.281, 72.475)), module, Split::MONO_OUTPUTS + 3));
  56. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(7.281, 82.635)), module, Split::MONO_OUTPUTS + 4));
  57. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(7.281, 92.795)), module, Split::MONO_OUTPUTS + 5));
  58. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(7.281, 102.955)), module, Split::MONO_OUTPUTS + 6));
  59. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(7.281, 113.115)), module, Split::MONO_OUTPUTS + 7));
  60. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(18.119, 41.995)), module, Split::MONO_OUTPUTS + 8));
  61. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(18.119, 52.155)), module, Split::MONO_OUTPUTS + 9));
  62. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(18.119, 62.315)), module, Split::MONO_OUTPUTS + 10));
  63. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(18.119, 72.475)), module, Split::MONO_OUTPUTS + 11));
  64. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(18.119, 82.635)), module, Split::MONO_OUTPUTS + 12));
  65. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(18.119, 92.795)), module, Split::MONO_OUTPUTS + 13));
  66. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(18.119, 102.955)), module, Split::MONO_OUTPUTS + 14));
  67. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(18.119, 113.115)), module, Split::MONO_OUTPUTS + 15));
  68. SplitChannelDisplay* display = createWidget<SplitChannelDisplay>(mm2px(Vec(14.02, 18.611)));
  69. display->box.size = mm2px(Vec(8.197, 8.197));
  70. display->module = module;
  71. addChild(display);
  72. }
  73. };
  74. Model* modelSplit = createModel<Split, SplitWidget>("Split");