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.

434 lines
19KB

  1. //**************************************************************************************
  2. //8 channel mixer module for VCV Rack by Alfredo Santamaria - AS - https://github.com/AScustomWorks/AS
  3. //
  4. //Based on DrumsMixer VCV Rack by Autodafe http://www.autodafe.net
  5. //Based on code taken from the Fundamentals plugins by Andrew Belt http://www.vcvrack.com
  6. //**************************************************************************************
  7. #include "AS.hpp"
  8. #include "dsp/digital.hpp"
  9. struct Mixer8ch : Module {
  10. enum ParamIds {
  11. MIX_PARAM,
  12. CH1_PARAM,
  13. CH2_PARAM,
  14. CH3_PARAM,
  15. CH4_PARAM,
  16. CH5_PARAM,
  17. CH6_PARAM,
  18. CH7_PARAM,
  19. CH8_PARAM,
  20. CH1_PAN_PARAM,
  21. CH2_PAN_PARAM,
  22. CH3_PAN_PARAM,
  23. CH4_PAN_PARAM,
  24. CH5_PAN_PARAM,
  25. CH6_PAN_PARAM,
  26. CH7_PAN_PARAM,
  27. CH8_PAN_PARAM,
  28. CH1MUTE,
  29. CH2MUTE,
  30. CH3MUTE,
  31. CH4MUTE,
  32. CH5MUTE,
  33. CH6MUTE,
  34. CH7MUTE,
  35. CH8MUTE,
  36. MASTER_MUTE,
  37. NUM_PARAMS
  38. };
  39. enum InputIds {
  40. MIX_CV_INPUT,
  41. CH1_INPUT,
  42. CH1_CV_INPUT,
  43. CH1_CV_PAN_INPUT,
  44. CH2_INPUT,
  45. CH2_CV_INPUT,
  46. CH2_CV_PAN_INPUT,
  47. CH3_INPUT,
  48. CH3_CV_INPUT,
  49. CH3_CV_PAN_INPUT,
  50. CH4_INPUT,
  51. CH4_CV_INPUT,
  52. CH4_CV_PAN_INPUT,
  53. CH5_INPUT,
  54. CH5_CV_INPUT,
  55. CH5_CV_PAN_INPUT,
  56. CH6_INPUT,
  57. CH6_CV_INPUT,
  58. CH6_CV_PAN_INPUT,
  59. CH7_INPUT,
  60. CH7_CV_INPUT,
  61. CH7_CV_PAN_INPUT,
  62. CH8_INPUT,
  63. CH8_CV_INPUT,
  64. CH8_CV_PAN_INPUT,
  65. LINK_L,
  66. LINK_R,
  67. NUM_INPUTS
  68. };
  69. enum OutputIds {
  70. MIX_OUTPUTL,
  71. MIX_OUTPUTR,
  72. CH1_OUTPUT,
  73. CH2_OUTPUT,
  74. CH3_OUTPUT,
  75. CH4_OUTPUT,
  76. CH5_OUTPUT,
  77. CH6_OUTPUT,
  78. CH7_OUTPUT,
  79. CH8_OUTPUT,
  80. NUM_OUTPUTS
  81. };
  82. enum LightIds {
  83. MUTE_LIGHT1,
  84. MUTE_LIGHT2,
  85. MUTE_LIGHT3,
  86. MUTE_LIGHT4,
  87. MUTE_LIGHT5,
  88. MUTE_LIGHT6,
  89. MUTE_LIGHT7,
  90. MUTE_LIGHT8,
  91. MUTE_LIGHT_MASTER,
  92. NUM_LIGHTS
  93. };
  94. Mixer8ch() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  95. reset();
  96. }
  97. void step() override;
  98. SchmittTrigger ch1mute;
  99. SchmittTrigger ch2mute;
  100. SchmittTrigger ch3mute;
  101. SchmittTrigger ch4mute;
  102. SchmittTrigger ch5mute;
  103. SchmittTrigger ch6mute;
  104. SchmittTrigger ch7mute;
  105. SchmittTrigger ch8mute;
  106. SchmittTrigger chMmute;
  107. float ch1m = false;
  108. float ch2m = false;
  109. float ch3m = false;
  110. float ch4m = false;
  111. float ch5m = false;
  112. float ch6m = false;
  113. float ch7m = false;
  114. float ch8m = false;
  115. float chMm = false;
  116. float mixL = 0.0f;
  117. float mixR = 0.0f;
  118. json_t *toJson()override {
  119. json_t *rootJm = json_object();
  120. json_t *mutesJ = json_array();
  121. json_t *muteJ1 = json_integer((int) ch1m);
  122. json_t *muteJ2 = json_integer((int) ch2m);
  123. json_t *muteJ3 = json_integer((int) ch3m);
  124. json_t *muteJ4 = json_integer((int) ch4m);
  125. json_t *muteJ5 = json_integer((int) ch5m);
  126. json_t *muteJ6 = json_integer((int) ch6m);
  127. json_t *muteJ7 = json_integer((int) ch7m);
  128. json_t *muteJ8 = json_integer((int) ch8m);
  129. json_t *muteJ9 = json_integer((int) chMm);
  130. json_array_append_new(mutesJ, muteJ1);
  131. json_array_append_new(mutesJ, muteJ2);
  132. json_array_append_new(mutesJ, muteJ3);
  133. json_array_append_new(mutesJ, muteJ4);
  134. json_array_append_new(mutesJ, muteJ5);
  135. json_array_append_new(mutesJ, muteJ6);
  136. json_array_append_new(mutesJ, muteJ7);
  137. json_array_append_new(mutesJ, muteJ8);
  138. json_array_append_new(mutesJ, muteJ9);
  139. json_object_set_new(rootJm, "as_MixerMutes", mutesJ);
  140. return rootJm;
  141. }
  142. void fromJson(json_t *rootJm)override {
  143. json_t *mutesJ = json_object_get(rootJm, "as_MixerMutes");
  144. json_t *muteJ1 = json_array_get(mutesJ, 0);
  145. json_t *muteJ2 = json_array_get(mutesJ, 1);
  146. json_t *muteJ3 = json_array_get(mutesJ, 2);
  147. json_t *muteJ4 = json_array_get(mutesJ, 3);
  148. json_t *muteJ5 = json_array_get(mutesJ, 4);
  149. json_t *muteJ6 = json_array_get(mutesJ, 5);
  150. json_t *muteJ7 = json_array_get(mutesJ, 6);
  151. json_t *muteJ8 = json_array_get(mutesJ, 7);
  152. json_t *muteJ9 = json_array_get(mutesJ, 8);
  153. ch1m = !!json_integer_value(muteJ1);
  154. ch2m = !!json_integer_value(muteJ2);
  155. ch3m = !!json_integer_value(muteJ3);
  156. ch4m = !!json_integer_value(muteJ4);
  157. ch5m = !!json_integer_value(muteJ5);
  158. ch6m = !!json_integer_value(muteJ6);
  159. ch7m = !!json_integer_value(muteJ7);
  160. ch8m = !!json_integer_value(muteJ8);
  161. chMm = !!json_integer_value(muteJ9);
  162. }
  163. //PAN LEVEL
  164. float PanL(float balance, float cv){ // -1...+1
  165. float p, gl;
  166. p=M_PI*(balance+1)/4;
  167. if(cv){
  168. gl=::cos(p)*(1-((cv+1)/5));
  169. }else
  170. {gl=::cos(p);
  171. }
  172. return gl;
  173. }
  174. float PanR(float balance , float cv){
  175. float p, gr;
  176. p=M_PI*(balance+1)/4;
  177. if(cv){gr=::sin(p)*((cv+1)/5);
  178. }else{
  179. gr=::sin(p);
  180. }
  181. return gr;
  182. }
  183. };
  184. void Mixer8ch::step() {
  185. //MUTE BUTTONS
  186. if (ch1mute.process(params[CH1MUTE].value)) {
  187. ch1m = !ch1m;
  188. }
  189. lights[MUTE_LIGHT1].value = ch1m ? 1.0f : 0.0f;
  190. if (ch2mute.process(params[CH2MUTE].value)) {
  191. ch2m = !ch2m;
  192. }
  193. lights[MUTE_LIGHT2].value = ch2m ? 1.0f : 0.0f;
  194. if (ch3mute.process(params[CH3MUTE].value)) {
  195. ch3m = !ch3m;
  196. }
  197. lights[MUTE_LIGHT3].value = ch3m ? 1.0f : 0.0f;
  198. if (ch4mute.process(params[CH4MUTE].value)) {
  199. ch4m = !ch4m;
  200. }
  201. lights[MUTE_LIGHT4].value = ch4m ? 1.0f : 0.0f;
  202. if (ch5mute.process(params[CH5MUTE].value)) {
  203. ch5m = !ch5m;
  204. }
  205. lights[MUTE_LIGHT5].value = ch5m ? 1.0f : 0.0f;
  206. if (ch6mute.process(params[CH6MUTE].value)) {
  207. ch6m = !ch6m;
  208. }
  209. lights[MUTE_LIGHT6].value = ch6m ? 1.0f : 0.0f;
  210. if (ch7mute.process(params[CH7MUTE].value)) {
  211. ch7m = !ch7m;
  212. }
  213. lights[MUTE_LIGHT7].value = ch7m ? 1.0f : 0.0f;
  214. if (ch8mute.process(params[CH8MUTE].value)) {
  215. ch8m = !ch8m;
  216. }
  217. lights[MUTE_LIGHT8].value = ch8m ? 1.0f : 0.0f;
  218. if (chMmute.process(params[MASTER_MUTE].value)) {
  219. chMm = !chMm;
  220. }
  221. lights[MUTE_LIGHT_MASTER].value = chMm ? 1.0f : 0.0f;
  222. //CHANNEL RESULTS
  223. float ch1L = (1-ch1m) * (inputs[CH1_INPUT].value) * params[CH1_PARAM].value * PanL(params[CH1_PAN_PARAM].value,(inputs[CH1_CV_PAN_INPUT].value))* clamp(inputs[CH1_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  224. float ch1R = (1-ch1m) * (inputs[CH1_INPUT].value) * params[CH1_PARAM].value * PanR(params[CH1_PAN_PARAM].value,(inputs[CH1_CV_PAN_INPUT].value)) * clamp(inputs[CH1_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  225. float ch2L = (1-ch2m) *(inputs[CH2_INPUT].value) * params[CH2_PARAM].value * PanL(params[CH2_PAN_PARAM].value,(inputs[CH2_CV_PAN_INPUT].value)) * clamp(inputs[CH2_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  226. float ch2R = (1-ch2m) *(inputs[CH2_INPUT].value) * params[CH2_PARAM].value * PanR(params[CH2_PAN_PARAM].value,(inputs[CH2_CV_PAN_INPUT].value)) * clamp(inputs[CH2_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  227. float ch3L = (1-ch3m) *(inputs[CH3_INPUT].value) * params[CH3_PARAM].value * PanL(params[CH3_PAN_PARAM].value,(inputs[CH3_CV_PAN_INPUT].value)) * clamp(inputs[CH3_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  228. float ch3R = (1-ch3m) *(inputs[CH3_INPUT].value) * params[CH3_PARAM].value * PanR(params[CH3_PAN_PARAM].value,(inputs[CH3_CV_PAN_INPUT].value)) * clamp(inputs[CH3_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  229. float ch4L = (1-ch4m) *(inputs[CH4_INPUT].value) * params[CH4_PARAM].value * PanL(params[CH4_PAN_PARAM].value,(inputs[CH4_CV_PAN_INPUT].value)) * clamp(inputs[CH4_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  230. float ch4R = (1-ch4m) *(inputs[CH4_INPUT].value) * params[CH4_PARAM].value * PanR(params[CH4_PAN_PARAM].value,(inputs[CH4_CV_PAN_INPUT].value)) * clamp(inputs[CH4_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  231. float ch5L = (1-ch5m) *(inputs[CH5_INPUT].value) * params[CH5_PARAM].value * PanL(params[CH5_PAN_PARAM].value,(inputs[CH5_CV_PAN_INPUT].value)) * clamp(inputs[CH5_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  232. float ch5R = (1-ch5m) *(inputs[CH5_INPUT].value) * params[CH5_PARAM].value * PanR(params[CH5_PAN_PARAM].value,(inputs[CH5_CV_PAN_INPUT].value)) * clamp(inputs[CH5_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  233. float ch6L = (1-ch6m) *(inputs[CH6_INPUT].value) * params[CH6_PARAM].value * PanL(params[CH6_PAN_PARAM].value,(inputs[CH6_CV_PAN_INPUT].value)) * clamp(inputs[CH6_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  234. float ch6R = (1-ch6m) *(inputs[CH6_INPUT].value) * params[CH6_PARAM].value * PanR(params[CH6_PAN_PARAM].value,(inputs[CH6_CV_PAN_INPUT].value)) * clamp(inputs[CH6_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  235. float ch7L = (1-ch7m) *(inputs[CH7_INPUT].value) * params[CH7_PARAM].value * PanL(params[CH7_PAN_PARAM].value,(inputs[CH7_CV_PAN_INPUT].value)) * clamp(inputs[CH7_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  236. float ch7R = (1-ch7m) *(inputs[CH7_INPUT].value) * params[CH7_PARAM].value * PanR(params[CH7_PAN_PARAM].value,(inputs[CH7_CV_PAN_INPUT].value)) * clamp(inputs[CH7_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  237. float ch8L = (1-ch8m) *(inputs[CH8_INPUT].value) * params[CH8_PARAM].value * PanL(params[CH8_PAN_PARAM].value,(inputs[CH8_CV_PAN_INPUT].value)) * clamp(inputs[CH8_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  238. float ch8R = (1-ch8m) *(inputs[CH8_INPUT].value) * params[CH8_PARAM].value * PanR(params[CH8_PAN_PARAM].value,(inputs[CH8_CV_PAN_INPUT].value)) * clamp(inputs[CH8_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  239. if(!chMm){
  240. mixL = (ch1L + ch2L + ch3L +ch4L + ch5L + ch6L + ch7L + ch8L) * params[MIX_PARAM].value * clamp(inputs[MIX_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  241. mixR = (ch1R + ch2R + ch3R +ch4R + ch5R + ch6R + ch7R + ch8R) * params[MIX_PARAM].value * clamp(inputs[MIX_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  242. //CHECK FOR INPUT FROM ANOTHER MIXER
  243. if(inputs[LINK_L].active && inputs[LINK_R].active){
  244. mixL += inputs[LINK_L].value;
  245. mixR += inputs[LINK_R].value;
  246. }
  247. }else{
  248. mixL = 0.0f;
  249. mixR = 0.0f;
  250. }
  251. outputs[CH1_OUTPUT].value= ch1L+ch1R;
  252. outputs[CH2_OUTPUT].value= ch2L+ch2R;
  253. outputs[CH3_OUTPUT].value= ch3L+ch3R;
  254. outputs[CH4_OUTPUT].value= ch4L+ch4R;
  255. outputs[CH5_OUTPUT].value= ch5L+ch5R;
  256. outputs[CH6_OUTPUT].value= ch6L+ch6R;
  257. outputs[CH7_OUTPUT].value= ch7L+ch7R;
  258. outputs[CH8_OUTPUT].value= ch8L+ch8R;
  259. //check for MONO OUTPUT
  260. if(!outputs[MIX_OUTPUTR].active){
  261. outputs[MIX_OUTPUTL].value= mixL+mixR;
  262. outputs[MIX_OUTPUTR].value= 0.0f;
  263. }else{
  264. outputs[MIX_OUTPUTL].value= mixL;
  265. outputs[MIX_OUTPUTR].value= mixR;
  266. }
  267. //outputs[MIX_OUTPUTL].value= mixL;
  268. //outputs[MIX_OUTPUTR].value= mixR;
  269. }
  270. struct Mixer8chWidget : ModuleWidget
  271. {
  272. Mixer8chWidget(Mixer8ch *module);
  273. };
  274. Mixer8chWidget::Mixer8chWidget(Mixer8ch *module) : ModuleWidget(module) {
  275. //box.size = Vec(15*37, 380);
  276. box.size = Vec(RACK_GRID_WIDTH*26, RACK_GRID_HEIGHT);
  277. {
  278. SVGPanel *panel = new SVGPanel();
  279. panel->box.size = box.size;
  280. panel->setBackground(SVG::load(assetPlugin(plugin, "res/8chMixer.svg")));
  281. addChild(panel);
  282. }
  283. //SCREWS
  284. addChild(Widget::create<as_HexScrew>(Vec(RACK_GRID_WIDTH, 0)));
  285. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  286. addChild(Widget::create<as_HexScrew>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  287. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  288. //PAN KNOBS
  289. static const float columnPos[8] = {33,73,113,153, 193, 233, 273, 313};
  290. static const float panPosY = 180;
  291. addParam(ParamWidget::create<as_KnobBlack>(Vec(columnPos[0]-5, panPosY), module, Mixer8ch::CH1_PAN_PARAM, -1.0f, 1.0f, 0.0f));
  292. addParam(ParamWidget::create<as_KnobBlack>(Vec(columnPos[1]-5, panPosY), module, Mixer8ch::CH2_PAN_PARAM, -1.0f, 1.0f, 0.0f));
  293. addParam(ParamWidget::create<as_KnobBlack>(Vec(columnPos[2]-5, panPosY), module, Mixer8ch::CH3_PAN_PARAM, -1.0f, 1.0f, 0.0f));
  294. addParam(ParamWidget::create<as_KnobBlack>(Vec(columnPos[3]-5, panPosY), module, Mixer8ch::CH4_PAN_PARAM, -1.0f, 1.0f, 0.0f));
  295. addParam(ParamWidget::create<as_KnobBlack>(Vec(columnPos[4]-5, panPosY), module, Mixer8ch::CH5_PAN_PARAM, -1.0f, 1.0f, 0.0f));
  296. addParam(ParamWidget::create<as_KnobBlack>(Vec(columnPos[5]-5, panPosY), module, Mixer8ch::CH6_PAN_PARAM, -1.0f, 1.0f, 0.0f));
  297. addParam(ParamWidget::create<as_KnobBlack>(Vec(columnPos[6]-5, panPosY), module, Mixer8ch::CH7_PAN_PARAM, -1.0f, 1.0f, 0.0f));
  298. addParam(ParamWidget::create<as_KnobBlack>(Vec(columnPos[7]-5, panPosY), module, Mixer8ch::CH8_PAN_PARAM, -1.0f, 1.0f, 0.0f));
  299. //VOLUME FADERS
  300. static const float volPosY = 223;
  301. addParam(ParamWidget::create<as_FaderPot>(Vec(columnPos[0]+2, volPosY), module, Mixer8ch::CH1_PARAM, 0.0f, 1.0f, 0.8f));
  302. addParam(ParamWidget::create<as_FaderPot>(Vec(columnPos[1]+2, volPosY), module, Mixer8ch::CH2_PARAM, 0.0f, 1.0f, 0.8f));
  303. addParam(ParamWidget::create<as_FaderPot>(Vec(columnPos[2]+2, volPosY), module, Mixer8ch::CH3_PARAM, 0.0f, 1.0f, 0.8f));
  304. addParam(ParamWidget::create<as_FaderPot>(Vec(columnPos[3]+2, volPosY), module, Mixer8ch::CH4_PARAM, 0.0f, 1.0f, 0.8f));
  305. addParam(ParamWidget::create<as_FaderPot>(Vec(columnPos[4]+2, volPosY), module, Mixer8ch::CH5_PARAM, 0.0f, 1.0f, 0.8f));
  306. addParam(ParamWidget::create<as_FaderPot>(Vec(columnPos[5]+2, volPosY), module, Mixer8ch::CH6_PARAM, 0.0f, 1.0f, 0.8f));
  307. addParam(ParamWidget::create<as_FaderPot>(Vec(columnPos[6]+2, volPosY), module, Mixer8ch::CH7_PARAM, 0.0f, 1.0f, 0.8f));
  308. addParam(ParamWidget::create<as_FaderPot>(Vec(columnPos[7]+2, volPosY), module, Mixer8ch::CH8_PARAM, 0.0f, 1.0f, 0.8f));
  309. //MUTES
  310. static const float mutePosY = 310;
  311. addParam(ParamWidget::create<LEDBezel>(Vec(columnPos[0]+3, mutePosY), module, Mixer8ch::CH1MUTE , 0.0f, 1.0f, 0.0f));
  312. addChild(ModuleLightWidget::create<LedLight<RedLight>>(Vec(columnPos[0]+5.2, mutePosY+2), module, Mixer8ch::MUTE_LIGHT1));
  313. addParam(ParamWidget::create<LEDBezel>(Vec(columnPos[1]+3, mutePosY), module, Mixer8ch::CH2MUTE , 0.0f, 1.0f, 0.0f));
  314. addChild(ModuleLightWidget::create<LedLight<RedLight>>(Vec(columnPos[1]+5.2, mutePosY+2), module, Mixer8ch::MUTE_LIGHT2));
  315. addParam(ParamWidget::create<LEDBezel>(Vec(columnPos[2]+3, mutePosY), module, Mixer8ch::CH3MUTE , 0.0f, 1.0f, 0.0f));
  316. addChild(ModuleLightWidget::create<LedLight<RedLight>>(Vec(columnPos[2]+5.2, mutePosY+2), module, Mixer8ch::MUTE_LIGHT3));
  317. addParam(ParamWidget::create<LEDBezel>(Vec(columnPos[3]+3, mutePosY), module, Mixer8ch::CH4MUTE , 0.0f, 1.0f, 0.0f));
  318. addChild(ModuleLightWidget::create<LedLight<RedLight>>(Vec(columnPos[3]+5.2, mutePosY+2), module, Mixer8ch::MUTE_LIGHT4));
  319. addParam(ParamWidget::create<LEDBezel>(Vec(columnPos[4]+3, mutePosY), module, Mixer8ch::CH5MUTE , 0.0f, 1.0f, 0.0f));
  320. addChild(ModuleLightWidget::create<LedLight<RedLight>>(Vec(columnPos[4]+5.2, mutePosY+2), module, Mixer8ch::MUTE_LIGHT5));
  321. addParam(ParamWidget::create<LEDBezel>(Vec(columnPos[5]+3, mutePosY), module, Mixer8ch::CH6MUTE , 0.0f, 1.0f, 0.0f));
  322. addChild(ModuleLightWidget::create<LedLight<RedLight>>(Vec(columnPos[5]+5.2, mutePosY+2), module, Mixer8ch::MUTE_LIGHT6));
  323. addParam(ParamWidget::create<LEDBezel>(Vec(columnPos[6]+3, mutePosY), module, Mixer8ch::CH7MUTE , 0.0f, 1.0f, 0.0f));
  324. addChild(ModuleLightWidget::create<LedLight<RedLight>>(Vec(columnPos[6]+5.2, mutePosY+2), module, Mixer8ch::MUTE_LIGHT7));
  325. addParam(ParamWidget::create<LEDBezel>(Vec(columnPos[7]+3, mutePosY), module, Mixer8ch::CH8MUTE , 0.0f, 1.0f, 0.0f));
  326. addChild(ModuleLightWidget::create<LedLight<RedLight>>(Vec(columnPos[7]+5.2, mutePosY+2), module, Mixer8ch::MUTE_LIGHT8));
  327. //PORTS
  328. static const float portsY[4] = {60,90,120,150};
  329. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[0], portsY[0]), Port::INPUT, module, Mixer8ch::CH1_INPUT));
  330. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[0], portsY[1]), Port::INPUT, module, Mixer8ch::CH1_CV_INPUT));
  331. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[0], portsY[2]), Port::INPUT, module, Mixer8ch::CH1_CV_PAN_INPUT));
  332. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[1], portsY[0]), Port::INPUT, module, Mixer8ch::CH2_INPUT));
  333. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[1], portsY[1]), Port::INPUT, module, Mixer8ch::CH2_CV_INPUT));
  334. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[1], portsY[2]), Port::INPUT, module, Mixer8ch::CH2_CV_PAN_INPUT));
  335. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[2], portsY[0]), Port::INPUT, module, Mixer8ch::CH3_INPUT));
  336. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[2], portsY[1]), Port::INPUT, module, Mixer8ch::CH3_CV_INPUT));
  337. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[2], portsY[2]), Port::INPUT, module, Mixer8ch::CH3_CV_PAN_INPUT));
  338. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[3], portsY[0]), Port::INPUT, module, Mixer8ch::CH4_INPUT));
  339. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[3], portsY[1]), Port::INPUT, module, Mixer8ch::CH4_CV_INPUT));
  340. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[3], portsY[2]), Port::INPUT, module, Mixer8ch::CH4_CV_PAN_INPUT));
  341. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[4], portsY[0]), Port::INPUT, module, Mixer8ch::CH5_INPUT));
  342. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[4], portsY[1]), Port::INPUT, module, Mixer8ch::CH5_CV_INPUT));
  343. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[4], portsY[2]), Port::INPUT, module, Mixer8ch::CH5_CV_PAN_INPUT));
  344. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[5], portsY[0]), Port::INPUT, module, Mixer8ch::CH6_INPUT));
  345. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[5], portsY[1]), Port::INPUT, module, Mixer8ch::CH6_CV_INPUT));
  346. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[5], portsY[2]), Port::INPUT, module, Mixer8ch::CH6_CV_PAN_INPUT));
  347. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[6], portsY[0]), Port::INPUT, module, Mixer8ch::CH7_INPUT));
  348. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[6], portsY[1]), Port::INPUT, module, Mixer8ch::CH7_CV_INPUT));
  349. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[6], portsY[2]), Port::INPUT, module, Mixer8ch::CH7_CV_PAN_INPUT));
  350. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[7], portsY[0]), Port::INPUT, module, Mixer8ch::CH8_INPUT));
  351. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[7], portsY[1]), Port::INPUT, module, Mixer8ch::CH8_CV_INPUT));
  352. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[7], portsY[2]), Port::INPUT, module, Mixer8ch::CH8_CV_PAN_INPUT));
  353. addOutput(Port::create<as_PJ301MPort>(Vec(columnPos[0], portsY[3]), Port::OUTPUT, module, Mixer8ch::CH1_OUTPUT));
  354. addOutput(Port::create<as_PJ301MPort>(Vec(columnPos[1], portsY[3]), Port::OUTPUT, module, Mixer8ch::CH2_OUTPUT));
  355. addOutput(Port::create<as_PJ301MPort>(Vec(columnPos[2], portsY[3]), Port::OUTPUT, module, Mixer8ch::CH3_OUTPUT));
  356. addOutput(Port::create<as_PJ301MPort>(Vec(columnPos[3], portsY[3]), Port::OUTPUT, module, Mixer8ch::CH4_OUTPUT));
  357. addOutput(Port::create<as_PJ301MPort>(Vec(columnPos[4], portsY[3]), Port::OUTPUT, module, Mixer8ch::CH5_OUTPUT));
  358. addOutput(Port::create<as_PJ301MPort>(Vec(columnPos[5], portsY[3]), Port::OUTPUT, module, Mixer8ch::CH6_OUTPUT));
  359. addOutput(Port::create<as_PJ301MPort>(Vec(columnPos[6], portsY[3]), Port::OUTPUT, module, Mixer8ch::CH7_OUTPUT));
  360. addOutput(Port::create<as_PJ301MPort>(Vec(columnPos[7], portsY[3]), Port::OUTPUT, module, Mixer8ch::CH8_OUTPUT));
  361. //OUTPUT
  362. addOutput(Port::create<as_PJ301MPort>(Vec(356, portsY[0]), Port::OUTPUT, module, Mixer8ch::MIX_OUTPUTL));
  363. addOutput(Port::create<as_PJ301MPort>(Vec(356, portsY[1]), Port::OUTPUT, module, Mixer8ch::MIX_OUTPUTR));
  364. addInput(Port::create<as_PJ301MPort>(Vec(356, portsY[3]), Port::INPUT, module, Mixer8ch::MIX_CV_INPUT));
  365. addParam(ParamWidget::create<as_FaderPot>(Vec(356, volPosY), module, Mixer8ch::MIX_PARAM, 0.0f, 1.0f, 0.8f));
  366. addParam(ParamWidget::create<LEDBezel>(Vec(356, mutePosY), module, Mixer8ch::MASTER_MUTE , 0.0f, 1.0f, 0.0f));
  367. addChild(ModuleLightWidget::create<LedLight<RedLight>>(Vec(356+2.2, mutePosY+2), module, Mixer8ch::MUTE_LIGHT_MASTER));
  368. //LINK
  369. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[0], 30), Port::INPUT, module, Mixer8ch::LINK_L));
  370. addInput(Port::create<as_PJ301MPort>(Vec(columnPos[1], 30), Port::INPUT, module, Mixer8ch::LINK_R));
  371. }
  372. Model *modelMixer8ch = Model::create<Mixer8ch, Mixer8chWidget>("AS", "Mixer8ch", "8-CH Mixer", MIXER_TAG, AMPLIFIER_TAG);