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.

764 lines
22KB

  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->setAbsolutePos(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->setAbsolutePos(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]->setAbsolutePos(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->setAbsolutePos(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->setAbsolutePos(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->setAbsolutePos(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->setAbsolutePos(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->setAbsolutePos(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->setAbsolutePos(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->setAbsolutePos(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]->setAbsolutePos(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. // set default values
  208. d_programChanged(0);
  209. }
  210. // -----------------------------------------------------------------------
  211. // DSP Callbacks
  212. void GrooveJuiceUI::d_parameterChanged(uint32_t index, float value)
  213. {
  214. if (index<17 || index>=17+64) {
  215. switch (index)
  216. {
  217. case GrooveJuicePlugin::paramX:
  218. if (paramX != value)
  219. {
  220. paramX = value;
  221. fDragValid = false;
  222. repaint();
  223. }
  224. break;
  225. case GrooveJuicePlugin::paramY:
  226. if (paramY != value)
  227. {
  228. paramY = value;
  229. fDragValid = false;
  230. repaint();
  231. }
  232. break;
  233. case GrooveJuicePlugin::paramOrbitSizeX:
  234. fKnobOrbitSizeX->setValue(value);
  235. break;
  236. case GrooveJuicePlugin::paramOrbitSizeY:
  237. fKnobOrbitSizeY->setValue(value);
  238. break;
  239. case GrooveJuicePlugin::paramOrbitSpeedX:
  240. fKnobOrbitSpeedX->setValue(value);
  241. break;
  242. case GrooveJuicePlugin::paramOrbitSpeedY:
  243. fKnobOrbitSpeedY->setValue(value);
  244. break;
  245. case GrooveJuicePlugin::paramSubOrbitSize:
  246. fKnobSubOrbitSize->setValue(value);
  247. break;
  248. case GrooveJuicePlugin::paramSubOrbitSpeed:
  249. fKnobSubOrbitSpeed->setValue(value);
  250. break;
  251. case GrooveJuicePlugin::paramSubOrbitSmooth:
  252. fKnobSubOrbitSmooth->setValue(value);
  253. break;
  254. case GrooveJuicePlugin::paramOrbitWaveX:
  255. fSliderOrbitWaveX->setValue(value);
  256. break;
  257. case GrooveJuicePlugin::paramOrbitWaveY:
  258. fSliderOrbitWaveY->setValue(value);
  259. break;
  260. case GrooveJuicePlugin::paramOrbitPhaseX:
  261. fSliderOrbitPhaseX->setValue(value);
  262. break;
  263. case GrooveJuicePlugin::paramOrbitPhaseY:
  264. fSliderOrbitPhaseY->setValue(value);
  265. break;
  266. case GrooveJuicePlugin::paramOrbitOutX:
  267. if (orbitX != value)
  268. {
  269. orbitX = value;
  270. repaint();
  271. }
  272. break;
  273. case GrooveJuicePlugin::paramOrbitOutY:
  274. if (orbitY != value)
  275. {
  276. orbitY = value;
  277. repaint();
  278. }
  279. break;
  280. case GrooveJuicePlugin::paramSubOrbitOutX:
  281. if (subOrbitX != value)
  282. {
  283. subOrbitX = value;
  284. repaint();
  285. }
  286. break;
  287. case GrooveJuicePlugin::paramSubOrbitOutY:
  288. if (subOrbitY != value)
  289. {
  290. subOrbitY = value;
  291. repaint();
  292. }
  293. break;
  294. case GrooveJuicePlugin::paramW1Out:
  295. synthSound[0] = value;
  296. repaint();
  297. break;
  298. case GrooveJuicePlugin::paramW2Out:
  299. synthSound[1] = value;
  300. repaint();
  301. break;
  302. case GrooveJuicePlugin::paramMOut:
  303. synthSound[2] = value;
  304. repaint();
  305. break;
  306. case GrooveJuicePlugin::paramCOut:
  307. synthSound[3] = value;
  308. repaint();
  309. break;
  310. case GrooveJuicePlugin::paramROut:
  311. synthSound[4] = value;
  312. repaint();
  313. break;
  314. case GrooveJuicePlugin::paramSOut:
  315. synthSound[5] = value;
  316. repaint();
  317. break;
  318. case GrooveJuicePlugin::paramReOut:
  319. synthSound[6] = value;
  320. repaint();
  321. break;
  322. case GrooveJuicePlugin::paramShOut:
  323. synthSound[7] = value;
  324. repaint();
  325. break;
  326. }
  327. } else {
  328. //synth param changed
  329. int num = (index-17); //synth params begin on #17
  330. int x = num%8; //synth param
  331. //synth page
  332. int y = (num-(num%8))/8;
  333. synthData[x][y] = value;
  334. }
  335. }
  336. void GrooveJuiceUI::d_programChanged(uint32_t index)
  337. {
  338. if (index != 0)
  339. return;
  340. // Default values
  341. paramX = paramY = 0.5f;
  342. fKnobOrbitSpeedX->setValue(4.0f);
  343. fKnobOrbitSpeedY->setValue(4.0f);
  344. fKnobOrbitSizeX->setValue(1.0f);
  345. fKnobOrbitSizeY->setValue(1.0f);
  346. fKnobSubOrbitSize->setValue(1.0f);
  347. fKnobSubOrbitSpeed->setValue(32.0f);
  348. fKnobSubOrbitSmooth->setValue(0.5f);
  349. fSliderOrbitWaveX->setValue(3.0f);
  350. fSliderOrbitWaveY->setValue(3.0f);
  351. fSliderOrbitPhaseX->setValue(0.0f);
  352. fSliderOrbitPhaseY->setValue(0.0f);
  353. }
  354. // -----------------------------------------------------------------------
  355. // Widget Callbacks
  356. void GrooveJuiceUI::imageButtonClicked(ImageButton* button, int)
  357. {
  358. if (button == fButtonAbout)
  359. fAboutWindow.exec();
  360. if (button == fButtonRandomize) {
  361. for (int y=0; y<8; y++) {
  362. for (int x=0; x<8; x++) {
  363. synthData[x][y] = getRandom();
  364. d_setParameterValue(17+y*8+x, synthData[x][y]);
  365. }
  366. }
  367. for (int x=0; x<8; x++) {
  368. fKnobsSynth[x]->setValue(synthData[x][page]);
  369. }
  370. }
  371. for (int i=0; i<8; i++) {
  372. if (button == fButtonsPage[i]) {
  373. page = i;
  374. tabTargetPosX = tabOX+page*tabMarginX;
  375. for (int x=0; x<8; x++) {
  376. fKnobsSynth[x]->setValue(synthData[x][page]);
  377. }
  378. }
  379. }
  380. }
  381. void GrooveJuiceUI::imageKnobDragStarted(ImageKnob* knob)
  382. {
  383. if (knob == fKnobOrbitSpeedX)
  384. d_editParameter(GrooveJuicePlugin::paramOrbitSpeedX, true);
  385. else if (knob == fKnobOrbitSpeedY)
  386. d_editParameter(GrooveJuicePlugin::paramOrbitSpeedY, true);
  387. else if (knob == fKnobOrbitSizeX)
  388. d_editParameter(GrooveJuicePlugin::paramOrbitSizeX, true);
  389. else if (knob == fKnobOrbitSizeY)
  390. d_editParameter(GrooveJuicePlugin::paramOrbitSizeY, true);
  391. else if (knob == fKnobSubOrbitSize)
  392. d_editParameter(GrooveJuicePlugin::paramSubOrbitSize, true);
  393. else if (knob == fKnobSubOrbitSpeed)
  394. d_editParameter(GrooveJuicePlugin::paramSubOrbitSpeed, true);
  395. else if (knob == fKnobSubOrbitSmooth)
  396. d_editParameter(GrooveJuicePlugin::paramSubOrbitSmooth, true);
  397. for (int i=0; i<8; i++) {
  398. if (knob== fKnobsSynth[i]) {
  399. d_editParameter(i+17+(page*8), true);
  400. }
  401. }
  402. }
  403. void GrooveJuiceUI::imageKnobDragFinished(ImageKnob* knob)
  404. {
  405. if (knob == fKnobOrbitSpeedX)
  406. d_editParameter(GrooveJuicePlugin::paramOrbitSpeedX, false);
  407. else if (knob == fKnobOrbitSpeedY)
  408. d_editParameter(GrooveJuicePlugin::paramOrbitSpeedY, false);
  409. else if (knob == fKnobOrbitSizeX)
  410. d_editParameter(GrooveJuicePlugin::paramOrbitSizeX, false);
  411. else if (knob == fKnobOrbitSizeY)
  412. d_editParameter(GrooveJuicePlugin::paramOrbitSizeY, false);
  413. else if (knob == fKnobSubOrbitSize)
  414. d_editParameter(GrooveJuicePlugin::paramSubOrbitSize, false);
  415. else if (knob == fKnobSubOrbitSpeed)
  416. d_editParameter(GrooveJuicePlugin::paramSubOrbitSpeed, false);
  417. else if (knob == fKnobSubOrbitSmooth)
  418. d_editParameter(GrooveJuicePlugin::paramSubOrbitSmooth, false);
  419. for (int i=0; i<8; i++) {
  420. if (knob== fKnobsSynth[i]) {
  421. d_editParameter(i+17+page*8, false);
  422. }
  423. }
  424. }
  425. void GrooveJuiceUI::imageKnobValueChanged(ImageKnob* knob, float value)
  426. {
  427. if (knob == fKnobOrbitSpeedX)
  428. d_setParameterValue(GrooveJuicePlugin::paramOrbitSpeedX, value);
  429. else if (knob == fKnobOrbitSpeedY)
  430. d_setParameterValue(GrooveJuicePlugin::paramOrbitSpeedY, value);
  431. else if (knob == fKnobOrbitSizeX)
  432. d_setParameterValue(GrooveJuicePlugin::paramOrbitSizeX, value);
  433. else if (knob == fKnobOrbitSizeY)
  434. d_setParameterValue(GrooveJuicePlugin::paramOrbitSizeY, value);
  435. else if (knob == fKnobSubOrbitSize)
  436. d_setParameterValue(GrooveJuicePlugin::paramSubOrbitSize, value);
  437. else if (knob == fKnobSubOrbitSpeed)
  438. d_setParameterValue(GrooveJuicePlugin::paramSubOrbitSpeed, value);
  439. else if (knob == fKnobSubOrbitSmooth)
  440. d_setParameterValue(GrooveJuicePlugin::paramSubOrbitSmooth, value);
  441. for (int i=0; i<8; i++) {
  442. if (knob== fKnobsSynth[i]) {
  443. synthData[i][page] = value;
  444. d_setParameterValue(i+17+page*8, value);
  445. }
  446. }
  447. }
  448. void GrooveJuiceUI::imageSliderDragStarted(ImageSlider* slider)
  449. {
  450. if (slider == fSliderOrbitWaveX)
  451. d_editParameter(GrooveJuicePlugin::paramOrbitWaveX, true);
  452. else if (slider == fSliderOrbitWaveY)
  453. d_editParameter(GrooveJuicePlugin::paramOrbitWaveY, true);
  454. else if (slider == fSliderOrbitPhaseX)
  455. d_editParameter(GrooveJuicePlugin::paramOrbitPhaseX, true);
  456. else if (slider == fSliderOrbitPhaseY)
  457. d_editParameter(GrooveJuicePlugin::paramOrbitPhaseY, true);
  458. }
  459. void GrooveJuiceUI::imageSliderDragFinished(ImageSlider* slider)
  460. {
  461. if (slider == fSliderOrbitWaveX)
  462. d_editParameter(GrooveJuicePlugin::paramOrbitWaveX, false);
  463. else if (slider == fSliderOrbitWaveY)
  464. d_editParameter(GrooveJuicePlugin::paramOrbitWaveY, false);
  465. else if (slider == fSliderOrbitPhaseX)
  466. d_editParameter(GrooveJuicePlugin::paramOrbitPhaseX, false);
  467. else if (slider == fSliderOrbitPhaseY)
  468. d_editParameter(GrooveJuicePlugin::paramOrbitPhaseY, false);
  469. }
  470. void GrooveJuiceUI::imageSliderValueChanged(ImageSlider* slider, float value)
  471. {
  472. if (slider == fSliderOrbitWaveX)
  473. d_setParameterValue(GrooveJuicePlugin::paramOrbitWaveX, value);
  474. else if (slider == fSliderOrbitWaveY)
  475. d_setParameterValue(GrooveJuicePlugin::paramOrbitWaveY, value);
  476. else if (slider == fSliderOrbitPhaseX)
  477. d_setParameterValue(GrooveJuicePlugin::paramOrbitPhaseX, value);
  478. else if (slider == fSliderOrbitPhaseY)
  479. d_setParameterValue(GrooveJuicePlugin::paramOrbitPhaseY, value);
  480. }
  481. void GrooveJuiceUI::onDisplay()
  482. {
  483. fImgBackground.draw();
  484. /*
  485. // TESTING - remove later
  486. // this paints the 'fCanvasArea' so we can clearly see its bounds
  487. {
  488. const int x = fCanvasArea.getX();
  489. const int y = fCanvasArea.getY();
  490. const int w = fCanvasArea.getWidth();
  491. const int h = fCanvasArea.getHeight();
  492. glColor4f(0.0f, 1.0f, 0.0f, 0.1f);
  493. glBegin(GL_QUADS);
  494. glTexCoord2f(0.0f, 0.0f);
  495. glVertex2i(x, y);
  496. glTexCoord2f(1.0f, 0.0f);
  497. glVertex2i(x+w, y);
  498. glTexCoord2f(1.0f, 1.0f);
  499. glVertex2i(x+w, y+h);
  500. glTexCoord2f(0.0f, 1.0f);
  501. glVertex2i(x, y+h);
  502. glEnd();
  503. // reset color
  504. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  505. }
  506. */
  507. // get x, y mapped to XY area
  508. int x = fCanvasArea.getX() + paramX*fCanvasArea.getWidth() - fImgRoundlet.getWidth()/2;
  509. int y = fCanvasArea.getY() + paramY*fCanvasArea.getHeight() - fImgRoundlet.getHeight()/2;
  510. int nOrbitX = fCanvasArea.getX()+((orbitX)*fCanvasArea.getWidth())-15;
  511. int nOrbitY = fCanvasArea.getY()+((orbitY)*fCanvasArea.getWidth())-15;
  512. int nSubOrbitX = fCanvasArea.getX()+(subOrbitX*fCanvasArea.getWidth())-15;
  513. int nSubOrbitY = fCanvasArea.getY()+(subOrbitY*fCanvasArea.getWidth())-14;
  514. //draw lines, just for fun
  515. glEnable(GL_BLEND);
  516. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  517. glColor4f(0.0f, 1.0f, 0.0f, 0.05f);
  518. glLineWidth(4);
  519. glBegin(GL_LINES);
  520. glVertex2i(x+ fImgRoundlet.getWidth()/2, y+ fImgRoundlet.getHeight()/2);
  521. glVertex2i(nOrbitX+15, nOrbitY+15);
  522. glEnd();
  523. glBegin(GL_LINES);
  524. glVertex2i(nOrbitX+15, nOrbitY+15);
  525. glVertex2i(nSubOrbitX+15, nSubOrbitY+14);
  526. glEnd();
  527. //draw tab highlight
  528. tabPosX -= (tabPosX-tabTargetPosX)/3;
  529. glColor4f(0.5f, 0.5f, 1.0f, 1.0f);
  530. glBegin(GL_POLYGON);
  531. glVertex2i(tabPosX, tabOY);
  532. glVertex2i(tabPosX+tabW, tabOY);
  533. glVertex2i(tabPosX+tabW, tabOY+tabH);
  534. glVertex2i(tabPosX, tabOY+tabH);
  535. glEnd();
  536. //draw real knob values
  537. int kPosX = 6;
  538. int kPosY = 550;
  539. int kH = 112;
  540. int kW = 83;
  541. int kM = 94-kPosX;
  542. glColor4f(1.0f, 1.0f, 1.0f, 0.1f);
  543. for (int i=0; i<8; i++) {
  544. glBegin(GL_POLYGON);
  545. glVertex2i(kPosX+kM*i, kPosY);
  546. glVertex2i(kPosX+kM*i+kW, kPosY);
  547. glVertex2i(kPosX+kM*i+kW, kPosY-synthSound[i]*kH);
  548. glVertex2i(kPosX+kM*i, kPosY-synthSound[i]*kH);
  549. glEnd();
  550. }
  551. /*for (int x=0; x<8; x++) {
  552. for (int y=0; y<8; y++) {
  553. if (isWithinSquare(orbitX, orbitY, x/8.0, y/8.0)) {
  554. if (squares[x][y].timer<squares[x][y].maxTimer) {
  555. squares[x][y].timer++;
  556. }
  557. } else {
  558. if (squares[x][y].timer>0) {
  559. squares[x][y].timer--;
  560. }
  561. }
  562. if (squares[x][y].timer>0) {
  563. //draw this square
  564. glColor4f(0.0f, 1.0f, 0.0f, squares[x][y].timer/squares[x][y].maxTimer/8);
  565. //printf("blend: %f\n", squares[x][y].timer/squares[x][y].maxTimer);
  566. glBegin(GL_POLYGON);
  567. glVertex2i(squares[x][y].x, squares[x][y].y);
  568. glVertex2i(squares[x][y].x+squares[x][y].size, squares[x][y].y);
  569. glVertex2i(squares[x][y].x+squares[x][y].size, squares[x][y].y+squares[x][y].size);
  570. glVertex2i(squares[x][y].x, squares[x][y].y+squares[x][y].size);
  571. glEnd();
  572. }
  573. }
  574. }*/
  575. // reset color
  576. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  577. // draw roundlet and orbits
  578. fImgRoundlet.drawAt(x, y);
  579. fImgOrbit.drawAt(nOrbitX, nOrbitY);
  580. fImgSubOrbit.drawAt(nSubOrbitX, nSubOrbitY);
  581. }
  582. bool GrooveJuiceUI::onMouse(const MouseEvent& ev)
  583. {
  584. if (ev.button != 1)
  585. return false;
  586. if (ev.press)
  587. {
  588. if (! fCanvasArea.contains(ev.pos))
  589. return false;
  590. fDragging = true;
  591. fDragValid = true;
  592. fLastX = ev.pos.getX();
  593. fLastY = ev.pos.getY();
  594. return true;
  595. }
  596. else if (fDragging)
  597. {
  598. fDragging = false;
  599. return true;
  600. }
  601. return false;
  602. }
  603. bool GrooveJuiceUI::onMotion(const MotionEvent& ev)
  604. {
  605. if (! fDragging)
  606. return false;
  607. const int x = ev.pos.getX();
  608. const int y = ev.pos.getY();
  609. if (! fDragValid)
  610. {
  611. fDragValid = true;
  612. fLastX = x;
  613. fLastY = y;
  614. }
  615. const int movedX = fLastX - x;
  616. const int movedY = fLastY - y;
  617. fLastX = x;
  618. fLastY = y;
  619. float newX = paramX;
  620. float newY = paramY;
  621. newX -= float(movedX)/fCanvasArea.getWidth();
  622. newY -= float(movedY)/fCanvasArea.getHeight();
  623. if (newX < 0.0f)
  624. newX = 0.0f;
  625. else if (newX > 1.0f)
  626. newX = 1.0f;
  627. if (newY < 0.0f)
  628. newY = 0.0f;
  629. else if (newY > 1.0f)
  630. newY = 1.0f;
  631. if (newX != paramX)
  632. {
  633. paramX = newX;
  634. d_setParameterValue(GrooveJuicePlugin::paramX, paramX);
  635. repaint();
  636. }
  637. if (newY != paramY)
  638. {
  639. paramY = newY;
  640. d_setParameterValue(GrooveJuicePlugin::paramY, paramY);
  641. repaint();
  642. }
  643. return true;
  644. }
  645. // -----------------------------------------------------------------------
  646. UI* createUI()
  647. {
  648. return new GrooveJuiceUI();
  649. }
  650. // -----------------------------------------------------------------------
  651. END_NAMESPACE_DISTRHO