From 1671ee67a4d868811b3d3b5652b991d383a13679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Nusser?= Date: Sat, 2 May 2020 12:56:48 +0200 Subject: Add powermap filter to the input processor and make sure that velocity visualizer is not affected but it. --- src/Makefile.am | 2 ++ src/inputprocessor.cc | 51 +++++++++++++++++++++++++++++++++++++++++++----- src/inputprocessor.h | 1 + src/powermapfilter.cc | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/powermapfilter.h | 47 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 src/powermapfilter.cc create mode 100644 src/powermapfilter.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index 09df750..56e06b4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -59,6 +59,7 @@ libdg_la_SOURCES = \ path.cc \ powerlist.cc \ powermap.cc \ + powermapfilter.cc \ random.cc \ sample.cc \ sample_selection.cc \ @@ -115,6 +116,7 @@ EXTRA_DIST = \ platform.h \ powerlist.h \ powermap.h \ + powermapfilter.h \ random.h \ range.h \ rangemap.h \ diff --git a/src/inputprocessor.cc b/src/inputprocessor.cc index 6249c5b..2da5dbc 100644 --- a/src/inputprocessor.cc +++ b/src/inputprocessor.cc @@ -32,12 +32,53 @@ #include "instrument.h" -#include "staminafilter.h" #include "latencyfilter.h" +#include "powermapfilter.h" +#include "staminafilter.h" #include "velocityfilter.h" #include "cpp11fix.h" +class VelocityStorer + : public InputFilter +{ +public: + VelocityStorer(float& original_velocity) + : original_velocity(original_velocity) + { + } + + bool filter(event_t& event, std::size_t pos) override + { + original_velocity = event.velocity; + return true; + } + +private: + float& original_velocity; +}; + +class Reporter + : public InputFilter +{ +public: + Reporter(Settings& settings, float& original_velocity) + : settings(settings) + , original_velocity(original_velocity) + { + } + + bool filter(event_t& event, std::size_t pos) override + { + settings.velocity_modifier_current.store(event.velocity / original_velocity); + return true; + } + +private: + Settings& settings; + float& original_velocity; +}; + InputProcessor::InputProcessor(Settings& settings, DrumKit& kit, EventsDS& events_ds, @@ -47,9 +88,12 @@ InputProcessor::InputProcessor(Settings& settings, , settings(settings) { // Build filter list + filters.emplace_back(std::make_unique(settings)); + filters.emplace_back(std::make_unique(original_velocity)); filters.emplace_back(std::make_unique(settings)); filters.emplace_back(std::make_unique(settings, random)); filters.emplace_back(std::make_unique(settings, random)); + filters.emplace_back(std::make_unique(settings, original_velocity)); } bool InputProcessor::process(std::vector& events, @@ -178,7 +222,7 @@ bool InputProcessor::processOnset(event_t& event, std::size_t pos, return false; } - auto const original_level = event.velocity; + original_velocity = event.velocity; for(auto& filter : filters) { // This line might change the 'event' variable @@ -208,9 +252,6 @@ bool InputProcessor::processOnset(event_t& event, std::size_t pos, return false; } - auto const selected_level = (sample->getPower() - power_min)/power_span; - settings.velocity_modifier_current.store(selected_level/original_level); - events_ds.startAddingNewGroup(instrument_id); for(Channel& ch: kit.channels) { diff --git a/src/inputprocessor.h b/src/inputprocessor.h index 546f348..3c2cd5a 100644 --- a/src/inputprocessor.h +++ b/src/inputprocessor.h @@ -67,4 +67,5 @@ private: std::vector> filters; Settings& settings; + float original_velocity{0.0f}; }; diff --git a/src/powermapfilter.cc b/src/powermapfilter.cc new file mode 100644 index 0000000..45df51e --- /dev/null +++ b/src/powermapfilter.cc @@ -0,0 +1,54 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + * powermapfilter.cc + * + * Mon Apr 20 23:28:12 CEST 2020 + * Copyright 2020 André Nusser + * andre.nusser@googlemail.com + ****************************************************************************/ + +/* + * 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 "powermapfilter.h" + +#include "settings.h" + +PowermapFilter::PowermapFilter(Settings& settings) + : settings(settings) +{ +} + +bool PowermapFilter::filter(event_t& event, size_t pos) +{ + // the position is irrelevant for this filter + (void) pos; + + settings.powermap_input.store(event.velocity); + if (settings.enable_powermap.load()) + { + powermap.setFixed0({settings.powermap_fixed0_x.load(), settings.powermap_fixed0_y.load()}); + powermap.setFixed1({settings.powermap_fixed1_x.load(), settings.powermap_fixed1_y.load()}); + powermap.setFixed2({settings.powermap_fixed2_x.load(), settings.powermap_fixed2_y.load()}); + powermap.setShelf(settings.powermap_shelf.load()); + + event.velocity = powermap.map(event.velocity); + } + settings.powermap_output.store(event.velocity); + + return true; +} diff --git a/src/powermapfilter.h b/src/powermapfilter.h new file mode 100644 index 0000000..263f809 --- /dev/null +++ b/src/powermapfilter.h @@ -0,0 +1,47 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + * powermapfilter.h + * + * Mon Apr 20 23:28:12 CEST 2020 + * Copyright 2020 André Nusser + * andre.nusser@googlemail.com + ****************************************************************************/ + +/* + * 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 "inputfilter.h" +#include "powermap.h" + +struct Settings; + +class PowermapFilter + : public InputFilter +{ +public: + PowermapFilter(Settings& settings); + + bool filter(event_t& event, std::size_t pos) override; + + // Note getLatency not overloaded because this filter doesn't add latency. + +private: + Settings& settings; + Powermap powermap; +}; -- cgit v1.2.3