From 7219872a147184bc6f7de52ac9d59f7549e88d0c Mon Sep 17 00:00:00 2001 From: Brian Hrebec Date: Sat, 9 Nov 2024 10:06:36 -0600 Subject: [PATCH] Added filter for select CC controls --- NuEVI/src/config.h | 4 ++-- NuEVI/src/hardware.cpp | 18 +++++++++--------- NuEVI/src/menu.cpp | 9 +++++++-- NuEVI/src/settings.cpp | 3 +++ NuEVI/src/settings.h | 5 +++-- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/NuEVI/src/config.h b/NuEVI/src/config.h index 7ac3188..39b00ad 100644 --- a/NuEVI/src/config.h +++ b/NuEVI/src/config.h @@ -33,8 +33,8 @@ #define BTN_VAL1 0x2 #define BTN_VAL2 0x4 #define BTN_PRESET 0x8 -#define KNOB_CURVE_THRESHOLD 100 -#define KNOB_CURVE_MULTIPLIER 5 +#define KNOB_CURVE_THRESHOLD 180 +#define KNOB_CURVE_MAX_MULTIPLIER 5 #define KNOB_DISPLAY_TIME 500 // Send breath CC data no more than every CC_BREATH_INTERVAL diff --git a/NuEVI/src/hardware.cpp b/NuEVI/src/hardware.cpp index 965737e..6b5b927 100644 --- a/NuEVI/src/hardware.cpp +++ b/NuEVI/src/hardware.cpp @@ -11,12 +11,8 @@ FilterOnePole breathAltFilter; FilterOnePole spikeFilter; FilterOnePole tiltFilter; FilterOnePole rollFilter; -FilterOnePole sliderFilterExtra; -FilterOnePole sliderFilterPB; -FilterOnePole sliderFilterLever; -float sliderMAExtra = 0.0; -float sliderMAPB = 0.0; -float sliderMALever = 0.0; +FilterOnePole leverFilter; +FilterOnePole biteFilter; Adafruit_MPR121 touchSensorKeys = Adafruit_MPR121(); Adafruit_MPR121 touchSensorRoller = Adafruit_MPR121(); @@ -54,6 +50,8 @@ void initHardware() { spikeFilter.setFilter(HIGHPASS, SPIKE_FILTER_FREQ, 0.0); // create a one pole (RC) lowpass filter tiltFilter.setFilter(LOWPASS, ICM_FILTER_FREQ, 0.0); // create a one pole (RC) lowpass filter rollFilter.setFilter(LOWPASS, ICM_FILTER_FREQ, 0.0); // create a one pole (RC) lowpass filter + leverFilter.setFilter(LOWPASS, FILTER_FREQ, 0.0); // create a one pole (RC) lowpass filter + biteFilter.setFilter(LOWPASS, FILTER_FREQ, 0.0); // create a one pole (RC) lowpass filter icmSensor.begin_I2C(ICM20948_I2CADDR_DEFAULT, &MainI2CBus); ledStrip.begin(); @@ -89,6 +87,8 @@ void updateFilters(preset_t &preset) { breathFilter.setFrequency(preset.breathFilterFreq); breathAltFilter.setFrequency(preset.breathFilterFreq); spikeFilter.setFrequency(preset.spikeFilterFreq); + leverFilter.setFrequency(preset.CCFilterFreq); + biteFilter.setFrequency(preset.CCFilterFreq); } /* @@ -145,7 +145,7 @@ int readKnob(uint8_t n) { lastOut = out; if (time - lastOutTime < KNOB_CURVE_THRESHOLD) { - out *= KNOB_CURVE_MULTIPLIER; + out *= constrain(KNOB_CURVE_THRESHOLD / time - lastOutTime, 1, KNOB_CURVE_MAX_MULTIPLIER); } lastOutTime = time; } @@ -213,10 +213,10 @@ int readRawControl(Control id) { a = readTouchRoller(extraPin); break; case CONTROL_BITE: - a = analogRead(bitePin); + a = biteFilter.input(analogRead(bitePin)); break; case CONTROL_LEVER: - a = analogRead(leverPin); + a = leverFilter.input(analogRead(leverPin)); break; case CONTROL_STICK_X: a = analogRead(stickXPin); diff --git a/NuEVI/src/menu.cpp b/NuEVI/src/menu.cpp index f368774..6833b6d 100644 --- a/NuEVI/src/menu.cpp +++ b/NuEVI/src/menu.cpp @@ -388,6 +388,9 @@ static void curveCustomDraw(size_t breathCurve) { const char* curveMenuLabels[] = { "-4", "-3", "-2", "-1", "LIN", "+1", "+2", "+3", "+4", "S1", "S2", "Z1", "Z2" }; if (breathCurve >= curves.size()) { + display.setCursor(125 - 3 * 6, 60 - 8); + display.setTextSize(0); + display.print("INVALID"); return; } @@ -1025,6 +1028,7 @@ PresetValueMenu<128, uint8_t> rollCCMenu("ROLL CC", &preset_t::icmRollCC, 0, 127 ChoiceMenu<4, ExtraControl> accelModeMenu("ACCEL MODE", &preset_t::icmAccelMode, { {OFF, VIBRATO, GLIDE, CC} }, { "OFF", "VIBRATO", "GLIDE", "CC" }); PresetValueMenu<128, uint8_t> accelCCMenu("ACCEL CC", &preset_t::icmAccelCC, 0, 127, true, CC_NAMES); PresetValueMenu<1, uint8_t> deglitchMenu("DEGLITCH", &preset_t::deglitch, 0, 70, true, { "OFF" }, "ms"); +PresetValueMenu<0, uint8_t> ccfilterMenu("AUXFILT CT", &preset_t::CCFilterFreq, 1, 200, false, {}, "hz"); PresetValueMenu<29, uint8_t> pinkyMenu("PINKY KEY", &preset_t::pinkySetting, 0, 29, true, { "-12", "-11", "-10", "-9", "-8", "-7", "-6", "-5", "-4", "-3", "-2", "-1", "PB/2", @@ -1095,7 +1099,7 @@ std::array breathMenuEntries = { }; SubMenu<11> breathMenu("BR SETUP", breathMenuEntries); -const std::array controlMenuEntries = { +const std::array controlMenuEntries = { &fingeringMenu, &polyMenu, &rollerMenu, @@ -1114,6 +1118,7 @@ const std::array controlMenuEntries = { &portMenu, &portLimitMenu, °litchMenu, + &ccfilterMenu, &pinkyMenu, &pitchBendMenu, &tiltModeMenu, @@ -1123,7 +1128,7 @@ const std::array controlMenuEntries = { &accelModeMenu, &accelCCMenu, }; -SubMenu<26> controlMenu("CTL SETUP", controlMenuEntries); +SubMenu<27> controlMenu("CTL SETUP", controlMenuEntries); const std::array vibratoMenuEntries = { &vibDepthMenu, diff --git a/NuEVI/src/settings.cpp b/NuEVI/src/settings.cpp index 55283b3..4a14fd2 100644 --- a/NuEVI/src/settings.cpp +++ b/NuEVI/src/settings.cpp @@ -350,6 +350,9 @@ void readEEPROM(const bool factoryReset, calibration_t &calibration) { if (settings_version < 6) { presets[i].noteMode = BREATH_TRIGGER; } + if (settings_version < 7) { + presets[i].CCFilterFreq = FILTER_FREQ; + } } writePresets(); diff --git a/NuEVI/src/settings.h b/NuEVI/src/settings.h index 59130d0..55ce024 100644 --- a/NuEVI/src/settings.h +++ b/NuEVI/src/settings.h @@ -5,7 +5,7 @@ #include "globals.h" -#define EEPROM_VERSION 6 +#define EEPROM_VERSION 7 #define EEPROM_VERSION_ADDR 0 #define SETTINGS_OFFSET 2 #define PRESET_MAX_SIZE 128 // Leave extra space for future settings @@ -107,8 +107,9 @@ struct preset_t { uint8_t stickXCC = 14; // stickX CC selection uint8_t stickYCC = 15; // stickY CC selection NoteMode noteMode = NoteMode::BREATH_TRIGGER; + uint8_t CCFilterFreq = 20; - uint8_t _reserved[76]; + uint8_t _reserved[75]; }; static_assert(sizeof(preset_t) == PRESET_MAX_SIZE, "preset_t must be 128 bytes");