Audio plugin host https://kx.studio/carla
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.

870 lines
27KB

  1. /*
  2. * ZaMultiCompX2 Stereo multiband compressor
  3. * Copyright (C) 2014 Damien Zammit <damien@zamaudio.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #include "ZaMultiCompX2UI.hpp"
  18. #include <stdio.h>
  19. using DGL::Point;
  20. START_NAMESPACE_DISTRHO
  21. // -----------------------------------------------------------------------
  22. ZaMultiCompX2UI::ZaMultiCompX2UI()
  23. : UI()
  24. {
  25. // background
  26. fImgBackground = Image(ZaMultiCompX2Artwork::zamulticompx2Data, ZaMultiCompX2Artwork::zamulticompx2Width, ZaMultiCompX2Artwork::zamulticompx2Height, GL_BGR);
  27. // led images
  28. fLedRedImg = Image(ZaMultiCompX2Artwork::ledredData, ZaMultiCompX2Artwork::ledredWidth, ZaMultiCompX2Artwork::ledredHeight);
  29. fLedYellowImg = Image(ZaMultiCompX2Artwork::ledyellowData, ZaMultiCompX2Artwork::ledyellowWidth, ZaMultiCompX2Artwork::ledyellowHeight);
  30. // led values
  31. fLedRedValue1 = 0.0f;
  32. fLedRedValue2 = 0.0f;
  33. fLedRedValue3 = 0.0f;
  34. fLedYellowValueL = 0.0f;
  35. fLedYellowValueR = 0.0f;
  36. // knob
  37. Image knobImage(ZaMultiCompX2Artwork::knobData, ZaMultiCompX2Artwork::knobWidth, ZaMultiCompX2Artwork::knobHeight);
  38. // knob
  39. fKnobAttack = new ImageKnob(this, knobImage);
  40. fKnobAttack->setPos(24, 43);
  41. fKnobAttack->setRange(0.1f, 200.0f);
  42. //fKnobAttack->setLogScale(true);
  43. //fKnobAttack->setDefault(10.0f);
  44. fKnobAttack->setStep(0.1f);
  45. fKnobAttack->setRotationAngle(240);
  46. fKnobAttack->setCallback(this);
  47. fKnobRelease = new ImageKnob(this, knobImage);
  48. fKnobRelease->setPos(108, 43);
  49. fKnobRelease->setRange(50.0f, 500.0f);
  50. //fKnobRelease->setDefault(80.0f);
  51. fKnobRelease->setRotationAngle(240);
  52. fKnobRelease->setCallback(this);
  53. fKnobThresh3 = new ImageKnob(this, knobImage);
  54. fKnobThresh3->setPos(94.5, 99);
  55. fKnobThresh3->setRange(-60.0f, 0.0f);
  56. //fKnobThresh3->setDefault(-16.0f);
  57. fKnobThresh3->setRotationAngle(240);
  58. fKnobThresh3->setCallback(this);
  59. fKnobThresh2 = new ImageKnob(this, knobImage);
  60. fKnobThresh2->setPos(94.5, 150);
  61. fKnobThresh2->setRange(-60.0f, 0.0f);
  62. //fKnobThresh2->setDefault(-18.0f);
  63. fKnobThresh2->setRotationAngle(240);
  64. fKnobThresh2->setCallback(this);
  65. fKnobThresh1 = new ImageKnob(this, knobImage);
  66. fKnobThresh1->setPos(94.5, 201);
  67. fKnobThresh1->setRange(-60.0f, 0.0f);
  68. //fKnobThresh1->setDefault(-20.0f);
  69. fKnobThresh1->setRotationAngle(240);
  70. fKnobThresh1->setCallback(this);
  71. fKnobRatio = new ImageKnob(this, knobImage);
  72. fKnobRatio->setPos(191.5, 43);
  73. fKnobRatio->setRange(1.0f, 20.0f);
  74. //fKnobRatio->setDefault(4.0f);
  75. fKnobRatio->setRotationAngle(240);
  76. fKnobRatio->setCallback(this);
  77. fKnobKnee = new ImageKnob(this, knobImage);
  78. fKnobKnee->setPos(273, 43);
  79. fKnobKnee->setRange(0.0f, 8.0f);
  80. //fKnobKnee->setDefault(0.0f);
  81. fKnobKnee->setRotationAngle(240);
  82. fKnobKnee->setCallback(this);
  83. fKnobGlobalGain = new ImageKnob(this, knobImage);
  84. fKnobGlobalGain->setPos(427.3, 43);
  85. fKnobGlobalGain->setRange(-30.0f, 30.0f);
  86. //fKnobGlobalGain->setDefault(0.0f);
  87. fKnobGlobalGain->setRotationAngle(240);
  88. fKnobGlobalGain->setCallback(this);
  89. fKnobXover2 = new ImageKnob(this, knobImage);
  90. fKnobXover2->setPos(23, 121);
  91. fKnobXover2->setRange(1400.f, 14000.f);
  92. //fKnobXover2->setLogScale(true);
  93. //fKnobXover2->setDefault(1400.f);
  94. fKnobXover2->setStep(5.f);
  95. fKnobXover2->setRotationAngle(240);
  96. fKnobXover2->setCallback(this);
  97. fKnobXover1 = new ImageKnob(this, knobImage);
  98. fKnobXover1->setPos(23, 175.5);
  99. fKnobXover1->setRange(20.0f, 1400.0f);
  100. //fKnobXover1->setLogScale(true);
  101. //fKnobXover1->setDefault(250.0f);
  102. fKnobXover1->setStep(1.f);
  103. fKnobXover1->setRotationAngle(240);
  104. fKnobXover1->setCallback(this);
  105. fKnobMakeup3 = new ImageKnob(this, knobImage);
  106. fKnobMakeup3->setPos(167.75, 99.5);
  107. fKnobMakeup3->setRange(0.0f, 30.0f);
  108. //fKnobMakeup3->setDefault(0.0f);
  109. fKnobMakeup3->setRotationAngle(240);
  110. fKnobMakeup3->setCallback(this);
  111. fKnobMakeup2 = new ImageKnob(this, knobImage);
  112. fKnobMakeup2->setPos(167.75, 150.25);
  113. fKnobMakeup2->setRange(0.0f, 30.0f);
  114. //fKnobMakeup2->setDefault(0.0f);
  115. fKnobMakeup2->setRotationAngle(240);
  116. fKnobMakeup2->setCallback(this);
  117. fKnobMakeup1 = new ImageKnob(this, knobImage);
  118. fKnobMakeup1->setPos(167.75, 201.4);
  119. fKnobMakeup1->setRange(0.0f, 30.0f);
  120. //fKnobMakeup1->setDefault(0.0f);
  121. fKnobMakeup1->setRotationAngle(240);
  122. fKnobMakeup1->setCallback(this);
  123. Image toggleonImage(ZaMultiCompX2Artwork::toggleonData, ZaMultiCompX2Artwork::toggleonWidth, ZaMultiCompX2Artwork::toggleonHeight);
  124. Image toggleoffImage(ZaMultiCompX2Artwork::toggleoffData, ZaMultiCompX2Artwork::toggleoffWidth, ZaMultiCompX2Artwork::toggleoffHeight);
  125. Image toggleonhImage(ZaMultiCompX2Artwork::toggleonhorizData, ZaMultiCompX2Artwork::toggleonhorizWidth, ZaMultiCompX2Artwork::toggleonhorizHeight);
  126. Image toggleoffhImage(ZaMultiCompX2Artwork::toggleoffhorizData, ZaMultiCompX2Artwork::toggleoffhorizWidth, ZaMultiCompX2Artwork::toggleoffhorizHeight);
  127. Point<int> togglePosStart(247,108);
  128. fToggleBypass3 = new ImageToggle(this, toggleoffImage, toggleoffImage, toggleonImage);
  129. fToggleBypass3->setPos(togglePosStart);
  130. fToggleBypass3->setCallback(this);
  131. togglePosStart.setY(158);
  132. fToggleBypass2 = new ImageToggle(this, toggleoffImage, toggleoffImage, toggleonImage);
  133. fToggleBypass2->setPos(togglePosStart);
  134. fToggleBypass2->setCallback(this);
  135. togglePosStart.setY(209);
  136. fToggleBypass1 = new ImageToggle(this, toggleoffImage, toggleoffImage, toggleonImage);
  137. fToggleBypass1->setPos(togglePosStart);
  138. fToggleBypass1->setCallback(this);
  139. togglePosStart.setX(278);
  140. togglePosStart.setY(113);
  141. fToggleListen3 = new ImageToggle(this, toggleoffhImage, toggleoffhImage, toggleonhImage);
  142. fToggleListen3->setPos(togglePosStart);
  143. fToggleListen3->setCallback(this);
  144. togglePosStart.setY(164);
  145. fToggleListen2 = new ImageToggle(this, toggleoffhImage, toggleoffhImage, toggleonhImage);
  146. fToggleListen2->setPos(togglePosStart);
  147. fToggleListen2->setCallback(this);
  148. togglePosStart.setY(214);
  149. fToggleListen1 = new ImageToggle(this, toggleoffhImage, toggleoffhImage, toggleonhImage);
  150. fToggleListen1->setPos(togglePosStart);
  151. fToggleListen1->setCallback(this);
  152. togglePosStart.setX(285.5);
  153. togglePosStart.setY(254);
  154. fToggleStereo = new ImageToggle(this, toggleoffImage, toggleoffImage, toggleonImage);
  155. fToggleStereo->setPos(togglePosStart);
  156. fToggleStereo->setCallback(this);
  157. fCanvasArea.setPos(540, 32);
  158. fCanvasArea.setSize(102, 102);
  159. fThresh[0] = -20.f;
  160. fThresh[1] = -18.f;
  161. fThresh[2] = -16.f;
  162. fRatio = 4.f;
  163. fKnee = 0.f;
  164. fMakeup[0] = 0.f;
  165. fMakeup[1] = 0.f;
  166. fMakeup[2] = 0.f;
  167. fBypass[0] = 0.f;
  168. fBypass[1] = 0.f;
  169. fBypass[2] = 0.f;
  170. fMaster = 0.f;
  171. int i,k;
  172. for (k = 0; k < MAX_COMP; ++k) {
  173. for (i = 0; i < COMPOINTS; ++i) {
  174. compx[k][i] = fCanvasArea.getX();
  175. compy[k][i] = fCanvasArea.getY() + fCanvasArea.getHeight();
  176. }
  177. }
  178. }
  179. ZaMultiCompX2UI::~ZaMultiCompX2UI()
  180. {
  181. delete fKnobAttack;
  182. delete fKnobRelease;
  183. delete fKnobThresh1;
  184. delete fKnobThresh2;
  185. delete fKnobThresh3;
  186. delete fKnobRatio;
  187. delete fKnobKnee;
  188. delete fKnobGlobalGain;
  189. delete fKnobMakeup1;
  190. delete fKnobMakeup2;
  191. delete fKnobMakeup3;
  192. delete fKnobXover1;
  193. delete fKnobXover2;
  194. delete fToggleBypass1;
  195. delete fToggleBypass2;
  196. delete fToggleBypass3;
  197. delete fToggleListen1;
  198. delete fToggleListen2;
  199. delete fToggleListen3;
  200. delete fToggleStereo;
  201. }
  202. void ZaMultiCompX2UI::compcurve(float in, int k, float *outx, float* outy) {
  203. float knee = fKnee;
  204. float ratio = fRatio;
  205. float makeup = fMakeup[k] + fMaster;
  206. float thresdb = fThresh[k];
  207. float width=((knee+1.f)-0.99f)*6.f;
  208. float xg, yg;
  209. yg = 0.f;
  210. xg = (in==0.f) ? -160.f : to_dB(fabs(in));
  211. xg = sanitize_denormal(xg);
  212. if (2.f*(xg-thresdb)<-width) {
  213. yg = xg;
  214. } else if (2.f*fabs(xg-thresdb)<=width) {
  215. yg = xg + (1.f/ratio-1.f)*(xg-thresdb+width/2.f)*(xg-thresdb+width/2.f)/(2.f*width);
  216. } else if (2.f*(xg-thresdb)>width) {
  217. yg = thresdb + (xg-thresdb)/ratio;
  218. }
  219. yg = sanitize_denormal(yg);
  220. *outx = (to_dB(in) + 1.) / 55. + 1.;
  221. *outy = !fBypass[k] ? (to_dB(in) + fMaster + 1.) / 55. + 1. : (yg + makeup + 1.) / 55. + 1.;
  222. //printf("x = %f y = %f\n",*outx,*outy);
  223. }
  224. void ZaMultiCompX2UI::calc_compcurves() {
  225. float max_x = 1.f;
  226. float min_x = 0.f;
  227. float x2;
  228. for (int k = 0; k < MAX_COMP; ++k) {
  229. for (int i = 0; i < COMPOINTS; ++i) {
  230. x2 = (max_x - min_x) / COMPOINTS * i + min_x;
  231. compcurve(x2, k, &compx[k][i], &compy[k][i]);
  232. compx[k][i] = fCanvasArea.getX() + compx[k][i]*fCanvasArea.getWidth();
  233. compy[k][i] = fCanvasArea.getY() + (1.-compy[k][i])*fCanvasArea.getHeight();
  234. }
  235. //dot follows curve:
  236. //compcurve(from_dB(-ui->gainred), k, &dotx[0], &doty[0]);
  237. //dotx[0] = -(1-dotx[0])*280. + 280.;
  238. //doty[0] = (1.-doty[0])*280.;
  239. //dot follows centre:
  240. //dotx[0] = -(1.- from_dB(-gainred))*280. + 280.;
  241. //doty[0] = (1.- from_dB(-gainred))*280.;
  242. //printf("gainr=%.2f x=%.2f y=%.2f\n",ui->gainred, ui->dotx[0], ui->doty[0]);
  243. }
  244. }
  245. // -----------------------------------------------------------------------
  246. // DSP Callbacks
  247. void ZaMultiCompX2UI::d_parameterChanged(uint32_t index, float value)
  248. {
  249. switch (index)
  250. {
  251. case ZaMultiCompX2Plugin::paramAttack:
  252. fKnobAttack->setValue(value);
  253. break;
  254. case ZaMultiCompX2Plugin::paramRelease:
  255. fKnobRelease->setValue(value);
  256. break;
  257. case ZaMultiCompX2Plugin::paramThresh1:
  258. fKnobThresh1->setValue(value);
  259. fThresh[0] = value;
  260. break;
  261. case ZaMultiCompX2Plugin::paramThresh2:
  262. fKnobThresh2->setValue(value);
  263. fThresh[1] = value;
  264. break;
  265. case ZaMultiCompX2Plugin::paramThresh3:
  266. fKnobThresh3->setValue(value);
  267. fThresh[2] = value;
  268. break;
  269. case ZaMultiCompX2Plugin::paramRatio:
  270. fKnobRatio->setValue(value);
  271. fRatio = value;
  272. break;
  273. case ZaMultiCompX2Plugin::paramKnee:
  274. fKnobKnee->setValue(value);
  275. fKnee = value;
  276. break;
  277. case ZaMultiCompX2Plugin::paramGlobalGain:
  278. fKnobGlobalGain->setValue(value);
  279. fMaster = value;
  280. break;
  281. case ZaMultiCompX2Plugin::paramGainR1:
  282. if (fLedRedValue1 != value)
  283. {
  284. fLedRedValue1 = value;
  285. repaint();
  286. }
  287. break;
  288. case ZaMultiCompX2Plugin::paramGainR2:
  289. if (fLedRedValue2 != value)
  290. {
  291. fLedRedValue2 = value;
  292. repaint();
  293. }
  294. break;
  295. case ZaMultiCompX2Plugin::paramGainR3:
  296. if (fLedRedValue3 != value)
  297. {
  298. fLedRedValue3 = value;
  299. repaint();
  300. }
  301. break;
  302. case ZaMultiCompX2Plugin::paramOutputLevelL:
  303. if (fLedYellowValueL != value)
  304. {
  305. fLedYellowValueL = value;
  306. repaint();
  307. }
  308. break;
  309. case ZaMultiCompX2Plugin::paramOutputLevelR:
  310. if (fLedYellowValueR != value)
  311. {
  312. fLedYellowValueR = value;
  313. repaint();
  314. }
  315. break;
  316. case ZaMultiCompX2Plugin::paramMakeup1:
  317. fKnobMakeup1->setValue(value);
  318. if (fMakeup[0] != value)
  319. {
  320. fMakeup[0] = value;
  321. repaint();
  322. }
  323. break;
  324. case ZaMultiCompX2Plugin::paramMakeup2:
  325. fKnobMakeup2->setValue(value);
  326. if (fMakeup[1] != value)
  327. {
  328. fMakeup[1] = value;
  329. repaint();
  330. }
  331. break;
  332. case ZaMultiCompX2Plugin::paramMakeup3:
  333. fKnobMakeup3->setValue(value);
  334. if (fMakeup[2] != value)
  335. {
  336. fMakeup[2] = value;
  337. repaint();
  338. }
  339. break;
  340. case ZaMultiCompX2Plugin::paramToggle1:
  341. fToggleBypass1->setValue(value);
  342. if (fBypass[0] != value)
  343. {
  344. fBypass[0] = value;
  345. repaint();
  346. }
  347. break;
  348. case ZaMultiCompX2Plugin::paramToggle2:
  349. fToggleBypass2->setValue(value);
  350. if (fBypass[1] != value)
  351. {
  352. fBypass[1] = value;
  353. repaint();
  354. }
  355. break;
  356. case ZaMultiCompX2Plugin::paramToggle3:
  357. fToggleBypass3->setValue(value);
  358. if (fBypass[2] != value)
  359. {
  360. fBypass[2] = value;
  361. repaint();
  362. }
  363. break;
  364. case ZaMultiCompX2Plugin::paramListen1:
  365. fToggleListen1->setValue(value);
  366. break;
  367. case ZaMultiCompX2Plugin::paramListen2:
  368. fToggleListen2->setValue(value);
  369. break;
  370. case ZaMultiCompX2Plugin::paramListen3:
  371. fToggleListen3->setValue(value);
  372. break;
  373. }
  374. }
  375. void ZaMultiCompX2UI::d_programChanged(uint32_t index)
  376. {
  377. if (index != 0)
  378. return;
  379. // Default values
  380. fKnobAttack->setValue(10.0f);
  381. fKnobRelease->setValue(80.0f);
  382. /*
  383. * fKnobThresh->setValue(-6.0f);
  384. fKnobRatio->setValue(4.0f);
  385. fKnobKnee->setValue(0.0f);
  386. fKnobGlobalGain->setValue(0.0f);
  387. fKnobMakeup1->setValue(0.0f);
  388. fKnobMakeup2->setValue(0.0f);
  389. fKnobMakeup3->setValue(0.0f);
  390. fKnobXover1->setValue(250.0f);
  391. fKnobXover2->setValue(1400.0f);
  392. */
  393. fToggleBypass1->setValue(0.0f);
  394. fToggleBypass2->setValue(0.0f);
  395. fToggleBypass3->setValue(0.0f);
  396. fToggleListen1->setValue(0.0f);
  397. fToggleListen2->setValue(0.0f);
  398. fToggleListen3->setValue(0.0f);
  399. fToggleStereo->setValue(0.0f);
  400. }
  401. void ZaMultiCompX2UI::d_stateChanged(const char*, const char*)
  402. {
  403. }
  404. // -----------------------------------------------------------------------
  405. // Widget Callbacks
  406. void ZaMultiCompX2UI::imageKnobDragStarted(ImageKnob* knob)
  407. {
  408. if (knob == fKnobAttack)
  409. d_editParameter(ZaMultiCompX2Plugin::paramAttack, true);
  410. else if (knob == fKnobRelease)
  411. d_editParameter(ZaMultiCompX2Plugin::paramRelease, true);
  412. else if (knob == fKnobThresh1)
  413. d_editParameter(ZaMultiCompX2Plugin::paramThresh1, true);
  414. else if (knob == fKnobThresh2)
  415. d_editParameter(ZaMultiCompX2Plugin::paramThresh2, true);
  416. else if (knob == fKnobThresh3)
  417. d_editParameter(ZaMultiCompX2Plugin::paramThresh3, true);
  418. else if (knob == fKnobRatio)
  419. d_editParameter(ZaMultiCompX2Plugin::paramRatio, true);
  420. else if (knob == fKnobKnee)
  421. d_editParameter(ZaMultiCompX2Plugin::paramKnee, true);
  422. else if (knob == fKnobGlobalGain)
  423. d_editParameter(ZaMultiCompX2Plugin::paramGlobalGain, true);
  424. else if (knob == fKnobMakeup1)
  425. d_editParameter(ZaMultiCompX2Plugin::paramMakeup1, true);
  426. else if (knob == fKnobMakeup2)
  427. d_editParameter(ZaMultiCompX2Plugin::paramMakeup2, true);
  428. else if (knob == fKnobMakeup3)
  429. d_editParameter(ZaMultiCompX2Plugin::paramMakeup3, true);
  430. else if (knob == fKnobXover1)
  431. d_editParameter(ZaMultiCompX2Plugin::paramXover1, true);
  432. else if (knob == fKnobXover2)
  433. d_editParameter(ZaMultiCompX2Plugin::paramXover2, true);
  434. }
  435. void ZaMultiCompX2UI::imageKnobDragFinished(ImageKnob* knob)
  436. {
  437. if (knob == fKnobAttack)
  438. d_editParameter(ZaMultiCompX2Plugin::paramAttack, false);
  439. else if (knob == fKnobRelease)
  440. d_editParameter(ZaMultiCompX2Plugin::paramRelease, false);
  441. else if (knob == fKnobThresh1)
  442. d_editParameter(ZaMultiCompX2Plugin::paramThresh1, false);
  443. else if (knob == fKnobThresh2)
  444. d_editParameter(ZaMultiCompX2Plugin::paramThresh2, false);
  445. else if (knob == fKnobThresh3)
  446. d_editParameter(ZaMultiCompX2Plugin::paramThresh3, false);
  447. else if (knob == fKnobRatio)
  448. d_editParameter(ZaMultiCompX2Plugin::paramRatio, false);
  449. else if (knob == fKnobKnee)
  450. d_editParameter(ZaMultiCompX2Plugin::paramKnee, false);
  451. else if (knob == fKnobGlobalGain)
  452. d_editParameter(ZaMultiCompX2Plugin::paramGlobalGain, false);
  453. else if (knob == fKnobMakeup1)
  454. d_editParameter(ZaMultiCompX2Plugin::paramMakeup1, false);
  455. else if (knob == fKnobMakeup2)
  456. d_editParameter(ZaMultiCompX2Plugin::paramMakeup2, false);
  457. else if (knob == fKnobMakeup3)
  458. d_editParameter(ZaMultiCompX2Plugin::paramMakeup3, false);
  459. else if (knob == fKnobXover1)
  460. d_editParameter(ZaMultiCompX2Plugin::paramXover1, false);
  461. else if (knob == fKnobXover2)
  462. d_editParameter(ZaMultiCompX2Plugin::paramXover2, false);
  463. }
  464. void ZaMultiCompX2UI::imageKnobValueChanged(ImageKnob* knob, float value)
  465. {
  466. if (knob == fKnobAttack)
  467. d_setParameterValue(ZaMultiCompX2Plugin::paramAttack, value);
  468. else if (knob == fKnobRelease)
  469. d_setParameterValue(ZaMultiCompX2Plugin::paramRelease, value);
  470. else if (knob == fKnobThresh1) {
  471. d_setParameterValue(ZaMultiCompX2Plugin::paramThresh1, value);
  472. fThresh[0] = value;
  473. }
  474. else if (knob == fKnobThresh2) {
  475. d_setParameterValue(ZaMultiCompX2Plugin::paramThresh2, value);
  476. fThresh[1] = value;
  477. }
  478. else if (knob == fKnobThresh3) {
  479. d_setParameterValue(ZaMultiCompX2Plugin::paramThresh3, value);
  480. fThresh[2] = value;
  481. }
  482. else if (knob == fKnobRatio) {
  483. d_setParameterValue(ZaMultiCompX2Plugin::paramRatio, value);
  484. fRatio = value;
  485. }
  486. else if (knob == fKnobKnee) {
  487. d_setParameterValue(ZaMultiCompX2Plugin::paramKnee, value);
  488. fKnee = value;
  489. }
  490. else if (knob == fKnobGlobalGain) {
  491. d_setParameterValue(ZaMultiCompX2Plugin::paramGlobalGain, value);
  492. fMaster = value;
  493. }
  494. else if (knob == fKnobMakeup1) {
  495. d_setParameterValue(ZaMultiCompX2Plugin::paramMakeup1, value);
  496. fMakeup[0] = value;
  497. }
  498. else if (knob == fKnobMakeup2) {
  499. d_setParameterValue(ZaMultiCompX2Plugin::paramMakeup2, value);
  500. fMakeup[1] = value;
  501. }
  502. else if (knob == fKnobMakeup3) {
  503. d_setParameterValue(ZaMultiCompX2Plugin::paramMakeup3, value);
  504. fMakeup[2] = value;
  505. }
  506. else if (knob == fKnobXover1)
  507. d_setParameterValue(ZaMultiCompX2Plugin::paramXover1, value);
  508. else if (knob == fKnobXover2)
  509. d_setParameterValue(ZaMultiCompX2Plugin::paramXover2, value);
  510. }
  511. void ZaMultiCompX2UI::imageToggleClicked(ImageToggle* toggle, int)
  512. {
  513. float v = toggle->getValue();
  514. if (toggle == fToggleBypass1) {
  515. d_setParameterValue(ZaMultiCompX2Plugin::paramToggle1, v);
  516. fBypass[0] = v;
  517. }
  518. else if (toggle == fToggleBypass2) {
  519. d_setParameterValue(ZaMultiCompX2Plugin::paramToggle2, v);
  520. fBypass[1] = v;
  521. }
  522. else if (toggle == fToggleBypass3) {
  523. d_setParameterValue(ZaMultiCompX2Plugin::paramToggle3, v);
  524. fBypass[2] = v;
  525. }
  526. else if (toggle == fToggleListen1)
  527. d_setParameterValue(ZaMultiCompX2Plugin::paramListen1, v);
  528. else if (toggle == fToggleListen2)
  529. d_setParameterValue(ZaMultiCompX2Plugin::paramListen2, v);
  530. else if (toggle == fToggleListen3)
  531. d_setParameterValue(ZaMultiCompX2Plugin::paramListen3, v);
  532. else if (toggle == fToggleStereo)
  533. d_setParameterValue(ZaMultiCompX2Plugin::paramStereoDet, v);
  534. }
  535. void ZaMultiCompX2UI::onDisplay()
  536. {
  537. fImgBackground.draw();
  538. d_setState("stateMeterReset", "");
  539. // draw leds
  540. static const float sLedSpacing = 15.5f;
  541. static const int sLedInitialX = 343;
  542. static const int sYellowLedStaticYL = 254.5;
  543. static const int sYellowLedStaticYR = 269.5;
  544. static const int sRedLed1StaticY = 215;
  545. static const int sRedLed2StaticY = 164;
  546. static const int sRedLed3StaticY = 113;
  547. int numRedLeds1;
  548. int numRedLeds2;
  549. int numRedLeds3;
  550. int numYellowLedsL;
  551. int numYellowLedsR;
  552. if (fLedRedValue1 >= 40.f)
  553. numRedLeds1 = 12;
  554. else if (fLedRedValue1 >= 30.f)
  555. numRedLeds1 = 11;
  556. else if (fLedRedValue1 >= 20.f)
  557. numRedLeds1 = 10;
  558. else if (fLedRedValue1 >= 15.f)
  559. numRedLeds1 = 9;
  560. else if (fLedRedValue1 >= 10.f)
  561. numRedLeds1 = 8;
  562. else if (fLedRedValue1 >= 8.f)
  563. numRedLeds1 = 7;
  564. else if (fLedRedValue1 >= 6.f)
  565. numRedLeds1 = 6;
  566. else if (fLedRedValue1 >= 5.f)
  567. numRedLeds1 = 5;
  568. else if (fLedRedValue1 >= 4.f)
  569. numRedLeds1 = 4;
  570. else if (fLedRedValue1 >= 3.f)
  571. numRedLeds1 = 3;
  572. else if (fLedRedValue1 >= 2.f)
  573. numRedLeds1 = 2;
  574. else if (fLedRedValue1 >= 1.f)
  575. numRedLeds1 = 1;
  576. else numRedLeds1 = 0;
  577. if (fLedRedValue2 >= 40.f)
  578. numRedLeds2 = 12;
  579. else if (fLedRedValue2 >= 30.f)
  580. numRedLeds2 = 11;
  581. else if (fLedRedValue2 >= 20.f)
  582. numRedLeds2 = 10;
  583. else if (fLedRedValue2 >= 15.f)
  584. numRedLeds2 = 9;
  585. else if (fLedRedValue2 >= 10.f)
  586. numRedLeds2 = 8;
  587. else if (fLedRedValue2 >= 8.f)
  588. numRedLeds2 = 7;
  589. else if (fLedRedValue2 >= 6.f)
  590. numRedLeds2 = 6;
  591. else if (fLedRedValue2 >= 5.f)
  592. numRedLeds2 = 5;
  593. else if (fLedRedValue2 >= 4.f)
  594. numRedLeds2 = 4;
  595. else if (fLedRedValue2 >= 3.f)
  596. numRedLeds2 = 3;
  597. else if (fLedRedValue2 >= 2.f)
  598. numRedLeds2 = 2;
  599. else if (fLedRedValue2 >= 1.f)
  600. numRedLeds2 = 1;
  601. else numRedLeds2 = 0;
  602. if (fLedRedValue3 >= 40.f)
  603. numRedLeds3 = 12;
  604. else if (fLedRedValue3 >= 30.f)
  605. numRedLeds3 = 11;
  606. else if (fLedRedValue3 >= 20.f)
  607. numRedLeds3 = 10;
  608. else if (fLedRedValue3 >= 15.f)
  609. numRedLeds3 = 9;
  610. else if (fLedRedValue3 >= 10.f)
  611. numRedLeds3 = 8;
  612. else if (fLedRedValue3 >= 8.f)
  613. numRedLeds3 = 7;
  614. else if (fLedRedValue3 >= 6.f)
  615. numRedLeds3 = 6;
  616. else if (fLedRedValue3 >= 5.f)
  617. numRedLeds3 = 5;
  618. else if (fLedRedValue3 >= 4.f)
  619. numRedLeds3 = 4;
  620. else if (fLedRedValue3 >= 3.f)
  621. numRedLeds3 = 3;
  622. else if (fLedRedValue3 >= 2.f)
  623. numRedLeds3 = 2;
  624. else if (fLedRedValue3 >= 1.f)
  625. numRedLeds3 = 1;
  626. else numRedLeds3 = 0;
  627. for (int i=numRedLeds1; i>0; --i)
  628. fLedRedImg.draw(sLedInitialX + (12 - i)*sLedSpacing, sRedLed1StaticY);
  629. for (int i=numRedLeds2; i>0; --i)
  630. fLedRedImg.draw(sLedInitialX + (12 - i)*sLedSpacing, sRedLed2StaticY);
  631. for (int i=numRedLeds3; i>0; --i)
  632. fLedRedImg.draw(sLedInitialX + (12 - i)*sLedSpacing, sRedLed3StaticY);
  633. if (fLedYellowValueL >= 20.f)
  634. numYellowLedsL = 19;
  635. else if (fLedYellowValueL >= 10.f)
  636. numYellowLedsL = 18;
  637. else if (fLedYellowValueL >= 8.f)
  638. numYellowLedsL = 17;
  639. else if (fLedYellowValueL >= 4.f)
  640. numYellowLedsL = 16;
  641. else if (fLedYellowValueL >= 2.f)
  642. numYellowLedsL = 15;
  643. else if (fLedYellowValueL >= 1.f)
  644. numYellowLedsL = 14;
  645. else if (fLedYellowValueL >= 0.f)
  646. numYellowLedsL = 13;
  647. else if (fLedYellowValueL >= -1.f)
  648. numYellowLedsL = 12;
  649. else if (fLedYellowValueL >= -2.f)
  650. numYellowLedsL = 11;
  651. else if (fLedYellowValueL >= -3.f)
  652. numYellowLedsL = 10;
  653. else if (fLedYellowValueL >= -4.f)
  654. numYellowLedsL = 9;
  655. else if (fLedYellowValueL >= -5.f)
  656. numYellowLedsL = 8;
  657. else if (fLedYellowValueL >= -6.f)
  658. numYellowLedsL = 7;
  659. else if (fLedYellowValueL >= -8.f)
  660. numYellowLedsL = 6;
  661. else if (fLedYellowValueL >= -10.f)
  662. numYellowLedsL = 5;
  663. else if (fLedYellowValueL >= -15.f)
  664. numYellowLedsL = 4;
  665. else if (fLedYellowValueL >= -20.f)
  666. numYellowLedsL = 3;
  667. else if (fLedYellowValueL >= -30.f)
  668. numYellowLedsL = 2;
  669. else if (fLedYellowValueL >= -40.f)
  670. numYellowLedsL = 1;
  671. else numYellowLedsL = 0;
  672. if (numYellowLedsL > 12) {
  673. for (int i=12; i<numYellowLedsL; ++i)
  674. fLedRedImg.draw(sLedInitialX + i*sLedSpacing, sYellowLedStaticYL);
  675. for (int i=0; i<12; ++i)
  676. fLedYellowImg.draw(sLedInitialX + i*sLedSpacing, sYellowLedStaticYL);
  677. } else {
  678. for (int i=0; i<numYellowLedsL; ++i)
  679. fLedYellowImg.draw(sLedInitialX + i*sLedSpacing, sYellowLedStaticYL);
  680. }
  681. if (fLedYellowValueR >= 20.f)
  682. numYellowLedsR = 19;
  683. else if (fLedYellowValueR >= 10.f)
  684. numYellowLedsR = 18;
  685. else if (fLedYellowValueR >= 8.f)
  686. numYellowLedsR = 17;
  687. else if (fLedYellowValueR >= 4.f)
  688. numYellowLedsR = 16;
  689. else if (fLedYellowValueR >= 2.f)
  690. numYellowLedsR = 15;
  691. else if (fLedYellowValueR >= 1.f)
  692. numYellowLedsR = 14;
  693. else if (fLedYellowValueR >= 0.f)
  694. numYellowLedsR = 13;
  695. else if (fLedYellowValueR >= -1.f)
  696. numYellowLedsR = 12;
  697. else if (fLedYellowValueR >= -2.f)
  698. numYellowLedsR = 11;
  699. else if (fLedYellowValueR >= -3.f)
  700. numYellowLedsR = 10;
  701. else if (fLedYellowValueR >= -4.f)
  702. numYellowLedsR = 9;
  703. else if (fLedYellowValueR >= -5.f)
  704. numYellowLedsR = 8;
  705. else if (fLedYellowValueR >= -6.f)
  706. numYellowLedsR = 7;
  707. else if (fLedYellowValueR >= -8.f)
  708. numYellowLedsR = 6;
  709. else if (fLedYellowValueR >= -10.f)
  710. numYellowLedsR = 5;
  711. else if (fLedYellowValueR >= -15.f)
  712. numYellowLedsR = 4;
  713. else if (fLedYellowValueR >= -20.f)
  714. numYellowLedsR = 3;
  715. else if (fLedYellowValueR >= -30.f)
  716. numYellowLedsR = 2;
  717. else if (fLedYellowValueR >= -40.f)
  718. numYellowLedsR = 1;
  719. else numYellowLedsR = 0;
  720. if (numYellowLedsR > 12) {
  721. for (int i=12; i<numYellowLedsR; ++i)
  722. fLedRedImg.draw(sLedInitialX + i*sLedSpacing, sYellowLedStaticYR);
  723. for (int i=0; i<12; ++i)
  724. fLedYellowImg.draw(sLedInitialX + i*sLedSpacing, sYellowLedStaticYR);
  725. } else {
  726. for (int i=0; i<numYellowLedsR; ++i)
  727. fLedYellowImg.draw(sLedInitialX + i*sLedSpacing, sYellowLedStaticYR);
  728. }
  729. /*
  730. // TESTING - remove later
  731. // this paints the 'fCanvasArea' so we can clearly see its bounds
  732. {
  733. const int x = fCanvasArea.getX();
  734. const int y = fCanvasArea.getY();
  735. const int w = fCanvasArea.getWidth();
  736. const int h = fCanvasArea.getHeight();
  737. glColor4f(0.0f, 1.0f, 0.0f, 0.9f);
  738. glBegin(GL_QUADS);
  739. glTexCoord2f(0.0f, 0.0f);
  740. glVertex2i(x, y);
  741. glTexCoord2f(1.0f, 0.0f);
  742. glVertex2i(x+w, y);
  743. glTexCoord2f(1.0f, 1.0f);
  744. glVertex2i(x+w, y+h);
  745. glTexCoord2f(0.0f, 1.0f);
  746. glVertex2i(x, y+h);
  747. glEnd();
  748. // reset color
  749. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  750. }
  751. */
  752. calc_compcurves();
  753. //draw comp curves
  754. glEnable(GL_BLEND);
  755. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  756. glEnable(GL_LINE_SMOOTH);
  757. glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
  758. glLineWidth(2);
  759. int i,k;
  760. for (k = 0; k < MAX_COMP; ++k) {
  761. glColor4f((k==0)?1.f:0.235f, (k==1)?1.f:0.235f, (k==2)?1.f:0.235f, 1.0f);
  762. for (i = 2; i < COMPOINTS; ++i) {
  763. glBegin(GL_LINES);
  764. if (compy[k][i-1] < fCanvasArea.getY() + fCanvasArea.getHeight()
  765. && compy[k][i-1] > fCanvasArea.getY()
  766. && compy[k][i] < fCanvasArea.getY() + fCanvasArea.getHeight()
  767. && compy[k][i] > fCanvasArea.getY()) {
  768. glVertex2i(compx[k][i-1], compy[k][i-1]);
  769. glVertex2i(compx[k][i], compy[k][i]);
  770. }
  771. glEnd();
  772. }
  773. }
  774. // reset color
  775. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  776. }
  777. // -----------------------------------------------------------------------
  778. UI* createUI()
  779. {
  780. return new ZaMultiCompX2UI();
  781. }
  782. // -----------------------------------------------------------------------
  783. END_NAMESPACE_DISTRHO