Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 53 additions & 9 deletions NuEVI/NuEVI.ino
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -1270,6 +1272,7 @@ void loop() {
extraController();
biteCC_();
leverCC_();
keys2CCs();
ccSendTime = currentTime;
}
if (currentTime - ccSendTime2 > CC_INTERVAL2) {
Expand Down Expand Up @@ -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 {
Expand All @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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){
Expand All @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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 {
Expand All @@ -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);
Expand Down
5 changes: 3 additions & 2 deletions NuEVI/globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#define GLD 29
#define ECH 30
#define QTN 31
#define KCC 32

#define MOD 13

Expand Down Expand Up @@ -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)
Expand Down
18 changes: 10 additions & 8 deletions NuEVI/menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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);
},
Expand Down
6 changes: 3 additions & 3 deletions NuEVI/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down