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.

258 lines
8.8KB

  1. /*
  2. * DISTRHO MVerb, a DPF'ied MVerb.
  3. * Copyright (c) 2010 Martin Eastwood
  4. * Copyright (C) 2014 Filipe Coelho <falktx@falktx.com>
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License as
  8. * published by the Free Software Foundation; either version 3 of
  9. * the License, or any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * For a full copy of the GNU General Public License see the LICENSE file.
  17. */
  18. #include "DistrhoUIMVerb.hpp"
  19. #include "MVerb.h"
  20. #include "font/Kh-Kangrey.h"
  21. START_NAMESPACE_DISTRHO
  22. using DGL::Color;
  23. // -----------------------------------------------------------------------
  24. DistrhoUIMVerb::DistrhoUIMVerb()
  25. : UI()
  26. {
  27. // set UI size
  28. setSize(DistrhoArtworkMVerb::backgroundWidth, DistrhoArtworkMVerb::backgroundHeight);
  29. // background
  30. fImgBackground = Image(DistrhoArtworkMVerb::backgroundData, DistrhoArtworkMVerb::backgroundWidth, DistrhoArtworkMVerb::backgroundHeight, GL_BGR);
  31. // text
  32. fNanoText.createFontMem("kh", (uchar*)khkangrey_ttf, khkangrey_ttfSize, false);
  33. // knobs
  34. Image knobImage(DistrhoArtworkMVerb::knobData, DistrhoArtworkMVerb::knobWidth, DistrhoArtworkMVerb::knobHeight);
  35. {
  36. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical, MVerb<float>::DAMPINGFREQ));
  37. knob->setAbsolutePos(56 + 7*40, 40);
  38. knob->setRange(0.0f, 100.0f);
  39. knob->setDefault(50.0f);
  40. knob->setCallback(this);
  41. fKnobs.push_back(knob);
  42. }
  43. {
  44. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical, MVerb<float>::DENSITY));
  45. knob->setAbsolutePos(56 + 4*40, 40);
  46. knob->setRange(0.0f, 100.0f);
  47. knob->setDefault(50.0f);
  48. knob->setCallback(this);
  49. fKnobs.push_back(knob);
  50. }
  51. {
  52. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical, MVerb<float>::BANDWIDTHFREQ));
  53. knob->setAbsolutePos(56 + 5*40, 40);
  54. knob->setRange(0.0f, 100.0f);
  55. knob->setDefault(50.0f);
  56. knob->setCallback(this);
  57. fKnobs.push_back(knob);
  58. }
  59. {
  60. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical, MVerb<float>::DECAY));
  61. knob->setAbsolutePos(56 + 6*40, 40);
  62. knob->setRange(0.0f, 100.0f);
  63. knob->setDefault(50.0f);
  64. knob->setCallback(this);
  65. fKnobs.push_back(knob);
  66. }
  67. {
  68. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical, MVerb<float>::PREDELAY));
  69. knob->setAbsolutePos(56 + 1*40, 40);
  70. knob->setRange(0.0f, 100.0f);
  71. knob->setDefault(50.0f);
  72. knob->setCallback(this);
  73. fKnobs.push_back(knob);
  74. }
  75. {
  76. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical, MVerb<float>::SIZE));
  77. knob->setAbsolutePos(56 + 3*40, 40);
  78. knob->setRange(5.0f, 100.0f);
  79. knob->setDefault(100.0f);
  80. knob->setCallback(this);
  81. fKnobs.push_back(knob);
  82. }
  83. {
  84. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical, MVerb<float>::GAIN));
  85. knob->setAbsolutePos(56 + 8*40, 40);
  86. knob->setRange(0.0f, 100.0f);
  87. knob->setDefault(75.0f);
  88. knob->setCallback(this);
  89. fKnobs.push_back(knob);
  90. }
  91. {
  92. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical, MVerb<float>::MIX));
  93. knob->setAbsolutePos(56 + 0*40, 40);
  94. knob->setRange(0.0f, 100.0f);
  95. knob->setDefault(50.0f);
  96. knob->setCallback(this);
  97. fKnobs.push_back(knob);
  98. }
  99. {
  100. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical, MVerb<float>::EARLYMIX));
  101. knob->setAbsolutePos(56 + 2*40, 40);
  102. knob->setRange(0.0f, 100.0f);
  103. knob->setDefault(50.0f);
  104. knob->setCallback(this);
  105. fKnobs.push_back(knob);
  106. }
  107. // set initial values
  108. d_programChanged(0);
  109. }
  110. DistrhoUIMVerb::~DistrhoUIMVerb()
  111. {
  112. for (std::vector<ImageKnob*>::iterator it=fKnobs.begin(), end=fKnobs.end(); it != end; ++it)
  113. {
  114. ImageKnob* const knob(*it);
  115. delete knob;
  116. }
  117. fKnobs.clear();
  118. }
  119. // -----------------------------------------------------------------------
  120. // DSP Callbacks
  121. void DistrhoUIMVerb::d_parameterChanged(uint32_t index, float value)
  122. {
  123. fKnobs[index]->setValue(value);
  124. }
  125. void DistrhoUIMVerb::d_programChanged(uint32_t index)
  126. {
  127. switch(index)
  128. {
  129. case 0:
  130. fKnobs[MVerb<float>::DAMPINGFREQ]->setValue(0.5f*100.0f);
  131. fKnobs[MVerb<float>::DENSITY]->setValue(0.5f*100.0f);
  132. fKnobs[MVerb<float>::BANDWIDTHFREQ]->setValue(0.5f*100.0f);
  133. fKnobs[MVerb<float>::DECAY]->setValue(0.5f*100.0f);
  134. fKnobs[MVerb<float>::PREDELAY]->setValue(0.5f*100.0f);
  135. fKnobs[MVerb<float>::GAIN]->setValue(1.0f*100.0f);
  136. fKnobs[MVerb<float>::MIX]->setValue(0.5f*100.0f);
  137. fKnobs[MVerb<float>::EARLYMIX]->setValue(0.5f*100.0f);
  138. fKnobs[MVerb<float>::SIZE]->setValue(0.75f*100.0f);
  139. break;
  140. case 1:
  141. fKnobs[MVerb<float>::DAMPINGFREQ]->setValue(0.9f*100.0f);
  142. fKnobs[MVerb<float>::DENSITY]->setValue(0.5f*100.0f);
  143. fKnobs[MVerb<float>::BANDWIDTHFREQ]->setValue(0.1f*100.0f);
  144. fKnobs[MVerb<float>::DECAY]->setValue(0.5f*100.0f);
  145. fKnobs[MVerb<float>::PREDELAY]->setValue(0.0f*100.0f);
  146. fKnobs[MVerb<float>::SIZE]->setValue(0.5f*100.0f);
  147. fKnobs[MVerb<float>::GAIN]->setValue(1.0f*100.0f);
  148. fKnobs[MVerb<float>::MIX]->setValue(0.5f*100.0f);
  149. fKnobs[MVerb<float>::EARLYMIX]->setValue(0.75f*100.0f);
  150. break;
  151. case 2:
  152. fKnobs[MVerb<float>::DAMPINGFREQ]->setValue(0.0f*100.0f);
  153. fKnobs[MVerb<float>::DENSITY]->setValue(0.5f*100.0f);
  154. fKnobs[MVerb<float>::BANDWIDTHFREQ]->setValue(1.0f*100.0f);
  155. fKnobs[MVerb<float>::DECAY]->setValue(0.5f*100.0f);
  156. fKnobs[MVerb<float>::PREDELAY]->setValue(0.0f*100.0f);
  157. fKnobs[MVerb<float>::SIZE]->setValue(0.25f*100.0f);
  158. fKnobs[MVerb<float>::GAIN]->setValue(1.0f*100.0f);
  159. fKnobs[MVerb<float>::MIX]->setValue(0.35f*100.0f);
  160. fKnobs[MVerb<float>::EARLYMIX]->setValue(0.75f*100.0f);
  161. break;
  162. case 3:
  163. fKnobs[MVerb<float>::DAMPINGFREQ]->setValue(0.0f*100.0f);
  164. fKnobs[MVerb<float>::DENSITY]->setValue(0.5f*100.0f);
  165. fKnobs[MVerb<float>::BANDWIDTHFREQ]->setValue(1.0f*100.0f);
  166. fKnobs[MVerb<float>::DECAY]->setValue(0.5f*100.0f);
  167. fKnobs[MVerb<float>::PREDELAY]->setValue(0.0f*100.0f);
  168. fKnobs[MVerb<float>::SIZE]->setValue(1.0f*100.0f);
  169. fKnobs[MVerb<float>::GAIN]->setValue(1.0f*100.0f);
  170. fKnobs[MVerb<float>::MIX]->setValue(0.35f*100.0f);
  171. fKnobs[MVerb<float>::EARLYMIX]->setValue(0.75f*100.0f);
  172. break;
  173. case 4:
  174. fKnobs[MVerb<float>::DAMPINGFREQ]->setValue(0.0f*100.0f);
  175. fKnobs[MVerb<float>::DENSITY]->setValue(0.5f*100.0f);
  176. fKnobs[MVerb<float>::BANDWIDTHFREQ]->setValue(1.0f*100.0f);
  177. fKnobs[MVerb<float>::DECAY]->setValue(0.5f*100.0f);
  178. fKnobs[MVerb<float>::PREDELAY]->setValue(0.0f*100.0f);
  179. fKnobs[MVerb<float>::SIZE]->setValue(0.5f*100.0f);
  180. fKnobs[MVerb<float>::GAIN]->setValue(1.0f*100.0f);
  181. fKnobs[MVerb<float>::MIX]->setValue(0.15f*100.0f);
  182. fKnobs[MVerb<float>::EARLYMIX]->setValue(0.75f*100.0f);
  183. break;
  184. }
  185. }
  186. // -----------------------------------------------------------------------
  187. // Widget Callbacks
  188. void DistrhoUIMVerb::imageKnobDragStarted(ImageKnob* knob)
  189. {
  190. d_editParameter(knob->getId(), true);
  191. }
  192. void DistrhoUIMVerb::imageKnobDragFinished(ImageKnob* knob)
  193. {
  194. d_editParameter(knob->getId(), false);
  195. }
  196. void DistrhoUIMVerb::imageKnobValueChanged(ImageKnob* knob, float value)
  197. {
  198. d_setParameterValue(knob->getId(), value);
  199. }
  200. void DistrhoUIMVerb::onDisplay()
  201. {
  202. fImgBackground.draw();
  203. // text display
  204. fNanoText.beginFrame(getWidth(), getHeight());
  205. fNanoText.fontFace("kh");
  206. fNanoText.fontSize(20);
  207. fNanoText.textAlign(NanoVG::Align(NanoVG::ALIGN_CENTER|NanoVG::ALIGN_TOP));
  208. fNanoText.fillColor(Color(1.0f, 1.0f, 1.0f));
  209. char strBuf[32+1];
  210. strBuf[32] = '\0';
  211. for (int i=0; i<MVerb<float>::NUM_PARAMS; ++i)
  212. {
  213. std::snprintf(strBuf, 32, "%i%%", int(fKnobs[i]->getValue()));
  214. fNanoText.textBox(58 + fKnobs[i]->getAbsoluteX()-56, 73, 30.0f, strBuf, nullptr);
  215. }
  216. fNanoText.endFrame();
  217. // just in case
  218. glDisable(GL_CULL_FACE);
  219. }
  220. // -----------------------------------------------------------------------
  221. UI* createUI()
  222. {
  223. return new DistrhoUIMVerb();
  224. }
  225. // -----------------------------------------------------------------------
  226. END_NAMESPACE_DISTRHO