summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2018-06-15 20:15:07 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2018-07-15 18:56:00 +0200
commitbe9fe821ff1689ece9ee6433fcf42ec316e0aaad (patch)
tree96ae9a9e52539c32b37d8f9805cf4a458125033a
parent3e003e674b31ca1308f5c32125f5a2152e773f17 (diff)
PoC for humanisation visualiser.
-rw-r--r--plugin/Makefile.mingw32.in1
m---------plugin/plugingizmo0
-rw-r--r--plugingui/Makefile.am2
-rw-r--r--plugingui/humaniservisualiser.cc124
-rw-r--r--plugingui/humaniservisualiser.h56
-rw-r--r--plugingui/timingframecontent.cc6
-rw-r--r--plugingui/timingframecontent.h5
-rw-r--r--src/latencyfilter.cc2
-rw-r--r--src/settings.h14
-rw-r--r--src/staminafilter.cc2
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(&regain, 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;
}