diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2020-06-05 18:55:36 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2020-07-24 22:24:19 +0200 |
commit | 50bf217c8d519e29613e0f0d653b631105b348a8 (patch) | |
tree | 31256af05d33afee3da3d903eaed6df35f53e0d4 | |
parent | 773a6ce4d153c6ecc8fb5cf9b41bcf9f25144d7c (diff) |
Double trigger filter.doubletriggerfilter
-rw-r--r-- | plugin/Makefile.mingw32.in | 1 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/doubletriggerfilter.cc | 75 | ||||
-rw-r--r-- | src/doubletriggerfilter.h | 46 | ||||
-rw-r--r-- | src/inputprocessor.cc | 2 |
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)); |