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.

215 lines
8.6KB

  1. ///////////////////////////////////////////////////
  2. //
  3. // VCA530 Clone
  4. // based on Fundamental Mixer
  5. //
  6. ///////////////////////////////////////////////////
  7. #include "dBiz.hpp"
  8. #include "dsp/digital.hpp"
  9. namespace rack_plugin_dBiz {
  10. ///////////////////////////////////////////////////
  11. struct VCA530 : Module {
  12. enum ParamIds
  13. {
  14. MIX1_PARAM,
  15. MIX2_PARAM,
  16. CH1_PARAM,
  17. CH2_PARAM,
  18. CH3_PARAM,
  19. CH4_PARAM,
  20. CH5_PARAM,
  21. CH6_PARAM,
  22. CV1_PARAM,
  23. CV2_PARAM,
  24. CV3_PARAM,
  25. CV4_PARAM,
  26. CV5_PARAM,
  27. CV6_PARAM,
  28. NUM_PARAMS
  29. };
  30. enum InputIds
  31. {
  32. CH1_INPUT,
  33. CH1_CV_INPUT,
  34. CH2_INPUT,
  35. CH2_CV_INPUT,
  36. CH3_INPUT,
  37. CH3_CV_INPUT,
  38. CH4_INPUT,
  39. CH4_CV_INPUT,
  40. CH5_INPUT,
  41. CH5_CV_INPUT,
  42. CH6_INPUT,
  43. CH6_CV_INPUT,
  44. NUM_INPUTS
  45. };
  46. enum OutputIds
  47. {
  48. SUM_OUTPUT_R,
  49. SUM_OUTPUT_L,
  50. MIX_OUTPUT_R,
  51. MIX_OUTPUT_L,
  52. NUM_OUTPUTS
  53. };
  54. enum LightIds
  55. {
  56. MIX1_LIGHTS,
  57. CLIP1_LIGHTS,
  58. MIX2_LIGHTS,
  59. CLIP2_LIGHTS,
  60. NUM_LIGHTS
  61. };
  62. VCA530() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  63. void step() override ;
  64. };
  65. void VCA530::step()
  66. {
  67. float ch1 = inputs[CH1_INPUT].value * params[CH1_PARAM].value;
  68. float ch2 = inputs[CH2_INPUT].value * params[CH2_PARAM].value;
  69. float ch3 = inputs[CH3_INPUT].value * params[CH3_PARAM].value;
  70. float ch4 = inputs[CH4_INPUT].value * params[CH4_PARAM].value;
  71. float ch5 = inputs[CH5_INPUT].value * params[CH5_PARAM].value;
  72. float ch6 = inputs[CH6_INPUT].value * params[CH6_PARAM].value;
  73. float sum_ch = (ch1 + ch2 + ch3 + ch4 + ch5 + ch6);
  74. float sum_mix_l = (ch1 + ch2 + ch3);
  75. float sum_mix_r = (ch4 + ch5 + ch6);
  76. float cv1 = sum_mix_l * (clamp(inputs[CH1_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f)) * (params[CV1_PARAM].value);
  77. float cv2 = sum_mix_l * (clamp(inputs[CH2_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f)) * (params[CV2_PARAM].value);
  78. float cv3 = sum_mix_l * (clamp(inputs[CH3_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f)) * (params[CV3_PARAM].value);
  79. float cv4 = sum_mix_r * (clamp(inputs[CH4_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f)) * (params[CV4_PARAM].value);
  80. float cv5 = sum_mix_r * (clamp(inputs[CH5_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f)) * (params[CV5_PARAM].value);
  81. float cv6 = sum_mix_r * (clamp(inputs[CH6_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f)) * (params[CV6_PARAM].value);
  82. float sum_l = sum_ch * params[MIX1_PARAM].value;
  83. float sum_r = sum_ch * params[MIX2_PARAM].value;
  84. float mix_l = sum_mix_l * params[MIX1_PARAM].value;
  85. float mix_r = sum_mix_r * params[MIX2_PARAM].value;
  86. float sum_cv_l = (cv1 + cv2 + cv3);
  87. float sum_cv_r = (cv4 + cv5 + cv6);
  88. outputs[SUM_OUTPUT_R].value = sum_r + sum_cv_r + sum_cv_l;
  89. outputs[SUM_OUTPUT_L].value = sum_l + sum_cv_l + sum_cv_r;
  90. outputs[MIX_OUTPUT_R].value = mix_r + sum_cv_r;
  91. outputs[MIX_OUTPUT_L].value = mix_l + sum_cv_l;
  92. lights[MIX1_LIGHTS].value = outputs[MIX_OUTPUT_L].value;
  93. lights[MIX2_LIGHTS].value = outputs[MIX_OUTPUT_R].value;
  94. if (outputs[MIX_OUTPUT_L].value > 4)
  95. lights[CLIP1_LIGHTS].value =1.0;
  96. else
  97. lights[CLIP1_LIGHTS].value = 0.0;
  98. if (outputs[MIX_OUTPUT_R].value > 4)
  99. lights[CLIP2_LIGHTS].value = 1.0;
  100. else
  101. lights[CLIP2_LIGHTS].value = 0.0;
  102. };
  103. struct VCA530Widget : ModuleWidget
  104. {
  105. VCA530Widget(VCA530 *module) : ModuleWidget(module)
  106. {
  107. box.size = Vec(15*12, 380);
  108. {
  109. SVGPanel *panel = new SVGPanel();
  110. panel->box.size = box.size;
  111. //panel->setBackground(SVG::load("plugins/mental/res/Mixer.svg"));
  112. panel->setBackground(SVG::load(assetPlugin(plugin,"res/VCA530.svg")));
  113. addChild(panel);
  114. }
  115. int column_1 =-15;
  116. int top_row = 60;
  117. int column_spacing = 27;
  118. int low = 350;
  119. int low_f = 230 ;
  120. int med = 180;
  121. int up =-15;
  122. addParam(ParamWidget::create<DaviesBlu>(Vec(52, med + up ), module, VCA530::MIX1_PARAM, 0.0, 1.0, 0.0));
  123. addParam(ParamWidget::create<DaviesBlu>(Vec(129, med + up), module, VCA530::MIX2_PARAM, 0.0, 1.0, 0.0));
  124. // channel strips
  125. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 1-5, 30+up), Port::INPUT, module, VCA530::CH1_INPUT));
  126. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 2-5, 30+up), Port::INPUT, module, VCA530::CH2_INPUT));
  127. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 3-5, 30+up), Port::INPUT, module, VCA530::CH3_INPUT));
  128. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 4-5, 30+up), Port::INPUT, module, VCA530::CH4_INPUT));
  129. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 5-5, 30+up), Port::INPUT, module, VCA530::CH5_INPUT));
  130. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 6-5, 30+up), Port::INPUT, module, VCA530::CH6_INPUT));
  131. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 1 ,top_row+up), module, VCA530::CH1_PARAM, 0.0, 1.0, 0.0));
  132. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 2, top_row+up), module, VCA530::CH2_PARAM, 0.0, 1.0, 0.0));
  133. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 3, top_row+up), module, VCA530::CH3_PARAM, 0.0, 1.0, 0.0));
  134. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 4, top_row+up), module, VCA530::CH4_PARAM, 0.0, 1.0, 0.0));
  135. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 5, top_row+up), module, VCA530::CH5_PARAM, 0.0, 1.0, 0.0));
  136. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 6, top_row+up), module, VCA530::CH6_PARAM, 0.0, 1.0, 0.0));
  137. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 1-5, low+up), Port::INPUT, module, VCA530::CH1_CV_INPUT));
  138. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 2-5, low+up), Port::INPUT, module, VCA530::CH2_CV_INPUT));
  139. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 3-5, low+up), Port::INPUT, module, VCA530::CH3_CV_INPUT));
  140. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 4-5, low+up), Port::INPUT, module, VCA530::CH4_CV_INPUT));
  141. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 5-5, low+up), Port::INPUT, module, VCA530::CH5_CV_INPUT));
  142. addInput(Port::create<PJ301MIPort>(Vec(column_1 + column_spacing * 6-5, low+up), Port::INPUT, module, VCA530::CH6_CV_INPUT));
  143. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 1 ,low_f+up), module, VCA530::CV1_PARAM, 0.0, 1.0, 0.0));
  144. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 2, low_f+up), module, VCA530::CV2_PARAM, 0.0, 1.0, 0.0));
  145. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 3, low_f+up), module, VCA530::CV3_PARAM, 0.0, 1.0, 0.0));
  146. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 4, low_f+up), module, VCA530::CV4_PARAM, 0.0, 1.0, 0.0));
  147. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 5, low_f+up), module, VCA530::CV5_PARAM, 0.0, 1.0, 0.0));
  148. addParam(ParamWidget::create<SlidePot2>(Vec(column_1 + column_spacing * 6, low_f+up), module, VCA530::CV6_PARAM, 0.0, 1.0, 0.0));
  149. //Screw
  150. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  151. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  152. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  153. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  154. // outputs
  155. addOutput(Port::create<PJ301MOPort>(Vec(15 , med+up), Port::OUTPUT, module, VCA530::MIX_OUTPUT_L));
  156. addOutput(Port::create<PJ301MOPort>(Vec(95 , med+up), Port::OUTPUT, module, VCA530::MIX_OUTPUT_R));
  157. //
  158. addOutput(Port::create<PJ301MOPort>(Vec(15, med+25+up), Port::OUTPUT, module, VCA530::SUM_OUTPUT_L));
  159. addOutput(Port::create<PJ301MOPort>(Vec(95, med+25+up), Port::OUTPUT, module, VCA530::SUM_OUTPUT_R));
  160. // lights
  161. addChild(GrayModuleLightWidget::create<SmallLight<GreenLight>>(Vec(42,med+5+20), module, VCA530::MIX1_LIGHTS));
  162. addChild(GrayModuleLightWidget::create<SmallLight<GreenLight>>(Vec(122,med+5+20), module, VCA530::MIX2_LIGHTS));
  163. addChild(GrayModuleLightWidget::create<SmallLight<RedLight>>(Vec(42,med-10+20), module, VCA530::CLIP1_LIGHTS));
  164. addChild(GrayModuleLightWidget::create<SmallLight<RedLight>>(Vec(122,med-10+20), module, VCA530::CLIP2_LIGHTS));
  165. }
  166. };
  167. } // namespace rack_plugin_dBiz
  168. using namespace rack_plugin_dBiz;
  169. RACK_PLUGIN_MODEL_INIT(dBiz, VCA530) {
  170. Model *modelVCA530 = Model::create<VCA530, VCA530Widget>("dBiz", "VCA530", "VCA530", MIXER_TAG);
  171. return modelVCA530;
  172. }