Skip to content

Commit

Permalink
Add parameter type for semitone values (#546)
Browse files Browse the repository at this point in the history
* Add parameter type for semitone values

* Apply clang-format

* Fix warning

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Loading branch information
jatinchowdhury18 and github-actions[bot] authored Jul 15, 2024
1 parent 554f6a4 commit 627aa22
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,18 @@ juce::String timeMsValToString (float timeMsVal)

float stringToTimeMsVal (const juce::String& s) { return s.getFloatValue(); }

juce::String semitonesValToString (float semitonesVal, bool snapToInt)
{
auto semitonesStr = snapToInt
? juce::String (static_cast<int> (semitonesVal)) + " st"
: juce::String (semitonesVal, 2, false) + " st";
if (semitonesVal > 0.0f)
semitonesStr = "+" + semitonesStr;
return semitonesStr;
}

float stringToSemitonesVal (const juce::String& s) { return s.getFloatValue(); }

juce::String floatValToString (float floatVal)
{
return floatValToStringDecimal<2> (floatVal);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ float stringToRatioVal (const juce::String& s);
juce::String timeMsValToString (float timeMsVal);
float stringToTimeMsVal (const juce::String& s);

juce::String semitonesValToString (float semitonesVal, bool snapToInt);
float stringToSemitonesVal (const juce::String& s);

juce::String floatValToString (float floatVal);
template <int NumDecimalPlaces>
juce::String floatValToStringDecimal (float floatVal)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,4 +270,30 @@ class RatioParameter : public FloatParameter
private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RatioParameter)
};

/** A float parameter which specifically stores a semitones value. */
class SemitonesParameter : public FloatParameter
{
public:
SemitonesParameter (const ParameterID& parameterID,
const juce::String& paramName,
juce::NormalisableRange<float> paramRange,
float defaultValue,
bool snapToInt = false)
: FloatParameter (
parameterID,
paramName,
(paramRange.interval = snapToInt ? 1.0f : paramRange.interval, paramRange),
defaultValue,
[snapToInt] (float val)
{ return ParamUtils::semitonesValToString (val, snapToInt); },
&ParamUtils::stringToSemitonesVal)
{
}

using Ptr = OptionalPointer<RatioParameter>;

private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SemitonesParameter)
};
} // namespace chowdsp
15 changes: 15 additions & 0 deletions tests/plugin_tests/chowdsp_parameters_test/ParamHelpersTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,4 +104,19 @@ TEST_CASE ("Param Helpers Test", "[plugin][parameters]")
modeParam.setValueNotifyingHost (1.0f);
REQUIRE_MESSAGE (modeParam.get() == Mode_3, "Set value is incorrect!");
}

SECTION ("Create Semitones Param Test")
{
chowdsp::SemitonesParameter semitonesContinuousParam { "st_continuous", "Semitones", juce::NormalisableRange { -12.0f, 12.0f }, 0.0f };
chowdsp::SemitonesParameter semitonesDiscreteParam { "st_discrete", "Semitones", juce::NormalisableRange { -12.0f, 12.0f }, 0.0f, true };

REQUIRE (static_cast<juce::RangedAudioParameter&> (semitonesContinuousParam).getText (0.5f, 1024) == juce::String ("0.00 st"));
REQUIRE (static_cast<juce::RangedAudioParameter&> (semitonesDiscreteParam).getText (0.5f, 1024) == juce::String ("0 st"));

REQUIRE (static_cast<juce::RangedAudioParameter&> (semitonesContinuousParam).getText (0.0f, 1024) == juce::String ("-12.00 st"));
REQUIRE (static_cast<juce::RangedAudioParameter&> (semitonesDiscreteParam).getText (0.0f, 1024) == juce::String ("-12 st"));

REQUIRE (static_cast<juce::RangedAudioParameter&> (semitonesContinuousParam).getText (1.0f, 1024) == juce::String ("+12.00 st"));
REQUIRE (static_cast<juce::RangedAudioParameter&> (semitonesDiscreteParam).getText (1.0f, 1024) == juce::String ("+12 st"));
}
}
12 changes: 12 additions & 0 deletions tests/plugin_tests/chowdsp_parameters_test/ParamStringsTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,18 @@ TEST_CASE ("Param Strings Test", "[plugin][parameters]")
REQUIRE_MESSAGE (juce::approximatelyEqual (stringToTimeMsVal ("200 ms"), 200.0f), "Incorrect milliseconds value!");
}

SECTION ("Semitones Param Test")
{
REQUIRE (semitonesValToString (10.0f, false) == juce::String ("+10.00 st"));
REQUIRE (semitonesValToString (10.0f, true) == juce::String ("+10 st"));
REQUIRE (semitonesValToString (10.1f, true) == juce::String ("+10 st"));
REQUIRE (semitonesValToString (0.0f, true) == juce::String ("0 st"));
REQUIRE (semitonesValToString (0.0f, false) == juce::String ("0.00 st"));
REQUIRE (semitonesValToString (-5.0f, false) == juce::String ("-5.00 st"));
REQUIRE (semitonesValToString (-5.0f, true) == juce::String ("-5 st"));
REQUIRE (juce::approximatelyEqual (stringToSemitonesVal ("9 st"), 9.0f));
}

SECTION ("Float Param Test")
{
REQUIRE_MESSAGE (floatValToString (10.0f) == juce::String ("10.00"), "Incorrect float string!");
Expand Down

0 comments on commit 627aa22

Please sign in to comment.