From f77bbcd3fb4fa36d743369daa71db75535d7d672 Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Tue, 9 Apr 2019 12:18:39 +0100 Subject: [PATCH] Added an explicit integer interval to the AudioParameterChoice and AudioParameterInt classes --- .../utilities/juce_AudioParameterChoice.cpp | 13 ++-- .../utilities/juce_AudioParameterInt.cpp | 13 ++-- .../juce_AudioProcessorValueTreeState.cpp | 72 +++++++++---------- 3 files changed, 52 insertions(+), 46 deletions(-) diff --git a/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp b/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp index 529a5874ae..6ba59454b6 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp @@ -32,10 +32,15 @@ AudioParameterChoice::AudioParameterChoice (const String& idToUse, const String& std::function stringFromIndex, std::function indexFromString) : RangedAudioParameter (idToUse, nameToUse, labelToUse), choices (c), - range (0.0f, choices.size() - 1.0f, - [](float, float end, float v) { return jlimit (0.0f, end, v * end); }, - [](float, float end, float v) { return jlimit (0.0f, 1.0f, v / end); }, - [](float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); }), + range ([this] + { + NormalisableRange rangeWithInterval { 0.0f, choices.size() - 1.0f, + [](float, float end, float v) { return jlimit (0.0f, end, v * end); }, + [](float, float end, float v) { return jlimit (0.0f, 1.0f, v / end); }, + [](float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); } }; + rangeWithInterval.interval = 1.0f; + return rangeWithInterval; + }()), value ((float) def), defaultValue (convertTo0to1 ((float) def)), stringFromIndexFunction (stringFromIndex), diff --git a/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp b/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp index e398957198..53a78f9a9b 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp @@ -33,10 +33,15 @@ AudioParameterInt::AudioParameterInt (const String& idToUse, const String& nameT std::function stringFromInt, std::function intFromString) : RangedAudioParameter (idToUse, nameToUse, labelToUse), - range ((float) minValue, (float) maxValue, - [](float start, float end, float v) { return jlimit (start, end, v * (end - start) + start); }, - [](float start, float end, float v) { return jlimit (0.0f, 1.0f, (v - start) / (end - start)); }, - [](float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); }), + range ([minValue, maxValue] + { + NormalisableRange rangeWithInterval { (float) minValue, (float) maxValue, + [](float start, float end, float v) { return jlimit (start, end, v * (end - start) + start); }, + [](float start, float end, float v) { return jlimit (0.0f, 1.0f, (v - start) / (end - start)); }, + [](float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); } }; + rangeWithInterval.interval = 1.0f; + return rangeWithInterval; + }()), value ((float) def), defaultValue (convertTo0to1 ((float) def)), stringFromIntFunction (stringFromInt), diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp index ace9ff493e..62d942e0bd 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp @@ -532,46 +532,42 @@ struct AudioProcessorValueTreeState::SliderAttachment::Pimpl : private Attached slider.setDoubleClickReturnValue (true, range.convertFrom0to1 (param->getParameter().getDefaultValue())); } - if (range.interval != 0.0f || range.skew != 1.0f) + auto convertFrom0To1Function = [range](double currentRangeStart, + double currentRangeEnd, + double normalisedValue) mutable { - slider.setRange (range.start, range.end, range.interval); - slider.setSkewFactor (range.skew, range.symmetricSkew); - } - else + range.start = (float) currentRangeStart; + range.end = (float) currentRangeEnd; + return (double) range.convertFrom0to1 ((float) normalisedValue); + }; + + auto convertTo0To1Function = [range](double currentRangeStart, + double currentRangeEnd, + double mappedValue) mutable { - auto convertFrom0To1Function = [range](double currentRangeStart, - double currentRangeEnd, - double normalisedValue) mutable - { - range.start = (float) currentRangeStart; - range.end = (float) currentRangeEnd; - return (double) range.convertFrom0to1 ((float) normalisedValue); - }; - - auto convertTo0To1Function = [range](double currentRangeStart, - double currentRangeEnd, - double mappedValue) mutable - { - range.start = (float) currentRangeStart; - range.end = (float) currentRangeEnd; - return (double) range.convertTo0to1 ((float) mappedValue); - }; + range.start = (float) currentRangeStart; + range.end = (float) currentRangeEnd; + return (double) range.convertTo0to1 ((float) mappedValue); + }; + + auto snapToLegalValueFunction = [range](double currentRangeStart, + double currentRangeEnd, + double valueToSnap) mutable + { + range.start = (float) currentRangeStart; + range.end = (float) currentRangeEnd; + return (double) range.snapToLegalValue ((float) valueToSnap); + }; - auto snapToLegalValueFunction = [range](double currentRangeStart, - double currentRangeEnd, - double valueToSnap) mutable - { - range.start = (float) currentRangeStart; - range.end = (float) currentRangeEnd; - return (double) range.snapToLegalValue ((float) valueToSnap); - }; + NormalisableRange newRange { (double) range.start, + (double) range.end, + convertFrom0To1Function, + convertTo0To1Function, + snapToLegalValueFunction }; + newRange.interval = (double) range.interval; + newRange.skew = (double) range.skew; - slider.setNormalisableRange ({ (double) range.start, - (double) range.end, - convertFrom0To1Function, - convertTo0To1Function, - snapToLegalValueFunction }); - } + slider.setNormalisableRange (newRange); sendInitialUpdate(); slider.addListener (this); @@ -1094,7 +1090,7 @@ public: TestAudioProcessor proc (std::make_unique (key, "", min, max, 0)); - expect (proc.state.getParameterRange (key) == NormalisableRange (float (min), float (max))); + expect (proc.state.getParameterRange (key) == NormalisableRange (float (min), float (max), 1.0f)); } beginTest ("Choice parameters retain their specified range"); @@ -1104,7 +1100,7 @@ public: TestAudioProcessor proc (std::make_unique (key, "", choices, 0)); - expect (proc.state.getParameterRange (key) == NormalisableRange (0.0f, (float) (choices.size() - 1))); + expect (proc.state.getParameterRange (key) == NormalisableRange (0.0f, (float) (choices.size() - 1), 1.0f)); expect (proc.state.getParameter (key)->getNumSteps() == choices.size()); }