diff --git a/NuEVI/NuEVI.ino b/NuEVI/NuEVI.ino index 1cc0997..99c9fed 100644 --- a/NuEVI/NuEVI.ino +++ b/NuEVI/NuEVI.ino @@ -116,8 +116,8 @@ unsigned short vibDirection = DNWD; //direction of first vibrato wave UPWD or DN unsigned short vibSensBite = 2; // vibrato sensitivity (bite) unsigned short vibSquelchBite = 12; //vibrato signal squelch (bite) unsigned short vibControl = 0; -unsigned short biteControl = 0; // OFF, VIB, GLD, CC -unsigned short leverControl = 0; // OFF, VIB, GLD, CC +unsigned short biteControl = 0; // OFF, VIB, GLD, CC, VIB+, GLD+, VG, VG+ +unsigned short leverControl = 0; // OFF, VIB, GLD, CC, VIB+, GLD+, VG, VG+ unsigned short biteCC = 0; // 0 - 127 unsigned short leverCC = 0; // 0 -127 @@ -604,6 +604,8 @@ IntervalTimer cvTimer; bool configManagementMode = false; bool i2cScan = false; +byte kccKeys[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +byte lastKccKeys[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //_______________________________________________________________________________________________ SETUP @@ -1270,6 +1272,7 @@ void loop() { extraController(); biteCC_(); leverCC_(); + keys2CCs(); ccSendTime = currentTime; } if (currentTime - ccSendTime2 > CC_INTERVAL2) { @@ -1544,7 +1547,7 @@ void pitch_bend() { vibMax = vibMaxList[vibSens - 1]; vibMaxBite = vibMaxBiteList[vibSensBite - 1]; - if (1 == biteControl){ //bite vibrato + if (1 == biteControl || 4 == biteControl || 6 == biteControl || 7 == biteControl){ //bite vibrato if (biteJumper){ //PBITE (if pulled low with jumper, or NuRAD compile, use pressure sensor instead of capacitive bite sensor) vibReadBite = analogRead(bitePressurePin); // alternative kind bite sensor (air pressure tube and sensor) PBITE } else { @@ -1566,7 +1569,7 @@ void pitch_bend() { vibSignal = vibSignal / 2; } } - if (1 == leverControl) { //lever vibrato + if (1 == leverControl || 4 == leverControl || 6 == leverControl || 7 == leverControl) { //lever vibrato vibRead = touchRead(vibratoPin); // SENSOR PIN 15 - built in var cap if (vibRead < vibThr) { if (UPWD == vibDirection) { @@ -1754,7 +1757,6 @@ void extraController() { CC2sw = true; CC1sw = true; } - if ((harmSetting && (pinkySetting != ECH)) || ((pinkySetting == ECH) && pinkyKey)){ if (harmSelect < 4){ harmonics = map(constrain(exSensor, extracThrVal, extracMaxVal), extracThrVal, extracMaxVal, 0, harmSetting); @@ -1834,6 +1836,48 @@ void extraController() { //*********************************************************** +void keys2CCs() { + int i=0; + int pressed=0; + + if (pinkySetting == KCC) { + kccKeys[0] = RHs; + kccKeys[1] = RH1; + kccKeys[2] = RH2; + kccKeys[3] = RH3; + kccKeys[4] = RHp1; + kccKeys[5] = RHp2; + kccKeys[6] = RHp3; + kccKeys[7] = LHb; + kccKeys[8] = LH1; + kccKeys[9] = LH2; + kccKeys[10] = LH3; + kccKeys[11] = LHp1; + kccKeys[12] = LHp2; + kccKeys[13] = LHp3; + kccKeys[14] = specialKey; + + for (i=0; i<15; i++) { + if (kccKeys[i]) pressed++; + if (pinkyKey && lastPinkyKey && kccKeys[i] && !lastKccKeys[i]) // new key press detected + midiSendControlChange((levelCC+i+1)%128, 127); + if (pinkyKey && !kccKeys[i] && lastKccKeys[i]) // new key release detected + midiSendControlChange((levelCC+i+1)%128, 0); + if (pinkyKey) + lastKccKeys[i] = kccKeys[i]; // track keys state for next pass + else // or if MOD released + lastKccKeys[i] = 0; // reset all + } + if (pinkyKey && !lastPinkyKey && !pressed) // new MOD press event and no other RH/LH + midiSendControlChange(levelCC, 127); + if (!pinkyKey && lastPinkyKey && !pressed) // MOD released & no other keys held + midiSendControlChange(levelCC, 0); + lastPinkyKey = pinkyKey; + } +} + +//*********************************************************** + void portamento_() { int portSumCC = 0; if (pinkySetting == GLD){ @@ -1842,7 +1886,7 @@ void portamento_() { if (glideLockOn){ if (portamento) portSumCC += 127; } - if (2 == biteControl) { + if (2 == biteControl || 5 == biteControl || 6 == biteControl || 7 == biteControl) { // Portamento is controlled with the bite sensor in the mouthpiece if (biteJumper) { //PBITE (if pulled low with jumper or if on a NuRAD, use pressure sensor instead of capacitive bite sensor) biteSensor=analogRead(bitePressurePin); // alternative kind bite sensor (air pressure tube and sensor) PBITE @@ -1853,7 +1897,7 @@ void portamento_() { portSumCC += map(constrain(biteSensor, portamThrVal, portamMaxVal), portamThrVal, portamMaxVal, 0, 127); } } - if (2 == leverControl) { + if (2 == leverControl || 5 == leverControl || 6 == leverControl || 7 == leverControl) { // Portamento is controlled with thumb lever leverPortRead = touchRead(vibratoPin); #if defined(SEAMUS) @@ -1922,7 +1966,7 @@ void portOff() { void biteCC_() { int biteCClevel = 0; - if (3 == biteControl){ + if (3 == biteControl || 4 == biteControl || 5 == biteControl || 7 == biteControl){ if (biteJumper) { //PBITE (if pulled low with jumper or if on a NuRAD, use pressure sensor instead of capacitive bite sensor) biteSensor=analogRead(bitePressurePin); // alternative kind bite sensor (air pressure tube and sensor) PBITE } else { @@ -1941,7 +1985,7 @@ void biteCC_() { void leverCC_() { int leverCClevel = 0; - if (3 == leverControl){ + if (3 == leverControl || 4 == leverControl || 5 == leverControl || 7 == leverControl){ leverPortRead = touchRead(vibratoPin); if (((3000-leverPortRead) >= leverThrVal)) { // we are over the threshold, calculate CC value leverCClevel = map(constrain((3000-leverPortRead), leverThrVal, leverMaxVal), leverThrVal, leverMaxVal, 0, 127); diff --git a/NuEVI/globals.h b/NuEVI/globals.h index 42be5b0..48fff15 100644 --- a/NuEVI/globals.h +++ b/NuEVI/globals.h @@ -27,6 +27,7 @@ #define GLD 29 #define ECH 30 #define QTN 31 +#define KCC 32 #define MOD 13 @@ -126,8 +127,8 @@ extern unsigned short hmzKey; // 0-11 (0 is C) extern unsigned short hmzLimit; // 2-5 extern unsigned short otfKey; //OFF:ON extern unsigned short breathInterval; // 3-15 -extern unsigned short biteControl; // OFF, VIB, GLD, CC -extern unsigned short leverControl; // OFF, VIB, GLD, CC +extern unsigned short biteControl; // OFF, VIB, GLD, CC, VIB+, GLD+, VG, VG+ +extern unsigned short leverControl; // OFF, VIB, GLD, CC, VIB+, GLD+, VG, VG+ extern unsigned short biteCC; // 0 - 127 extern unsigned short leverCC; // 0 -127 extern unsigned short cvTune; // 1 - 199 representing -99 to +99 in menu (offset of 100 to keep postitive) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index c3ca379..afb664c 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -1548,10 +1548,10 @@ const MenuPage breathMenuPage = { // Control menu const MenuEntrySub biteCtlMenu = { - MenuType::ESub, "BITE CTL", "BITE DEST", &biteControl, 0, 3, MenuEntryFlags::EMenuEntryWrap, + MenuType::ESub, "BITE CTL", "BITE DEST", &biteControl, 0, 7, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused,char* out, const char ** __unused unit) { - const char* labs[] = { "OFF", "VIB", "GLD", "CC" }; - strncpy(out, labs[biteControl], 4); + const char* labs[] = { "OFF", "VIB", "GLD", "CC", "VIB+", "GLD+", "VG", "VG+" }; + strncpy(out, labs[biteControl], 5); }, [](SubMenuRef __unused sub) { writeSetting(BITECTL_ADDR,biteControl); } , nullptr @@ -1567,10 +1567,10 @@ const MenuEntrySub biteCCMenu = { }; const MenuEntrySub leverCtlMenu = { - MenuType::ESub, "LEVER CTL", "LEVER DEST", &leverControl, 0, 3, MenuEntryFlags::EMenuEntryWrap, + MenuType::ESub, "LEVER CTL", "LEVER DEST", &leverControl, 0, 7, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused,char* out, const char ** __unused unit) { - const char* labs[] = { "OFF", "VIB", "GLD", "CC" }; - strncpy(out, labs[leverControl], 4); + const char* labs[] = { "OFF", "VIB", "GLD", "CC", "VIB+", "GLD+", "VG", "VG+" }; + strncpy(out, labs[leverControl], 5); }, [](SubMenuRef __unused sub) { writeSetting(LEVERCTL_ADDR,leverControl); } , nullptr @@ -1689,11 +1689,11 @@ const MenuEntrySub deglitchMenu = { #if defined(NURAD) const MenuEntrySub pinkyMenu = { - MenuType::ESub, "MOD KEY", "MOD KEY", &pinkySetting, 0, 31, MenuEntryFlags::ENone, + MenuType::ESub, "MOD KEY", "MOD KEY", &pinkySetting, 0, 32, MenuEntryFlags::ENone, [](SubMenuRef __unused,char* textBuffer, const char** __unused unit) { #else const MenuEntrySub pinkyMenu = { - MenuType::ESub, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 31, MenuEntryFlags::ENone, + MenuType::ESub, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 32, MenuEntryFlags::ENone, [](SubMenuRef __unused,char* textBuffer, const char** __unused unit) { #endif if (pinkySetting == PBD) @@ -1712,6 +1712,8 @@ const MenuEntrySub pinkyMenu = { strncpy(textBuffer, "ECH", 4); else if (pinkySetting == QTN) strncpy(textBuffer, "QTN", 4); + else if (pinkySetting == KCC) + strncpy(textBuffer, "KCC", 4); else numToString(pinkySetting-12, textBuffer, true); }, diff --git a/NuEVI/settings.cpp b/NuEVI/settings.cpp index fd13084..fba77dc 100644 --- a/NuEVI/settings.cpp +++ b/NuEVI/settings.cpp @@ -215,7 +215,7 @@ void readEEPROM(const bool factoryReset) { curve = readSettingBounded(BREATHCURVE_ADDR, 0, 12, BREATHCURVE_FACTORY); velSmpDl = readSettingBounded(VEL_SMP_DL_ADDR, 0, 30, VEL_SMP_DL_FACTORY); velBias = readSettingBounded(VEL_BIAS_ADDR, 0, 9, VEL_BIAS_FACTORY); - pinkySetting = readSettingBounded(PINKY_KEY_ADDR, 0, 31, PINKY_KEY_FACTORY); + pinkySetting = readSettingBounded(PINKY_KEY_ADDR, 0, 32, PINKY_KEY_FACTORY); fastPatch[0] = readSettingBounded(FP1_ADDR, 0, 127, 0); fastPatch[1] = readSettingBounded(FP2_ADDR, 0, 127, 0); fastPatch[2] = readSettingBounded(FP3_ADDR, 0, 127, 0); @@ -276,8 +276,8 @@ void readEEPROM(const bool factoryReset) { leverMaxVal = readSettingBounded(LEVER_MAX_ADDR, leverLoLimit, leverHiLimit, LEVER_MAX_FACTORY); brHarmSetting = readSettingBounded(BRHARMSET_ADDR, 0, 6, BRHARMSET_FACTORY); brHarmSelect = readSettingBounded(BRHARMSEL_ADDR, 0, 3, BRHARMSEL_FACTORY); - biteControl = readSettingBounded(BITECTL_ADDR, 0, 3, BITECTL_FACTORY); - leverControl = readSettingBounded(LEVERCTL_ADDR, 0, 3, LEVERCTL_FACTORY); + biteControl = readSettingBounded(BITECTL_ADDR, 0, 7, BITECTL_FACTORY); + leverControl = readSettingBounded(LEVERCTL_ADDR, 0, 7, LEVERCTL_FACTORY); biteCC = readSettingBounded(BITECC_ADDR, 0, 127, BITECC_FACTORY); leverCC = readSettingBounded(LEVERCC_ADDR, 0, 127, LEVERCC_FACTORY); cvTune = readSettingBounded(CVTUNE_ADDR, 1, 199, CVTUNE_FACTORY);