Added filter for select CC controls

This commit is contained in:
Brian Hrebec 2024-11-09 10:06:36 -06:00
parent e3c91fa6ee
commit 7219872a14
5 changed files with 24 additions and 15 deletions

View file

@ -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

View file

@ -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);

View file

@ -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<MenuScreen *const, 11> breathMenuEntries = {
};
SubMenu<11> breathMenu("BR SETUP", breathMenuEntries);
const std::array<MenuScreen *const, 26> controlMenuEntries = {
const std::array<MenuScreen *const, 27> controlMenuEntries = {
&fingeringMenu,
&polyMenu,
&rollerMenu,
@ -1114,6 +1118,7 @@ const std::array<MenuScreen *const, 26> controlMenuEntries = {
&portMenu,
&portLimitMenu,
&deglitchMenu,
&ccfilterMenu,
&pinkyMenu,
&pitchBendMenu,
&tiltModeMenu,
@ -1123,7 +1128,7 @@ const std::array<MenuScreen *const, 26> controlMenuEntries = {
&accelModeMenu,
&accelCCMenu,
};
SubMenu<26> controlMenu("CTL SETUP", controlMenuEntries);
SubMenu<27> controlMenu("CTL SETUP", controlMenuEntries);
const std::array<MenuScreen *const, 5> vibratoMenuEntries = {
&vibDepthMenu,

View file

@ -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();

View file

@ -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");