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.

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