Collection of DPF-based plugins for packaging
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.

262 lines
8.8KB

  1. /*
  2. * DISTRHO MVerb, a DPF'ied MVerb.
  3. * Copyright (c) 2010 Martin Eastwood
  4. * Copyright (C) 2015-2021 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. START_NAMESPACE_DISTRHO
  21. namespace Art = DistrhoArtworkMVerb;
  22. using DGL::Color;
  23. // -----------------------------------------------------------------------
  24. DistrhoUIMVerb::DistrhoUIMVerb()
  25. : UI(Art::backgroundWidth, Art::backgroundHeight, true),
  26. fImgBackground(Art::backgroundData, Art::backgroundWidth, Art::backgroundHeight, kImageFormatBGR)
  27. {
  28. // text
  29. fNanoText.loadSharedResources();
  30. fNanoFont = fNanoText.findFont(NANOVG_DEJAVU_SANS_TTF);
  31. // knobs
  32. Image knobImage(Art::knobData, Art::knobWidth, Art::knobHeight);
  33. {
  34. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical));
  35. knob->setId(MVerb<float>::DAMPINGFREQ);
  36. knob->setAbsolutePos(56 + 7*40, 40);
  37. knob->setRange(0.0f, 100.0f);
  38. knob->setDefault(50.0f);
  39. knob->setCallback(this);
  40. fKnobs.push_back(knob);
  41. }
  42. {
  43. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical));
  44. knob->setId(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));
  53. knob->setId(MVerb<float>::BANDWIDTHFREQ);
  54. knob->setAbsolutePos(56 + 5*40, 40);
  55. knob->setRange(0.0f, 100.0f);
  56. knob->setDefault(50.0f);
  57. knob->setCallback(this);
  58. fKnobs.push_back(knob);
  59. }
  60. {
  61. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical));
  62. knob->setId(MVerb<float>::DECAY);
  63. knob->setAbsolutePos(56 + 6*40, 40);
  64. knob->setRange(0.0f, 100.0f);
  65. knob->setDefault(50.0f);
  66. knob->setCallback(this);
  67. fKnobs.push_back(knob);
  68. }
  69. {
  70. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical));
  71. knob->setId(MVerb<float>::PREDELAY);
  72. knob->setAbsolutePos(56 + 1*40, 40);
  73. knob->setRange(0.0f, 100.0f);
  74. knob->setDefault(50.0f);
  75. knob->setCallback(this);
  76. fKnobs.push_back(knob);
  77. }
  78. {
  79. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical));
  80. knob->setId(MVerb<float>::SIZE);
  81. knob->setAbsolutePos(56 + 3*40, 40);
  82. knob->setRange(5.0f, 100.0f);
  83. knob->setDefault(100.0f);
  84. knob->setCallback(this);
  85. fKnobs.push_back(knob);
  86. }
  87. {
  88. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical));
  89. knob->setId(MVerb<float>::GAIN);
  90. knob->setAbsolutePos(56 + 8*40, 40);
  91. knob->setRange(0.0f, 100.0f);
  92. knob->setDefault(75.0f);
  93. knob->setCallback(this);
  94. fKnobs.push_back(knob);
  95. }
  96. {
  97. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical));
  98. knob->setId(MVerb<float>::MIX);
  99. knob->setAbsolutePos(56 + 0*40, 40);
  100. knob->setRange(0.0f, 100.0f);
  101. knob->setDefault(50.0f);
  102. knob->setCallback(this);
  103. fKnobs.push_back(knob);
  104. }
  105. {
  106. ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical));
  107. knob->setId(MVerb<float>::EARLYMIX);
  108. knob->setAbsolutePos(56 + 2*40, 40);
  109. knob->setRange(0.0f, 100.0f);
  110. knob->setDefault(50.0f);
  111. knob->setCallback(this);
  112. fKnobs.push_back(knob);
  113. }
  114. // set initial values
  115. programLoaded(0);
  116. }
  117. DistrhoUIMVerb::~DistrhoUIMVerb()
  118. {
  119. for (std::vector<ImageKnob*>::iterator it=fKnobs.begin(), end=fKnobs.end(); it != end; ++it)
  120. {
  121. ImageKnob* const knob(*it);
  122. delete knob;
  123. }
  124. fKnobs.clear();
  125. }
  126. // -----------------------------------------------------------------------
  127. // DSP Callbacks
  128. void DistrhoUIMVerb::parameterChanged(uint32_t index, float value)
  129. {
  130. fKnobs[index]->setValue(value);
  131. }
  132. void DistrhoUIMVerb::programLoaded(uint32_t index)
  133. {
  134. switch(index)
  135. {
  136. case 0:
  137. fKnobs[MVerb<float>::DAMPINGFREQ]->setValue(0.5f*100.0f);
  138. fKnobs[MVerb<float>::DENSITY]->setValue(0.5f*100.0f);
  139. fKnobs[MVerb<float>::BANDWIDTHFREQ]->setValue(0.5f*100.0f);
  140. fKnobs[MVerb<float>::DECAY]->setValue(0.5f*100.0f);
  141. fKnobs[MVerb<float>::PREDELAY]->setValue(0.5f*100.0f);
  142. fKnobs[MVerb<float>::GAIN]->setValue(1.0f*100.0f);
  143. fKnobs[MVerb<float>::MIX]->setValue(0.5f*100.0f);
  144. fKnobs[MVerb<float>::EARLYMIX]->setValue(0.5f*100.0f);
  145. fKnobs[MVerb<float>::SIZE]->setValue(0.75f*100.0f);
  146. break;
  147. case 1:
  148. fKnobs[MVerb<float>::DAMPINGFREQ]->setValue(0.9f*100.0f);
  149. fKnobs[MVerb<float>::DENSITY]->setValue(0.5f*100.0f);
  150. fKnobs[MVerb<float>::BANDWIDTHFREQ]->setValue(0.1f*100.0f);
  151. fKnobs[MVerb<float>::DECAY]->setValue(0.5f*100.0f);
  152. fKnobs[MVerb<float>::PREDELAY]->setValue(0.0f*100.0f);
  153. fKnobs[MVerb<float>::SIZE]->setValue(0.5f*100.0f);
  154. fKnobs[MVerb<float>::GAIN]->setValue(1.0f*100.0f);
  155. fKnobs[MVerb<float>::MIX]->setValue(0.5f*100.0f);
  156. fKnobs[MVerb<float>::EARLYMIX]->setValue(0.75f*100.0f);
  157. break;
  158. case 2:
  159. fKnobs[MVerb<float>::DAMPINGFREQ]->setValue(0.0f*100.0f);
  160. fKnobs[MVerb<float>::DENSITY]->setValue(0.5f*100.0f);
  161. fKnobs[MVerb<float>::BANDWIDTHFREQ]->setValue(1.0f*100.0f);
  162. fKnobs[MVerb<float>::DECAY]->setValue(0.5f*100.0f);
  163. fKnobs[MVerb<float>::PREDELAY]->setValue(0.0f*100.0f);
  164. fKnobs[MVerb<float>::SIZE]->setValue(0.25f*100.0f);
  165. fKnobs[MVerb<float>::GAIN]->setValue(1.0f*100.0f);
  166. fKnobs[MVerb<float>::MIX]->setValue(0.35f*100.0f);
  167. fKnobs[MVerb<float>::EARLYMIX]->setValue(0.75f*100.0f);
  168. break;
  169. case 3:
  170. fKnobs[MVerb<float>::DAMPINGFREQ]->setValue(0.0f*100.0f);
  171. fKnobs[MVerb<float>::DENSITY]->setValue(0.5f*100.0f);
  172. fKnobs[MVerb<float>::BANDWIDTHFREQ]->setValue(1.0f*100.0f);
  173. fKnobs[MVerb<float>::DECAY]->setValue(0.5f*100.0f);
  174. fKnobs[MVerb<float>::PREDELAY]->setValue(0.0f*100.0f);
  175. fKnobs[MVerb<float>::SIZE]->setValue(1.0f*100.0f);
  176. fKnobs[MVerb<float>::GAIN]->setValue(1.0f*100.0f);
  177. fKnobs[MVerb<float>::MIX]->setValue(0.35f*100.0f);
  178. fKnobs[MVerb<float>::EARLYMIX]->setValue(0.75f*100.0f);
  179. break;
  180. case 4:
  181. fKnobs[MVerb<float>::DAMPINGFREQ]->setValue(0.0f*100.0f);
  182. fKnobs[MVerb<float>::DENSITY]->setValue(0.5f*100.0f);
  183. fKnobs[MVerb<float>::BANDWIDTHFREQ]->setValue(1.0f*100.0f);
  184. fKnobs[MVerb<float>::DECAY]->setValue(0.5f*100.0f);
  185. fKnobs[MVerb<float>::PREDELAY]->setValue(0.0f*100.0f);
  186. fKnobs[MVerb<float>::SIZE]->setValue(0.5f*100.0f);
  187. fKnobs[MVerb<float>::GAIN]->setValue(1.0f*100.0f);
  188. fKnobs[MVerb<float>::MIX]->setValue(0.15f*100.0f);
  189. fKnobs[MVerb<float>::EARLYMIX]->setValue(0.75f*100.0f);
  190. break;
  191. }
  192. }
  193. // -----------------------------------------------------------------------
  194. // Widget Callbacks
  195. void DistrhoUIMVerb::imageKnobDragStarted(ImageKnob* knob)
  196. {
  197. editParameter(knob->getId(), true);
  198. }
  199. void DistrhoUIMVerb::imageKnobDragFinished(ImageKnob* knob)
  200. {
  201. editParameter(knob->getId(), false);
  202. }
  203. void DistrhoUIMVerb::imageKnobValueChanged(ImageKnob* knob, float value)
  204. {
  205. setParameterValue(knob->getId(), value);
  206. }
  207. void DistrhoUIMVerb::onDisplay()
  208. {
  209. const GraphicsContext& context(getGraphicsContext());
  210. fImgBackground.draw(context);
  211. // text display
  212. fNanoText.beginFrame(this);
  213. fNanoText.fontFaceId(fNanoFont);
  214. fNanoText.fontSize(13);
  215. fNanoText.textAlign(NanoVG::ALIGN_CENTER|NanoVG::ALIGN_TOP);
  216. fNanoText.fillColor(Color(1.0f, 1.0f, 1.0f));
  217. char strBuf[32+1];
  218. strBuf[32] = '\0';
  219. for (std::size_t i=0; i<MVerb<float>::NUM_PARAMS; ++i)
  220. {
  221. std::snprintf(strBuf, 32, "%i%%", int(fKnobs[i]->getValue()));
  222. fNanoText.textBox(56.0f + float(fKnobs[i]->getAbsoluteX()) - 56.0f, 76.0f, 34.0f, strBuf, nullptr);
  223. }
  224. fNanoText.endFrame();
  225. }
  226. // -----------------------------------------------------------------------
  227. UI* createUI()
  228. {
  229. return new DistrhoUIMVerb();
  230. }
  231. // -----------------------------------------------------------------------
  232. END_NAMESPACE_DISTRHO