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.

106 lines
3.6KB

  1. #include "QuantalAudio.hpp"
  2. #include "dsp/digital.hpp"
  3. namespace rack_plugin_QuantalAudio {
  4. struct DaisyMaster : Module {
  5. enum ParamIds {
  6. MIX_LVL_PARAM,
  7. MUTE_PARAM,
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. MIX_CV_INPUT,
  12. CHAIN_INPUT,
  13. NUM_INPUTS
  14. };
  15. enum OutputIds {
  16. MIX_OUTPUT,
  17. NUM_OUTPUTS
  18. };
  19. enum LightsIds {
  20. MUTE_LIGHT,
  21. NUM_LIGHTS
  22. };
  23. // Hypothetically the max number of channels that could be chained
  24. // Needs to match the divisor in the daisy channel class
  25. float DAISY_DIVISOR = 16.f;
  26. bool muted = false;
  27. SchmittTrigger muteTrigger;
  28. DaisyMaster() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  29. json_t *toJson() override {
  30. json_t *rootJ = json_object();
  31. // mute
  32. json_object_set_new(rootJ, "muted", json_boolean(muted));
  33. return rootJ;
  34. }
  35. void fromJson(json_t *rootJ) override {
  36. // mute
  37. json_t *mutedJ = json_object_get(rootJ, "muted");
  38. if (mutedJ)
  39. muted = json_is_true(mutedJ);
  40. }
  41. void step() override {
  42. if (muteTrigger.process(params[MUTE_PARAM].value)) {
  43. muted = !muted;
  44. }
  45. float mix = 0.f;
  46. if (!muted) {
  47. // Bring the voltage back up from the chained low voltage
  48. mix = clamp(inputs[CHAIN_INPUT].value * DAISY_DIVISOR, -12.f, 12.f);
  49. mix *= params[MIX_LVL_PARAM].value;
  50. float mix_cv = 1.f;
  51. if (inputs[MIX_CV_INPUT].active)
  52. mix_cv = clamp(inputs[MIX_CV_INPUT].value / 10.f, 0.f, 1.f);
  53. mix *= mix_cv;
  54. }
  55. outputs[MIX_OUTPUT].value = mix;
  56. lights[MUTE_LIGHT].value = (muted);
  57. }
  58. };
  59. struct DaisyMasterWidget : ModuleWidget {
  60. DaisyMasterWidget(DaisyMaster *module) : ModuleWidget(module) {
  61. setPanel(SVG::load(assetPlugin(plugin, "res/DaisyMaster.svg")));
  62. // Screws
  63. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  64. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  65. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  66. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  67. // Level & CV
  68. addParam(ParamWidget::create<RoundLargeBlackKnob>(Vec(RACK_GRID_WIDTH * 1.5 - (38.0/2), 52.0), module, DaisyMaster::MIX_LVL_PARAM, 0.0, 2.0, 1.0));
  69. addInput(Port::create<PJ301MPort>(Vec(RACK_GRID_WIDTH * 1.5 - (25.0/2), 96.0), Port::INPUT, module, DaisyMaster::MIX_CV_INPUT));
  70. // Mute
  71. addParam(ParamWidget::create<LEDButton>(Vec(RACK_GRID_WIDTH * 1.5 - 9.0, 206.0), module, DaisyMaster::MUTE_PARAM, 0.0f, 1.0f, 0.0f));
  72. addChild(ModuleLightWidget::create<MediumLight<RedLight>>(Vec(RACK_GRID_WIDTH * 1.5 - 4.5, 210.25f), module, DaisyMaster::MUTE_LIGHT));
  73. // Mix output
  74. addOutput(Port::create<PJ301MPort>(Vec((RACK_GRID_WIDTH * 1.5) - (25.0/2), 245.0), Port::OUTPUT, module, DaisyMaster::MIX_OUTPUT));
  75. // Chain input
  76. addInput(Port::create<PJ301MPort>(Vec((RACK_GRID_WIDTH * 1.5) - (25.0/2), 290.5), Port::INPUT, module, DaisyMaster::CHAIN_INPUT));
  77. }
  78. };
  79. } // namespace rack_plugin_QuantalAudio
  80. using namespace rack_plugin_QuantalAudio;
  81. RACK_PLUGIN_MODEL_INIT(QuantalAudio, DaisyMaster) {
  82. Model *modelDaisyMaster = Model::create<DaisyMaster, DaisyMasterWidget>("QuantalAudio", "DaisyMaster", "Daisy Mix Master | 3HP", MIXER_TAG, AMPLIFIER_TAG);
  83. return modelDaisyMaster;
  84. }