diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2018-06-15 20:15:07 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2018-07-15 18:56:00 +0200 |
commit | be9fe821ff1689ece9ee6433fcf42ec316e0aaad (patch) | |
tree | 96ae9a9e52539c32b37d8f9805cf4a458125033a | |
parent | 3e003e674b31ca1308f5c32125f5a2152e773f17 (diff) |
PoC for humanisation visualiser.
-rw-r--r-- | plugin/Makefile.mingw32.in | 1 | ||||
m--------- | plugin/plugingizmo | 0 | ||||
-rw-r--r-- | plugingui/Makefile.am | 2 | ||||
-rw-r--r-- | plugingui/humaniservisualiser.cc | 124 | ||||
-rw-r--r-- | plugingui/humaniservisualiser.h | 56 | ||||
-rw-r--r-- | plugingui/timingframecontent.cc | 6 | ||||
-rw-r--r-- | plugingui/timingframecontent.h | 5 | ||||
-rw-r--r-- | src/latencyfilter.cc | 2 | ||||
-rw-r--r-- | src/settings.h | 14 | ||||
-rw-r--r-- | src/staminafilter.cc | 2 |
10 files changed, 211 insertions, 1 deletions
diff --git a/plugin/Makefile.mingw32.in b/plugin/Makefile.mingw32.in index 3330e35..d0589d6 100644 --- a/plugin/Makefile.mingw32.in +++ b/plugin/Makefile.mingw32.in @@ -61,6 +61,7 @@ GUI_SRC = \ @top_srcdir@/plugingui/font.cc \ @top_srcdir@/plugingui/frame.cc \ @top_srcdir@/plugingui/humanizerframecontent.cc \ + @top_srcdir@/plugingui/humaniservisualiser.cc \ @top_srcdir@/plugingui/image.cc \ @top_srcdir@/plugingui/imagecache.cc \ @top_srcdir@/plugingui/knob.cc \ diff --git a/plugin/plugingizmo b/plugin/plugingizmo -Subproject 27ce655dd74b81d40a3a28e65e753985f506a38 +Subproject efc232050e3b3841f3d6c33cbc8e04a8c009bc8 diff --git a/plugingui/Makefile.am b/plugingui/Makefile.am index 94e8a7c..fc31f35 100644 --- a/plugingui/Makefile.am +++ b/plugingui/Makefile.am @@ -68,6 +68,7 @@ nodist_libdggui_la_SOURCES = \ font.cc \ frame.cc \ humanizerframecontent.cc \ + humaniservisualiser.cc \ image.cc \ imagecache.cc \ knob.cc \ @@ -191,6 +192,7 @@ EXTRA_DIST = \ frame.h \ guievent.h \ humanizerframecontent.h \ + humaniservisualiser.h \ image.h \ imagecache.h \ knob.h \ diff --git a/plugingui/humaniservisualiser.cc b/plugingui/humaniservisualiser.cc new file mode 100644 index 0000000..6737e36 --- /dev/null +++ b/plugingui/humaniservisualiser.cc @@ -0,0 +1,124 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + * humaniservisualiser.cc + * + * Fri Jun 15 19:09:18 CEST 2018 + * Copyright 2018 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * DrumGizmo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "humaniservisualiser.h" + +#include "painter.h" + +#include <notifier.h> +#include <settings.h> + +#include <iostream> + +HumaniserVisualiser::HumaniserVisualiser(GUI::Widget* parent, + SettingsNotifier& settings_notifier) + : GUI::Widget(parent) + , settings_notifier(settings_notifier) +{ + CONNECT(this, settings_notifier.latency_current, + this, &HumaniserVisualiser::latencyOffsetChanged); + CONNECT(this, settings_notifier.velocity_modifier_current, + this, &HumaniserVisualiser::velocityOffsetChanged); + + CONNECT(this, settings_notifier.latency_stddev, + this, &HumaniserVisualiser::latencyStddevChanged); + CONNECT(this, settings_notifier.latency_laid_back, + this, &HumaniserVisualiser::latencyLaidbackChanged); + CONNECT(this, settings_notifier.velocity_stddev, + this, &HumaniserVisualiser::velocityStddevChanged); +} + +void HumaniserVisualiser::repaintEvent(GUI::RepaintEvent *repaintEvent) +{ + GUI::Painter p(*this); + + // Background + p.setColour(GUI::Colour(0, 0, 1)); + p.drawFilledRectangle(0, 0, width(), height()); + + int x = latency_offset / 2000.0 * width() / 2 + width() / 2; + int y = velocity_offset * height(); + int w = latency_stddev / 10; + int h = velocity_stddev * 10; + + // Stddev squares + float v = w; + while(v > 1) + { + float a = 1.0f - v / (float)w; + a = a * a * a; + p.setColour(GUI::Colour(1.0f, 0.0f, 1.0f, a)); + p.drawFilledRectangle(x - v / 2, 0, + x + v / 2, height()); + v -= 1.0f; + } + + v = h; + while(v > 1) + { + float a = 1.0f - v / (float)h; + a = a * a * a; + p.setColour(GUI::Colour(1.0f, 0.0f, 1.0f, a)); + p.drawFilledRectangle(0, y - v / 2, + width(), y + v / 2); + v -= 1.0f; + } + + // Lines + p.setColour(GUI::Colour(0, 1, 1)); + p.drawLine(0, y, width(), y); + p.drawLine(x, 0, x, height()); +} + +void HumaniserVisualiser::latencyOffsetChanged(int offset) +{ + latency_offset = offset; + redraw(); +} + +void HumaniserVisualiser::velocityOffsetChanged(float offset) +{ + velocity_offset = -1 * offset + 1; + redraw(); +} + +void HumaniserVisualiser::latencyStddevChanged(float stddev) +{ + latency_stddev = stddev; + redraw(); +} + +void HumaniserVisualiser::latencyLaidbackChanged(int laidback) +{ + this->laidback = laidback; + redraw(); +} + +void HumaniserVisualiser::velocityStddevChanged(float stddev) +{ + velocity_stddev = stddev; + redraw(); +} diff --git a/plugingui/humaniservisualiser.h b/plugingui/humaniservisualiser.h new file mode 100644 index 0000000..f7f4c15 --- /dev/null +++ b/plugingui/humaniservisualiser.h @@ -0,0 +1,56 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + * humaniservisualiser.h + * + * Fri Jun 15 19:09:18 CEST 2018 + * Copyright 2018 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * DrumGizmo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#pragma once + +#include "widget.h" + +class SettingsNotifier; + +class HumaniserVisualiser + : public GUI::Widget +{ +public: + HumaniserVisualiser(GUI::Widget* parent, + SettingsNotifier& settings_notifier); + + // From Widget: + virtual void repaintEvent(GUI::RepaintEvent *repaintEvent) override; + + void latencyOffsetChanged(int offset); + void velocityOffsetChanged(float offset); + void latencyStddevChanged(float stddev); + void latencyLaidbackChanged(int laidback); + void velocityStddevChanged(float stddev); + +private: + int latency_offset; + float velocity_offset; + float latency_stddev; + int laidback; + float velocity_stddev; + SettingsNotifier& settings_notifier; +}; diff --git a/plugingui/timingframecontent.cc b/plugingui/timingframecontent.cc index 5e48423..d6b4c29 100644 --- a/plugingui/timingframecontent.cc +++ b/plugingui/timingframecontent.cc @@ -27,6 +27,7 @@ #include "timingframecontent.h" #include <cmath> +#include <iostream> #include "painter.h" @@ -39,6 +40,7 @@ TimingframeContent::TimingframeContent(Widget* parent, : Widget(parent) , settings(settings) , settings_notifier(settings_notifier) + , visualiser(this, settings_notifier) { layout.setResizeChildren(false); @@ -70,6 +72,9 @@ TimingframeContent::TimingframeContent(Widget* parent, layout.setPosition(®ain, GridLayout::GridRange{1, 2, 0, 1}); layout.setPosition(&laidback, GridLayout::GridRange{2, 3, 0, 1}); + visualiser.move(80, 40); + visualiser.resize(40, 40); + CONNECT(this, settings_notifier.latency_stddev, this, &TimingframeContent::tightnessSettingsValueChanged); CONNECT(this, settings_notifier.latency_regain, @@ -83,7 +88,6 @@ TimingframeContent::TimingframeContent(Widget* parent, this, &TimingframeContent::regainKnobValueChanged); CONNECT(&laidback_knob, valueChangedNotifier, this, &TimingframeContent::laidbackKnobValueChanged); - } float TimingframeContent::thightnessKnobToSettings(float value) const diff --git a/plugingui/timingframecontent.h b/plugingui/timingframecontent.h index 011b288..e0131e3 100644 --- a/plugingui/timingframecontent.h +++ b/plugingui/timingframecontent.h @@ -31,6 +31,7 @@ #include "labeledcontrol.h" #include "layout.h" #include "widget.h" +#include "humaniservisualiser.h" #include <settings.h> @@ -63,6 +64,9 @@ private: void laidbackKnobValueChanged(float value); void laidbackSettingsValueChanged(int value); + void latencyOffsetChanged(int offset); + void velocityOffsetChanged(float offset); + GridLayout layout{this, 3, 1}; LabeledControl tightness{this, "Tightness"}; @@ -75,6 +79,7 @@ private: Settings& settings; SettingsNotifier& settings_notifier; + HumaniserVisualiser visualiser; }; } // GUI:: diff --git a/src/latencyfilter.cc b/src/latencyfilter.cc index 9ea707d..5cb6db2 100644 --- a/src/latencyfilter.cc +++ b/src/latencyfilter.cc @@ -92,6 +92,8 @@ bool LatencyFilter::filter(event_t& event, std::size_t pos) event.offset += latency_laid_back; // laid back offset (user controlled) event.offset += latency_offset; // current drift + settings.latency_current.store(latency_offset + latency_laid_back); + return true; } diff --git a/src/settings.h b/src/settings.h index f044bae..9d225b0 100644 --- a/src/settings.h +++ b/src/settings.h @@ -79,6 +79,9 @@ struct Settings Atomic<float> velocity_modifier_weight{velocity_modifier_weight_default}; Atomic<float> velocity_stddev{velocity_stddev_default}; // [0.5; 3.0] + // Current velocity offset - for UI + Atomic<float> velocity_modifier_current{1.0f}; + Atomic<bool> enable_velocity_randomiser{false}; Atomic<float> velocity_randomiser_weight{0.1f}; @@ -121,6 +124,9 @@ struct Settings //! 1: never static float constexpr latency_regain_default = 0.9f; Atomic<float> latency_regain{latency_regain_default}; + + // Current latency offset - for UI + Atomic<int> latency_current{0}; }; //! Settings getter class. @@ -146,6 +152,7 @@ struct SettingsGetter SettingRef<float> velocity_modifier_falloff; SettingRef<float> velocity_modifier_weight; SettingRef<float> velocity_stddev; + SettingRef<float> velocity_modifier_current; SettingRef<bool> enable_velocity_randomiser; SettingRef<float> velocity_randomiser_weight; @@ -169,6 +176,7 @@ struct SettingsGetter SettingRef<int> latency_laid_back; SettingRef<float> latency_stddev; SettingRef<float> latency_regain; + SettingRef<int> latency_current; SettingsGetter(Settings& settings) : drumkit_file(settings.drumkit_file) @@ -188,6 +196,7 @@ struct SettingsGetter , velocity_modifier_falloff{settings.velocity_modifier_falloff} , velocity_modifier_weight{settings.velocity_modifier_weight} , velocity_stddev{settings.velocity_stddev} + , velocity_modifier_current{settings.velocity_modifier_current} , enable_velocity_randomiser{settings.enable_velocity_randomiser} , velocity_randomiser_weight{settings.velocity_randomiser_weight} , samplerate{settings.samplerate} @@ -205,6 +214,7 @@ struct SettingsGetter , latency_laid_back{settings.latency_laid_back} , latency_stddev{settings.latency_stddev} , latency_regain{settings.latency_regain} + , latency_current{settings.latency_current} { } }; @@ -233,6 +243,7 @@ public: Notifier<float> velocity_modifier_falloff; Notifier<float> velocity_modifier_weight; Notifier<float> velocity_stddev; + Notifier<float> velocity_modifier_current; Notifier<bool> enable_velocity_randomiser; Notifier<float> velocity_randomiser_weight; @@ -256,6 +267,7 @@ public: Notifier<int> latency_laid_back; Notifier<float> latency_stddev; Notifier<float> latency_regain; + Notifier<int> latency_current; void evaluate() { @@ -281,6 +293,7 @@ public: EVAL(velocity_modifier_falloff); EVAL(velocity_modifier_weight); EVAL(velocity_stddev); + EVAL(velocity_modifier_current); EVAL(enable_velocity_randomiser); EVAL(velocity_randomiser_weight); @@ -304,6 +317,7 @@ public: EVAL(latency_laid_back); EVAL(latency_stddev); EVAL(latency_regain); + EVAL(latency_current); } SettingsNotifier(Settings& settings) diff --git a/src/staminafilter.cc b/src/staminafilter.cc index a8f6a86..aadfd2d 100644 --- a/src/staminafilter.cc +++ b/src/staminafilter.cc @@ -76,5 +76,7 @@ bool StaminaFilter::filter(event_t& event, size_t pos) mod *= velocity_modifier_weight; } + settings.velocity_modifier_current.store(mod); + return true; } |