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.

264 lines
11KB

  1. ///////////////////////////////////////////////////
  2. //
  3. // dBiz revisited version of
  4. // Sub Mixer VCV Module
  5. // Built from fundamental VCMixer
  6. //
  7. // Strum 2017
  8. //
  9. ///////////////////////////////////////////////////
  10. #include "dBiz.hpp"
  11. #include "dsp/vumeter.hpp"
  12. namespace rack_plugin_dBiz {
  13. struct SubMix : Module {
  14. enum ParamIds {
  15. MIX_PARAM,
  16. CH1_PARAM,
  17. CH1_PAN_PARAM,
  18. CH2_PARAM,
  19. CH2_PAN_PARAM,
  20. CH3_PARAM,
  21. CH3_PAN_PARAM,
  22. CH4_PARAM,
  23. CH4_PAN_PARAM,
  24. NUM_PARAMS
  25. };
  26. enum InputIds {
  27. MIX_CV_INPUT,
  28. CH1_INPUT,
  29. CH1_CV_INPUT,
  30. CH1_PAN_INPUT,
  31. CH2_INPUT,
  32. CH2_CV_INPUT,
  33. CH2_PAN_INPUT,
  34. CH3_INPUT,
  35. CH3_CV_INPUT,
  36. CH3_PAN_INPUT,
  37. CH4_INPUT,
  38. CH4_CV_INPUT,
  39. CH4_PAN_INPUT,
  40. NUM_INPUTS
  41. };
  42. enum OutputIds {
  43. MIX_OUTPUT_L,
  44. MIX_OUTPUT_R,
  45. CH1_OUTPUT,
  46. CH2_OUTPUT,
  47. CH3_OUTPUT,
  48. CH4_OUTPUT,
  49. NUM_OUTPUTS
  50. };
  51. enum LightIds
  52. {
  53. VU1_LIGHT,
  54. VU2_LIGHT = VU1_LIGHT + 5,
  55. VU3_LIGHT = VU2_LIGHT + 5,
  56. VU4_LIGHT = VU3_LIGHT + 5,
  57. NUM_LIGHTS = VU4_LIGHT + 5
  58. };
  59. SubMix() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS,NUM_LIGHTS) {};
  60. void step() override ;
  61. };
  62. void SubMix::step() {
  63. float ch1 = inputs[CH1_INPUT].value * params[CH1_PARAM].value * clamp(inputs[CH1_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  64. float pan_cv_in_1 = inputs[CH1_PAN_INPUT].value/5;
  65. float pan_position_1 = pan_cv_in_1 + params[CH1_PAN_PARAM].value;
  66. if (pan_position_1 < 0) pan_position_1 = 0;
  67. if (pan_position_1 > 1) pan_position_1 = 1;
  68. float ch1_l = ch1 * (1-pan_position_1)* 2;
  69. float ch1_r = ch1 * pan_position_1 * 2;
  70. VUMeter vuMeter1;
  71. vuMeter1.dBInterval = 6.0;
  72. vuMeter1.setValue(ch1 / 10.0);
  73. for (int j = 0; j < 5; j++)
  74. {
  75. lights[VU1_LIGHT+j].setBrightnessSmooth(vuMeter1.getBrightness(j));
  76. }
  77. float ch2 = inputs[CH2_INPUT].value * params[CH2_PARAM].value * clamp(inputs[CH2_CV_INPUT].normalize(10.0f) / 10.0f, -1.0f, 1.0f);
  78. float pan_cv_in_2 = inputs[CH2_PAN_INPUT].value/5;
  79. float pan_position_2 = pan_cv_in_2 + params[CH2_PAN_PARAM].value;
  80. if (pan_position_2 < 0) pan_position_2 = 0;
  81. if (pan_position_2 > 1) pan_position_2 = 1;
  82. float ch2_l = ch2 * (1-pan_position_2)* 2;
  83. float ch2_r = ch2 * pan_position_2 * 2;
  84. VUMeter vuMeter2;
  85. vuMeter2.dBInterval = 6.0;
  86. vuMeter2.setValue(ch2 / 10.0);
  87. for (int j = 0; j < 5; j++)
  88. {
  89. lights[VU2_LIGHT + j].setBrightnessSmooth(vuMeter2.getBrightness(j));
  90. }
  91. float ch3 = inputs[CH3_INPUT].value * params[CH3_PARAM].value * clamp(inputs[CH3_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  92. float pan_cv_in_3 = inputs[CH3_PAN_INPUT].value/5;
  93. float pan_position_3 = pan_cv_in_3 + params[CH3_PAN_PARAM].value;
  94. if (pan_position_3 < 0) pan_position_3 = 0;
  95. if (pan_position_3 > 1) pan_position_3 = 1;
  96. float ch3_l = ch3 * (1-pan_position_3)* 2;
  97. float ch3_r = ch3 * pan_position_3 * 2;
  98. VUMeter vuMeter3;
  99. vuMeter3.dBInterval = 6.0;
  100. vuMeter3.setValue(ch3 / 10.0);
  101. for (int j = 0; j < 5; j++)
  102. {
  103. lights[VU3_LIGHT + j].setBrightnessSmooth(vuMeter3.getBrightness(j));
  104. }
  105. float ch4 = inputs[CH4_INPUT].value * params[CH4_PARAM].value * clamp(inputs[CH4_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  106. float pan_cv_in_4 = inputs[CH4_PAN_INPUT].value/5;
  107. float pan_position_4 = pan_cv_in_4 + params[CH4_PAN_PARAM].value;
  108. if (pan_position_4 < 0) pan_position_4 = 0;
  109. if (pan_position_4 > 1) pan_position_4 = 1;
  110. float ch4_l = ch4 * (1-pan_position_4)* 2;
  111. float ch4_r = ch4 * pan_position_4 * 2;
  112. VUMeter vuMeter4;
  113. vuMeter4.dBInterval = 6.0;
  114. vuMeter4.setValue(ch4 / 10.0);
  115. for (int j = 0; j < 5; j++)
  116. {
  117. lights[VU4_LIGHT + j].setBrightnessSmooth(vuMeter4.getBrightness(j));
  118. }
  119. float mix_l = (ch1_l + ch2_l + ch3_l + ch4_l) * params[MIX_PARAM].value * inputs[MIX_CV_INPUT].normalize(10.0) / 10.0;
  120. float mix_r = (ch1_r + ch2_r + ch3_r + ch4_r) * params[MIX_PARAM].value * inputs[MIX_CV_INPUT].normalize(10.0) / 10.0;
  121. outputs[CH1_OUTPUT].value = ch1;
  122. outputs[CH2_OUTPUT].value = ch2;
  123. outputs[CH3_OUTPUT].value = ch3;
  124. outputs[CH4_OUTPUT].value = ch4;
  125. outputs[MIX_OUTPUT_L].value = mix_l;
  126. outputs[MIX_OUTPUT_R].value = mix_r;
  127. }
  128. struct SubMixWidget : ModuleWidget
  129. {
  130. SubMixWidget(SubMix *module) : ModuleWidget(module)
  131. {
  132. box.size = Vec(15*12, 380);
  133. {
  134. SVGPanel *panel = new SVGPanel();
  135. panel->box.size = box.size;
  136. panel->setBackground(SVG::load(assetPlugin(plugin,"res/SubMix.svg")));
  137. addChild(panel);
  138. }
  139. int knob = 40;
  140. int jcv = 27;
  141. int cvs = 230;
  142. int border=17;
  143. int borderl = 25;
  144. int light = 13;
  145. addParam(ParamWidget::create<LRoundWhy>(Vec(10, 15), module, SubMix::MIX_PARAM, 0.0, 1.0, 0.5));
  146. addInput(Port::create<PJ301MIPort>(Vec(box.size.x-10-jcv*4, 20), Port::INPUT, module, SubMix::MIX_CV_INPUT));
  147. //Screw
  148. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  149. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  150. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  151. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  152. //mixer out
  153. addOutput(Port::create<PJ301MLPort>(Vec(box.size.x-10-jcv*1, 20), Port::OUTPUT, module, SubMix::MIX_OUTPUT_L));
  154. addOutput(Port::create<PJ301MRPort>(Vec(box.size.x-10-jcv*2, 20), Port::OUTPUT, module, SubMix::MIX_OUTPUT_R));
  155. //
  156. addParam(ParamWidget::create<RoundRed>(Vec(10+knob*0,150), module, SubMix::CH1_PARAM, 0.0, 1.0, 0.0));
  157. addParam(ParamWidget::create<RoundRed>(Vec(10+knob*1,150), module, SubMix::CH2_PARAM, 0.0, 1.0, 0.0));
  158. addParam(ParamWidget::create<RoundRed>(Vec(10+knob*2,150), module, SubMix::CH3_PARAM, 0.0, 1.0, 0.0));
  159. addParam(ParamWidget::create<RoundRed>(Vec(10+knob*3,150), module, SubMix::CH4_PARAM, 0.0, 1.0, 0.0));
  160. //
  161. addParam(ParamWidget::create<RoundAzz>(Vec(10+knob*0,190), module, SubMix::CH1_PAN_PARAM, 0.0, 1.0, 0.5));
  162. addParam(ParamWidget::create<RoundAzz>(Vec(10+knob*1,190), module, SubMix::CH2_PAN_PARAM, 0.0, 1.0, 0.5));
  163. addParam(ParamWidget::create<RoundAzz>(Vec(10+knob*2,190), module, SubMix::CH3_PAN_PARAM, 0.0, 1.0, 0.5));
  164. addParam(ParamWidget::create<RoundAzz>(Vec(10+knob*3,190), module, SubMix::CH4_PAN_PARAM, 0.0, 1.0, 0.5));
  165. //
  166. //
  167. addChild(GrayModuleLightWidget::create<MediumLight<RedLight>>(Vec(borderl,80), module, SubMix::VU1_LIGHT + 0));
  168. addChild(GrayModuleLightWidget::create<MediumLight<YellowLight>>(Vec(borderl,80 + light), module, SubMix::VU1_LIGHT + 1));
  169. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl, 80 + light * 2), module, SubMix::VU1_LIGHT + 2));
  170. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl,80 + light * 3 ), module, SubMix::VU1_LIGHT + 3));
  171. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl,80 + light * 4 ), module, SubMix::VU1_LIGHT + 4));
  172. addChild(GrayModuleLightWidget::create<MediumLight<RedLight>>(Vec(borderl+knob,80 ), module, SubMix::VU2_LIGHT + 0));
  173. addChild(GrayModuleLightWidget::create<MediumLight<YellowLight>>(Vec(borderl+knob,80 + light ), module, SubMix::VU2_LIGHT + 1));
  174. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl + knob, 80 + light * 2), module, SubMix::VU2_LIGHT + 2));
  175. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl + knob, 80 + light * 3), module, SubMix::VU2_LIGHT + 3));
  176. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl + knob, 80 + light * 4), module, SubMix::VU2_LIGHT + 4));
  177. addChild(GrayModuleLightWidget::create<MediumLight<RedLight>>(Vec(borderl + knob * 2,80 ), module, SubMix::VU3_LIGHT + 0));
  178. addChild(GrayModuleLightWidget::create<MediumLight<YellowLight>>(Vec(borderl + knob * 2,80 + light ), module, SubMix::VU3_LIGHT + 1));
  179. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl + knob * 2, 80 + light * 2), module, SubMix::VU3_LIGHT + 2));
  180. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl + knob * 2, 80 + light * 3), module, SubMix::VU3_LIGHT + 3));
  181. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl + knob * 2, 80 + light * 4), module, SubMix::VU3_LIGHT + 4));
  182. addChild(GrayModuleLightWidget::create<MediumLight<RedLight>>(Vec(borderl + knob * 3,80 ), module, SubMix::VU4_LIGHT + 0));
  183. addChild(GrayModuleLightWidget::create<MediumLight<YellowLight>>(Vec(borderl + knob * 3,80 + light ), module, SubMix::VU4_LIGHT + 1));
  184. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl + knob * 3, 80 + light * 2), module, SubMix::VU4_LIGHT + 2));
  185. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl + knob * 3, 80 + light * 3), module, SubMix::VU4_LIGHT + 3));
  186. addChild(GrayModuleLightWidget::create<MediumLight<GreenLight>>(Vec(borderl + knob * 3, 80 + light * 4), module, SubMix::VU4_LIGHT + 4));
  187. //
  188. //
  189. addInput(Port::create<PJ301MIPort>(Vec(border,cvs+jcv*0), Port::INPUT, module, SubMix::CH1_INPUT));
  190. addInput(Port::create<PJ301MCPort>(Vec(border,cvs+jcv*1), Port::INPUT, module, SubMix::CH1_CV_INPUT));
  191. addInput(Port::create<PJ301MCPort>(Vec(border,cvs+jcv*2), Port::INPUT, module, SubMix::CH1_PAN_INPUT));
  192. addOutput(Port::create<PJ301MOPort>(Vec(border,cvs+jcv*3), Port::OUTPUT, module, SubMix::CH1_OUTPUT));
  193. //
  194. addInput(Port::create<PJ301MIPort>(Vec(border+knob,cvs+jcv*0), Port::INPUT, module, SubMix::CH2_INPUT));
  195. addInput(Port::create<PJ301MCPort>(Vec(border+knob,cvs+jcv*1), Port::INPUT, module, SubMix::CH2_CV_INPUT));
  196. addInput(Port::create<PJ301MCPort>(Vec(border+knob,cvs+jcv*2), Port::INPUT, module, SubMix::CH2_PAN_INPUT));
  197. addOutput(Port::create<PJ301MOPort>(Vec(border+knob,cvs+jcv*3), Port::OUTPUT, module, SubMix::CH2_OUTPUT));
  198. //
  199. addInput(Port::create<PJ301MIPort>(Vec(border+knob*2,cvs+jcv*0), Port::INPUT, module, SubMix::CH3_INPUT));
  200. addInput(Port::create<PJ301MCPort>(Vec(border+knob*2,cvs+jcv*1), Port::INPUT, module, SubMix::CH3_CV_INPUT));
  201. addInput(Port::create<PJ301MCPort>(Vec(border+knob*2,cvs+jcv*2), Port::INPUT, module, SubMix::CH3_PAN_INPUT));
  202. addOutput(Port::create<PJ301MOPort>(Vec(border+knob*2,cvs+jcv*3), Port::OUTPUT, module, SubMix::CH3_OUTPUT));
  203. //
  204. addInput(Port::create<PJ301MIPort>(Vec(border+knob*3,cvs+jcv*0), Port::INPUT, module, SubMix::CH4_INPUT));
  205. addInput(Port::create<PJ301MCPort>(Vec(border+knob*3,cvs+jcv*1), Port::INPUT, module, SubMix::CH4_CV_INPUT));
  206. addInput(Port::create<PJ301MCPort>(Vec(border+knob*3,cvs+jcv*2), Port::INPUT, module, SubMix::CH4_PAN_INPUT));
  207. addOutput(Port::create<PJ301MOPort>(Vec(border+knob*3,cvs+jcv*3), Port::OUTPUT, module, SubMix::CH4_OUTPUT));
  208. }
  209. };
  210. } // namespace rack_plugin_dBiz
  211. using namespace rack_plugin_dBiz;
  212. RACK_PLUGIN_MODEL_INIT(dBiz, SubMix) {
  213. Model *modelSubMix = Model::create<SubMix, SubMixWidget>("dBiz", "SubMix", "SubMix", MIXER_TAG);
  214. return modelSubMix;
  215. }