From 50bf217c8d519e29613e0f0d653b631105b348a8 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 5 Jun 2020 18:55:36 +0200 Subject: Double trigger filter. --- plugin/Makefile.mingw32.in | 1 + src/Makefile.am | 2 ++ src/doubletriggerfilter.cc | 75 ++++++++++++++++++++++++++++++++++++++++++++++ src/doubletriggerfilter.h | 46 ++++++++++++++++++++++++++++ src/inputprocessor.cc | 2 ++ 5 files changed, 126 insertions(+) create mode 100644 src/doubletriggerfilter.cc create mode 100644 src/doubletriggerfilter.h 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 +#include + +#include "settings.h" +#include "random.h" + +DoubleTriggerFilter::DoubleTriggerFilter(Settings& settings) + : settings(settings) +{ + lastStrokes.resize(127, 0.0); // initialise to all zeros +} + +template +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 + +#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 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(settings)); filters.emplace_back(std::make_unique(settings)); filters.emplace_back(std::make_unique(original_velocity)); filters.emplace_back(std::make_unique(settings)); -- cgit v1.2.3