From a896e04abc6936a158c0e9a8a26a1e0234cb6e82 Mon Sep 17 00:00:00 2001 From: Patric Schmitz Date: Thu, 5 Mar 2020 11:18:45 +0000 Subject: [PATCH] implement int and toggle UI controls --- Presets/simple-synth.yaml | 25 +++++++++---------- Source/ControlElement.h | 1 + Source/ControlElementFactory.cpp | 11 +++++--- Source/ControlElementKnob.cpp | 11 ++++---- Source/ControlElementUI.cpp | 43 +++++++++++++++++++++----------- Source/PresetParser.cpp | 6 +++++ Source/UIComponentFactory.cpp | 13 ++++++++++ Source/UIComponentFactory.h | 4 +++ 8 files changed, 79 insertions(+), 35 deletions(-) diff --git a/Presets/simple-synth.yaml b/Presets/simple-synth.yaml index ae10720..82ee6e5 100644 --- a/Presets/simple-synth.yaml +++ b/Presets/simple-synth.yaml @@ -5,8 +5,8 @@ network: controls: - name: frequency type: float - range: [100, 2000] default: 440 + range: [100, 2000] message: /synth/freq - name: amplitude @@ -14,19 +14,18 @@ controls: default: 0.8 message: /synth/amplitude - # - name: voices - # type: int - # range: [1, 6] - # default: 1 - # message: /synth/voices + - name: vibrato + type: float + default: 0.0 + message: /synth/vibrato - - name: flerp - type: toggle - default: on - message: /synth/flerp + - name: voices + type: int + default: 1 + range: [1, 6] + message: /synth/voices - - name: freak out + - name: sub-oscillator type: toggle default: off - message: /synth/freak-out - message-mute: /synth/freak-out/mute + message: /synth/sub-osc diff --git a/Source/ControlElement.h b/Source/ControlElement.h index cf8aa57..cf05afb 100644 --- a/Source/ControlElement.h +++ b/Source/ControlElement.h @@ -30,6 +30,7 @@ class ControlElement enum class Type { Float, + Int, Toggle }; diff --git a/Source/ControlElementFactory.cpp b/Source/ControlElementFactory.cpp index 0aaf5a7..162b211 100644 --- a/Source/ControlElementFactory.cpp +++ b/Source/ControlElementFactory.cpp @@ -43,14 +43,19 @@ createControlElementUI { std::unique_ptr product; - if(createInfo.type == ControlElement::Type::Float) { + switch (createInfo.type) { + case ControlElement::Type::Float: + case ControlElement::Type::Int: { product = std::make_unique (createInfo, oscSender); + break; } - else if(createInfo.type == ControlElement::Type::Toggle) { + + case ControlElement::Type::Toggle: { product = std::make_unique (createInfo, oscSender); - } + break; + }} product->registerSendValue(); diff --git a/Source/ControlElementKnob.cpp b/Source/ControlElementKnob.cpp index 73ee41a..1e8139d 100644 --- a/Source/ControlElementKnob.cpp +++ b/Source/ControlElementKnob.cpp @@ -31,11 +31,12 @@ ControlElementKnob OSCSender & oscSender) : ControlElementUI(createInfo, oscSender) { - knob.reset (new Slider("knob")); - knob->setSliderStyle (Slider::RotaryVerticalDrag); - knob->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); - knob->setRange (createInfo.range.first, createInfo.range.second, 0); - knob->setPaintingIsUnclipped (true); + knob = UIComponentFactory::createControlKnob (); + + auto increment = + createInfo.type == ControlElement::Type::Int ? 1 : 0; + knob->setRange (createInfo.range.first, + createInfo.range.second, increment); addAndMakeVisible (knob.get()); textEditor = UIComponentFactory::createControlTextEditor (); diff --git a/Source/ControlElementUI.cpp b/Source/ControlElementUI.cpp index b330a11..1f2fc76 100644 --- a/Source/ControlElementUI.cpp +++ b/Source/ControlElementUI.cpp @@ -57,19 +57,9 @@ ControlElementUI:: registerSendValue() { sendValue.removeListener (this); - - sendValue.referTo - (getSpecificSendValue ()); - - // set below allowed range to trigger valueChanged later - sendValue.setValue - (createInfo.range.first - - std::numeric_limits::epsilon ()); - + sendValue.referTo (getSpecificSendValue ()); sendValue.addListener (this); - // seting default value now triggers valueChanged -> send on init, - // even for default == 0 that would not trigger valueChanged. sendValue.setValue (createInfo.defaultValue); } @@ -105,8 +95,33 @@ send() { if (!buttonMute->getToggleState()) { auto value = sendValue.getValue(); - auto oscMessage = - OSCMessage(String(createInfo.message), float(value)); - oscSender.send(oscMessage); + + switch (createInfo.type) { + case ControlElement::Type::Float: { + auto oscMessage = + OSCMessage( + String(createInfo.message), + float(value)); + oscSender.send(oscMessage); + break; + } + + case ControlElement::Type::Int: { + auto oscMessage = + OSCMessage( + String(createInfo.message), + int(value)); + oscSender.send(oscMessage); + break; + } + + case ControlElement::Type::Toggle: + auto oscMessage = + OSCMessage( + String(createInfo.message), + float(value)); + oscSender.send(oscMessage); + break; + } } } diff --git a/Source/PresetParser.cpp b/Source/PresetParser.cpp index cb54aff..3042109 100644 --- a/Source/PresetParser.cpp +++ b/Source/PresetParser.cpp @@ -26,6 +26,7 @@ const std::map PresetParser::mapTypeNames = { {"float", ControlElement::Type::Float}, + {"int", ControlElement::Type::Int}, {"toggle", ControlElement::Type::Toggle}, }; @@ -117,6 +118,11 @@ getControlElementCreateInfo break; } + case ControlElement::Type::Int: { + info.defaultValue = control["default"].as(); + break; + } + case ControlElement::Type::Toggle: { info.defaultValue = control["default"].as(); break; diff --git a/Source/UIComponentFactory.cpp b/Source/UIComponentFactory.cpp index b664050..89051d6 100644 --- a/Source/UIComponentFactory.cpp +++ b/Source/UIComponentFactory.cpp @@ -61,3 +61,16 @@ createControlButton () return product; } + +std::unique_ptr +UIComponentFactory:: +createControlKnob () +{ + auto product = std::make_unique ("knob"); + + product->setSliderStyle (Slider::RotaryVerticalDrag); + product->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + product->setPaintingIsUnclipped (true); + + return product; +} diff --git a/Source/UIComponentFactory.h b/Source/UIComponentFactory.h index f2eba92..82257b9 100644 --- a/Source/UIComponentFactory.h +++ b/Source/UIComponentFactory.h @@ -35,4 +35,8 @@ class UIComponentFactory static std::unique_ptr createControlButton (); + + static + std::unique_ptr + createControlKnob (); };