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.

777 lines
23KB

  1. /*
  2. * Vector Juice Plugin
  3. * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz
  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 "GrooveJuiceUI.hpp"
  18. using DGL::Point;
  19. START_NAMESPACE_DISTRHO
  20. // -----------------------------------------------------------------------
  21. GrooveJuiceUI::GrooveJuiceUI()
  22. : UI(),
  23. fAboutWindow(this)
  24. {
  25. // xy params
  26. paramX = paramY = 0.5f;
  27. // set the XY canvas area
  28. fDragging = false;
  29. fDragValid = false;
  30. fLastX = fLastY = 0;
  31. fCanvasArea.setPos(22+12, 49+12);
  32. fCanvasArea.setSize(368-24, 368-24);
  33. // background
  34. fImgBackground = Image(GrooveJuiceArtwork::backgroundData, GrooveJuiceArtwork::backgroundWidth, GrooveJuiceArtwork::backgroundHeight, GL_BGR);
  35. //roundlet
  36. fImgRoundlet = Image(GrooveJuiceArtwork::roundletData, GrooveJuiceArtwork::roundletWidth, GrooveJuiceArtwork::roundletHeight);
  37. //orbit
  38. fImgOrbit = Image(GrooveJuiceArtwork::orbitData, GrooveJuiceArtwork::orbitWidth, GrooveJuiceArtwork::orbitHeight);
  39. //subOrbit
  40. fImgSubOrbit = Image(GrooveJuiceArtwork::subOrbitData, GrooveJuiceArtwork::subOrbitWidth, GrooveJuiceArtwork::subOrbitHeight);
  41. // about
  42. Image imageAbout(GrooveJuiceArtwork::aboutData, GrooveJuiceArtwork::aboutWidth, GrooveJuiceArtwork::aboutHeight, GL_BGR);
  43. fAboutWindow.setImage(imageAbout);
  44. // about button
  45. Image aboutImageNormal(GrooveJuiceArtwork::aboutButtonNormalData, GrooveJuiceArtwork::aboutButtonNormalWidth, GrooveJuiceArtwork::aboutButtonNormalHeight);
  46. Image aboutImageHover(GrooveJuiceArtwork::aboutButtonHoverData, GrooveJuiceArtwork::aboutButtonHoverWidth, GrooveJuiceArtwork::aboutButtonHoverHeight);
  47. fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover);
  48. fButtonAbout->setPos(599, 17);
  49. fButtonAbout->setCallback(this);
  50. Image pageImageNormal(GrooveJuiceArtwork::pageButtonNormalData, GrooveJuiceArtwork::pageButtonNormalWidth, GrooveJuiceArtwork::pageButtonNormalHeight);
  51. Image pageImageHover(GrooveJuiceArtwork::pageButtonHoverData, GrooveJuiceArtwork::pageButtonHoverWidth, GrooveJuiceArtwork::pageButtonHoverHeight);
  52. Image randomizeImageNormal(GrooveJuiceArtwork::randomizeButtonNormalData, GrooveJuiceArtwork::randomizeButtonNormalWidth, GrooveJuiceArtwork::randomizeButtonNormalHeight);
  53. Image randomizeImageHover(GrooveJuiceArtwork::randomizeButtonHoverData, GrooveJuiceArtwork::randomizeButtonHoverWidth, GrooveJuiceArtwork::randomizeButtonHoverHeight);
  54. fButtonRandomize = new ImageButton(this, randomizeImageNormal, randomizeImageHover, randomizeImageHover);
  55. fButtonRandomize -> setPos(313, 586);
  56. fButtonRandomize -> setCallback(this);
  57. int oX = 15;
  58. int oY = 557;
  59. int mX = 103-oX;
  60. int mY = 0;
  61. for (int i=0; i<8; i++) {
  62. fButtonsPage[i] = new ImageButton(this, pageImageNormal, pageImageHover, pageImageHover);
  63. fButtonsPage[i]->setPos(oX+mX*i, oY);
  64. fButtonsPage[i]->setCallback(this);
  65. }
  66. // knobs
  67. Image knobImage(GrooveJuiceArtwork::knobData, GrooveJuiceArtwork::knobWidth, GrooveJuiceArtwork::knobHeight);
  68. Image knob2Image(GrooveJuiceArtwork::knob2Data, GrooveJuiceArtwork::knob2Width, GrooveJuiceArtwork::knob2Height);
  69. // knob KnobOrbitSpeedX
  70. fKnobOrbitSpeedX = new ImageKnob(this, knobImage);
  71. fKnobOrbitSpeedX->setPos(423, 185);
  72. fKnobOrbitSpeedX->setStep(1.0f);
  73. fKnobOrbitSpeedX->setRange(1.0f, 128.0f);
  74. fKnobOrbitSpeedX->setValue(4.0f);
  75. fKnobOrbitSpeedX->setRotationAngle(270);
  76. fKnobOrbitSpeedX->setCallback(this);
  77. // knob KnobOrbitSpeedY
  78. fKnobOrbitSpeedY = new ImageKnob(this, knobImage);
  79. fKnobOrbitSpeedY->setPos(516, 185);
  80. fKnobOrbitSpeedY->setStep(1.0f);
  81. fKnobOrbitSpeedY->setRange(1.0f, 128.0f);
  82. fKnobOrbitSpeedY->setValue(4.0f);
  83. fKnobOrbitSpeedY->setRotationAngle(270);
  84. fKnobOrbitSpeedY->setCallback(this);
  85. // knob KnobOrbitSizeX
  86. fKnobOrbitSizeX = new ImageKnob(this, knobImage);
  87. fKnobOrbitSizeX->setPos(423, 73);
  88. fKnobOrbitSizeX->setRange(0.0f, 1.0f);
  89. fKnobOrbitSizeX->setValue(0.5f);
  90. fKnobOrbitSizeX->setRotationAngle(270);
  91. fKnobOrbitSizeX->setCallback(this);
  92. // knob KnobOrbitSizeY
  93. fKnobOrbitSizeY = new ImageKnob(this, knobImage);
  94. fKnobOrbitSizeY->setPos(516, 73);
  95. fKnobOrbitSizeY->setRange(0.0f, 1.0f);
  96. fKnobOrbitSizeY->setValue(0.5f);
  97. fKnobOrbitSizeY->setRotationAngle(270);
  98. fKnobOrbitSizeY->setCallback(this);
  99. // knob KnobSubOrbitSpeed
  100. fKnobSubOrbitSpeed = new ImageKnob(this, knobImage);
  101. fKnobSubOrbitSpeed->setPos(620, 185);
  102. fKnobSubOrbitSpeed->setStep(1.0f);
  103. fKnobSubOrbitSpeed->setRange(1.0f, 128.0f);
  104. fKnobSubOrbitSpeed->setValue(32.0f);
  105. fKnobSubOrbitSpeed->setRotationAngle(270);
  106. fKnobSubOrbitSpeed->setCallback(this);
  107. // knob KnobSubOrbitSize
  108. fKnobSubOrbitSize = new ImageKnob(this, knobImage);
  109. fKnobSubOrbitSize->setPos(620, 73);
  110. fKnobSubOrbitSize->setRange(0.0f, 1.0f);
  111. fKnobSubOrbitSize->setValue(0.5f);
  112. fKnobSubOrbitSize->setRotationAngle(270);
  113. fKnobSubOrbitSize->setCallback(this);
  114. // knob KnobSubOrbitSmooth
  115. fKnobSubOrbitSmooth = new ImageKnob(this, knobImage);
  116. fKnobSubOrbitSmooth->setPos(620, 297);
  117. fKnobSubOrbitSmooth->setRange(0.0f, 1.0f);
  118. fKnobSubOrbitSmooth->setValue(0.5f);
  119. fKnobSubOrbitSmooth->setRotationAngle(270);
  120. fKnobSubOrbitSmooth->setCallback(this);
  121. // sliders
  122. Image sliderImage(GrooveJuiceArtwork::sliderData, GrooveJuiceArtwork::sliderWidth, GrooveJuiceArtwork::sliderHeight);
  123. Point<int> sliderPosStart(410, 284);
  124. Point<int> sliderPosEnd(410+48, 284);
  125. // slider OrbitWaveX
  126. fSliderOrbitWaveX = new ImageSlider(this, sliderImage);
  127. fSliderOrbitWaveX->setStartPos(sliderPosStart);
  128. fSliderOrbitWaveX->setEndPos(sliderPosEnd);
  129. fSliderOrbitWaveX->setRange(1.0f, 4.0f);
  130. fSliderOrbitWaveX->setStep(1.0f);
  131. fSliderOrbitWaveX->setValue(3.0f);
  132. fSliderOrbitWaveX->setCallback(this);
  133. // slider OrbitWaveY
  134. sliderPosStart.setX(503);
  135. sliderPosEnd.setX(503+48);
  136. fSliderOrbitWaveY = new ImageSlider(this, sliderImage);
  137. fSliderOrbitWaveY->setStartPos(sliderPosStart);
  138. fSliderOrbitWaveY->setEndPos(sliderPosEnd);
  139. fSliderOrbitWaveY->setRange(1.0f, 4.0f);
  140. fSliderOrbitWaveY->setStep(1.0f);
  141. fSliderOrbitWaveY->setValue(3.0f);
  142. fSliderOrbitWaveY->setCallback(this);
  143. // slider OrbitPhaseX
  144. sliderPosStart.setX(410);
  145. sliderPosStart.setY(345);
  146. sliderPosEnd.setX(410+48);
  147. sliderPosEnd.setY(345);
  148. fSliderOrbitPhaseX = new ImageSlider(this, sliderImage);
  149. fSliderOrbitPhaseX->setStartPos(sliderPosStart);
  150. fSliderOrbitPhaseX->setEndPos(sliderPosEnd);
  151. fSliderOrbitPhaseX->setRange(0.0f, 1.0f);
  152. //fSliderOrbitPhaseX->setStep(1.0f); // FIXME?
  153. fSliderOrbitPhaseX->setValue(0.0f);
  154. fSliderOrbitPhaseX->setCallback(this);
  155. // slider OrbitPhaseY
  156. sliderPosStart.setX(503);
  157. sliderPosEnd.setX(503+48);
  158. fSliderOrbitPhaseY = new ImageSlider(this, sliderImage);
  159. fSliderOrbitPhaseY->setStartPos(sliderPosStart);
  160. fSliderOrbitPhaseY->setEndPos(sliderPosEnd);
  161. fSliderOrbitPhaseY->setRange(0.0f, 1.0f);
  162. //fSliderOrbitPhaseY->setStep(1.0f); // FIXME?
  163. fSliderOrbitPhaseY->setValue(0.0f);
  164. fSliderOrbitPhaseY->setCallback(this);
  165. //knobs graphics
  166. oX = 25; //offset
  167. oY = 480;
  168. mX = 113-oX; //margin
  169. mY = 545-oY;
  170. oX-=9;
  171. oY-=9;
  172. page = 0;
  173. //synth Knobs
  174. for (int x=0; x<8; x++) {
  175. fKnobsSynth[x] = new ImageKnob(this, knob2Image);
  176. fKnobsSynth[x]->setPos(oX+mX*x, oY);
  177. //fKnobsSynth[x]->setStep(1.0f);
  178. fKnobsSynth[x]->setRange(0.0f, 1.0f);
  179. fKnobsSynth[x]->setValue(0.5f);
  180. fKnobsSynth[x]->setRotationAngle(270);
  181. fKnobsSynth[x]->setCallback(this);
  182. }
  183. //default synthData
  184. for (int x=0; x<8; x++)
  185. for (int y=0; y<8; y++)
  186. synthData[x][y] = 0.5;
  187. //default squares
  188. oX = 20;
  189. oY = 47;
  190. mX = 372/8;
  191. for (int x=0; x<8; x++) {
  192. for (int y=0; y<8; y++) {
  193. squares[x][y].timer = 0;
  194. squares[x][y].maxTimer = d_getSampleRate()/8000;
  195. squares[x][y].x=oX+mX*x;
  196. squares[x][y].y=oY+mX*y;
  197. squares[x][y].size = mX;
  198. }
  199. }
  200. tabOX = 15;
  201. tabOY = 552;
  202. tabW = 64;
  203. tabH = 5;
  204. tabPosX = tabOX;
  205. tabTargetPosX = tabPosX;
  206. tabMarginX = 103-tabOX;
  207. }
  208. GrooveJuiceUI::~GrooveJuiceUI()
  209. {
  210. delete fButtonAbout;
  211. //knobs
  212. delete fKnobOrbitSpeedX;
  213. delete fKnobOrbitSpeedY;
  214. delete fKnobOrbitSizeX;
  215. delete fKnobOrbitSizeY;
  216. delete fKnobSubOrbitSpeed;
  217. delete fKnobSubOrbitSize;
  218. delete fKnobSubOrbitSmooth;
  219. //sliders
  220. delete fSliderOrbitWaveX;
  221. delete fSliderOrbitWaveY;
  222. delete fSliderOrbitPhaseX;
  223. delete fSliderOrbitPhaseY;
  224. }
  225. // -----------------------------------------------------------------------
  226. // DSP Callbacks
  227. void GrooveJuiceUI::d_parameterChanged(uint32_t index, float value)
  228. {
  229. if (index<17 || index>=17+64) {
  230. switch (index)
  231. {
  232. case GrooveJuicePlugin::paramX:
  233. if (paramX != value)
  234. {
  235. paramX = value;
  236. fDragValid = false;
  237. repaint();
  238. }
  239. break;
  240. case GrooveJuicePlugin::paramY:
  241. if (paramY != value)
  242. {
  243. paramY = value;
  244. fDragValid = false;
  245. repaint();
  246. }
  247. break;
  248. case GrooveJuicePlugin::paramOrbitSizeX:
  249. fKnobOrbitSizeX->setValue(value);
  250. break;
  251. case GrooveJuicePlugin::paramOrbitSizeY:
  252. fKnobOrbitSizeY->setValue(value);
  253. break;
  254. case GrooveJuicePlugin::paramOrbitSpeedX:
  255. fKnobOrbitSpeedX->setValue(value);
  256. break;
  257. case GrooveJuicePlugin::paramOrbitSpeedY:
  258. fKnobOrbitSpeedY->setValue(value);
  259. break;
  260. case GrooveJuicePlugin::paramSubOrbitSize:
  261. fKnobSubOrbitSize->setValue(value);
  262. break;
  263. case GrooveJuicePlugin::paramSubOrbitSpeed:
  264. fKnobSubOrbitSpeed->setValue(value);
  265. break;
  266. case GrooveJuicePlugin::paramSubOrbitSmooth:
  267. fKnobSubOrbitSmooth->setValue(value);
  268. break;
  269. case GrooveJuicePlugin::paramOrbitWaveX:
  270. fSliderOrbitWaveX->setValue(value);
  271. break;
  272. case GrooveJuicePlugin::paramOrbitWaveY:
  273. fSliderOrbitWaveY->setValue(value);
  274. break;
  275. case GrooveJuicePlugin::paramOrbitPhaseX:
  276. fSliderOrbitPhaseX->setValue(value);
  277. break;
  278. case GrooveJuicePlugin::paramOrbitPhaseY:
  279. fSliderOrbitPhaseY->setValue(value);
  280. break;
  281. case GrooveJuicePlugin::paramOrbitOutX:
  282. if (orbitX != value)
  283. {
  284. orbitX = value;
  285. repaint();
  286. }
  287. break;
  288. case GrooveJuicePlugin::paramOrbitOutY:
  289. if (orbitY != value)
  290. {
  291. orbitY = value;
  292. repaint();
  293. }
  294. break;
  295. case GrooveJuicePlugin::paramSubOrbitOutX:
  296. if (subOrbitX != value)
  297. {
  298. subOrbitX = value;
  299. repaint();
  300. }
  301. break;
  302. case GrooveJuicePlugin::paramSubOrbitOutY:
  303. if (subOrbitY != value)
  304. {
  305. subOrbitY = value;
  306. repaint();
  307. }
  308. break;
  309. case GrooveJuicePlugin::paramW1Out:
  310. synthSound[0] = value;
  311. repaint();
  312. break;
  313. case GrooveJuicePlugin::paramW2Out:
  314. synthSound[1] = value;
  315. repaint();
  316. break;
  317. case GrooveJuicePlugin::paramMOut:
  318. synthSound[2] = value;
  319. repaint();
  320. break;
  321. case GrooveJuicePlugin::paramCOut:
  322. synthSound[3] = value;
  323. repaint();
  324. break;
  325. case GrooveJuicePlugin::paramROut:
  326. synthSound[4] = value;
  327. repaint();
  328. break;
  329. case GrooveJuicePlugin::paramSOut:
  330. synthSound[5] = value;
  331. repaint();
  332. break;
  333. case GrooveJuicePlugin::paramReOut:
  334. synthSound[6] = value;
  335. repaint();
  336. break;
  337. case GrooveJuicePlugin::paramShOut:
  338. synthSound[7] = value;
  339. repaint();
  340. break;
  341. }
  342. } else {
  343. //synth param changed
  344. int num = (index-17); //synth params begin on #17
  345. int x = num%8; //synth param
  346. //synth page
  347. int y = (num-(num%8))/8;
  348. synthData[x][y] = value;
  349. }
  350. }
  351. void GrooveJuiceUI::d_programChanged(uint32_t index)
  352. {
  353. if (index != 0)
  354. return;
  355. // Default values
  356. paramX = paramY = 0.5f;
  357. fKnobOrbitSpeedX->setValue(4.0f);
  358. fKnobOrbitSpeedY->setValue(4.0f);
  359. fKnobOrbitSizeX->setValue(1.0f);
  360. fKnobOrbitSizeY->setValue(1.0f);
  361. fKnobSubOrbitSize->setValue(1.0f);
  362. fKnobSubOrbitSpeed->setValue(32.0f);
  363. fKnobSubOrbitSmooth->setValue(0.5f);
  364. fSliderOrbitWaveX->setValue(3.0f);
  365. fSliderOrbitWaveY->setValue(3.0f);
  366. fSliderOrbitPhaseX->setValue(0.0f);
  367. fSliderOrbitPhaseY->setValue(0.0f);
  368. }
  369. // -----------------------------------------------------------------------
  370. // Widget Callbacks
  371. void GrooveJuiceUI::imageButtonClicked(ImageButton* button, int)
  372. {
  373. if (button == fButtonAbout)
  374. fAboutWindow.exec();
  375. if (button == fButtonRandomize) {
  376. for (int y=0; y<8; y++) {
  377. for (int x=0; x<8; x++) {
  378. synthData[x][y] = getRandom();
  379. d_setParameterValue(17+y*8+x, synthData[x][y]);
  380. }
  381. }
  382. for (int x=0; x<8; x++) {
  383. fKnobsSynth[x]->setValue(synthData[x][page]);
  384. }
  385. }
  386. for (int i=0; i<8; i++) {
  387. if (button == fButtonsPage[i]) {
  388. page = i;
  389. tabTargetPosX = tabOX+page*tabMarginX;
  390. for (int x=0; x<8; x++) {
  391. fKnobsSynth[x]->setValue(synthData[x][page]);
  392. }
  393. }
  394. }
  395. }
  396. void GrooveJuiceUI::imageKnobDragStarted(ImageKnob* knob)
  397. {
  398. if (knob == fKnobOrbitSpeedX)
  399. d_editParameter(GrooveJuicePlugin::paramOrbitSpeedX, true);
  400. else if (knob == fKnobOrbitSpeedY)
  401. d_editParameter(GrooveJuicePlugin::paramOrbitSpeedY, true);
  402. else if (knob == fKnobOrbitSizeX)
  403. d_editParameter(GrooveJuicePlugin::paramOrbitSizeX, true);
  404. else if (knob == fKnobOrbitSizeY)
  405. d_editParameter(GrooveJuicePlugin::paramOrbitSizeY, true);
  406. else if (knob == fKnobSubOrbitSize)
  407. d_editParameter(GrooveJuicePlugin::paramSubOrbitSize, true);
  408. else if (knob == fKnobSubOrbitSpeed)
  409. d_editParameter(GrooveJuicePlugin::paramSubOrbitSpeed, true);
  410. else if (knob == fKnobSubOrbitSmooth)
  411. d_editParameter(GrooveJuicePlugin::paramSubOrbitSmooth, true);
  412. for (int i=0; i<8; i++) {
  413. if (knob== fKnobsSynth[i]) {
  414. d_editParameter(i+17+(page*8), true);
  415. }
  416. }
  417. }
  418. void GrooveJuiceUI::imageKnobDragFinished(ImageKnob* knob)
  419. {
  420. if (knob == fKnobOrbitSpeedX)
  421. d_editParameter(GrooveJuicePlugin::paramOrbitSpeedX, false);
  422. else if (knob == fKnobOrbitSpeedY)
  423. d_editParameter(GrooveJuicePlugin::paramOrbitSpeedY, false);
  424. else if (knob == fKnobOrbitSizeX)
  425. d_editParameter(GrooveJuicePlugin::paramOrbitSizeX, false);
  426. else if (knob == fKnobOrbitSizeY)
  427. d_editParameter(GrooveJuicePlugin::paramOrbitSizeY, false);
  428. else if (knob == fKnobSubOrbitSize)
  429. d_editParameter(GrooveJuicePlugin::paramSubOrbitSize, false);
  430. else if (knob == fKnobSubOrbitSpeed)
  431. d_editParameter(GrooveJuicePlugin::paramSubOrbitSpeed, false);
  432. else if (knob == fKnobSubOrbitSmooth)
  433. d_editParameter(GrooveJuicePlugin::paramSubOrbitSmooth, false);
  434. for (int i=0; i<8; i++) {
  435. if (knob== fKnobsSynth[i]) {
  436. d_editParameter(i+17+page*8, false);
  437. }
  438. }
  439. }
  440. void GrooveJuiceUI::imageKnobValueChanged(ImageKnob* knob, float value)
  441. {
  442. if (knob == fKnobOrbitSpeedX)
  443. d_setParameterValue(GrooveJuicePlugin::paramOrbitSpeedX, value);
  444. else if (knob == fKnobOrbitSpeedY)
  445. d_setParameterValue(GrooveJuicePlugin::paramOrbitSpeedY, value);
  446. else if (knob == fKnobOrbitSizeX)
  447. d_setParameterValue(GrooveJuicePlugin::paramOrbitSizeX, value);
  448. else if (knob == fKnobOrbitSizeY)
  449. d_setParameterValue(GrooveJuicePlugin::paramOrbitSizeY, value);
  450. else if (knob == fKnobSubOrbitSize)
  451. d_setParameterValue(GrooveJuicePlugin::paramSubOrbitSize, value);
  452. else if (knob == fKnobSubOrbitSpeed)
  453. d_setParameterValue(GrooveJuicePlugin::paramSubOrbitSpeed, value);
  454. else if (knob == fKnobSubOrbitSmooth)
  455. d_setParameterValue(GrooveJuicePlugin::paramSubOrbitSmooth, value);
  456. for (int i=0; i<8; i++) {
  457. if (knob== fKnobsSynth[i]) {
  458. synthData[i][page] = value;
  459. d_setParameterValue(i+17+page*8, value);
  460. }
  461. }
  462. }
  463. void GrooveJuiceUI::imageSliderDragStarted(ImageSlider* slider)
  464. {
  465. if (slider == fSliderOrbitWaveX)
  466. d_editParameter(GrooveJuicePlugin::paramOrbitWaveX, true);
  467. else if (slider == fSliderOrbitWaveY)
  468. d_editParameter(GrooveJuicePlugin::paramOrbitWaveY, true);
  469. else if (slider == fSliderOrbitPhaseX)
  470. d_editParameter(GrooveJuicePlugin::paramOrbitPhaseX, true);
  471. else if (slider == fSliderOrbitPhaseY)
  472. d_editParameter(GrooveJuicePlugin::paramOrbitPhaseY, true);
  473. }
  474. void GrooveJuiceUI::imageSliderDragFinished(ImageSlider* slider)
  475. {
  476. if (slider == fSliderOrbitWaveX)
  477. d_editParameter(GrooveJuicePlugin::paramOrbitWaveX, false);
  478. else if (slider == fSliderOrbitWaveY)
  479. d_editParameter(GrooveJuicePlugin::paramOrbitWaveY, false);
  480. else if (slider == fSliderOrbitPhaseX)
  481. d_editParameter(GrooveJuicePlugin::paramOrbitPhaseX, false);
  482. else if (slider == fSliderOrbitPhaseY)
  483. d_editParameter(GrooveJuicePlugin::paramOrbitPhaseY, false);
  484. }
  485. void GrooveJuiceUI::imageSliderValueChanged(ImageSlider* slider, float value)
  486. {
  487. if (slider == fSliderOrbitWaveX)
  488. d_setParameterValue(GrooveJuicePlugin::paramOrbitWaveX, value);
  489. else if (slider == fSliderOrbitWaveY)
  490. d_setParameterValue(GrooveJuicePlugin::paramOrbitWaveY, value);
  491. else if (slider == fSliderOrbitPhaseX)
  492. d_setParameterValue(GrooveJuicePlugin::paramOrbitPhaseX, value);
  493. else if (slider == fSliderOrbitPhaseY)
  494. d_setParameterValue(GrooveJuicePlugin::paramOrbitPhaseY, value);
  495. }
  496. void GrooveJuiceUI::onDisplay()
  497. {
  498. fImgBackground.draw();
  499. /*
  500. // TESTING - remove later
  501. // this paints the 'fCanvasArea' so we can clearly see its bounds
  502. {
  503. const int x = fCanvasArea.getX();
  504. const int y = fCanvasArea.getY();
  505. const int w = fCanvasArea.getWidth();
  506. const int h = fCanvasArea.getHeight();
  507. glColor4f(0.0f, 1.0f, 0.0f, 0.1f);
  508. glBegin(GL_QUADS);
  509. glTexCoord2f(0.0f, 0.0f);
  510. glVertex2i(x, y);
  511. glTexCoord2f(1.0f, 0.0f);
  512. glVertex2i(x+w, y);
  513. glTexCoord2f(1.0f, 1.0f);
  514. glVertex2i(x+w, y+h);
  515. glTexCoord2f(0.0f, 1.0f);
  516. glVertex2i(x, y+h);
  517. glEnd();
  518. // reset color
  519. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  520. }
  521. */
  522. // get x, y mapped to XY area
  523. int x = fCanvasArea.getX() + paramX*fCanvasArea.getWidth() - fImgRoundlet.getWidth()/2;
  524. int y = fCanvasArea.getY() + paramY*fCanvasArea.getHeight() - fImgRoundlet.getHeight()/2;
  525. int nOrbitX = fCanvasArea.getX()+((orbitX)*fCanvasArea.getWidth())-15;
  526. int nOrbitY = fCanvasArea.getY()+((orbitY)*fCanvasArea.getWidth())-15;
  527. int nSubOrbitX = fCanvasArea.getX()+(subOrbitX*fCanvasArea.getWidth())-15;
  528. int nSubOrbitY = fCanvasArea.getY()+(subOrbitY*fCanvasArea.getWidth())-14;
  529. //draw lines, just for fun
  530. glEnable(GL_BLEND);
  531. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  532. glColor4f(0.0f, 1.0f, 0.0f, 0.05f);
  533. glLineWidth(4);
  534. glBegin(GL_LINES);
  535. glVertex2i(x+ fImgRoundlet.getWidth()/2, y+ fImgRoundlet.getHeight()/2);
  536. glVertex2i(nOrbitX+15, nOrbitY+15);
  537. glEnd();
  538. glBegin(GL_LINES);
  539. glVertex2i(nOrbitX+15, nOrbitY+15);
  540. glVertex2i(nSubOrbitX+15, nSubOrbitY+14);
  541. glEnd();
  542. //draw tab highlight
  543. tabPosX -= (tabPosX-tabTargetPosX)/3;
  544. glColor4f(0.5f, 0.5f, 1.0f, 1.0f);
  545. glBegin(GL_POLYGON);
  546. glVertex2i(tabPosX, tabOY);
  547. glVertex2i(tabPosX+tabW, tabOY);
  548. glVertex2i(tabPosX+tabW, tabOY+tabH);
  549. glVertex2i(tabPosX, tabOY+tabH);
  550. glEnd();
  551. //draw real knob values
  552. int kPosX = 6;
  553. int kPosY = 550;
  554. int kH = 112;
  555. int kW = 83;
  556. int kM = 94-kPosX;
  557. glColor4f(1.0f, 1.0f, 1.0f, 0.1f);
  558. for (int i=0; i<8; i++) {
  559. glBegin(GL_POLYGON);
  560. glVertex2i(kPosX+kM*i, kPosY);
  561. glVertex2i(kPosX+kM*i+kW, kPosY);
  562. glVertex2i(kPosX+kM*i+kW, kPosY-synthSound[i]*kH);
  563. glVertex2i(kPosX+kM*i, kPosY-synthSound[i]*kH);
  564. glEnd();
  565. }
  566. /*for (int x=0; x<8; x++) {
  567. for (int y=0; y<8; y++) {
  568. if (isWithinSquare(orbitX, orbitY, x/8.0, y/8.0)) {
  569. if (squares[x][y].timer<squares[x][y].maxTimer) {
  570. squares[x][y].timer++;
  571. }
  572. } else {
  573. if (squares[x][y].timer>0) {
  574. squares[x][y].timer--;
  575. }
  576. }
  577. if (squares[x][y].timer>0) {
  578. //draw this square
  579. glColor4f(0.0f, 1.0f, 0.0f, squares[x][y].timer/squares[x][y].maxTimer/8);
  580. //printf("blend: %f\n", squares[x][y].timer/squares[x][y].maxTimer);
  581. glBegin(GL_POLYGON);
  582. glVertex2i(squares[x][y].x, squares[x][y].y);
  583. glVertex2i(squares[x][y].x+squares[x][y].size, squares[x][y].y);
  584. glVertex2i(squares[x][y].x+squares[x][y].size, squares[x][y].y+squares[x][y].size);
  585. glVertex2i(squares[x][y].x, squares[x][y].y+squares[x][y].size);
  586. glEnd();
  587. }
  588. }
  589. }*/
  590. // reset color
  591. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  592. // draw roundlet and orbits
  593. fImgRoundlet.draw(x, y);
  594. fImgOrbit.draw(nOrbitX, nOrbitY);
  595. fImgSubOrbit.draw(nSubOrbitX, nSubOrbitY);
  596. }
  597. bool GrooveJuiceUI::onMouse(int button, bool press, int x, int y)
  598. {
  599. if (button != 1)
  600. return false;
  601. if (press)
  602. {
  603. if (! fCanvasArea.contains(x, y))
  604. return false;
  605. fDragging = true;
  606. fDragValid = true;
  607. fLastX = x;
  608. fLastY = y;
  609. return true;
  610. }
  611. else if (fDragging)
  612. {
  613. fDragging = false;
  614. return true;
  615. }
  616. return false;
  617. }
  618. bool GrooveJuiceUI::onMotion(int x, int y)
  619. {
  620. if (! fDragging)
  621. return false;
  622. if (! fDragValid)
  623. {
  624. fDragValid = true;
  625. fLastX = x;
  626. fLastY = y;
  627. }
  628. const int movedX = fLastX - x;
  629. const int movedY = fLastY - y;
  630. fLastX = x;
  631. fLastY = y;
  632. float newX = paramX;
  633. float newY = paramY;
  634. newX -= float(movedX)/fCanvasArea.getWidth();
  635. newY -= float(movedY)/fCanvasArea.getHeight();
  636. if (newX < 0.0f)
  637. newX = 0.0f;
  638. else if (newX > 1.0f)
  639. newX = 1.0f;
  640. if (newY < 0.0f)
  641. newY = 0.0f;
  642. else if (newY > 1.0f)
  643. newY = 1.0f;
  644. if (newX != paramX)
  645. {
  646. paramX = newX;
  647. d_setParameterValue(GrooveJuicePlugin::paramX, paramX);
  648. repaint();
  649. }
  650. if (newY != paramY)
  651. {
  652. paramY = newY;
  653. d_setParameterValue(GrooveJuicePlugin::paramY, paramY);
  654. repaint();
  655. }
  656. return true;
  657. }
  658. // -----------------------------------------------------------------------
  659. UI* createUI()
  660. {
  661. return new GrooveJuiceUI();
  662. }
  663. // -----------------------------------------------------------------------
  664. END_NAMESPACE_DISTRHO