From 1cc50cff638edbb159ee6dda6a8bf67c78281330 Mon Sep 17 00:00:00 2001 From: Johan Berglund Date: Mon, 15 Jul 2019 13:46:34 +0200 Subject: [PATCH] Added secondary breath CC setting (free 1-127) with a rise multiplier to make this CC rise faster than primary CC, for example to get a fast rising VCA control together with a less steep VCF slope. Changed portamento sensor name to BITE. Put SNS dots for MPR121 and Teensy touch keys on separate rows to avoid blanking when redrawn. Note: Update resets to factory settings. --- NuEVI/NuEVI.ino | 20 +++++++++++++++++--- NuEVI/adjustmenu.cpp | 7 +++---- NuEVI/config.h | 2 +- NuEVI/globals.h | 4 +++- NuEVI/menu.cpp | 34 +++++++++++++++++++++++++++++++--- NuEVI/settings.h | 6 +++++- 6 files changed, 60 insertions(+), 13 deletions(-) diff --git a/NuEVI/NuEVI.ino b/NuEVI/NuEVI.ino index 55378eb..5eb6ee2 100644 --- a/NuEVI/NuEVI.ino +++ b/NuEVI/NuEVI.ino @@ -52,6 +52,8 @@ unsigned short ctouchThrVal;// = 120; unsigned short transpose; unsigned short MIDIchannel; unsigned short breathCC; // OFF:MW:BR:VL:EX:MW+:BR+:VL+:EX+:CF +unsigned short breathCC2; // OFF:1-127 +unsigned short breathCC2Rise; // 1X:2X:3X:4X:5X unsigned short breathAT; unsigned short velocity; unsigned short portamento;// switching on cc65? just cc5 enabled? SW:ON:OFF @@ -87,7 +89,7 @@ uint16_t specialKeyEnable = 0; int touch_Thr = 1300; -byte ccList[11] = {0,1,2,7,11,1,2,7,11,74,20}; // OFF, Modulation, Breath, Volume, Expression (then same sent in hires), CC74 (cutoff/brightness), CC20 +byte ccList[13] = {0,1,2,7,11,19,1,2,7,11,19,74,20}; // OFF, Modulation, Breath, Volume, Expression, Sirin Cutoff (then same sent in hires), CC74 (cutoff/brightness), CC20 (UNO Cutoff) int pbDepthList[13] = {8192,8192,4096,2731,2048,1638,1365,1170,1024,910,819,744,683}; @@ -120,6 +122,7 @@ byte slowMidi = 0; int breathLevel=0; // breath level (smoothed) not mapped to CC value int oldbreath=0; +int oldbreathcc2=0; unsigned int oldbreathhires=0; float filterFreq = 30.0; @@ -304,6 +307,8 @@ void setup() { writeSetting(VIB_RETN_ADDR,VIB_RETN_FACTORY); writeSetting(VIB_SQUELCH_ADDR,VIB_SQUELCH_FACTORY); writeSetting(VIB_DIRECTION_ADDR,VIB_DIRECTION_FACTORY); + writeSetting(BREATH_CC2_ADDR,BREATH_CC2_FACTORY); + writeSetting(BREATH_CC2_RISE_ADDR,BREATH_CC2_RISE_FACTORY); } // read settings from EEPROM breathThrVal = readSetting(BREATH_THR_ADDR); @@ -349,6 +354,8 @@ void setup() { vibRetn = readSetting(VIB_RETN_ADDR); vibSquelch = readSetting(VIB_SQUELCH_ADDR); vibDirection = readSetting(VIB_DIRECTION_ADDR); + breathCC2 = readSetting(BREATH_CC2_ADDR); + breathCC2Rise = readSetting(BREATH_CC2_RISE_ADDR); legacy = dipSwBits & (1<<1); legacyBrAct = dipSwBits & (1<<2); @@ -897,7 +904,7 @@ void statusLEDs() { //************************************************************** void breath() { - int breathCCval, breathCCvalFine; + int breathCCval, breathCCvalFine,breathCC2val; unsigned int breathCCvalHires; breathLevel = constrain(pressureSensor, breathThrVal, breathMaxVal); //breathLevel = breathLevel*0.6+pressureSensor*0.4; // smoothing of breathLevel value @@ -905,6 +912,7 @@ void breath() { breathCCvalHires = breathCurve(map(constrain(breathLevel, breathThrVal, breathMaxVal), breathThrVal, breathMaxVal, 0, 16383)); breathCCval = (breathCCvalHires >> 7) & 0x007F; breathCCvalFine = breathCCvalHires & 0x007F; + breathCC2val = constrain(breathCCval*breathCC2Rise,0,127); if (breathCCval != oldbreath) { // only send midi data if breath has changed from previous value if (breathCC) { @@ -919,11 +927,17 @@ void breath() { } if (breathCCvalHires != oldbreathhires) { - if ((breathCC > 4) && (breathCC < 9)) { // send high resolution midi + if ((breathCC > 5) && (breathCC < 11)) { // send high resolution midi midiSendControlChange(ccList[breathCC] + 32, breathCCvalFine); } oldbreathhires = breathCCvalHires; } + if (breathCC2val != oldbreathcc2){ + if (breathCC2 && (breathCC2 != ccList[breathCC])){ + midiSendControlChange(breathCC2, breathCC2val); + } + oldbreathcc2 = breathCC2val; + } } //************************************************************** diff --git a/NuEVI/adjustmenu.cpp b/NuEVI/adjustmenu.cpp index 23ceb6d..55ec3f7 100644 --- a/NuEVI/adjustmenu.cpp +++ b/NuEVI/adjustmenu.cpp @@ -52,7 +52,7 @@ static void portamentoSave(const AdjustMenuEntry& e) { } const AdjustMenuEntry portamentoAdjustMenu = { - "PORTAMENTO", + "BITE", { { &portamThrVal, portamLoLimit, portamHiLimit }, { &portamMaxVal, portamLoLimit, portamHiLimit } @@ -226,10 +226,10 @@ void plotSensorPixels(){ redraw = updateSensorPixel(pos, -1); } else if(adjustOption == 4) { - display.drawLine(28,38,118,38,BLACK); + display.drawLine(28,39,118,39,BLACK); for (byte i=0; i<12; i++){ int pos = map(constrain(touchSensor.filteredData(i), ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); - display.drawPixel(pos, 38, WHITE); + display.drawPixel(pos, 39, WHITE); } int posRead = map(touchRead(halfPitchBendKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); @@ -371,4 +371,3 @@ int updateAdjustMenu(uint32_t timeNow, KeyState &input, bool firstRun, bool draw return result; } - diff --git a/NuEVI/config.h b/NuEVI/config.h index ace77cf..6255eeb 100644 --- a/NuEVI/config.h +++ b/NuEVI/config.h @@ -5,7 +5,7 @@ // Compile options, comment/uncomment to change -#define FIRMWARE_VERSION "1.3.7" // FIRMWARE VERSION NUMBER HERE <<<<<<<<<<<<<<<<<<<<<<< +#define FIRMWARE_VERSION "1.3.8" // FIRMWARE VERSION NUMBER HERE <<<<<<<<<<<<<<<<<<<<<<< //#define CASSIDY diff --git a/NuEVI/globals.h b/NuEVI/globals.h index da5c789..b61882b 100644 --- a/NuEVI/globals.h +++ b/NuEVI/globals.h @@ -40,7 +40,9 @@ extern unsigned short extracMaxVal; extern unsigned short ctouchThrVal; extern unsigned short transpose; extern unsigned short MIDIchannel; -extern unsigned short breathCC; // OFF:MW:BR:VL:EX:MW+:BR+:VL+:EX+:CF +extern unsigned short breathCC; // OFF:MW:BR:VL:EX:SR:MW+:BR+:VL+:EX+:SR+:CF:UNO +extern unsigned short breathCC2; // OFF:1-127 +extern unsigned short breathCC2Rise; // 1X:2X:3X:4X:5X extern unsigned short breathAT; extern unsigned short velocity; extern unsigned short portamento;// switching on cc65? just cc5 enabled? SW:ON:OFF diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 9bcd67a..bbfd777 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -641,10 +641,10 @@ const MenuPage rotatorMenuPage = { //*********************************************************** // Breath menu const MenuEntrySub breathCCMenu = { - MenuType::ESub, "BREATH CC", "BREATH CC", &breathCC, 0, 10, MenuEntryFlags::EMenuEntryWrap, + MenuType::ESub, "BRTH CC1", "BRTH CC1", &breathCC, 0, 12, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused, char* out, const char** __unused unit) { - const char* breathCCMenuLabels[] = { "OFF", "MW", "BR", "VL", "EX", "MW+", - "BR+", "VL+", "EX+", "CF", "20" }; + const char* breathCCMenuLabels[] = { "OFF", "MW", "BR", "VL", "EX","SR", "MW+", + "BR+", "VL+", "EX+", "SR+", "CF", "UNO" }; strncpy(out, breathCCMenuLabels[breathCC], 4); }, [](const MenuEntrySub & __unused sub){ @@ -656,6 +656,32 @@ const MenuEntrySub breathCCMenu = { , nullptr }; +const MenuEntrySub breathCC2Menu = { + MenuType::ESub, "BRTH CC2", "BRTH CC2", &breathCC2, 0, 127, MenuEntryFlags::EMenuEntryWrap, + [](SubMenuRef __unused, char* out, const char** __unused unit) { + if(breathCC2) numToString(breathCC2, out); + else strncpy(out, "OFF", 4); + }, + [](const MenuEntrySub & __unused sub){ + if (readSetting(BREATH_CC2_ADDR) != breathCC2) { + writeSetting(BREATH_CC2_ADDR,breathCC2); + midiReset(); + } + } + , nullptr +}; + +const MenuEntrySub breathCC2RiseMenu = { + MenuType::ESub, "CC2 RISE", "CC2 RISE", &breathCC2Rise, 1, 10, MenuEntryFlags::EMenuEntryWrap, + [](SubMenuRef __unused, char *out, const char** label) { + numToString(breathCC2Rise, out); + *label = "X"; + }, + [](const MenuEntrySub & __unused sub) { writeSetting(BREATH_CC2_RISE_ADDR,breathCC2Rise); } + , nullptr +}; + + const MenuEntrySub breathATMenu = { MenuType::ESub, "BREATH AT", "BREATH AT", &breathAT, 0, 1, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused, char* out, const char ** __unused unit) { @@ -726,6 +752,8 @@ const MenuEntrySub velBiasMenu = { const MenuEntry* breathMenuEntries[] = { (MenuEntry*)&breathCCMenu, + (MenuEntry*)&breathCC2Menu, + (MenuEntry*)&breathCC2RiseMenu, (MenuEntry*)&breathATMenu, (MenuEntry*)&velocityMenu, (MenuEntry*)&curveMenu, diff --git a/NuEVI/settings.h b/NuEVI/settings.h index 112cad3..3305715 100644 --- a/NuEVI/settings.h +++ b/NuEVI/settings.h @@ -49,9 +49,11 @@ #define VIB_RETN_ADDR 82 #define VIB_SQUELCH_ADDR 84 #define VIB_DIRECTION_ADDR 86 +#define BREATH_CC2_ADDR 88 +#define BREATH_CC2_RISE_ADDR 90 //"factory" values for settings -#define VERSION 31 +#define VERSION 32 #define BREATH_THR_FACTORY 1400 #define BREATH_MAX_FACTORY 4000 #define PORTAM_THR_FACTORY 2600 @@ -90,5 +92,7 @@ #define VIB_RETN_FACTORY 2 // 0, no return, 1 slow return, higher faster return #define VIB_SQUELCH_FACTORY 15 // 0 to 30, vib signal squelch #define VIB_DIRECTION_FACTORY 0 +#define BREATH_CC2_FACTORY 0 //OFF,1-127 +#define BREATH_CC2_RISE_FACTORY 1 #endif