commit eea7e66efdf545260340b4275aafa9b324133d81 parent f38864ef4645bdd9ad488ceb47d22dea22afad5e Author: Matt Demanett <matt@demanett.net> Date: Tue, 5 Oct 2021 23:40:09 -0400 Rack2: enable new tooltip handling for buttons and switches, and fix "snap" on knobs that use it. Diffstat:
97 files changed, 325 insertions(+), 367 deletions(-)
diff --git a/README-prerelease.md b/README-prerelease.md @@ -448,7 +448,8 @@ Features: - When MODE is TRIG, a trigger CV or press of the TRIGGER button will start a normal DADSR cycle, but controlled by an internal gate CV. The internal gate persists for the time set by the HOLD knob. - The envelope is output as a 0-10 signal at port ENV. Its inverse (10V - ENV) is output at INV. When a release stage completes, a trigger is emitted at END. - When MODE is TRIGGER, the CYCLE switch controls whether the envelope loops or not upon completion of a release stage. - - Toggles allow selection of linear, exponential or inverse-exponential shapes for the attack, decay and release stages. + - Toggles allow selection of linear, exponential or inverse-exponential ("logarithmic", more or less) shapes for the attack, decay and release stages. + - The SPEED switch slows down the timing of segments by 10x. - The RETRIG switch controls the retrigger behavior (when a new gate or trigger happens while the envelope is running): ATT immediately attacks from the current envelope value (this is the typical behavior with many ADSRs), while RST causes a full reset of the envelope (restarting it at the delay stage). _Polyphony:_ <a href="#polyphony">polyphonic</a>, with channels defined by the TRIGGER input. Pressing the trigger button will trigger all channels. @@ -474,6 +475,7 @@ Features: - The trapezoid envelope is output as a 0-10V control signal at port ENV, subject to attenuation by the ENV knob. (INV outputs 10V - ENV.) - Audio input at port IN is sent through the internal VCA -- controlled by knob SIGNAL and the envelope -- to port OUT. Turning up the SIGNAL knob can dramatically amplify the signal. [This is actually a design error, but enough people have used it this way that we leave it be.] - A trigger CV at the TRIGGER port, or a press of the TRIGGER button, will start the envelope cycle. When the off stage completes, a trigger is emitted at port END. If the CYCLE switch is set to LOOP, the envelope restarts immediately. + - The SPEED switch slows down the timing of segments by 10x. _Polyphony:_ <a href="#polyphony">polyphonic</a>, with channels defined by the TRIGGER input. Pressing the trigger button will trigger all channels. @@ -497,7 +499,7 @@ If the RT (retrigger) toggle is enabled, if TRIG receives a new trigger while th If the LP (loop) toggle is enabled, the envelope cycles continuously (it doesn't need a trigger to start it). If RT is also enabled, triggers at TRIG will restart the cycle (this is similar to syncing an LFO). -By default, the attack and decay envelope segments have an exponential curve -- in linear mode (the LIN toggle), the segments are linear. +By default, the attack and decay envelope segments have a logarithmic (more or less) curve -- in linear mode (the LIN toggle), the segments are linear. _Polyphony:_ <a href="#polyphony">polyphonic</a>, with channels defined by the TRIG input. @@ -505,7 +507,7 @@ _When <a href="#bypassing">bypassed</a>:_ no output. #### <a name="asr"></a> ASR -ASR is AR (if triggered) or ASR (Attack, Sustain, Release -- if gated) envelope generator. It has CV inputs for the attack and release times (if CVs are used, they are attenuated by the corresponding knob values). The sustain level may be set by the small knob marked S. The attack and release segments have an exponential shape by default, but can be made linear with the LIN toggle. +ASR is AR (if triggered) or ASR (Attack, Sustain, Release -- if gated) envelope generator. It has CV inputs for the attack and release times (if CVs are used, they are attenuated by the corresponding knob values). The sustain level may be set by the small knob marked S. The attack and release segments are curved by default, but can be made linear with the LIN toggle. _Polyphony:_ <a href="#polyphony">polyphonic</a>, with channels defined by the TRIG input. @@ -515,7 +517,7 @@ _When <a href="#bypassing">bypassed</a>:_ no output. A standard ADSR (Attack, Decay, Sustain, Release) envelope generator in 3HP. The attack, decay and release knobs are exponentially scaled with durations up to 10 seconds. The sustain knob is linearly scaled, setting the sustain level from 0 to 10 volts. Lights below each stage knob indicate which stage is active. -By default, the attack, decay and release envelope segments have an exponential curve -- in linear mode (the LIN button), the segments are linear. +By default, the attack, decay and release envelope segments have a curve -- in linear mode (the LIN button), the segments are linear. _Polyphony:_ <a href="#polyphony">polyphonic</a>, with channels defined by the GATE input. diff --git a/README.md b/README.md @@ -448,7 +448,8 @@ Features: - When MODE is TRIG, a trigger CV or press of the TRIGGER button will start a normal DADSR cycle, but controlled by an internal gate CV. The internal gate persists for the time set by the HOLD knob. - The envelope is output as a 0-10 signal at port ENV. Its inverse (10V - ENV) is output at INV. When a release stage completes, a trigger is emitted at END. - When MODE is TRIGGER, the CYCLE switch controls whether the envelope loops or not upon completion of a release stage. - - Toggles allow selection of linear, exponential or inverse-exponential shapes for the attack, decay and release stages. + - Toggles allow selection of linear, exponential or inverse-exponential ("logarithmic", more or less) shapes for the attack, decay and release stages. + - The SPEED switch slows down the timing of segments by 10x. - The RETRIG switch controls the retrigger behavior (when a new gate or trigger happens while the envelope is running): ATT immediately attacks from the current envelope value (this is the typical behavior with many ADSRs), while RST causes a full reset of the envelope (restarting it at the delay stage). _Polyphony:_ <a href="#polyphony">polyphonic</a>, with channels defined by the TRIGGER input. Pressing the trigger button will trigger all channels. @@ -474,6 +475,7 @@ Features: - The trapezoid envelope is output as a 0-10V control signal at port ENV, subject to attenuation by the ENV knob. (INV outputs 10V - ENV.) - Audio input at port IN is sent through the internal VCA -- controlled by knob SIGNAL and the envelope -- to port OUT. Turning up the SIGNAL knob can dramatically amplify the signal. [This is actually a design error, but enough people have used it this way that we leave it be.] - A trigger CV at the TRIGGER port, or a press of the TRIGGER button, will start the envelope cycle. When the off stage completes, a trigger is emitted at port END. If the CYCLE switch is set to LOOP, the envelope restarts immediately. + - The SPEED switch slows down the timing of segments by 10x. _Polyphony:_ <a href="#polyphony">polyphonic</a>, with channels defined by the TRIGGER input. Pressing the trigger button will trigger all channels. @@ -497,7 +499,7 @@ If the RT (retrigger) toggle is enabled, if TRIG receives a new trigger while th If the LP (loop) toggle is enabled, the envelope cycles continuously (it doesn't need a trigger to start it). If RT is also enabled, triggers at TRIG will restart the cycle (this is similar to syncing an LFO). -By default, the attack and decay envelope segments have an exponential curve -- in linear mode (the LIN toggle), the segments are linear. +By default, the attack and decay envelope segments have a logarithmic (more or less) curve -- in linear mode (the LIN toggle), the segments are linear. _Polyphony:_ <a href="#polyphony">polyphonic</a>, with channels defined by the TRIG input. @@ -505,7 +507,7 @@ _When <a href="#bypassing">bypassed</a>:_ no output. #### <a name="asr"></a> ASR -ASR is AR (if triggered) or ASR (Attack, Sustain, Release -- if gated) envelope generator. It has CV inputs for the attack and release times (if CVs are used, they are attenuated by the corresponding knob values). The sustain level may be set by the small knob marked S. The attack and release segments have an exponential shape by default, but can be made linear with the LIN toggle. +ASR is AR (if triggered) or ASR (Attack, Sustain, Release -- if gated) envelope generator. It has CV inputs for the attack and release times (if CVs are used, they are attenuated by the corresponding knob values). The sustain level may be set by the small knob marked S. The attack and release segments are curved by default, but can be made linear with the LIN toggle. _Polyphony:_ <a href="#polyphony">polyphonic</a>, with channels defined by the TRIG input. @@ -515,7 +517,7 @@ _When <a href="#bypassing">bypassed</a>:_ no output. A standard ADSR (Attack, Decay, Sustain, Release) envelope generator in 3HP. The attack, decay and release knobs are exponentially scaled with durations up to 10 seconds. The sustain knob is linearly scaled, setting the sustain level from 0 to 10 volts. Lights below each stage knob indicate which stage is active. -By default, the attack, decay and release envelope segments have an exponential curve -- in linear mode (the LIN button), the segments are linear. +By default, the attack, decay and release envelope segments have a curve -- in linear mode (the LIN button), the segments are linear. _Polyphony:_ <a href="#polyphony">polyphonic</a>, with channels defined by the GATE input. diff --git a/src/AD.hpp b/src/AD.hpp @@ -69,9 +69,9 @@ struct AD : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam<EnvelopeSegmentParamQuantity>(ATTACK_PARAM, 0.0f, 1.0f, 0.141421f, "Attack", " s"); configParam<EnvelopeSegmentParamQuantity>(DECAY_PARAM, 0.0f, 1.0f, 0.31623f, "Decay", " s"); - configParam(LOOP_PARAM, 0.0f, 1.0f, 0.0f, "Loop"); - configParam(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear"); - configParam(RETRIGGER_PARAM, 0.0f, 1.0f, 1.0f, "Retrigger"); + configSwitch(LOOP_PARAM, 0.0f, 1.0f, 0.0f, "Loop", {"Disabled (stop)", "Enabled"}); + configSwitch(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear", {"Disabled (logarithmic)", "Enabled"}); + configSwitch(RETRIGGER_PARAM, 0.0f, 1.0f, 1.0f, "Retrigger", {"Disabled (finish cycle)", "Enabled"}); } void reset() override; diff --git a/src/ADSR.hpp b/src/ADSR.hpp @@ -62,7 +62,7 @@ struct ADSR : BGModule { configParam<EnvelopeSegmentParamQuantity>(DECAY_PARAM, 0.0f, 1.0f, 0.31623f, "Decay", " s"); configParam(SUSTAIN_PARAM, 0.0f, 1.0f, 1.0f, "Sustain", "%", 0.0f, 100.0f); configParam<EnvelopeSegmentParamQuantity>(RELEASE_PARAM, 0.0f, 1.0f, 0.31623f, "Release", " s"); - configParam(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear"); + configSwitch(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear", {"Disabled (logarithmic)", "Enabled"}); } void reset() override; diff --git a/src/ASR.hpp b/src/ASR.hpp @@ -66,7 +66,7 @@ struct ASR : BGModule { configParam<EnvelopeSegmentParamQuantity>(ATTACK_PARAM, 0.0f, 1.0f, 0.141421f, "Attack", " s"); configParam<EnvelopeSegmentParamQuantity>(RELEASE_PARAM, 0.0f, 1.0f, 0.31623f, "Release", " s"); configParam(SUSTAIN_PARAM, 0.0f, 1.0f, 1.0f, "Sustain", "", 0.0f, 10.0f); - configParam(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear"); + configSwitch(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear", {"Disabled (logarithmic)", "Enabled"}); } void reset() override; diff --git a/src/Additator.cpp b/src/Additator.cpp @@ -253,11 +253,7 @@ struct AdditatorWidget : BGModuleWidget { // end generated by svg_widgets.rb addParam(createParam<Knob68>(frequencyParamPosition, module, Additator::FREQUENCY_PARAM)); - { - auto w = createParam<Knob38>(partialsParamPosition, module, Additator::PARTIALS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob38>(partialsParamPosition, module, Additator::PARTIALS_PARAM)); addParam(createParam<Knob16>(fineParamPosition, module, Additator::FINE_PARAM)); addParam(createParam<Knob26>(widthParamPosition, module, Additator::WIDTH_PARAM)); addParam(createParam<Knob26>(oddSkewParamPosition, module, Additator::ODD_SKEW_PARAM)); diff --git a/src/Additator.hpp b/src/Additator.hpp @@ -103,6 +103,7 @@ struct Additator : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam<FrequencyParamQuantity>(FREQUENCY_PARAM, -3.0f, 6.0f, 0.0f, "Frequency", " Hz"); configParam(PARTIALS_PARAM, 1.0f, Additator::maxPartials, Additator::maxPartials / 5.0f, "Partials"); + paramQuantities[PARTIALS_PARAM]->snapEnabled = true; configParam(FINE_PARAM, -1.0f, 1.0f, 0.0f, "Fine tune", " cents", 0.0f, 100.0f); configParam(WIDTH_PARAM, 0.0f, maxWidth, maxWidth / 2.0f, "Width", "%", 0.0f, 2.0f * (1.0f / maxWidth) * 100.0f, -100.0f); configParam(ODD_SKEW_PARAM, -maxSkew, maxSkew, 0.0f, "Odd skew", "%", 0.0f, (1.0f / maxSkew) * 100.0f); @@ -111,7 +112,7 @@ struct Additator : BGModule { configParam(DECAY_PARAM, minDecay, maxDecay, (maxDecay - minDecay) / 2.0 + minDecay, "Decay"); configParam(BALANCE_PARAM, -1.0f, 1.0f, 0.0f, "Balance", "%", 0.0f, 100.0f); configParam(FILTER_PARAM, minFilter, maxFilter, (maxFilter - minFilter) / 2.0 + minFilter, "Filter"); - configParam(PHASE_PARAM, 1.0f, 2.0f, 1.0f, "Phase"); + configSwitch(PHASE_PARAM, 1.0f, 2.0f, 1.0f, "Phase", {"Sine", "Cosine"}); } void reset() override; diff --git a/src/AddrSeq.hpp b/src/AddrSeq.hpp @@ -117,7 +117,7 @@ struct AddrSeq : AddrSeqBase { AddrSeq() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam<StepsParamQuantity>(STEPS_PARAM, 1.0f, 8.0f, 8.0f, "Steps"); - configParam(DIRECTION_PARAM, 0.0f, 1.0f, 1.0f, "Direction"); + configSwitch(DIRECTION_PARAM, 0.0f, 1.0f, 1.0f, "Direction", {"Reverse", "Forward"}); configParam<SelectParamQuantity>(SELECT_PARAM, 0.0f, 7.0f, 0.0f, "Select step"); configParam<OutputRangeParamQuantity>(OUT1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1", " V"); configParam<OutputRangeParamQuantity>(OUT2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2", " V"); diff --git a/src/Analyzer.hpp b/src/Analyzer.hpp @@ -50,8 +50,8 @@ struct Analyzer : AnalyzerBase { Analyzer() : AnalyzerBase(4, NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { configParam(RANGE2_PARAM, -1.0f, 1.0f, 0.0f, "Range"); configParam(SMOOTH_PARAM, 0.0f, 1.0f, 0.5f, "Smoothing", " ms", 0.0f, 500.0f); - configParam(QUALITY_PARAM, 1.0f, 3.0f, 1.0f, "Analysis quality"); - configParam(WINDOW_PARAM, 1.0f, 3.0f, 1.0f, "Analysis window type"); + configSwitch(QUALITY_PARAM, 1.0f, 3.0f, 1.0f, "Analysis quality", {"Good", "High", "Ultra"}); + configSwitch(WINDOW_PARAM, 1.0f, 3.0f, 1.0f, "Analysis window type", {"Kaiser", "Hamming", "None"}); } virtual ~Analyzer() { reset(); diff --git a/src/Arp.hpp b/src/Arp.hpp @@ -136,7 +136,7 @@ struct Arp : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam(MODE_PARAM, 0.0f, 6.0f, 0.0f, "Playback mode"); configParam<GateLengthParamQuantity>(GATE_LENGTH_PARAM, 0.0f, 1.0f, 0.5f, "Gate length"); - configParam(HOLD_PARAM, 0.0f, 1.0f, 0.0f, "Hold/latch"); + configSwitch(HOLD_PARAM, 0.0f, 1.0f, 0.0f, "Hold/latch", {"Disabled", "Enabled"}); _currentNotes = new NoteSet(); _playbackNotes = new NoteSet(_currentNotes); diff --git a/src/Assign.cpp b/src/Assign.cpp @@ -125,11 +125,7 @@ struct AssignWidget : BGModuleWidget { auto gateOutputPosition = Vec(10.5, 221.0); // end generated by svg_widgets.rb - { - auto w = createParam<Knob26>(channelsParamPosition, module, Assign::CHANNELS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob26>(channelsParamPosition, module, Assign::CHANNELS_PARAM)); addInput(createInput<Port24>(pitchInputPosition, module, Assign::PITCH_INPUT)); addInput(createInput<Port24>(gateInputPosition, module, Assign::GATE_INPUT)); diff --git a/src/Assign.hpp b/src/Assign.hpp @@ -41,6 +41,7 @@ struct Assign : BGModule { Assign() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(CHANNELS_PARAM, 1.0f, 16.0f, 0.0f, "Channels"); + paramQuantities[CHANNELS_PARAM]->snapEnabled = true; } void reset() override; diff --git a/src/CVD.cpp b/src/CVD.cpp @@ -85,7 +85,6 @@ struct CVDWidget : BGModuleWidget { { auto w = createParam<Knob16>(timeScaleParamPosition, module, CVD::TIME_SCALE_PARAM); auto k = dynamic_cast<SvgKnob*>(w); - k->snap = true; k->minAngle = -M_PI / 4.0f; k->maxAngle = M_PI / 4.0f; k->speed = 3.0; diff --git a/src/CVD.hpp b/src/CVD.hpp @@ -43,6 +43,7 @@ struct CVD : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(TIME_PARAM, 0.0f, 1.0f, 0.5f, "Time base", " s"); configParam(TIME_SCALE_PARAM, 0.0f, 2.0f, 1.0f, "Time scale", "", 10.0f, 0.1f); + paramQuantities[TIME_SCALE_PARAM]->snapEnabled = true; configParam(MIX_PARAM, -1.0f, 1.0f, 0.0f, "Dry wet mix", "%", 0.0f, 100.0f); configBypass(IN_INPUT, OUT_OUTPUT); } diff --git a/src/Chirp.hpp b/src/Chirp.hpp @@ -89,9 +89,9 @@ struct Chirp : BGModule { configParam<TimeParamQuantity>(TIME_PARAM, 0.0f, 1.0f, 0.30899415, "Time", "s"); configParam<FrequencyParamQuantity>(FREQUENCY1_PARAM, -3.0f, 6.0f, -3.0f, "Frequency 1", " Hz"); configParam<FrequencyParamQuantity>(FREQUENCY2_PARAM, -3.0f, 6.0f, 6.0f, "Frequency 2", " Hz"); - configParam(TRIGGER_PARAM, 0.0f, 1.0f, 0.0f, "Trigger"); - configParam(EXPONENTIAL_PARAM, 0.0f, 1.0f, 1.0f, "Exponential"); - configParam(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop"); + configButton(TRIGGER_PARAM, "Trigger"); + configButton(EXPONENTIAL_PARAM, "Exponential"); + configButton(LOOP_PARAM, "Loop"); } void reset() override; diff --git a/src/Clpr.hpp b/src/Clpr.hpp @@ -54,7 +54,7 @@ struct Clpr : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam<ThresholdParamQuantity>(THRESHOLD_PARAM, 0.0f, 1.0f, 0.8f, "Threshold", " dB"); configParam(OUTPUT_GAIN_PARAM, 0.0f, 1.0f, 0.0f, "Output gain", " dB", 0.0f, 24.0f); - configParam(KNEE_PARAM, 0.0f, 1.0f, 0.0f, "Knee"); + configSwitch(KNEE_PARAM, 0.0f, 1.0f, 1.0f, "Knee", {"Hard", "Soft"}); configBypass(LEFT_INPUT, LEFT_OUTPUT); configBypass(RIGHT_INPUT, RIGHT_OUTPUT); } diff --git a/src/Cmp.cpp b/src/Cmp.cpp @@ -184,7 +184,6 @@ struct CmpWidget : BGModuleWidget { { auto w = createParam<Knob16>(outputParamPosition, module, Cmp::OUTPUT_PARAM); auto k = dynamic_cast<SvgKnob*>(w); - k->snap = true; k->minAngle = 3.0f * (M_PI / 8.0f); k->maxAngle = 5.0f * (M_PI / 8.0f); k->speed = 3.0; diff --git a/src/Cmp.hpp b/src/Cmp.hpp @@ -53,7 +53,8 @@ struct Cmp : BGModule { configParam(B_PARAM, -1.0f, 1.0f, 0.0f, "B", " V", 0.0f, 10.0f); configParam(WINDOW_PARAM, 0.0f, 1.0f, 0.5f, "Window", " V", 0.0f, 10.0f); configParam<ScaledSquaringParamQuantity<1>>(LAG_PARAM, 0.0f, 1.0f, 0.1f, "Lag", " s"); - configParam(OUTPUT_PARAM, 0.0f, 1.0f, 0.0f, "Output"); + configSwitch(OUTPUT_PARAM, 0.0f, 1.0f, 0.0f, "Output", {"+10V", "+/-5V"}); + paramQuantities[OUTPUT_PARAM]->snapEnabled = true; } void reset() override; diff --git a/src/DADSRH.hpp b/src/DADSRH.hpp @@ -72,14 +72,14 @@ struct DADSRH : TriggerOnLoadModule { configParam(SUSTAIN_PARAM, 0.0f, 1.0f, 0.5f, "Sustain", "%", 0.0f, 100.0f); configParam<EnvelopeSegmentParamQuantity>(RELEASE_PARAM, 0.0f, 1.0f, 0.31623f, "Release", " s"); configParam<EnvelopeSegmentParamQuantity>(HOLD_PARAM, 0.0f, 1.0f, 0.44721f, "Hold", " s"); - configParam(ATTACK_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Attack shape"); - configParam(DECAY_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Decay shape"); - configParam(RELEASE_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Release shape"); - configParam(TRIGGER_PARAM, 0.0f, 1.0f, 0.0f, "Trigger"); - configParam(MODE_PARAM, 0.0f, 1.0f, 1.0f, "Mode"); - configParam(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop"); - configParam(SPEED_PARAM, 0.0f, 1.0f, 1.0f, "Speed"); - configParam(RETRIGGER_PARAM, 0.0f, 1.0f, 1.0f, "Retrigger"); + configSwitch(ATTACK_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Attack shape", {"Logarithmic", "Linear", "Exponential"}); + configSwitch(DECAY_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Decay shape", {"Exponential", "Linear", "Logarithmic"}); + configSwitch(RELEASE_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Release shape", {"Exponential", "Linear", "Logarithmic"}); + configButton(TRIGGER_PARAM, "Trigger"); + configSwitch(MODE_PARAM, 0.0f, 1.0f, 1.0f, "Mode", {"Triggered", "Gated"}); + configSwitch(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop", {"Loop", "Stop"}); + configSwitch(SPEED_PARAM, 0.0f, 1.0f, 1.0f, "Speed", {"Slow", "Normal"}); + configSwitch(RETRIGGER_PARAM, 0.0f, 1.0f, 1.0f, "Retrigger", {"Reset", "Resume attack"}); } void reset() override; diff --git a/src/DADSRHPlus.hpp b/src/DADSRHPlus.hpp @@ -83,14 +83,14 @@ struct DADSRHPlus : TriggerOnLoadModule { configParam(SUSTAIN_PARAM, 0.0f, 1.0f, 0.5f, "Sustain", "%", 0.0f, 100.0f); configParam<EnvelopeSegmentParamQuantity>(RELEASE_PARAM, 0.0f, 1.0f, 0.31623f, "Release", " s"); configParam<EnvelopeSegmentParamQuantity>(HOLD_PARAM, 0.0f, 1.0f, 0.44721f, "Hold", " s"); - configParam(ATTACK_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Attack shape"); - configParam(DECAY_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Decay shape"); - configParam(RELEASE_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Release shape"); - configParam(TRIGGER_PARAM, 0.0f, 1.0f, 0.0f, "Trigger"); - configParam(MODE_PARAM, 0.0f, 1.0f, 1.0f, "Mode"); - configParam(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop"); - configParam(SPEED_PARAM, 0.0f, 1.0f, 1.0f, "Speed"); - configParam(RETRIGGER_PARAM, 0.0f, 1.0f, 1.0f, "Retrigger"); + configSwitch(ATTACK_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Attack shape", {"Logarithmic", "Linear", "Exponential"}); + configSwitch(DECAY_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Decay shape", {"Exponential", "Linear", "Logarithmic"}); + configSwitch(RELEASE_SHAPE_PARAM, 1.0f, 3.0f, 1.0f, "Release shape", {"Exponential", "Linear", "Logarithmic"}); + configButton(TRIGGER_PARAM, "Trigger"); + configSwitch(MODE_PARAM, 0.0f, 1.0f, 1.0f, "Mode", {"Triggered", "Gated"}); + configSwitch(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop", {"Loop", "Stop"}); + configSwitch(SPEED_PARAM, 0.0f, 1.0f, 1.0f, "Speed", {"Slow", "Normal"}); + configSwitch(RETRIGGER_PARAM, 0.0f, 1.0f, 1.0f, "Retrigger", {"Reset", "Resume attack"}); } void reset() override; diff --git a/src/DGate.hpp b/src/DGate.hpp @@ -57,8 +57,8 @@ struct DGate : TriggerOnLoadModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam<EnvelopeSegmentParamQuantity>(DELAY_PARAM, 0.0f, 1.0f, 0.0f, "Delay", " s"); configParam<EnvelopeSegmentParamQuantity>(GATE_PARAM, 0.0f, 1.0f, 0.31623f, "Gate", " s"); - configParam(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop"); - configParam(TRIGGER_PARAM, 0.0f, 1.0f, 0.0f, "Trigger"); + configSwitch(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop", {"Loop", "Stop"}); + configButton(TRIGGER_PARAM, "Trigger"); } void reset() override; diff --git a/src/Detune.cpp b/src/Detune.cpp @@ -76,11 +76,7 @@ struct DetuneWidget : BGModuleWidget { auto outMinusOutputPosition = Vec(10.5, 236.0); // end generated by svg_widgets.rb - { - auto w = createParam<Knob26>(centsParamPosition, module, Detune::CENTS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob26>(centsParamPosition, module, Detune::CENTS_PARAM)); addInput(createInput<Port24>(cvInputPosition, module, Detune::CV_INPUT)); addInput(createInput<Port24>(inInputPosition, module, Detune::IN_INPUT)); diff --git a/src/Detune.hpp b/src/Detune.hpp @@ -37,6 +37,7 @@ struct Detune : BGModule { Detune() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(CENTS_PARAM, 0.0f, 50.0f, 0.0f, "Cents"); + paramQuantities[CENTS_PARAM]->snapEnabled = true; for (int i = 0; i < maxChannels; ++i) { _lastCents[i] = -1.0f; diff --git a/src/EightFO.cpp b/src/EightFO.cpp @@ -269,7 +269,6 @@ struct EightFOWidget : BGModuleWidget { { auto w = createParam<Knob16>(waveParamPosition, module, EightFO::WAVE_PARAM); auto k = dynamic_cast<SvgKnob*>(w); - k->snap = true; k->minAngle = 0.0; k->maxAngle = M_PI; k->speed = 3.0; diff --git a/src/EightFO.hpp b/src/EightFO.hpp @@ -129,8 +129,9 @@ struct EightFO : LFOBase { EightFO() : LFOBase(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) { configParam<LFOFrequencyParamQuantity>(FREQUENCY_PARAM, -5.0f, 8.0f, 0.0, "Frequency", " Hz"); - configParam(WAVE_PARAM, 1.0, 6.0, 3.0, "Waveform"); - configParam(SLOW_PARAM, 0.0, 1.0, 0.0, "Slow"); + configSwitch(WAVE_PARAM, 1.0, 6.0, 3.0, "Waveform", {"Ramp up", "Ramp down", "Sine", "Triangle", "Square", "Stepped"}); + paramQuantities[WAVE_PARAM]->snapEnabled = true; + configButton(SLOW_PARAM, "Slow"); configParam(SAMPLE_PWM_PARAM, -1.0, 1.0, 0.0, "Width", "%", 0.0f, 100.0f); configParam(SMOOTH_PARAM, 0.0f, 1.0f, 0.0f, "Smoothing", "%", 0.0f, 100.0f); configParam(OFFSET_PARAM, -1.0, 1.0, 0.0, "Offset", " V", 0.0f, 5.0f); diff --git a/src/EightOne.cpp b/src/EightOne.cpp @@ -75,17 +75,9 @@ struct EightOneWidget : AddressableSequenceModuleWidget { auto in8LightPosition = Vec(23.5, 350.5); // end generated by svg_widgets.rb - { - auto w = createParam<Knob16>(stepsParamPosition, module, EightOne::STEPS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob16>(stepsParamPosition, module, EightOne::STEPS_PARAM)); addParam(createParam<SliderSwitch2State14>(directionParamPosition, module, EightOne::DIRECTION_PARAM)); - { - auto w = createParam<Knob29>(selectParamPosition, module, EightOne::SELECT_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob29>(selectParamPosition, module, EightOne::SELECT_PARAM)); addInput(createInput<Port24>(in1InputPosition, module, EightOne::IN1_INPUT)); addInput(createInput<Port24>(in2InputPosition, module, EightOne::IN2_INPUT)); diff --git a/src/EightOne.hpp b/src/EightOne.hpp @@ -55,8 +55,10 @@ struct EightOne : AddressableSequenceModule { EightOne() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam(STEPS_PARAM, 1.0f, 8.0f, 8.0f, "Steps"); - configParam(DIRECTION_PARAM, 0.0f, 1.0f, 1.0f, "Direction"); + paramQuantities[STEPS_PARAM]->snapEnabled = true; + configSwitch(DIRECTION_PARAM, 0.0f, 1.0f, 1.0f, "Direction", {"Reverse", "Forward"}); configParam(SELECT_PARAM, 0.0f, 7.0f, 0.0f, "Select step"); + paramQuantities[SELECT_PARAM]->snapEnabled = true; setInputIDs(CLOCK_INPUT, SELECT_INPUT); configBypass(IN1_INPUT, OUT_OUTPUT); } diff --git a/src/FMOp.hpp b/src/FMOp.hpp @@ -115,9 +115,9 @@ struct FMOp : BGModule { configParam(DEPTH_PARAM, 0.0f, 1.0f, 0.0f, "FM depth", "%", 0.0f, 100.0f); configParam(FEEDBACK_PARAM, 0.0f, 1.0f, 0.0f, "Feedback", "%", 0.0f, 100.0f); configParam<LevelParamQuantity>(LEVEL_PARAM, 0.0f, 1.0f, 1.0f, "Level"); - configParam(ENV_TO_LEVEL_PARAM, 0.0f, 1.0f, 0.0f, "Level follows envelope"); - configParam(ENV_TO_FEEDBACK_PARAM, 0.0f, 1.0f, 0.0f, "Feedback follows envelope"); - configParam(ENV_TO_DEPTH_PARAM, 0.0f, 1.0f, 0.0f, "FM depth follows envelope"); + configButton(ENV_TO_LEVEL_PARAM, "Level follows envelope"); + configButton(ENV_TO_FEEDBACK_PARAM, "Feedback follows envelope"); + configButton(ENV_TO_DEPTH_PARAM, "FM depth follows envelope"); } void reset() override; diff --git a/src/FourFO.cpp b/src/FourFO.cpp @@ -237,7 +237,6 @@ struct FourFOWidget : BGModuleWidget { { auto w = createParam<Knob16>(waveParamPosition, module, FourFO::WAVE_PARAM); auto k = dynamic_cast<SvgKnob*>(w); - k->snap = true; k->minAngle = 0.0; k->maxAngle = M_PI; k->speed = 3.0; diff --git a/src/FourFO.hpp b/src/FourFO.hpp @@ -101,8 +101,9 @@ struct FourFO : LFOBase { FourFO() : LFOBase(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) { configParam<LFOFrequencyParamQuantity>(FREQUENCY_PARAM, -5.0f, 8.0f, 0.0, "Frequency", " Hz"); - configParam(WAVE_PARAM, 1.0, 6.0, 3.0, "Waveform"); - configParam(SLOW_PARAM, 0.0, 1.0, 0.0, "Slow"); + configSwitch(WAVE_PARAM, 1.0, 6.0, 3.0, "Waveform", {"Ramp up", "Ramp down", "Sine", "Triangle", "Square", "Stepped"}); + paramQuantities[WAVE_PARAM]->snapEnabled = true; + configButton(SLOW_PARAM, "Slow"); configParam(SAMPLE_PWM_PARAM, -1.0, 1.0, 0.0, "Width", "%", 0.0f, 100.0f); configParam(SMOOTH_PARAM, 0.0f, 1.0f, 0.0f, "Smoothing", "%", 0.0f, 100.0f); configParam(OFFSET_PARAM, -1.0, 1.0, 0.0, "Offset", " V", 0.0f, 5.0f); diff --git a/src/FourMan.hpp b/src/FourMan.hpp @@ -37,10 +37,10 @@ struct FourMan : TriggerOnLoadModule { FourMan() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); - configParam(TRIGGER1_PARAM, 0.0f, 1.0f, 0.0f, "Trigger 1"); - configParam(TRIGGER2_PARAM, 0.0f, 1.0f, 0.0f, "Trigger 2"); - configParam(TRIGGER3_PARAM, 0.0f, 1.0f, 0.0f, "Trigger 3"); - configParam(TRIGGER4_PARAM, 0.0f, 1.0f, 0.0f, "Trigger 4"); + configButton(TRIGGER1_PARAM, "Trigger 1"); + configButton(TRIGGER2_PARAM, "Trigger 2"); + configButton(TRIGGER3_PARAM, "Trigger 3"); + configButton(TRIGGER4_PARAM, "Trigger 4"); _triggerOnLoad = false; _initialDelay = new bogaudio::dsp::Timer(APP->engine->getSampleRate(), 0.01f); } diff --git a/src/Inv.hpp b/src/Inv.hpp @@ -45,9 +45,9 @@ struct Inv : BGModule { Inv() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam(GATE1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 gate"); - configParam(LATCH1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 latch"); + configSwitch(LATCH1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 latch", {"Disabled", "Enabled"}); configParam(GATE2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 gate"); - configParam(LATCH2_PARAM, 0.0f, 1.0f, 0.0f, "Channle 2 latch"); + configSwitch(LATCH2_PARAM, 0.0f, 1.0f, 0.0f, "Channle 2 latch", {"Disabled", "Enabled"}); configBypass(IN1_INPUT, OUT1_OUTPUT); configBypass(IN2_INPUT, OUT2_OUTPUT); } diff --git a/src/LFO.hpp b/src/LFO.hpp @@ -86,7 +86,7 @@ struct LFO : LFOBase { LFO() : LFOBase(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) { configParam<LFOFrequencyParamQuantity>(FREQUENCY_PARAM, -5.0f, 8.0f, 0.0f, "Frequency", " Hz"); - configParam(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow"); + configButton(SLOW_PARAM, "Slow"); configParam(SAMPLE_PARAM, 0.0f, 1.0f, 0.0f, "Output sampling", "%", 0.0f, 100.0f); configParam(PW_PARAM, -1.0f, 1.0f, 0.0f, "Pulse width", "%", 0.0f, 100.0f*0.5f*(1.0f - 2.0f * SquareOscillator::minPulseWidth), 50.0f); configParam(SMOOTH_PARAM, 0.0f, 1.0f, 0.0f, "Smoothing", "%", 0.0f, 100.0f); diff --git a/src/LLFO.hpp b/src/LLFO.hpp @@ -87,8 +87,8 @@ struct LLFO : LFOBase { , _oscillator(&_sine) { configParam<LFOFrequencyParamQuantity>(FREQUENCY_PARAM, -5.0f, 8.0f, 0.0f, "Frequency", " Hz"); - configParam(WAVE_PARAM, 0.0f, 6.0f, 0.0f, "Waveform"); - configParam(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow mode"); + configSwitch(WAVE_PARAM, 0.0f, 6.0f, 0.0f, "Waveform", {"Sine", "Triangle", "Ramp up", "Ramp down", "Square", "Pulse", "Stepped"}); + configButton(SLOW_PARAM, "Slow mode"); configParam(OFFSET_PARAM, -1.0f, 1.0f, 0.0f, "Offset", " V", 0.0f, 5.0f); configParam(SCALE_PARAM, 0.0f, 1.0f, 1.0f, "Scale", "%", 0.0f, 100.0f); } diff --git a/src/LPG.hpp b/src/LPG.hpp @@ -61,14 +61,14 @@ struct LPG : LPGEnvBaseModule { { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(RESPONSE_PARAM, 0.0f, 1.0f, 0.5f, "Response", "%", 0.0f, 100.0f); - configParam(LONG_PARAM, 0.0f, 1.0f, 0.0f, "Long mode"); + configButton(LONG_PARAM, "Long mode"); configParam(RISE_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Rise shape"); configParam(FALL_SHAPE_PARAM, -1.0f, 1.0f, -0.5f, "Fall shape"); configParam(LPF_ENV_PARAM, -1.0f, 1.0f, 0.8f, "LPF envelope amount", "%", 0.0f, 100.0f); configParam<ScaledSquaringParamQuantity<(int)maxFilterCutoff>>(LPF_BIAS_PARAM, 0.0f, 1.0f, 0.0f, "LPF cutoff", " HZ"); configParam(VCA_ENV_PARAM, -1.0f, 1.0f, 1.0f, "VCA envelope amount", "%", 0.0f, 100.0f); configParam(VCA_BIAS_PARAM, 0.0f, 1.0f, 0.0f, "VCA level", "%", 0.0f, 100.0f); - configParam(LINEAR_VCA_PARAM, 0.0f, 1.0f, 0.0f, "Linear VCA mode"); + configButton(LINEAR_VCA_PARAM, "Linear VCA mode"); } void reset() override; diff --git a/src/LVCF.hpp b/src/LVCF.hpp @@ -73,7 +73,7 @@ struct LVCF : BGModule { configParam<ScaledSquaringParamQuantity<(int)maxFrequency>>(FREQUENCY_PARAM, 0.0f, 1.0f, 0.22361f, "Center/cutoff frequency", " HZ"); configParam(FREQUENCY_CV_PARAM, -1.0f, 1.0f, 0.0f, "Frequency CV attenuation", "%", 0.0f, 100.0f); configParam(Q_PARAM, 0.0f, 1.0f, 0.0f, "Resonance / bandwidth", "%", 0.0f, 100.0f); - configParam(MODE_PARAM, 0.0f, 3.0f, 0.0f, "Mode"); + configSwitch(MODE_PARAM, 0.0f, 3.0f, 0.0f, "Mode", {"Lowpass", "Highpass", "Bandpass", "Band reject"}); configBypass(IN_INPUT, OUT_OUTPUT); } diff --git a/src/LVCO.hpp b/src/LVCO.hpp @@ -62,8 +62,8 @@ struct LVCO : VCOBase { { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam<VCOFrequencyParamQuantity>(FREQUENCY_PARAM, -3.0f, 6.0f, 0.0f, "Frequency", " Hz"); - configParam(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow mode"); - configParam(WAVE_PARAM, 0.0f, 5.0f, 0.0f, "Waveform"); + configButton(SLOW_PARAM, "Slow mode"); + configSwitch(WAVE_PARAM, 0.0f, 5.0f, 0.0f, "Waveform", {"Sine", "Triangle", "Saw", "Square", "25% Pulse", "10% Pulse"}); configParam(FM_DEPTH_PARAM, 0.0f, 1.0f, 0.0f, "FM depth", "%", 0.0f, 100.0f); } diff --git a/src/Lag.cpp b/src/Lag.cpp @@ -67,7 +67,6 @@ struct LagWidget : BGModuleWidget { { auto w = createParam<Knob16>(timeScaleParamPosition, module, Lag::TIME_SCALE_PARAM); auto k = dynamic_cast<SvgKnob*>(w); - k->snap = true; k->minAngle = -M_PI / 4.0f; k->maxAngle = M_PI / 4.0f; k->speed = 3.0; diff --git a/src/Lag.hpp b/src/Lag.hpp @@ -35,6 +35,7 @@ struct Lag : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(TIME_PARAM, 0.0f, 1.0f, 0.5f, "time"); configParam(TIME_SCALE_PARAM, 0.0f, 2.0f, 1.0f, "time_scale"); + paramQuantities[TIME_SCALE_PARAM]->snapEnabled = true; configParam(SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "shape"); } diff --git a/src/Lgsw.cpp b/src/Lgsw.cpp @@ -35,7 +35,7 @@ void Lgsw::processAlways(const ProcessArgs& args) { } void Lgsw::processChannel(const ProcessArgs& args, int c) { - bool buttonTriggered = _buttonTriggers[c].process(params[GATE_PARAM].getValue()); + bool buttonTriggered = _buttonTriggers[c].process(10.0f*params[GATE_PARAM].getValue()); bool aTriggered = _aTriggers[c].process(inputs[GATE_A_INPUT].getVoltage(c)); bool bTriggered = _bTriggers[c].process(inputs[GATE_B_INPUT].getVoltage(c)); diff --git a/src/Lgsw.hpp b/src/Lgsw.hpp @@ -58,9 +58,9 @@ struct Lgsw : SaveLatchToPatchModule { Lgsw() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - configParam(GATE_PARAM, 0.0f, 10.0f, 0.0f, "Gate"); - configParam(LATCH_PARAM, 0.0f, 1.0f, 0.0f, "Latch"); - configParam(LOGIC_MODE_PARAM, 0.0f, 4.0f, 0.0f, "Logic"); + configButton(GATE_PARAM, "Gate"); + configSwitch(LATCH_PARAM, 0.0f, 1.0f, 0.0f, "Latch", {"Disabled", "Enabled"}); + configSwitch(LOGIC_MODE_PARAM, 0.0f, 4.0f, 0.0f, "Logic", {"OR", "AND", "XOR", "NOR", "NAND"}); } void resetChannel(int c); diff --git a/src/Lmtr.hpp b/src/Lmtr.hpp @@ -68,7 +68,7 @@ struct Lmtr : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam<ThresholdParamQuantity>(THRESHOLD_PARAM, 0.0f, 1.0f, 0.8f, "Threshold", " dB"); configParam(OUTPUT_GAIN_PARAM, 0.0f, 1.0f, 0.0f, "Output gain", " dB", 0.0f, 24.0f); - configParam(KNEE_PARAM, 0.0f, 1.0f, 0.0f, "Knee"); + configSwitch(KNEE_PARAM, 0.0f, 1.0f, 1.0f, "Knee", {"Hard", "Soft"}); configBypass(LEFT_INPUT, LEFT_OUTPUT); configBypass(RIGHT_INPUT, RIGHT_OUTPUT); } diff --git a/src/Manual.hpp b/src/Manual.hpp @@ -38,7 +38,7 @@ struct Manual : TriggerOnLoadModule { Manual() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); - configParam(TRIGGER_PARAM, 0.0f, 1.0f, 0.0f, "Trigger"); + configButton(TRIGGER_PARAM, "Trigger"); _triggerOnLoad = false; _initialDelay = new bogaudio::dsp::Timer(APP->engine->getSampleRate(), 0.01f); } diff --git a/src/Matrix44Cvm.hpp b/src/Matrix44Cvm.hpp @@ -55,23 +55,24 @@ struct Matrix44Cvm : Matrix44CvmBase { Input** _cvs = NULL; Matrix44Cvm() { + const std::vector<std::string> muteLabels = {"Unmuted", "Muted", "Soloed", "Soloed"}; config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); - configParam(MUTE11_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1A"); - configParam(MUTE21_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2A"); - configParam(MUTE31_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3A"); - configParam(MUTE41_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4A"); - configParam(MUTE12_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1B"); - configParam(MUTE22_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2B"); - configParam(MUTE32_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3B"); - configParam(MUTE42_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4B"); - configParam(MUTE13_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1C"); - configParam(MUTE23_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2C"); - configParam(MUTE33_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3C"); - configParam(MUTE43_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4C"); - configParam(MUTE14_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1D"); - configParam(MUTE24_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2D"); - configParam(MUTE34_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3D"); - configParam(MUTE44_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4D"); + configSwitch(MUTE11_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1A", muteLabels); + configSwitch(MUTE21_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2A", muteLabels); + configSwitch(MUTE31_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3A", muteLabels); + configSwitch(MUTE41_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4A", muteLabels); + configSwitch(MUTE12_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1B", muteLabels); + configSwitch(MUTE22_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2B", muteLabels); + configSwitch(MUTE32_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3B", muteLabels); + configSwitch(MUTE42_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4B", muteLabels); + configSwitch(MUTE13_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1C", muteLabels); + configSwitch(MUTE23_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2C", muteLabels); + configSwitch(MUTE33_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3C", muteLabels); + configSwitch(MUTE43_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4C", muteLabels); + configSwitch(MUTE14_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1D", muteLabels); + configSwitch(MUTE24_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2D", muteLabels); + configSwitch(MUTE34_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3D", muteLabels); + configSwitch(MUTE44_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4D", muteLabels); _mutes = new Param*[16]; _cvs = new Input*[16]; diff --git a/src/Matrix88M.hpp b/src/Matrix88M.hpp @@ -86,78 +86,79 @@ struct Matrix88M : Matrix88MBase { Param** _mutes = NULL; Matrix88M() { + const std::vector<std::string> muteLabels = {"Unmuted", "Muted", "Soloed", "Soloed"}; config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); - configParam(MUTE11_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1A"); - configParam(MUTE21_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2A"); - configParam(MUTE31_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3A"); - configParam(MUTE41_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4A"); - configParam(MUTE51_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5A"); - configParam(MUTE61_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6A"); - configParam(MUTE71_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7A"); - configParam(MUTE81_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8A"); - - configParam(MUTE12_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1B"); - configParam(MUTE22_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2B"); - configParam(MUTE32_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3B"); - configParam(MUTE42_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4B"); - configParam(MUTE52_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5B"); - configParam(MUTE62_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6B"); - configParam(MUTE72_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7B"); - configParam(MUTE82_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8B"); - - configParam(MUTE13_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1C"); - configParam(MUTE23_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2C"); - configParam(MUTE33_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3C"); - configParam(MUTE43_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4C"); - configParam(MUTE53_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5C"); - configParam(MUTE63_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6C"); - configParam(MUTE73_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7C"); - configParam(MUTE83_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8C"); - - configParam(MUTE14_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1D"); - configParam(MUTE24_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2D"); - configParam(MUTE34_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3D"); - configParam(MUTE44_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4D"); - configParam(MUTE54_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5D"); - configParam(MUTE64_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6D"); - configParam(MUTE74_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7D"); - configParam(MUTE84_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8D"); - - configParam(MUTE15_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1E"); - configParam(MUTE25_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2E"); - configParam(MUTE35_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3E"); - configParam(MUTE45_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4E"); - configParam(MUTE55_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5E"); - configParam(MUTE65_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6E"); - configParam(MUTE75_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7E"); - configParam(MUTE85_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8E"); - - configParam(MUTE16_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1F"); - configParam(MUTE26_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2F"); - configParam(MUTE36_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3F"); - configParam(MUTE46_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4F"); - configParam(MUTE56_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5F"); - configParam(MUTE66_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6F"); - configParam(MUTE76_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7F"); - configParam(MUTE86_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8F"); - - configParam(MUTE17_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1G"); - configParam(MUTE27_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2G"); - configParam(MUTE37_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3G"); - configParam(MUTE47_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4G"); - configParam(MUTE57_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5G"); - configParam(MUTE67_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6G"); - configParam(MUTE77_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7G"); - configParam(MUTE87_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8G"); - - configParam(MUTE18_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1H"); - configParam(MUTE28_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2H"); - configParam(MUTE38_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3H"); - configParam(MUTE48_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4H"); - configParam(MUTE58_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5H"); - configParam(MUTE68_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6H"); - configParam(MUTE78_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7H"); - configParam(MUTE88_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8H"); + configSwitch(MUTE11_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1A", muteLabels); + configSwitch(MUTE21_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2A", muteLabels); + configSwitch(MUTE31_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3A", muteLabels); + configSwitch(MUTE41_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4A", muteLabels); + configSwitch(MUTE51_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5A", muteLabels); + configSwitch(MUTE61_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6A", muteLabels); + configSwitch(MUTE71_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7A", muteLabels); + configSwitch(MUTE81_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8A", muteLabels); + + configSwitch(MUTE12_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1B", muteLabels); + configSwitch(MUTE22_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2B", muteLabels); + configSwitch(MUTE32_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3B", muteLabels); + configSwitch(MUTE42_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4B", muteLabels); + configSwitch(MUTE52_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5B", muteLabels); + configSwitch(MUTE62_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6B", muteLabels); + configSwitch(MUTE72_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7B", muteLabels); + configSwitch(MUTE82_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8B", muteLabels); + + configSwitch(MUTE13_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1C", muteLabels); + configSwitch(MUTE23_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2C", muteLabels); + configSwitch(MUTE33_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3C", muteLabels); + configSwitch(MUTE43_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4C", muteLabels); + configSwitch(MUTE53_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5C", muteLabels); + configSwitch(MUTE63_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6C", muteLabels); + configSwitch(MUTE73_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7C", muteLabels); + configSwitch(MUTE83_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8C", muteLabels); + + configSwitch(MUTE14_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1D", muteLabels); + configSwitch(MUTE24_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2D", muteLabels); + configSwitch(MUTE34_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3D", muteLabels); + configSwitch(MUTE44_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4D", muteLabels); + configSwitch(MUTE54_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5D", muteLabels); + configSwitch(MUTE64_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6D", muteLabels); + configSwitch(MUTE74_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7D", muteLabels); + configSwitch(MUTE84_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8D", muteLabels); + + configSwitch(MUTE15_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1E", muteLabels); + configSwitch(MUTE25_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2E", muteLabels); + configSwitch(MUTE35_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3E", muteLabels); + configSwitch(MUTE45_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4E", muteLabels); + configSwitch(MUTE55_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5E", muteLabels); + configSwitch(MUTE65_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6E", muteLabels); + configSwitch(MUTE75_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7E", muteLabels); + configSwitch(MUTE85_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8E", muteLabels); + + configSwitch(MUTE16_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1F", muteLabels); + configSwitch(MUTE26_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2F", muteLabels); + configSwitch(MUTE36_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3F", muteLabels); + configSwitch(MUTE46_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4F", muteLabels); + configSwitch(MUTE56_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5F", muteLabels); + configSwitch(MUTE66_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6F", muteLabels); + configSwitch(MUTE76_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7F", muteLabels); + configSwitch(MUTE86_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8F", muteLabels); + + configSwitch(MUTE17_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1G", muteLabels); + configSwitch(MUTE27_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2G", muteLabels); + configSwitch(MUTE37_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3G", muteLabels); + configSwitch(MUTE47_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4G", muteLabels); + configSwitch(MUTE57_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5G", muteLabels); + configSwitch(MUTE67_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6G", muteLabels); + configSwitch(MUTE77_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7G", muteLabels); + configSwitch(MUTE87_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8G", muteLabels); + + configSwitch(MUTE18_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1H", muteLabels); + configSwitch(MUTE28_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2H", muteLabels); + configSwitch(MUTE38_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3H", muteLabels); + configSwitch(MUTE48_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4H", muteLabels); + configSwitch(MUTE58_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5H", muteLabels); + configSwitch(MUTE68_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6H", muteLabels); + configSwitch(MUTE78_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7H", muteLabels); + configSwitch(MUTE88_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8H", muteLabels); _mutes = new Param*[64]; for (int i = 0; i < 64; ++i) { diff --git a/src/MegaGate.hpp b/src/MegaGate.hpp @@ -111,20 +111,20 @@ struct MegaGate : LPGEnvBaseModule { configParam(FALL_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Fall shape"); configParam<TimeParamQuantity<1>>(MINIMUM_GATE_PARAM, 0.0f, 1.0f, 0.3162278f, "Minimum gate", " s"); configParam(TILT_PARAM, -1.0f, 1.0f, 0.0f, "Tilt", "%", 0.0f, 100.0f); - configParam(GATE_TO_TRIGGER_PARAM, 0.0f, 1.0f, 1.0f, "Gate to trigger mode"); - configParam(TIMES_10X_PARAM, 0.0f, 1.0f, 0.0f, "Timings 10X mode"); - configParam(FILTERS_SERIAL_PARAM, 0.0f, 1.0f, 0.0f, "Filters in series mode"); - configParam(LINEAR_VCA_PARAM, 0.0f, 1.0f, 0.0f, "Linear VCA mode"); + configButton(GATE_TO_TRIGGER_PARAM, "Gate to trigger mode"); + configButton(TIMES_10X_PARAM, "Timings 10X mode"); + configButton(FILTERS_SERIAL_PARAM, "Filters in series mode"); + configButton(LINEAR_VCA_PARAM, "Linear VCA mode"); configParam(LPF_ENV_PARAM, -1.0f, 1.0f, 0.8f, "LPF envelope amount", "%", 0.0f, 100.0f); configParam(LPF_ENV_ATTENUATOR_PARAM, -1.0f, 1.0f, 0.0f, "LPF envelope amount CV", "%", 0.0f, 100.0f); configParam<ScaledSquaringParamQuantity<(int)maxFilterCutoff>>(LPF_BIAS_PARAM, 0.0f, 1.0f, 0.0f, "LPF cutoff", " HZ"); configParam(LPF_BIAS_ATTENUATOR_PARAM, -1.0f, 1.0f, 0.0f, "LPF cutoff CV", "%", 0.0f, 100.0f); - configParam(LPF_POLES_PARAM, 0.0f, 3.0f, 1.0f, "LPF poles"); + configSwitch(LPF_POLES_PARAM, 0.0f, 3.0f, 1.0f, "LPF poles", {"1", "2", "3", "4"}); configParam(HPF_ENV_PARAM, -1.0f, 1.0f, 0.0f, "HPF envelope amount", "%", 0.0f, 100.0f); configParam(HPF_ENV_ATTENUATOR_PARAM, -1.0f, 1.0f, 0.0f, "HPF envelope amount CV", "%", 0.0f, 100.0f); configParam<ScaledSquaringParamQuantity<(int)maxFilterCutoff>>(HPF_BIAS_PARAM, 0.0f, 1.0f, 1.0f, "HPF cutoff", " HZ"); configParam(HPF_BIAS_ATTENUATOR_PARAM, -1.0f, 1.0f, 0.0f, "HPF cutoff CV", "%", 0.0f, 100.0f); - configParam(HPF_POLES_PARAM, 0.0f, 3.0f, 1.0f, "HPF poles"); + configSwitch(HPF_POLES_PARAM, 0.0f, 3.0f, 1.0f, "HPF poles", {"1", "2", "3", "4"}); configParam(VCA_ENV_PARAM, -1.0f, 1.0f, 1.0f, "VCA envelope amount", "%", 0.0f, 100.0f); configParam(VCA_ENV_ATTENUATOR_PARAM, -1.0f, 1.0f, 0.0f, "VCA envelope amount CV", "%", 0.0f, 100.0f); configParam(VCA_BIAS_PARAM, 0.0f, 1.0f, 0.0f, "VCA level", "%", 0.0f, 100.0f); diff --git a/src/Mix1.hpp b/src/Mix1.hpp @@ -36,7 +36,7 @@ struct Mix1 : LinearCVMixerModule { Mix1() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(LEVEL_PARAM, 0.0f, 1.0f, fabsf(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels), "Level", "dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); - configParam(MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Mute"); + configSwitch(MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Mute", {"Unmuted", "Muted"}); configBypass(IN_INPUT, OUT_OUTPUT); } diff --git a/src/Mix2.hpp b/src/Mix2.hpp @@ -59,7 +59,7 @@ struct Mix2 : LinearCVMixerModule { Mix2() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(LEVEL_PARAM, 0.0f, 1.0f, fabsf(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels), "Level", "dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); - configParam(MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Mute"); + configSwitch(MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Mute", {"Unmuted", "Muted"}); } void sampleRateChange() override; diff --git a/src/Mix4.hpp b/src/Mix4.hpp @@ -68,19 +68,19 @@ struct Mix4 : ExpandableModule<Mix4ExpanderMessage, DimmableMixerModule> { float levelDefault = fabsf(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels); configParam(LEVEL1_PARAM, 0.0f, 1.0f, levelDefault, "Channel 1 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN1_PARAM, -1.0f, 1.0f, 0.0f, "Channel 1 panning", "%", 0.0f, 100.0f); - configParam(MUTE1_PARAM, 0.0f, 3.0f, 0.0f, "Channel 1 mute"); + configSwitch(MUTE1_PARAM, 0.0f, 3.0f, 0.0f, "Channel 1 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(LEVEL2_PARAM, 0.0f, 1.0f, levelDefault, "Channel 2 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN2_PARAM, -1.0f, 1.0f, 0.0f, "Channel 2 panning", "%", 0.0f, 100.0f); - configParam(MUTE2_PARAM, 0.0f, 3.0f, 0.0f, "Channel 2 mute"); + configSwitch(MUTE2_PARAM, 0.0f, 3.0f, 0.0f, "Channel 2 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(LEVEL3_PARAM, 0.0f, 1.0f, levelDefault, "Channel 3 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN3_PARAM, -1.0f, 1.0f, 0.0f, "Channel 3 panning", "%", 0.0f, 100.0f); - configParam(MUTE3_PARAM, 0.0f, 3.0f, 0.0f, "Channel 3 mute"); + configSwitch(MUTE3_PARAM, 0.0f, 3.0f, 0.0f, "Channel 3 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(LEVEL4_PARAM, 0.0f, 1.0f, levelDefault, "Channel 4 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN4_PARAM, -1.0f, 1.0f, 0.0f, "Channel 4 panning", "%", 0.0f, 100.0f); - configParam(MUTE4_PARAM, 0.0f, 3.0f, 0.0f, "Channel 4 mute"); + configSwitch(MUTE4_PARAM, 0.0f, 3.0f, 0.0f, "Channel 4 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(MIX_PARAM, 0.0f, 1.0f, levelDefault, "Master level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); - configParam(MIX_MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Master mute"); - configParam(MIX_DIM_PARAM, 0.0f, 1.0f, 0.0f, "Master dim"); + configSwitch(MIX_MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Master mute", {"Unmuted", "Muted"}); + configSwitch(MIX_DIM_PARAM, 0.0f, 1.0f, 0.0f, "Master dim", {"Disabled", "Enabled"}); getParamQuantity(MUTE1_PARAM)->randomizeEnabled = false; getParamQuantity(MUTE2_PARAM)->randomizeEnabled = false; getParamQuantity(MUTE3_PARAM)->randomizeEnabled = false; diff --git a/src/Mix4x.hpp b/src/Mix4x.hpp @@ -76,30 +76,30 @@ struct Mix4x : ExpanderModule<Mix4ExpanderMessage, BGModule> { configParam<EQParamQuantity>(MID1_PARAM, -1.0f, 1.0f, 0.0f, "Channel 1 mid", " dB"); configParam<EQParamQuantity>(HIGH1_PARAM, -1.0f, 1.0f, 0.0f, "Channel 1 high", " dB"); configParam<AmplifierParamQuantity>(A1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 A send"); - configParam(PRE_A1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 A send pre/post"); + configSwitch(PRE_A1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 B send"); - configParam(PRE_B1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 B send pre/post"); + configSwitch(PRE_B1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 B send", {"Post-fader", "Pre-fader"}); configParam<EQParamQuantity>(LOW2_PARAM, -1.0f, 1.0f, 0.0f, "Channel 2 low", " dB"); configParam<EQParamQuantity>(MID2_PARAM, -1.0f, 1.0f, 0.0f, "Channel 2 mid", " dB"); configParam<EQParamQuantity>(HIGH2_PARAM, -1.0f, 1.0f, 0.0f, "Channel 2 high", " dB"); configParam<AmplifierParamQuantity>(A2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 A send"); - configParam(PRE_A2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 A send pre/post"); + configSwitch(PRE_A2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 B send"); - configParam(PRE_B2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 B send pre/post"); + configSwitch(PRE_B2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 B send", {"Post-fader", "Pre-fader"}); configParam<EQParamQuantity>(LOW3_PARAM, -1.0f, 1.0f, 0.0f, "Channel 3 low", " dB"); configParam<EQParamQuantity>(MID3_PARAM, -1.0f, 1.0f, 0.0f, "Channel 3 mid", " dB"); configParam<EQParamQuantity>(HIGH3_PARAM, -1.0f, 1.0f, 0.0f, "Channel 3 high", " dB"); configParam<AmplifierParamQuantity>(A3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 A send"); - configParam(PRE_A3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 A send pre/post"); + configSwitch(PRE_A3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 B send"); - configParam(PRE_B3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 B send pre/post"); + configSwitch(PRE_B3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 B send", {"Post-fader", "Pre-fader"}); configParam<EQParamQuantity>(LOW4_PARAM, -1.0f, 1.0f, 0.0f, "Channel 4 low", " dB"); configParam<EQParamQuantity>(MID4_PARAM, -1.0f, 1.0f, 0.0f, "Channel 4 mid", " dB"); configParam<EQParamQuantity>(HIGH4_PARAM, -1.0f, 1.0f, 0.0f, "Channel 4 high", " dB"); configParam<AmplifierParamQuantity>(A4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 A send"); - configParam(PRE_A4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 A send pre/post"); + configSwitch(PRE_A4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 B send"); - configParam(PRE_B4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 B send pre/post"); + configSwitch(PRE_B4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 B send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(LEVEL_A_PARAM, 0.0f, 1.0f, 0.8f, "A return level"); configParam<AmplifierParamQuantity>(LEVEL_B_PARAM, 0.0f, 1.0f, 0.8f, "B return level"); diff --git a/src/Mix8.hpp b/src/Mix8.hpp @@ -92,31 +92,31 @@ struct Mix8 : ExpandableModule<Mix8ExpanderMessage, DimmableMixerModule> { float levelDefault = fabsf(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels); configParam(LEVEL1_PARAM, 0.0f, 1.0f, levelDefault, "Channel 1 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN1_PARAM, -1.0f, 1.0f, 0.0f, "Channel 1 panning", "%", 0.0f, 100.0f); - configParam(MUTE1_PARAM, 0.0f, 3.0f, 0.0f, "Channel 1 mute"); + configSwitch(MUTE1_PARAM, 0.0f, 3.0f, 0.0f, "Channel 1 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(LEVEL2_PARAM, 0.0f, 1.0f, levelDefault, "Channel 2 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN2_PARAM, -1.0f, 1.0f, 0.0f, "Channel 2 panning", "%", 0.0f, 100.0f); - configParam(MUTE2_PARAM, 0.0f, 3.0f, 0.0f, "Channel 2 mute"); + configSwitch(MUTE2_PARAM, 0.0f, 3.0f, 0.0f, "Channel 2 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(LEVEL3_PARAM, 0.0f, 1.0f, levelDefault, "Channel 3 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN3_PARAM, -1.0f, 1.0f, 0.0f, "Channel 3 panning", "%", 0.0f, 100.0f); - configParam(MUTE3_PARAM, 0.0f, 3.0f, 0.0f, "Channel 3 mute"); + configSwitch(MUTE3_PARAM, 0.0f, 3.0f, 0.0f, "Channel 3 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(LEVEL4_PARAM, 0.0f, 1.0f, levelDefault, "Channel 4 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN4_PARAM, -1.0f, 1.0f, 0.0f, "Channel 4 panning", "%", 0.0f, 100.0f); - configParam(MUTE4_PARAM, 0.0f, 3.0f, 0.0f, "Channel 4 mute"); + configSwitch(MUTE4_PARAM, 0.0f, 3.0f, 0.0f, "Channel 4 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(LEVEL5_PARAM, 0.0f, 1.0f, levelDefault, "Channel 5 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN5_PARAM, -1.0f, 1.0f, 0.0f, "Channel 5 panning", "%", 0.0f, 100.0f); - configParam(MUTE5_PARAM, 0.0f, 3.0f, 0.0f, "Channel 5 mute"); + configSwitch(MUTE5_PARAM, 0.0f, 3.0f, 0.0f, "Channel 5 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(LEVEL6_PARAM, 0.0f, 1.0f, levelDefault, "Channel 6 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN6_PARAM, -1.0f, 1.0f, 0.0f, "Channel 6 panning", "%", 0.0f, 100.0f); - configParam(MUTE6_PARAM, 0.0f, 3.0f, 0.0f, "Channel 6 mute"); + configSwitch(MUTE6_PARAM, 0.0f, 3.0f, 0.0f, "Channel 6 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(LEVEL7_PARAM, 0.0f, 1.0f, levelDefault, "Channel 7 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN7_PARAM, -1.0f, 1.0f, 0.0f, "Channel 7 panning", "%", 0.0f, 100.0f); - configParam(MUTE7_PARAM, 0.0f, 3.0f, 0.0f, "Channel 7 mute"); + configSwitch(MUTE7_PARAM, 0.0f, 3.0f, 0.0f, "Channel 7 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(LEVEL8_PARAM, 0.0f, 1.0f, levelDefault, "Channel 8 level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(PAN8_PARAM, -1.0f, 1.0f, 0.0f, "Channel 8 panning", "%", 0.0f, 100.0f); - configParam(MUTE8_PARAM, 0.0f, 3.0f, 0.0f, "Channel 8 mute"); + configSwitch(MUTE8_PARAM, 0.0f, 3.0f, 0.0f, "Channel 8 mute", {"Unmuted", "Muted", "Soloed", "Soloed"}); configParam(MIX_PARAM, 0.0f, 1.0f, levelDefault, "Master level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); - configParam(MIX_MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Master mute"); - configParam(MIX_DIM_PARAM, 0.0f, 1.0f, 0.0f, "Master dim"); + configSwitch(MIX_MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Master mute", {"Unmuted", "Muted"}); + configSwitch(MIX_DIM_PARAM, 0.0f, 1.0f, 0.0f, "Master dim", {"Disabled", "Enabled"}); getParamQuantity(MUTE1_PARAM)->randomizeEnabled = false; getParamQuantity(MUTE2_PARAM)->randomizeEnabled = false; getParamQuantity(MUTE3_PARAM)->randomizeEnabled = false; diff --git a/src/Mix8x.hpp b/src/Mix8x.hpp @@ -111,58 +111,58 @@ struct Mix8x : ExpanderModule<Mix8ExpanderMessage, BGModule> { configParam<EQParamQuantity>(MID1_PARAM, -1.0f, 1.0f, 0.0f, "Channel 1 mid", " dB"); configParam<EQParamQuantity>(HIGH1_PARAM, -1.0f, 1.0f, 0.0f, "Channel 1 high", " dB"); configParam<AmplifierParamQuantity>(A1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 A send"); - configParam(PRE_A1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 A send pre/post"); + configSwitch(PRE_A1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 B send"); - configParam(PRE_B1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 B send pre/post"); + configSwitch(PRE_B1_PARAM, 0.0f, 1.0f, 0.0f, "Channel 1 B send", {"Post-fader", "Pre-fader"}); configParam<EQParamQuantity>(LOW2_PARAM, -1.0f, 1.0f, 0.0f, "Channel 2 low", " dB"); configParam<EQParamQuantity>(MID2_PARAM, -1.0f, 1.0f, 0.0f, "Channel 2 mid", " dB"); configParam<EQParamQuantity>(HIGH2_PARAM, -1.0f, 1.0f, 0.0f, "Channel 2 high", " dB"); configParam<AmplifierParamQuantity>(A2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 A send"); - configParam(PRE_A2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 A send pre/post"); + configSwitch(PRE_A2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 B send"); - configParam(PRE_B2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 B send pre/post"); + configSwitch(PRE_B2_PARAM, 0.0f, 1.0f, 0.0f, "Channel 2 B send", {"Post-fader", "Pre-fader"}); configParam<EQParamQuantity>(LOW3_PARAM, -1.0f, 1.0f, 0.0f, "Channel 3 low", " dB"); configParam<EQParamQuantity>(MID3_PARAM, -1.0f, 1.0f, 0.0f, "Channel 3 mid", " dB"); configParam<EQParamQuantity>(HIGH3_PARAM, -1.0f, 1.0f, 0.0f, "Channel 3 high", " dB"); configParam<AmplifierParamQuantity>(A3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 A send"); - configParam(PRE_A3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 A send pre/post"); + configSwitch(PRE_A3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 B send"); - configParam(PRE_B3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 B send pre/post"); + configSwitch(PRE_B3_PARAM, 0.0f, 1.0f, 0.0f, "Channel 3 B send", {"Post-fader", "Pre-fader"}); configParam<EQParamQuantity>(LOW4_PARAM, -1.0f, 1.0f, 0.0f, "Channel 4 low", " dB"); configParam<EQParamQuantity>(MID4_PARAM, -1.0f, 1.0f, 0.0f, "Channel 4 mid", " dB"); configParam<EQParamQuantity>(HIGH4_PARAM, -1.0f, 1.0f, 0.0f, "Channel 4 high", " dB"); configParam<AmplifierParamQuantity>(A4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 A send"); - configParam(PRE_A4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 A send pre/post"); + configSwitch(PRE_A4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 B send"); - configParam(PRE_B4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 B send pre/post"); + configSwitch(PRE_B4_PARAM, 0.0f, 1.0f, 0.0f, "Channel 4 B send", {"Post-fader", "Pre-fader"}); configParam<EQParamQuantity>(LOW5_PARAM, -1.0f, 1.0f, 0.0f, "Channel 5 low", " dB"); configParam<EQParamQuantity>(MID5_PARAM, -1.0f, 1.0f, 0.0f, "Channel 5 mid", " dB"); configParam<EQParamQuantity>(HIGH5_PARAM, -1.0f, 1.0f, 0.0f, "Channel 5 high", " dB"); configParam<AmplifierParamQuantity>(A5_PARAM, 0.0f, 1.0f, 0.0f, "Channel 5 A send"); - configParam(PRE_A5_PARAM, 0.0f, 1.0f, 0.0f, "Channel 5 A send pre/post"); + configSwitch(PRE_A5_PARAM, 0.0f, 1.0f, 0.0f, "Channel 5 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B5_PARAM, 0.0f, 1.0f, 0.0f, "Channel 5 B send"); - configParam(PRE_B5_PARAM, 0.0f, 1.0f, 0.0f, "Channel 5 B send pre/post"); + configSwitch(PRE_B5_PARAM, 0.0f, 1.0f, 0.0f, "Channel 5 B send", {"Post-fader", "Pre-fader"}); configParam<EQParamQuantity>(LOW6_PARAM, -1.0f, 1.0f, 0.0f, "Channel 6 low", " dB"); configParam<EQParamQuantity>(MID6_PARAM, -1.0f, 1.0f, 0.0f, "Channel 6 mid", " dB"); configParam<EQParamQuantity>(HIGH6_PARAM, -1.0f, 1.0f, 0.0f, "Channel 6 high", " dB"); configParam<AmplifierParamQuantity>(A6_PARAM, 0.0f, 1.0f, 0.0f, "Channel 6 A send"); - configParam(PRE_A6_PARAM, 0.0f, 1.0f, 0.0f, "Channel 6 A send pre/post"); + configSwitch(PRE_A6_PARAM, 0.0f, 1.0f, 0.0f, "Channel 6 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B6_PARAM, 0.0f, 1.0f, 0.0f, "Channel 6 B send"); - configParam(PRE_B6_PARAM, 0.0f, 1.0f, 0.0f, "Channel 6 B send pre/post"); + configSwitch(PRE_B6_PARAM, 0.0f, 1.0f, 0.0f, "Channel 6 B send", {"Post-fader", "Pre-fader"}); configParam<EQParamQuantity>(LOW7_PARAM, -1.0f, 1.0f, 0.0f, "Channel 7 low", " dB"); configParam<EQParamQuantity>(MID7_PARAM, -1.0f, 1.0f, 0.0f, "Channel 7 mid", " dB"); configParam<EQParamQuantity>(HIGH7_PARAM, -1.0f, 1.0f, 0.0f, "Channel 7 high", " dB"); configParam<AmplifierParamQuantity>(A7_PARAM, 0.0f, 1.0f, 0.0f, "Channel 7 A send"); - configParam(PRE_A7_PARAM, 0.0f, 1.0f, 0.0f, "Channel 7 A send pre/post"); + configSwitch(PRE_A7_PARAM, 0.0f, 1.0f, 0.0f, "Channel 7 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B7_PARAM, 0.0f, 1.0f, 0.0f, "Channel 7 B send"); - configParam(PRE_B7_PARAM, 0.0f, 1.0f, 0.0f, "Channel 7 B send pre/post"); + configSwitch(PRE_B7_PARAM, 0.0f, 1.0f, 0.0f, "Channel 7 B send", {"Post-fader", "Pre-fader"}); configParam<EQParamQuantity>(LOW8_PARAM, -1.0f, 1.0f, 0.0f, "Channel 8 low", " dB"); configParam<EQParamQuantity>(MID8_PARAM, -1.0f, 1.0f, 0.0f, "Channel 8 mid", " dB"); configParam<EQParamQuantity>(HIGH8_PARAM, -1.0f, 1.0f, 0.0f, "Channel 8 high", " dB"); configParam<AmplifierParamQuantity>(A8_PARAM, 0.0f, 1.0f, 0.0f, "Channel 8 A send"); - configParam(PRE_A8_PARAM, 0.0f, 1.0f, 0.0f, "Channel 8 A send pre/post"); + configSwitch(PRE_A8_PARAM, 0.0f, 1.0f, 0.0f, "Channel 8 A send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(B8_PARAM, 0.0f, 1.0f, 0.0f, "Channel 8 B send"); - configParam(PRE_B8_PARAM, 0.0f, 1.0f, 0.0f, "Channel 8 B send pre/post"); + configSwitch(PRE_B8_PARAM, 0.0f, 1.0f, 0.0f, "Channel 8 B send", {"Post-fader", "Pre-fader"}); configParam<AmplifierParamQuantity>(LEVEL_A_PARAM, 0.0f, 1.0f, 0.8f, "A return level"); configParam<AmplifierParamQuantity>(LEVEL_B_PARAM, 0.0f, 1.0f, 0.8f, "B return level"); diff --git a/src/Mumix.hpp b/src/Mumix.hpp @@ -52,14 +52,14 @@ struct Mumix : MatrixBaseModule { Mumix() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); - configParam(MUTE1_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1"); - configParam(MUTE2_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2"); - configParam(MUTE3_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3"); - configParam(MUTE4_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4"); - configParam(MUTE5_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5"); - configParam(MUTE6_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6"); - configParam(MUTE7_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7"); - configParam(MUTE8_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8"); + configSwitch(MUTE1_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE2_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE3_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE4_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE5_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE6_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE7_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE8_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8", {"Unmuted", "Muted", "Soloed", "Soloed"}); } void sampleRateChange() override; diff --git a/src/Mute8.hpp b/src/Mute8.hpp @@ -78,14 +78,14 @@ struct Mute8 : BGModule { Mute8() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - configParam(MUTE1_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1"); - configParam(MUTE2_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2"); - configParam(MUTE3_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3"); - configParam(MUTE4_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4"); - configParam(MUTE5_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5"); - configParam(MUTE6_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6"); - configParam(MUTE7_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7"); - configParam(MUTE8_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8"); + configSwitch(MUTE1_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE2_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE3_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE4_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE5_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE6_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE7_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7", {"Unmuted", "Muted", "Soloed", "Soloed"}); + configSwitch(MUTE8_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8", {"Unmuted", "Muted", "Soloed", "Soloed"}); configBypass(INPUT1_INPUT, OUTPUT1_OUTPUT); configBypass(INPUT2_INPUT, OUTPUT2_OUTPUT); diff --git a/src/Nsgt.hpp b/src/Nsgt.hpp @@ -68,7 +68,7 @@ struct Nsgt : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam<ThresholdParamQuantity>(THRESHOLD_PARAM, 0.0f, 1.0f, 0.8f, "Threshold", " dB"); configParam<DynamicsRatioParamQuantity>(RATIO_PARAM, 0.0f, 1.0f, 0.55159f, "Ratio"); - configParam(KNEE_PARAM, 0.0f, 1.0f, 1.0f, "Knee"); + configSwitch(KNEE_PARAM, 0.0f, 1.0f, 1.0f, "Knee", {"Hard", "Soft"}); configBypass(LEFT_INPUT, LEFT_OUTPUT); configBypass(RIGHT_INPUT, RIGHT_OUTPUT); } diff --git a/src/OneEight.cpp b/src/OneEight.cpp @@ -86,17 +86,9 @@ struct OneEightWidget : AddressableSequenceModuleWidget { auto out8LightPosition = Vec(66.5, 350.5); // end generated by svg_widgets.rb - { - auto w = createParam<Knob16>(stepsParamPosition, module, OneEight::STEPS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob16>(stepsParamPosition, module, OneEight::STEPS_PARAM)); addParam(createParam<SliderSwitch2State14>(directionParamPosition, module, OneEight::DIRECTION_PARAM)); - { - auto w = createParam<Knob29>(selectParamPosition, module, OneEight::SELECT_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob29>(selectParamPosition, module, OneEight::SELECT_PARAM)); addInput(createInput<Port24>(clockInputPosition, module, OneEight::CLOCK_INPUT)); addInput(createInput<Port24>(resetInputPosition, module, OneEight::RESET_INPUT)); diff --git a/src/OneEight.hpp b/src/OneEight.hpp @@ -55,8 +55,10 @@ struct OneEight : AddressableSequenceModule { OneEight() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam(STEPS_PARAM, 1.0f, 8.0f, 8.0f, "Steps"); - configParam(DIRECTION_PARAM, 0.0f, 1.0f, 1.0f, "Direction"); + paramQuantities[STEPS_PARAM]->snapEnabled = true; + configSwitch(DIRECTION_PARAM, 0.0f, 1.0f, 1.0f, "Direction", {"Reverse", "Forward"}); configParam(SELECT_PARAM, 0.0f, 7.0f, 0.0f, "Select step"); + paramQuantities[SELECT_PARAM]->snapEnabled = true; setInputIDs(CLOCK_INPUT, SELECT_INPUT); configBypass(IN_INPUT, OUT1_OUTPUT); } diff --git a/src/PEQ.hpp b/src/PEQ.hpp @@ -63,7 +63,7 @@ struct PEQ : BGModule { configParam<ScaledSquaringParamQuantity<(int)PEQChannel::maxFrequency>>(A_FREQUENCY_PARAM, 0.0f, 1.0f, 0.0707107f, "Channel A frequency", " HZ"); configParam(A_BANDWIDTH_PARAM, 0.0f, 1.0f, 0.5f, "Channel A bandwidth", "%", 0.0f, 100.0f); configParam(A_CV_PARAM, -1.0f, 1.0f, 0.0f, "Channel A frequency CV attenuation", "%", 0.0f, 100.0f); - configParam(A_MODE_PARAM, 0.0f, 1.0f, 1.0f, "Channel A LP/BP"); + configSwitch(A_MODE_PARAM, 0.0f, 1.0f, 1.0f, "Channel A LP/BP", {"Bandpass", "Lowpass"}); configParam(B_LEVEL_PARAM, 0.0f, 1.0f, levelDefault, "Channel B level", " dB", 0.0f, PEQChannel::maxDecibels - PEQChannel::minDecibels, PEQChannel::minDecibels); configParam<ScaledSquaringParamQuantity<(int)PEQChannel::maxFrequency>>(B_FREQUENCY_PARAM, 0.0f, 1.0f, 0.1322876f, "Channel B frequency", " HZ"); configParam(B_BANDWIDTH_PARAM, 0.0f, 1.0f, 0.66f, "Channel B bandwidth", "%", 0.0f, 100.0f); @@ -72,7 +72,7 @@ struct PEQ : BGModule { configParam<ScaledSquaringParamQuantity<(int)PEQChannel::maxFrequency>>(C_FREQUENCY_PARAM, 0.0f, 1.0f, 0.223607f, "Channel C frequency", " HZ"); configParam(C_BANDWIDTH_PARAM, 0.0f, 1.0f, 0.5f, "Channel C bandwidth", "%", 0.0f, 100.0f); configParam(C_CV_PARAM, -1.0f, 1.0f, 0.0f, "Channel C frequency CV attenuation", "%", 0.0f, 100.0f); - configParam(C_MODE_PARAM, 0.0f, 1.0f, 1.0f, "Channel C HP/BP"); + configSwitch(C_MODE_PARAM, 0.0f, 1.0f, 1.0f, "Channel C HP/BP", {"Bandpass", "Highpass"}); configBypass(IN_INPUT, OUT_OUTPUT); } diff --git a/src/PEQ14.hpp b/src/PEQ14.hpp @@ -130,9 +130,9 @@ struct PEQ14 : ExpandableModule<PEQ14ExpanderMessage, BandExcludeModule> { float levelDefault = fabsf(PEQChannel::minDecibels) / (PEQChannel::maxDecibels - PEQChannel::minDecibels); configParam(FREQUENCY_CV_PARAM, -1.0f, 1.0f, 0.0f, "Global frequency CV attenuation", "%", 0.0f, 100.0f); configParam(BANDWIDTH_PARAM, 0.0f, 1.0f, 0.11f, "Bandwidth", "%", 0.0f, 100.0f); - configParam(LP_PARAM, 0.0f, 1.0f, 1.0f, "Channel 1 LP/BP"); - configParam(HP_PARAM, 0.0f, 1.0f, 1.0f, "Channel 14 HP/BP"); - configParam(FMOD_PARAM, 0.0f, 1.0f, 0.0f, "Frequency modulation range"); + configSwitch(LP_PARAM, 0.0f, 1.0f, 1.0f, "Channel 1 LP/BP", {"Bandpass", "Lowpass"}); + configSwitch(HP_PARAM, 0.0f, 1.0f, 1.0f, "Channel 6 HP/BP", {"Bandpass", "Highpass"}); + configSwitch(FMOD_PARAM, 0.0f, 1.0f, 0.0f, "Frequency modulation range", {"Octave", "Full"}); configParam(LEVEL1_PARAM, 0.0f, 1.0f, levelDefault, "Channel 1 level", " dB", 0.0f, PEQChannel::maxDecibels - PEQChannel::minDecibels, PEQChannel::minDecibels); configParam<ScaledSquaringParamQuantity<(int)PEQChannel::maxFrequency>>(FREQUENCY1_PARAM, 0.0f, 1.0f, 0.0689202f, "Channel 1 frequency", " HZ"); configParam(FREQUENCY_CV1_PARAM, -1.0f, 1.0f, 1.0f, "Channel 1 frequency CV attenuation", "%", 0.0f, 100.0f); diff --git a/src/PEQ6.cpp b/src/PEQ6.cpp @@ -108,8 +108,9 @@ void PEQ6::postProcessAlways(const ProcessArgs& args) { _rms[i] = _rmsSums[i] * _inverseChannels; } - lights[FMOD_RELATIVE_LIGHT].value = !_fullFrequencyMode; - lights[FMOD_FULL_LIGHT].value = _fullFrequencyMode; + bool ffm = params[FMOD_PARAM].getValue() > 0.5f; + lights[FMOD_RELATIVE_LIGHT].value = !ffm; + lights[FMOD_FULL_LIGHT].value = ffm; } struct PEQ6Widget : BandExcludeModuleWidget { diff --git a/src/PEQ6.hpp b/src/PEQ6.hpp @@ -79,9 +79,9 @@ struct PEQ6 : ExpandableModule<PEQ6ExpanderMessage, BandExcludeModule> { float levelDefault = fabsf(PEQChannel::minDecibels) / (PEQChannel::maxDecibels - PEQChannel::minDecibels); configParam(FREQUENCY_CV_PARAM, -1.0f, 1.0f, 0.0f, "Global frequency CV attenuation", "%", 0.0f, 100.0f); configParam(BANDWIDTH_PARAM, 0.0f, 1.0f, 0.33f, "Bandwidth", "%", 0.0f, 100.0f); - configParam(LP_PARAM, 0.0f, 1.0f, 1.0f, "Channel 1 LP/BP"); - configParam(HP_PARAM, 0.0f, 1.0f, 1.0f, "Channel 6 HP/BP"); - configParam(FMOD_PARAM, 0.0f, 1.0f, 0.0f, "Frequency modulation range"); + configSwitch(LP_PARAM, 0.0f, 1.0f, 1.0f, "Channel 1 LP/BP", {"Bandpass", "Lowpass"}); + configSwitch(HP_PARAM, 0.0f, 1.0f, 1.0f, "Channel 6 HP/BP", {"Bandpass", "Highpass"}); + configSwitch(FMOD_PARAM, 0.0f, 1.0f, 0.0f, "Frequency modulation range", {"Octave", "Full"}); configParam(LEVEL1_PARAM, 0.0f, 1.0f, levelDefault, "Channel 1 level", " dB", 0.0f, PEQChannel::maxDecibels - PEQChannel::minDecibels, PEQChannel::minDecibels); configParam<ScaledSquaringParamQuantity<(int)PEQChannel::maxFrequency>>(FREQUENCY1_PARAM, 0.0f, 1.0f, 0.0707107f, "Channel 1 frequency", " HZ"); configParam(FREQUENCY_CV1_PARAM, -1.0f, 1.0f, 1.0f, "Channel 1 frequency CV attenuation", "%", 0.0f, 100.0f); diff --git a/src/Pgmr.hpp b/src/Pgmr.hpp @@ -71,28 +71,28 @@ struct Pgmr : PgmrBase { Pgmr() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - configParam(DIRECTION_PARAM, 0.0f, 1.0f, 1.0f, "Forward"); - configParam(SELECT_ON_CLOCK_PARAM, 0.0f, 1.0f, 0.0f, "Select on clock"); + configSwitch(DIRECTION_PARAM, 0.0f, 1.0f, 1.0f, "Direction", {"Reverse", "Forward"}); + configSwitch(SELECT_ON_CLOCK_PARAM, 0.0f, 1.0f, 0.0f, "Select on clock", {"Disabled", "Enabled"}); configParam<OutputRangeParamQuantity>(CVA1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1A", " V"); configParam<OutputRangeParamQuantity>(CVB1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1B", " V"); configParam<OutputRangeParamQuantity>(CVC1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1C", " V"); configParam<OutputRangeParamQuantity>(CVD1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1D", " V"); - configParam(SELECT1_PARAM, 0.0f, 1.0f, 0.0f, "Select 1"); + configButton(SELECT1_PARAM, "Select 1"); configParam<OutputRangeParamQuantity>(CVA2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2A", " V"); configParam<OutputRangeParamQuantity>(CVB2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2B", " V"); configParam<OutputRangeParamQuantity>(CVC2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2C", " V"); configParam<OutputRangeParamQuantity>(CVD2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2D", " V"); - configParam(SELECT2_PARAM, 0.0f, 1.0f, 0.0f, "Select 2"); + configButton(SELECT2_PARAM, "Select 2"); configParam<OutputRangeParamQuantity>(CVA3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3A", " V"); configParam<OutputRangeParamQuantity>(CVB3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3B", " V"); configParam<OutputRangeParamQuantity>(CVC3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3C", " V"); configParam<OutputRangeParamQuantity>(CVD3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3D", " V"); - configParam(SELECT3_PARAM, 0.0f, 1.0f, 0.0f, "Select 3"); + configButton(SELECT3_PARAM, "Select 3"); configParam<OutputRangeParamQuantity>(CVA4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4A", " V"); configParam<OutputRangeParamQuantity>(CVB4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4B", " V"); configParam<OutputRangeParamQuantity>(CVC4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4C", " V"); configParam<OutputRangeParamQuantity>(CVD4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4D", " V"); - configParam(SELECT4_PARAM, 0.0f, 1.0f, 0.0f, "Select 4"); + configButton(SELECT4_PARAM, "Select 4"); setInputIDs(CLOCK_INPUT, SELECT_INPUT); setLocalElements({ diff --git a/src/PgmrX.hpp b/src/PgmrX.hpp @@ -61,22 +61,22 @@ struct PgmrX : PgmrXBase, OutputRange { configParam<OutputRangeParamQuantity>(CVB1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1B", " V"); configParam<OutputRangeParamQuantity>(CVC1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1C", " V"); configParam<OutputRangeParamQuantity>(CVD1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1D", " V"); - configParam(SELECT1_PARAM, 0.0f, 1.0f, 0.0f, "Select 1"); + configButton(SELECT1_PARAM, "Select 1"); configParam<OutputRangeParamQuantity>(CVA2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2A", " V"); configParam<OutputRangeParamQuantity>(CVB2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2B", " V"); configParam<OutputRangeParamQuantity>(CVC2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2C", " V"); configParam<OutputRangeParamQuantity>(CVD2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2D", " V"); - configParam(SELECT2_PARAM, 0.0f, 1.0f, 0.0f, "Select 2"); + configButton(SELECT2_PARAM, "Select 2"); configParam<OutputRangeParamQuantity>(CVA3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3A", " V"); configParam<OutputRangeParamQuantity>(CVB3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3B", " V"); configParam<OutputRangeParamQuantity>(CVC3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3C", " V"); configParam<OutputRangeParamQuantity>(CVD3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3D", " V"); - configParam(SELECT3_PARAM, 0.0f, 1.0f, 0.0f, "Select 3"); + configButton(SELECT3_PARAM, "Select 3"); configParam<OutputRangeParamQuantity>(CVA4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4A", " V"); configParam<OutputRangeParamQuantity>(CVB4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4B", " V"); configParam<OutputRangeParamQuantity>(CVC4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4C", " V"); configParam<OutputRangeParamQuantity>(CVD4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4D", " V"); - configParam<OutputRangeParamQuantity>(SELECT4_PARAM, 0.0f, 1.0f, 0.0f, "Select 4"); + configButton(SELECT4_PARAM, "Select 4"); setLocalElements({ new PgmrStep(params[CVA1_PARAM], params[CVB1_PARAM], params[CVC1_PARAM], params[CVD1_PARAM], lights[SELECT1_LIGHT], params[SELECT1_PARAM], inputs[SELECT1_INPUT], outputs[SELECT1_OUTPUT]), diff --git a/src/PolyCon16.cpp b/src/PolyCon16.cpp @@ -70,11 +70,7 @@ struct PolyCon16Widget : BGModuleWidget { auto channel16LightPosition = Vec(83.75, 311.0); // end generated by svg_widgets.rb - { - auto w = createParam<Knob16>(channelsParamPosition, module, PolyCon16::CHANNELS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob16>(channelsParamPosition, module, PolyCon16::CHANNELS_PARAM)); addParam(createParam<Knob19>(channel1ParamPosition, module, PolyCon16::CHANNEL1_PARAM)); addParam(createParam<Knob19>(channel2ParamPosition, module, PolyCon16::CHANNEL2_PARAM)); addParam(createParam<Knob19>(channel3ParamPosition, module, PolyCon16::CHANNEL3_PARAM)); diff --git a/src/PolyCon16.hpp b/src/PolyCon16.hpp @@ -62,6 +62,7 @@ struct PolyCon16 : OutputRangeModule<BGModule> { PolyCon16() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam(CHANNELS_PARAM, 1.0f, 16.0f, 1.0f, "Polyphony channels"); + paramQuantities[CHANNELS_PARAM]->snapEnabled = true; configParam<OutputRangeParamQuantity>(CHANNEL1_PARAM, -1.0f, 1.0f, 0.0f, "Channel 1", " V"); configParam<OutputRangeParamQuantity>(CHANNEL2_PARAM, -1.0f, 1.0f, 0.0f, "Channel 2", " V"); configParam<OutputRangeParamQuantity>(CHANNEL3_PARAM, -1.0f, 1.0f, 0.0f, "Channel 3", " V"); diff --git a/src/PolyMult.cpp b/src/PolyMult.cpp @@ -41,11 +41,7 @@ struct PolyMultWidget : BGModuleWidget { auto out4OutputPosition = Vec(10.5, 252.0); // end generated by svg_widgets.rb - { - auto w = createParam<Knob16>(channelsParamPosition, module, PolyMult::CHANNELS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob16>(channelsParamPosition, module, PolyMult::CHANNELS_PARAM)); addInput(createInput<Port24>(channelsInputPosition, module, PolyMult::CHANNELS_INPUT)); addInput(createInput<Port24>(inInputPosition, module, PolyMult::IN_INPUT)); diff --git a/src/PolyMult.hpp b/src/PolyMult.hpp @@ -29,6 +29,7 @@ struct PolyMult : BGModule { PolyMult() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(CHANNELS_PARAM, 1.0f, 16.0f, 1.0f, "Polyphony channels"); + paramQuantities[CHANNELS_PARAM]->snapEnabled = true; } void processAll(const ProcessArgs& args) override; diff --git a/src/PolyOff16.cpp b/src/PolyOff16.cpp @@ -188,11 +188,7 @@ struct PolyOff16Widget : BGModuleWidget { addParam(createParam<Knob16>(scale15ParamPosition, module, PolyOff16::SCALE15_PARAM)); addParam(createParam<Knob16>(offset16ParamPosition, module, PolyOff16::OFFSET16_PARAM)); addParam(createParam<Knob16>(scale16ParamPosition, module, PolyOff16::SCALE16_PARAM)); - { - auto w = createParam<Knob16>(channelsParamPosition, module, PolyOff16::CHANNELS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob16>(channelsParamPosition, module, PolyOff16::CHANNELS_PARAM)); addInput(createInput<Port24>(cv1InputPosition, module, PolyOff16::CV1_INPUT)); addInput(createInput<Port24>(cv2InputPosition, module, PolyOff16::CV2_INPUT)); diff --git a/src/PolyOff16.hpp b/src/PolyOff16.hpp @@ -128,6 +128,7 @@ struct PolyOff16 : OutputRangeModule<BGModule> { configParam<OutputRangeParamQuantity>(OFFSET16_PARAM, -1.0f, 1.0f, 0.0f, "Channel 16 offset", " V"); configParam(SCALE16_PARAM, -1.0f, 1.0f, 1.0f, "Channel 16 scale", "%", 0.0f, 100.0f); configParam(CHANNELS_PARAM, 1.0f, 16.0f, 1.0f, "Polyphony channels"); + paramQuantities[CHANNELS_PARAM]->snapEnabled = true; } json_t* saveToJson(json_t* root) override; diff --git a/src/PolyOff8.cpp b/src/PolyOff8.cpp @@ -140,11 +140,7 @@ struct PolyOff8Widget : BGModuleWidget { addParam(createParam<Knob16>(scale7ParamPosition, module, PolyOff8::SCALE7_PARAM)); addParam(createParam<Knob16>(offset8ParamPosition, module, PolyOff8::OFFSET8_PARAM)); addParam(createParam<Knob16>(scale8ParamPosition, module, PolyOff8::SCALE8_PARAM)); - { - auto w = createParam<Knob16>(channelsParamPosition, module, PolyOff8::CHANNELS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob16>(channelsParamPosition, module, PolyOff8::CHANNELS_PARAM)); addInput(createInput<Port24>(cv1InputPosition, module, PolyOff8::CV1_INPUT)); addInput(createInput<Port24>(cv2InputPosition, module, PolyOff8::CV2_INPUT)); diff --git a/src/PolyOff8.hpp b/src/PolyOff8.hpp @@ -80,6 +80,7 @@ struct PolyOff8 : OutputRangeModule<BGModule> { configParam<OutputRangeParamQuantity>(OFFSET8_PARAM, -1.0f, 1.0f, 0.0f, "Channel 8 offset", " V"); configParam(SCALE8_PARAM, -1.0f, 1.0f, 1.0f, "Channel 8 scale", "%", 0.0f, 100.0f); configParam(CHANNELS_PARAM, 1.0f, 8.0f, 1.0f, "Polyphony channels"); + paramQuantities[CHANNELS_PARAM]->snapEnabled = true; } json_t* saveToJson(json_t* root) override; diff --git a/src/Pressor.hpp b/src/Pressor.hpp @@ -90,9 +90,9 @@ struct Pressor : BGModule { configParam(OUTPUT_GAIN_PARAM, 0.0f, 1.0f, 0.0f, "Output gain", " dB", 0.0f, 24.0f); configParam(INPUT_GAIN_PARAM, -1.0f, 1.0f, 0.0f, "Input gain", " dB", 0.0f, 12.0f); configParam(DETECTOR_MIX_PARAM, -1.0f, 1.0f, 0.0f, "Detector mix", "%", 0.0f, 100.0f); - configParam(MODE_PARAM, 0.0f, 1.0f, 1.0f, "Mode"); - configParam(DECTECTOR_MODE_PARAM, 0.0f, 1.0f, 1.0f, "Dectector mode"); - configParam(KNEE_PARAM, 0.0f, 1.0f, 1.0f, "Knee"); + configSwitch(MODE_PARAM, 0.0f, 1.0f, 1.0f, "Mode", {"Noise gate", "Compressor"}); + configSwitch(DECTECTOR_MODE_PARAM, 0.0f, 1.0f, 1.0f, "Dectector mode", {"Peak", "RMS"}); + configSwitch(KNEE_PARAM, 0.0f, 1.0f, 1.0f, "Knee", {"Hard", "Soft"}); configBypass(LEFT_INPUT, LEFT_OUTPUT); configBypass(RIGHT_INPUT, RIGHT_OUTPUT); } diff --git a/src/Pulse.hpp b/src/Pulse.hpp @@ -39,7 +39,7 @@ struct Pulse : VCOBase { { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam<VCOFrequencyParamQuantity>(FREQUENCY_PARAM, -3.0f, 6.0f, 0.0f, "Frequency", " Hz"); - configParam(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow mode"); + configButton(SLOW_PARAM, "Slow mode"); configParam(PW_PARAM, -1.0f, 1.0f, 0.0f, "Pulse width", "%", 0.0f, 100.0f*0.5f*(1.0f - 2.0f * SquareOscillator::minPulseWidth), 50.0f); configParam(PWM_PARAM, -1.0f, 1.0f, 0.0f, "Pulse width CV amount"); } diff --git a/src/Ranalyzer.cpp b/src/Ranalyzer.cpp @@ -389,12 +389,7 @@ struct RanalyzerWidget : AnalyzerBaseWidget { addParam(createParam<Button18>(triggerParamPosition, module, Ranalyzer::TRIGGER_PARAM)); addParam(createParam<IndicatorButtonGreen9>(exponentialParamPosition, module, Ranalyzer::EXPONENTIAL_PARAM)); addParam(createParam<IndicatorButtonGreen9>(loopParamPosition, module, Ranalyzer::LOOP_PARAM)); - { - auto w = createParam<Knob16>(delayParamPosition, module, Ranalyzer::DELAY_PARAM); - auto k = dynamic_cast<SvgKnob*>(w); - k->snap = true; - addParam(w); - } + addParam(createParam<Knob16>(delayParamPosition, module, Ranalyzer::DELAY_PARAM)); addInput(createInput<Port24>(triggerInputPosition, module, Ranalyzer::TRIGGER_INPUT)); addInput(createInput<Port24>(testInputPosition, module, Ranalyzer::TEST_INPUT)); diff --git a/src/Ranalyzer.hpp b/src/Ranalyzer.hpp @@ -117,10 +117,11 @@ struct Ranalyzer : AnalyzerBase { { configParam<FrequencyParamQuantity>(FREQUENCY1_PARAM, 0.0f, 1.0f, 0.0f, "Frequency 1", " Hz"); configParam<FrequencyParamQuantity>(FREQUENCY2_PARAM, 0.0f, 1.0f, 1.0f, "Frequency 2", " Hz"); - configParam(TRIGGER_PARAM, 0.0f, 1.0f, 0.0f, "Trigger"); - configParam(EXPONENTIAL_PARAM, 0.0f, 1.0f, 1.0f, "Exponential"); - configParam(LOOP_PARAM, 0.0f, 1.0f, 0.0f, "Loop"); + configButton(TRIGGER_PARAM, "Trigger"); + configSwitch(EXPONENTIAL_PARAM, 0.0f, 1.0f, 1.0f, "Sweep", {"Linear", "Exponential"}); + configSwitch(LOOP_PARAM, 0.0f, 1.0f, 0.0f, "Loop", {"Disabled", "Enabled"}); configParam(DELAY_PARAM, 2.0f, (float)maxResponseDelay, 2.0f, "Return sample delay"); + paramQuantities[DELAY_PARAM]->snapEnabled = true; _skinnable = false; } diff --git a/src/Reftone.cpp b/src/Reftone.cpp @@ -217,16 +217,8 @@ struct ReftoneWidget : BGModuleWidget { auto outOutputPosition = Vec(10.5, 274.0); // end generated by svg_widgets.rb - { - auto w = createParam<Knob26>(pitchParamPosition, module, Reftone::PITCH_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } - { - auto w = createParam<Knob26>(octaveParamPosition, module, Reftone::OCTAVE_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob26>(pitchParamPosition, module, Reftone::PITCH_PARAM)); + addParam(createParam<Knob26>(octaveParamPosition, module, Reftone::OCTAVE_PARAM)); addParam(createParam<Knob26>(fineParamPosition, module, Reftone::FINE_PARAM)); addOutput(createOutput<Port24>(cvOutputPosition, module, Reftone::CV_OUTPUT)); diff --git a/src/Reftone.hpp b/src/Reftone.hpp @@ -38,7 +38,9 @@ struct Reftone : BGModule { Reftone() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(PITCH_PARAM, 0.0f, 11.0f, 9.0f, "Pitch"); + paramQuantities[PITCH_PARAM]->snapEnabled = true; configParam(OCTAVE_PARAM, 1.0f, 8.0f, 4.0f, "Octave"); + paramQuantities[OCTAVE_PARAM]->snapEnabled = true; configParam(FINE_PARAM, -0.99f, 0.99f, 0.0f, "Fine tune", " cents", 0.0f, 100.0f); sampleRateChange(); diff --git a/src/SampleHold.hpp b/src/SampleHold.hpp @@ -61,12 +61,12 @@ struct SampleHold : BGModule { SampleHold() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); - configParam(TRIGGER1_PARAM, 0.0f, 10.0f, 0.0f, "Trigger 1"); - configParam(TRIGGER2_PARAM, 0.0f, 10.0f, 0.0f, "Trigger 2"); - configParam(TRACK1_PARAM, 0.0f, 1.0f, 0.0f, "Track 1"); - configParam(TRACK2_PARAM, 0.0f, 1.0f, 0.0f, "Track 2"); - configParam(INVERT1_PARAM, 0.0f, 1.0f, 0.0f, "Invert 1"); - configParam(INVERT2_PARAM, 0.0f, 1.0f, 0.0f, "Invert 2"); + configButton(TRIGGER1_PARAM, "Trigger 1"); + configButton(TRIGGER2_PARAM, "Trigger 2"); + configSwitch(TRACK1_PARAM, 0.0f, 1.0f, 0.0f, "Track 1", {"Disabled", "Enabled"}); + configSwitch(TRACK2_PARAM, 0.0f, 1.0f, 0.0f, "Track 2", {"Disabled", "Enabled"}); + configSwitch(INVERT1_PARAM, 0.0f, 1.0f, 0.0f, "Invert 1", {"Disabled", "Enabled"}); + configSwitch(INVERT2_PARAM, 0.0f, 1.0f, 0.0f, "Invert 2", {"Disabled", "Enabled"}); } void reset() override; diff --git a/src/Shaper.hpp b/src/Shaper.hpp @@ -58,9 +58,9 @@ struct Shaper : TriggerOnLoadModule { configParam<EnvelopeSegmentParamQuantity>(OFF_PARAM, 0.0f, 1.0f, 0.07071f, "Off", " s"); configParam(ENV_PARAM, 0.0f, 1.0f, 1.0f, "Env", "%", 0.0f, 100.0f); configParam(SIGNAL_PARAM, 0.0f, 1.0f, 0.1f, "Signal", "x", 10.0f); - configParam(TRIGGER_PARAM, 0.0f, 1.0f, 0.0f, "Trigger"); - configParam(SPEED_PARAM, 0.0f, 1.0f, 1.0f, "Speed"); - configParam(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop"); + configButton(TRIGGER_PARAM, "Trigger"); + configSwitch(SPEED_PARAM, 0.0f, 1.0f, 1.0f, "Speed", {"Slow", "Normal"}); + configSwitch(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop", {"Loop", "Stop"}); } void reset() override; diff --git a/src/ShaperPlus.hpp b/src/ShaperPlus.hpp @@ -68,9 +68,9 @@ struct ShaperPlus : TriggerOnLoadModule { configParam<EnvelopeSegmentParamQuantity>(OFF_PARAM, 0.0f, 1.0f, 0.07071f, "Off", " s"); configParam(ENV_PARAM, 0.0f, 1.0f, 1.0f, "Env", "%", 0.0f, 100.0f); configParam(SIGNAL_PARAM, 0.0f, 1.0f, 0.1f, "Signal", "x", 10.0f); - configParam(TRIGGER_PARAM, 0.0f, 1.0f, 0.0f, "Trigger"); - configParam(SPEED_PARAM, 0.0f, 1.0f, 1.0f, "Speed"); - configParam(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop"); + configButton(TRIGGER_PARAM, "Trigger"); + configSwitch(SPEED_PARAM, 0.0f, 1.0f, 1.0f, "Speed", {"Slow", "Normal"}); + configSwitch(LOOP_PARAM, 0.0f, 1.0f, 1.0f, "Loop", {"Loop", "Stop"}); } void reset() override; diff --git a/src/Sine.hpp b/src/Sine.hpp @@ -53,7 +53,7 @@ struct Sine : VCOBase { { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam<VCOFrequencyParamQuantity>(FREQUENCY_PARAM, -3.0f, 6.0f, 0.0f, "Frequency", " Hz"); - configParam(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow mode"); + configButton(SLOW_PARAM, "Slow mode"); configParam(FM_DEPTH_PARAM, 0.0f, 1.0f, 0.0f, "FM depth", "%", 0.0f, 100.0f); configParam(PHASE_PARAM, -1.0f, 1.0f, 0.0f, "Phase offset", "º", 0.0f, 180.0f); } diff --git a/src/Slew.hpp b/src/Slew.hpp @@ -37,7 +37,7 @@ struct Slew : BGModule { configParam(RISE_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Rise shape"); configParam<EnvelopeSegmentParamQuantity>(FALL_PARAM, 0.0f, 1.0f, 0.31623f, "Fall", " s"); configParam(FALL_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Fall shape"); - configParam(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow mode"); + configSwitch(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow mode", {"Disabled", "Enabled"}); configBypass(IN_INPUT, OUT_OUTPUT); } diff --git a/src/Stack.cpp b/src/Stack.cpp @@ -75,15 +75,10 @@ struct StackWidget : BGModuleWidget { auto outOutputPosition = Vec(10.5, 289.0); // end generated by svg_widgets.rb - { - auto w = createParam<Knob26>(semisParamPosition, module, Stack::SEMIS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob26>(semisParamPosition, module, Stack::SEMIS_PARAM)); { auto w = createParam<Knob16>(octaveParamPosition, module, Stack::OCTAVE_PARAM); auto k = dynamic_cast<SvgKnob*>(w); - k->snap = true; k->minAngle = -0.5 * M_PI; k->maxAngle = 0.5 * M_PI; addParam(w); diff --git a/src/Stack.hpp b/src/Stack.hpp @@ -42,9 +42,11 @@ struct Stack : BGModule { Stack() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(SEMIS_PARAM, 0.0f, 11.0f, 0.0f, "Semitones"); + paramQuantities[SEMIS_PARAM]->snapEnabled = true; configParam(OCTAVE_PARAM, -3.0f, 3.0f, 0.0f, "Octaves"); + paramQuantities[OCTAVE_PARAM]->snapEnabled = true; configParam(FINE_PARAM, -0.99f, 0.99f, 0.0f, "Fine tune", " cents", 0.0f, 100.0f); - configParam(QUANTIZE_PARAM, 0.0f, 1.0f, 1.0f, "Quantize"); + configSwitch(QUANTIZE_PARAM, 0.0f, 1.0f, 1.0f, "Quantize", {"Disabled", "Enabled"}); for (int i = 0; i < maxChannels; ++i) { _lastSemitones[i] = -1000.0f; diff --git a/src/Switch.cpp b/src/Switch.cpp @@ -30,7 +30,7 @@ void bogaudio::Switch::processAlways(const ProcessArgs& args) { } void bogaudio::Switch::processChannel(const ProcessArgs& args, int c) { - bool triggered = _trigger[c].process(params[GATE_PARAM].getValue() + inputs[GATE_INPUT].getVoltage(c)); + bool triggered = _trigger[c].process(10.0f*params[GATE_PARAM].getValue() + inputs[GATE_INPUT].getVoltage(c)); if (_latch) { if (triggered) { _latchedHigh[c] = !_latchedHigh[c]; diff --git a/src/Switch.hpp b/src/Switch.hpp @@ -45,8 +45,8 @@ struct Switch : SaveLatchToPatchModule { Switch() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - configParam(GATE_PARAM, 0.0f, 10.0f, 0.0f, "Gate"); - configParam(LATCH_PARAM, 0.0f, 1.0f, 0.0f, "Latch"); + configButton(GATE_PARAM, "Gate"); + configSwitch(LATCH_PARAM, 0.0f, 1.0f, 0.0f, "Latch", {"Disabled", "Enabled"}); configBypass(LOW1_INPUT, OUT1_OUTPUT); configBypass(LOW2_INPUT, OUT2_OUTPUT); } diff --git a/src/Unison.cpp b/src/Unison.cpp @@ -61,11 +61,7 @@ struct UnisonWidget : BGModuleWidget { auto gateOutputPosition = Vec(10.5, 282.0); // end generated by svg_widgets.rb - { - auto w = createParam<Knob26>(channelsParamPosition, module, Unison::CHANNELS_PARAM); - dynamic_cast<Knob*>(w)->snap = true; - addParam(w); - } + addParam(createParam<Knob26>(channelsParamPosition, module, Unison::CHANNELS_PARAM)); addParam(createParam<Knob26>(detuneParamPosition, module, Unison::DETUNE_PARAM)); addInput(createInput<Port24>(detuneInputPosition, module, Unison::DETUNE_INPUT)); diff --git a/src/Unison.hpp b/src/Unison.hpp @@ -33,6 +33,7 @@ struct Unison : BGModule { Unison() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(CHANNELS_PARAM, 1.0f, 16.0f, 1.0f, "Channels"); + paramQuantities[CHANNELS_PARAM]->snapEnabled = true; configParam(DETUNE_PARAM, 0.0f, maxDetuneCents, 0.0f, "Detune"); } diff --git a/src/VCA.hpp b/src/VCA.hpp @@ -44,7 +44,7 @@ struct VCA : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam<LevelParamQuantity>(LEVEL1_PARAM, 0.0f, 1.0f, 0.8f, "Level 1"); configParam<LevelParamQuantity>(LEVEL2_PARAM, 0.0f, 1.0f, 0.8f, "Level 2"); - configParam(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear"); + configSwitch(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear", {"Disabled", "Enabled"}); configBypass(IN1_INPUT, OUT1_OUTPUT); configBypass(IN2_INPUT, OUT2_OUTPUT); diff --git a/src/VCF.cpp b/src/VCF.cpp @@ -217,7 +217,6 @@ struct VCFWidget : BGModuleWidget { { auto w = createParam<Knob16>(modeParamPosition, module, VCF::MODE_PARAM); auto k = dynamic_cast<SvgKnob*>(w); - k->snap = true; float a = (22.5 / 180.0) * M_PI; k->minAngle = a; k->maxAngle = M_PI - a; diff --git a/src/VCF.hpp b/src/VCF.hpp @@ -75,7 +75,8 @@ struct VCF : BGModule { configParam(FREQUENCY_CV_PARAM, -1.0f, 1.0f, 0.0f, "Frequency CV attenuation", "%", 0.0f, 100.0f); configParam(FM_PARAM, 0.0f, 1.0f, 0.0f, "FM", "%", 0.0f, 100.0f); configParam(Q_PARAM, 0.0f, 1.0f, 0.0f, "Resonance / bandwidth", "%", 0.0f, 100.0f); - configParam(MODE_PARAM, 0.0f, 3.0f, 0.0f, "Mode"); + configSwitch(MODE_PARAM, 0.0f, 3.0f, 0.0f, "Mode", {"Lowpass", "Highpass", "Bandpass", "Band reject"}); + paramQuantities[MODE_PARAM]->snapEnabled = true; configParam<ScaledSquaringParamQuantity<Engine::maxPoles - Engine::minPoles>>(SLOPE_PARAM, 0.0f, 1.0f, 0.522233f, "Slope", " poles", 0.0f, 1.0f, Engine::minPoles); configBypass(IN_INPUT, OUT_OUTPUT); } diff --git a/src/VCO.hpp b/src/VCO.hpp @@ -47,11 +47,11 @@ struct VCO : VCOBase { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam<VCOFrequencyParamQuantity>(FREQUENCY_PARAM, -3.0f, 6.0f, 0.0f, "Frequency", " Hz"); configParam(FINE_PARAM, -1.0f, 1.0f, 0.0f, "Fine tune", " cents", 0.0f, 100.0f); - configParam(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow mode"); + configButton(SLOW_PARAM, "Slow mode"); configParam(PW_PARAM, -1.0f, 1.0f, 0.0f, "Pulse width", "%", 0.0f, 100.0f*0.5f*(1.0f - 2.0f * SquareOscillator::minPulseWidth), 50.0f); configParam(FM_PARAM, 0.0f, 1.0f, 0.0f, "FM depth", "%", 0.0f, 100.0f); - configParam(FM_TYPE_PARAM, 0.0f, 1.0f, 1.0f, "FM mode"); - configParam(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear Freq"); + configSwitch(FM_TYPE_PARAM, 0.0f, 1.0f, 1.0f, "FM mode", {"Linear FM", "Exponential FM"}); + configButton(LINEAR_PARAM, "Linear frequency"); } bool active() override; diff --git a/src/Velo.hpp b/src/Velo.hpp @@ -48,7 +48,7 @@ struct Velo : BGModule { configParam<LevelParamQuantity>(LEVEL_PARAM, 0.0f, 1.0f, 0.8f, "level"); configParam(LEVEL_ATTENUATOR_PARAM, -1.0f, 1.0f, 0.0f, "Level CV"); configParam<ScaledSquaringParamQuantity<-60>>(VELOCITY_PARAM, 0.0f, 1.0f, 0.3162278f, "Velocity range", " dB"); - configParam(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear"); + configSwitch(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear", {"Disabled", "Enabled"}); configBypass(IN_INPUT, OUT_OUTPUT); } diff --git a/src/Vish.hpp b/src/Vish.hpp @@ -55,8 +55,8 @@ struct Vish : LPGEnvBaseModule { configParam<TimeParamQuantity<1>>(FALL_PARAM, 0.0f, 1.0f, 0.5477226f, "Fall time", " s"); configParam(FALL_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Fall shape"); configParam<TimeParamQuantity<1>>(MINIMUM_GATE_PARAM, 0.0f, 1.0f, 0.3162278f, "Minimum gate", " s"); - configParam(GATE_TO_TRIGGER_PARAM, 0.0f, 1.0f, 1.0f, "Gate to trigger mode"); - configParam(TIMES_10X_PARAM, 0.0f, 1.0f, 0.0f, "Timings 10X mode"); + configSwitch(GATE_TO_TRIGGER_PARAM, 0.0f, 1.0f, 1.0f, "Gate to trigger mode", {"Disabled (input pass-through)", "Enabled"}); + configSwitch(TIMES_10X_PARAM, 0.0f, 1.0f, 0.0f, "Timings 10X mode", {"Disabled (normal)", "Enabled"}); } void reset() override; diff --git a/src/Walk2.hpp b/src/Walk2.hpp @@ -88,7 +88,7 @@ struct Walk2 : BGModule { configParam(OFFSET_Y_PARAM, -1.0f, 1.0f, 0.0f, "Offset Y", " V", 0.0f, 5.0f); configParam(SCALE_X_PARAM, 0.0f, 1.0f, 1.0f, "Scale X", "%", 0.0f, 100.0f); configParam(SCALE_Y_PARAM, 0.0f, 1.0f, 1.0f, "Scale Y", "%", 0.0f, 100.0f); - configParam(JUMP_MODE_PARAM, 0.0f, 2.0f, 0.0f, "TRIG action"); + configSwitch(JUMP_MODE_PARAM, 0.0f, 2.0f, 0.0f, "TRIG action", {"Jump", "Sample & hold", "Track & hold"}); } void reset() override; diff --git a/src/XCO.hpp b/src/XCO.hpp @@ -134,9 +134,9 @@ struct XCO : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam<XCOFrequencyParamQuantity>(FREQUENCY_PARAM, -3.0f, 6.0f, 0.0f, "Frequency", " Hz"); configParam(FINE_PARAM, -1.0f, 1.0f, 0.0f, "Fine tune", " cents", 0.0f, 100.0f); - configParam(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow mode"); + configButton(SLOW_PARAM, "Slow mode"); configParam(FM_DEPTH_PARAM, 0.0f, 1.0f, 0.0f, "FM depth", "%", 0.0f, 100.0f); - configParam(FM_TYPE_PARAM, 0.0f, 1.0f, 1.0f, "FM mode"); + configSwitch(FM_TYPE_PARAM, 0.0f, 1.0f, 1.0f, "FM mode", {"Linear FM", "Exponential FM"}); configParam(SQUARE_PW_PARAM, -0.97f, 0.97f, 0.0f, "Square wave pulse width", "%", 0.0f, 100.0f); configParam(SQUARE_PHASE_PARAM, -1.0f, 1.0f, 0.0f, "Square wave phase", "º", 0.0f, 180.0f); configParam(SQUARE_MIX_PARAM, 0.0f, 1.0f, 1.0f, "Square wave mix", "%", 0.0f, 100.0f); diff --git a/src/XFade.hpp b/src/XFade.hpp @@ -39,7 +39,7 @@ struct XFade : BGModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); configParam(MIX_PARAM, -1.0f, 1.0f, 0.0f, "Mix", "%", 0.0f, 100.0f); configParam(CURVE_PARAM, 0.0f, 1.0f, 0.5f, "Curve"); - configParam(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear"); + configSwitch(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear", {"Decibels", "Amplitude"}); sampleRateChange(); for (int c = 0; c < maxChannels; ++c) {