zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit fd511fc1a706e4ae8a753be9606e2c6cdb0d4a33
parent dce8241e738167fc99d2cb5f50dfd2431d9ea815
Author: Johannes Lorenz <j.git@lorenz-ho.me>
Date:   Wed,  8 Apr 2020 18:43:07 +0200

Fl_Osc_Dial: Enable float dials

Diffstat:
Msrc/UI/Fl_Osc_Dial.H | 8++++++++
Msrc/UI/Fl_Osc_Dial.cpp | 25+++++++++++++++++++++----
2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/UI/Fl_Osc_Dial.H b/src/UI/Fl_Osc_Dial.H @@ -31,6 +31,7 @@ class Fl_Osc_Dial:public WidgetPDial, public Fl_Osc_Widget //void OSC_value(float); void OSC_value(int); void OSC_value(char); + void OSC_value(float); using Fl_Osc_Widget::OSC_value; //Refetch parameter information @@ -44,7 +45,14 @@ class Fl_Osc_Dial:public WidgetPDial, public Fl_Osc_Widget virtual void rebase(std::string new_base) override; void cb(void); + + //! normally, it's all uchar. this hack makes it a float dial + void make_float() { dataType = dataTypeT::type_float; } private: + enum class dataTypeT + { + type_uchar, type_float + } dataType = dataTypeT::type_uchar; bool alt_style; bool dead; std::pair<Fl_Callback*, void*> cb_data; diff --git a/src/UI/Fl_Osc_Dial.cpp b/src/UI/Fl_Osc_Dial.cpp @@ -89,12 +89,20 @@ int Fl_Osc_Dial::handle(int ev) void Fl_Osc_Dial::OSC_value(int v) { + assert(dataType == dataTypeT::type_uchar); value(v + value() - floorf(value()) + (minimum() == 64 ? 0 : minimum())); } +void Fl_Osc_Dial::OSC_value(float v) +{ + assert(dataType == dataTypeT::type_float); + value(v); +} + void Fl_Osc_Dial::OSC_value(char v) { + assert(dataType == dataTypeT::type_uchar); value(v + value() - floorf(value()) + minimum()); } @@ -108,10 +116,19 @@ void Fl_Osc_Dial::cb(void) { assert(osc); - if(64 != (int)minimum()) - oscWrite(ext, "i", (int)(value()-minimum())); - else - oscWrite(ext, "i", (int)(value())); + if(dataType == dataTypeT::type_uchar) + { + if(64 != (int)minimum()) + oscWrite(ext, "i", (int)(value()-minimum())); + else + oscWrite(ext, "i", (int)(value())); + } + else if(dataType == dataTypeT::type_float) + { + oscWrite(ext, "f", static_cast<float>(value())); + } + else { assert(false); } + if(cb_data.first) cb_data.first(this, cb_data.second);