The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
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.

176 lines
8.7KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2017 - ROLI Ltd.
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 5 End-User License
  8. Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
  9. 27th April 2017).
  10. End User License Agreement: www.juce.com/juce-5-licence
  11. Privacy Policy: www.juce.com/juce-5-privacy-policy
  12. Or: You may also use this code under the terms of the GPL v3 (see
  13. www.gnu.org/licenses).
  14. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  15. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  16. DISCLAIMED.
  17. ==============================================================================
  18. */
  19. namespace juce
  20. {
  21. // This file contains the implementations of the various AudioParameter[XYZ] classes..
  22. AudioProcessorParameterWithID::AudioProcessorParameterWithID (const String& idToUse,
  23. const String& nameToUse,
  24. const String& labelToUse,
  25. AudioProcessorParameter::Category categoryToUse)
  26. : paramID (idToUse), name (nameToUse), label (labelToUse), category (categoryToUse) {}
  27. AudioProcessorParameterWithID::~AudioProcessorParameterWithID() {}
  28. String AudioProcessorParameterWithID::getName (int maximumStringLength) const { return name.substring (0, maximumStringLength); }
  29. String AudioProcessorParameterWithID::getLabel() const { return label; }
  30. AudioProcessorParameter::Category AudioProcessorParameterWithID::getCategory() const { return category; }
  31. //==============================================================================
  32. AudioParameterFloat::AudioParameterFloat (const String& idToUse, const String& nameToUse,
  33. NormalisableRange<float> r, float def,
  34. const String& labelToUse, Category categoryToUse)
  35. : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse, categoryToUse),
  36. range (r), value (def), defaultValue (def)
  37. {
  38. }
  39. AudioParameterFloat::AudioParameterFloat (String pid, String nm, float minValue, float maxValue, float def)
  40. : AudioProcessorParameterWithID (pid, nm), range (minValue, maxValue), value (def), defaultValue (def)
  41. {
  42. }
  43. AudioParameterFloat::~AudioParameterFloat() {}
  44. float AudioParameterFloat::getValue() const { return range.convertTo0to1 (value); }
  45. void AudioParameterFloat::setValue (float newValue) { value = range.convertFrom0to1 (newValue); }
  46. float AudioParameterFloat::getDefaultValue() const { return range.convertTo0to1 (defaultValue); }
  47. int AudioParameterFloat::getNumSteps() const { return AudioProcessorParameterWithID::getNumSteps(); }
  48. float AudioParameterFloat::getValueForText (const String& text) const { return range.convertTo0to1 (text.getFloatValue()); }
  49. String AudioParameterFloat::getText (float v, int length) const
  50. {
  51. String asText (range.convertFrom0to1 (v), 2);
  52. return length > 0 ? asText.substring (0, length) : asText;
  53. }
  54. AudioParameterFloat& AudioParameterFloat::operator= (float newValue)
  55. {
  56. if (value != newValue)
  57. setValueNotifyingHost (range.convertTo0to1 (newValue));
  58. return *this;
  59. }
  60. //==============================================================================
  61. AudioParameterInt::AudioParameterInt (const String& idToUse, const String& nameToUse,
  62. int mn, int mx, int def,
  63. const String& labelToUse)
  64. : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse),
  65. minValue (mn), maxValue (mx),
  66. value ((float) def),
  67. defaultValue (convertTo0to1 (def))
  68. {
  69. jassert (minValue < maxValue); // must have a non-zero range of values!
  70. }
  71. AudioParameterInt::~AudioParameterInt() {}
  72. int AudioParameterInt::limitRange (int v) const noexcept { return jlimit (minValue, maxValue, v); }
  73. float AudioParameterInt::convertTo0to1 (int v) const noexcept { return (limitRange (v) - minValue) / (float) (maxValue - minValue); }
  74. int AudioParameterInt::convertFrom0to1 (float v) const noexcept { return limitRange (roundToInt ((v * (float) (maxValue - minValue)) + minValue)); }
  75. float AudioParameterInt::getValue() const { return convertTo0to1 (roundToInt (value)); }
  76. void AudioParameterInt::setValue (float newValue) { value = (float) convertFrom0to1 (newValue); }
  77. float AudioParameterInt::getDefaultValue() const { return defaultValue; }
  78. int AudioParameterInt::getNumSteps() const { return AudioProcessorParameterWithID::getNumSteps(); }
  79. float AudioParameterInt::getValueForText (const String& text) const { return convertTo0to1 (text.getIntValue()); }
  80. String AudioParameterInt::getText (float v, int /*length*/) const { return String (convertFrom0to1 (v)); }
  81. AudioParameterInt& AudioParameterInt::operator= (int newValue)
  82. {
  83. if (get() != newValue)
  84. setValueNotifyingHost (convertTo0to1 (newValue));
  85. return *this;
  86. }
  87. //==============================================================================
  88. AudioParameterBool::AudioParameterBool (const String& idToUse, const String& nameToUse,
  89. bool def, const String& labelToUse)
  90. : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse),
  91. value (def ? 1.0f : 0.0f),
  92. defaultValue (value)
  93. {
  94. }
  95. AudioParameterBool::~AudioParameterBool() {}
  96. float AudioParameterBool::getValue() const { return value; }
  97. void AudioParameterBool::setValue (float newValue) { value = newValue; }
  98. float AudioParameterBool::getDefaultValue() const { return defaultValue; }
  99. int AudioParameterBool::getNumSteps() const { return 2; }
  100. bool AudioParameterBool::isDiscrete() const { return true; }
  101. float AudioParameterBool::getValueForText (const String& text) const { return text.getIntValue() != 0 ? 1.0f : 0.0f; }
  102. String AudioParameterBool::getText (float v, int /*length*/) const { return String ((int) (v > 0.5f ? 1 : 0)); }
  103. AudioParameterBool& AudioParameterBool::operator= (bool newValue)
  104. {
  105. if (get() != newValue)
  106. setValueNotifyingHost (newValue ? 1.0f : 0.0f);
  107. return *this;
  108. }
  109. //==============================================================================
  110. AudioParameterChoice::AudioParameterChoice (const String& idToUse, const String& nameToUse,
  111. const StringArray& c, int def, const String& labelToUse)
  112. : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse), choices (c),
  113. value ((float) def),
  114. defaultValue (convertTo0to1 (def))
  115. {
  116. jassert (choices.size() > 0); // you must supply an actual set of items to choose from!
  117. }
  118. AudioParameterChoice::~AudioParameterChoice() {}
  119. int AudioParameterChoice::limitRange (int v) const noexcept { return jlimit (0, choices.size() - 1, v); }
  120. float AudioParameterChoice::convertTo0to1 (int v) const noexcept { return jlimit (0.0f, 1.0f, (v + 0.5f) / (float) choices.size()); }
  121. int AudioParameterChoice::convertFrom0to1 (float v) const noexcept { return limitRange ((int) (v * (float) choices.size())); }
  122. float AudioParameterChoice::getValue() const { return convertTo0to1 (roundToInt (value)); }
  123. void AudioParameterChoice::setValue (float newValue) { value = (float) convertFrom0to1 (newValue); }
  124. float AudioParameterChoice::getDefaultValue() const { return defaultValue; }
  125. int AudioParameterChoice::getNumSteps() const { return choices.size(); }
  126. bool AudioParameterChoice::isDiscrete() const { return true; }
  127. float AudioParameterChoice::getValueForText (const String& text) const { return convertTo0to1 (choices.indexOf (text)); }
  128. String AudioParameterChoice::getText (float v, int /*length*/) const { return choices [convertFrom0to1 (v)]; }
  129. AudioParameterChoice& AudioParameterChoice::operator= (int newValue)
  130. {
  131. if (getIndex() != newValue)
  132. setValueNotifyingHost (convertTo0to1 (newValue));
  133. return *this;
  134. }
  135. } // namespace juce