summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2020-06-05 18:55:36 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2020-07-24 22:24:19 +0200
commit50bf217c8d519e29613e0f0d653b631105b348a8 (patch)
tree31256af05d33afee3da3d903eaed6df35f53e0d4
parent773a6ce4d153c6ecc8fb5cf9b41bcf9f25144d7c (diff)
Double trigger filter.doubletriggerfilter
-rw-r--r--plugin/Makefile.mingw32.in1
-rw-r--r--src/Makefile.am2
-rw-r--r--src/doubletriggerfilter.cc75
-rw-r--r--src/doubletriggerfilter.h46
-rw-r--r--src/inputprocessor.cc2
5 files changed, 126 insertions, 0 deletions
diff --git a/plugin/Makefile.mingw32.in b/plugin/Makefile.mingw32.in
index bf52e04..5bb07d9 100644
--- a/plugin/Makefile.mingw32.in
+++ b/plugin/Makefile.mingw32.in
@@ -26,6 +26,7 @@ DG_SRC = \
@top_srcdir@/src/dgxmlparser.cc \
@top_srcdir@/src/directory.cc \
@top_srcdir@/src/domloader.cc \
+ @top_srcdir@/src/doubletriggerfilter.cc \
@top_srcdir@/src/drumgizmo.cc \
@top_srcdir@/src/drumgizmoconf.cc \
@top_srcdir@/src/drumkit.cc \
diff --git a/src/Makefile.am b/src/Makefile.am
index f2a392d..428b8d7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -45,6 +45,7 @@ libdg_la_SOURCES = \
configparser.cc \
directory.cc \
domloader.cc \
+ doubletriggerfilter.cc \
dgxmlparser.cc \
drumgizmo.cc \
drumgizmoconf.cc \
@@ -95,6 +96,7 @@ EXTRA_DIST = \
cpp11fix.h \
dgxmlparser.h \
domloader.h \
+ doubletriggerfilter.h \
drumgizmo.h \
drumgizmoconf.h \
drumkit.h \
diff --git a/src/doubletriggerfilter.cc b/src/doubletriggerfilter.cc
new file mode 100644
index 0000000..77ba02d
--- /dev/null
+++ b/src/doubletriggerfilter.cc
@@ -0,0 +1,75 @@
+/* -*- Mode: c++ -*- */
+/***************************************************************************
+ * doubletriggerfilter.cc
+ *
+ * Fri Jun 5 18:26:32 CEST 2020
+ * Copyright 2020 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 "doubletriggerfilter.h"
+
+#include "latencyfilter.h"
+
+#include <cmath>
+#include <hugin.hpp>
+
+#include "settings.h"
+#include "random.h"
+
+DoubleTriggerFilter::DoubleTriggerFilter(Settings& settings)
+ : settings(settings)
+{
+ lastStrokes.resize(127, 0.0); // initialise to all zeros
+}
+
+template<typename T1, typename T2>
+static T1 getDistanceSamples(T1 min_dist_ms, T2 samplerate)
+{
+ return min_dist_ms * samplerate / 1000.;
+}
+
+bool DoubleTriggerFilter::filter(event_t& event, std::size_t pos)
+{
+ auto enabled = true;//settings.enable_latency_modifier.load();
+ auto min_dist_ms = 25.0;//settings.latency_max_ms.load();
+ auto samplerate = settings.samplerate.load();
+
+ if(!enabled)
+ {
+ return true;
+ }
+
+ auto min_dist = getDistanceSamples(min_dist_ms, samplerate);
+ double note_pos = pos + event.offset;
+ if(event.instrument >= lastStrokes.size())
+ {
+ lastStrokes.resize(event.instrument, 0.0); // expand and initialise to zeros
+ }
+
+ auto lastStroke = lastStrokes[event.instrument];
+ if((note_pos - lastStroke) > min_dist)
+ {
+ lastStrokes[event.instrument] = note_pos;
+ return true;
+ }
+
+ return false;
+}
diff --git a/src/doubletriggerfilter.h b/src/doubletriggerfilter.h
new file mode 100644
index 0000000..226bc2b
--- /dev/null
+++ b/src/doubletriggerfilter.h
@@ -0,0 +1,46 @@
+/* -*- Mode: c++ -*- */
+/***************************************************************************
+ * doubletriggerfilter.h
+ *
+ * Fri Jun 5 18:26:32 CEST 2020
+ * Copyright 2020 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 <vector>
+
+#include "inputfilter.h"
+
+struct Settings;
+
+class DoubleTriggerFilter
+ : public InputFilter
+{
+public:
+ DoubleTriggerFilter(Settings& settings);
+
+ bool filter(event_t& events, std::size_t pos) override;
+
+private:
+ Settings& settings;
+ std::vector<double> lastStrokes;
+};
diff --git a/src/inputprocessor.cc b/src/inputprocessor.cc
index 2da5dbc..dcbc283 100644
--- a/src/inputprocessor.cc
+++ b/src/inputprocessor.cc
@@ -36,6 +36,7 @@
#include "powermapfilter.h"
#include "staminafilter.h"
#include "velocityfilter.h"
+#include "doubletriggerfilter.h"
#include "cpp11fix.h"
@@ -88,6 +89,7 @@ InputProcessor::InputProcessor(Settings& settings,
, settings(settings)
{
// Build filter list
+ filters.emplace_back(std::make_unique<DoubleTriggerFilter>(settings));
filters.emplace_back(std::make_unique<PowermapFilter>(settings));
filters.emplace_back(std::make_unique<VelocityStorer>(original_velocity));
filters.emplace_back(std::make_unique<StaminaFilter>(settings));