Merge branch 'master' into sysex
This commit is contained in:
commit
75ee097857
8 changed files with 199 additions and 55 deletions
163
NuEVI/NuEVI.ino
163
NuEVI/NuEVI.ino
|
@ -66,10 +66,14 @@ unsigned short octave;
|
||||||
unsigned short curve;
|
unsigned short curve;
|
||||||
unsigned short velSmpDl; // 0-30 ms
|
unsigned short velSmpDl; // 0-30 ms
|
||||||
unsigned short velBias; // 0-9
|
unsigned short velBias; // 0-9
|
||||||
unsigned short pinkySetting; // 0 - 11 (QuickTranspose -12 to -1), 12 (pb/2), 13 - 24 (QuickTranspose +1 to +12)
|
unsigned short pinkySetting; // 0 - 11 (QuickTranspose -12 to -1), 12 (pb/2), 13 - 24 (QuickTranspose +1 to +12), 25 (EC2), 26 (ECSW), 27 (LVL), 28 (LVLP)
|
||||||
unsigned short dipSwBits; // virtual dip switch settings for special modes (work in progress)
|
unsigned short dipSwBits; // virtual dip switch settings for special modes (work in progress)
|
||||||
unsigned short priority; // mono priority for rotator chords
|
unsigned short priority; // mono priority for rotator chords
|
||||||
|
|
||||||
|
unsigned short extraCT2; // OFF:1-127
|
||||||
|
unsigned short levelCC; // 0-127
|
||||||
|
unsigned short levelVal; // 0-127
|
||||||
|
|
||||||
unsigned short vibSens = 2; // vibrato sensitivity
|
unsigned short vibSens = 2; // vibrato sensitivity
|
||||||
unsigned short vibRetn = 2; // vibrato return speed
|
unsigned short vibRetn = 2; // vibrato return speed
|
||||||
unsigned short vibSquelch = 12; //vibrato signal squelch
|
unsigned short vibSquelch = 12; //vibrato signal squelch
|
||||||
|
@ -110,6 +114,7 @@ static const unsigned long pixelUpdateInterval = 80;
|
||||||
|
|
||||||
unsigned long lastDeglitchTime = 0; // The last time the fingering was changed
|
unsigned long lastDeglitchTime = 0; // The last time the fingering was changed
|
||||||
unsigned long ccSendTime = 0L; // The last time we sent CC values
|
unsigned long ccSendTime = 0L; // The last time we sent CC values
|
||||||
|
unsigned long ccBreathSendTime = 0L; // The last time we sent breath CC values
|
||||||
unsigned long breath_on_time = 0L; // Time when breath sensor value went over the ON threshold
|
unsigned long breath_on_time = 0L; // Time when breath sensor value went over the ON threshold
|
||||||
|
|
||||||
int lastFingering = 0; // Keep the last fingering value for debouncing
|
int lastFingering = 0; // Keep the last fingering value for debouncing
|
||||||
|
@ -158,7 +163,7 @@ int targetPitch;
|
||||||
int exSensor=0;
|
int exSensor=0;
|
||||||
byte extracIsOn=0;
|
byte extracIsOn=0;
|
||||||
int oldextrac=0;
|
int oldextrac=0;
|
||||||
int lastEx=0;
|
int oldextrac2=0;
|
||||||
|
|
||||||
int pitchBend=8192;
|
int pitchBend=8192;
|
||||||
int oldpb=8192;
|
int oldpb=8192;
|
||||||
|
@ -169,6 +174,7 @@ byte vibLedOff = 0;
|
||||||
byte oldpkey = 0;
|
byte oldpkey = 0;
|
||||||
|
|
||||||
static const float vibDepth[10] = {0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.40,0.45}; // max pitch bend values (+/-) for the vibrato settings
|
static const float vibDepth[10] = {0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.40,0.45}; // max pitch bend values (+/-) for the vibrato settings
|
||||||
|
static const short vibMaxBiteList[17] = {1600,1400,1200,1000,900,800,700,600,500,400,300,250,200,150,100,50,25};
|
||||||
static const short vibMaxList[12] = {300,275,250,225,200,175,150,125,100,75,50,25};
|
static const short vibMaxList[12] = {300,275,250,225,200,175,150,125,100,75,50,25};
|
||||||
|
|
||||||
static const unsigned short curveM4[] = {0,4300,7000,8700,9900,10950,11900,12600,13300,13900,14500,15000,15450,15700,16000,16250,16383};
|
static const unsigned short curveM4[] = {0,4300,7000,8700,9900,10950,11900,12600,13300,13900,14500,15000,15450,15700,16000,16250,16383};
|
||||||
|
@ -226,6 +232,7 @@ byte halfPitchBendKey;
|
||||||
byte specialKey;
|
byte specialKey;
|
||||||
byte pinkyKey;
|
byte pinkyKey;
|
||||||
byte lastSpecialKey = 0;
|
byte lastSpecialKey = 0;
|
||||||
|
byte lastPinkyKey = 0;
|
||||||
byte pitchlatch;
|
byte pitchlatch;
|
||||||
int reverb;
|
int reverb;
|
||||||
|
|
||||||
|
@ -327,6 +334,10 @@ void setup() {
|
||||||
doPatchUpdate=1;
|
doPatchUpdate=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((pinkySetting == LVLP) && levelCC){
|
||||||
|
midiSendControlChange(levelCC, levelVal);
|
||||||
|
}
|
||||||
|
|
||||||
activeMIDIchannel = MIDIchannel;
|
activeMIDIchannel = MIDIchannel;
|
||||||
midiInitialize(MIDIchannel);
|
midiInitialize(MIDIchannel);
|
||||||
|
|
||||||
|
@ -475,9 +486,7 @@ void loop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (analogRead(breathSensorPin) > (breathCalZero - 800)) programonce = false;
|
if (analogRead(breathSensorPin) > (breathCalZero - 800)) programonce = false;
|
||||||
|
if (specialKeyEnable) {
|
||||||
if (specialKeyEnable) {
|
|
||||||
specialKey = (touchRead(specialKeyPin) > touch_Thr); //S2 on pcb
|
|
||||||
if (lastSpecialKey != specialKey) {
|
if (lastSpecialKey != specialKey) {
|
||||||
if (specialKey) {
|
if (specialKey) {
|
||||||
// special key just pressed, check other keys
|
// special key just pressed, check other keys
|
||||||
|
@ -524,6 +533,23 @@ void loop() {
|
||||||
parallelChord = 0;
|
parallelChord = 0;
|
||||||
subOctaveDouble = 0;
|
subOctaveDouble = 0;
|
||||||
}
|
}
|
||||||
|
if ((pinkySetting == LVL) || (pinkySetting == LVLP)){
|
||||||
|
if (pinkyKey){
|
||||||
|
ledMeter(levelVal);
|
||||||
|
if (K5 && (levelVal < 127)){
|
||||||
|
levelVal++;
|
||||||
|
if (levelCC) midiSendControlChange(levelCC, levelVal);
|
||||||
|
else midiSendAfterTouch(levelVal);
|
||||||
|
} else if (K1 && (levelVal > 0)){
|
||||||
|
levelVal--;
|
||||||
|
if (levelCC) midiSendControlChange(levelCC, levelVal);
|
||||||
|
else midiSendAfterTouch(levelVal);
|
||||||
|
}
|
||||||
|
} else if (lastPinkyKey){
|
||||||
|
writeSetting(LEVEL_VAL_ADDR,levelVal);
|
||||||
|
}
|
||||||
|
lastPinkyKey = pinkyKey;
|
||||||
|
}
|
||||||
} else if (mainState == RISE_WAIT) {
|
} else if (mainState == RISE_WAIT) {
|
||||||
if ((pressureSensor > breathThrVal) || gateOpen) {
|
if ((pressureSensor > breathThrVal) || gateOpen) {
|
||||||
// Has enough time passed for us to collect our second
|
// Has enough time passed for us to collect our second
|
||||||
|
@ -691,19 +717,20 @@ void loop() {
|
||||||
if (pressureSensor > breathThrVal) cursorBlinkTime = millis(); // keep display from updating with cursor blinking if breath is over thr
|
if (pressureSensor > breathThrVal) cursorBlinkTime = millis(); // keep display from updating with cursor blinking if breath is over thr
|
||||||
}
|
}
|
||||||
// Is it time to send more CC data?
|
// Is it time to send more CC data?
|
||||||
|
if (millis() - ccBreathSendTime > (CC_BREATH_INTERVAL*(slowMidi+1))){
|
||||||
|
breath();
|
||||||
|
ccBreathSendTime = millis();
|
||||||
|
}
|
||||||
if (millis() - ccSendTime > CC_INTERVAL) {
|
if (millis() - ccSendTime > CC_INTERVAL) {
|
||||||
// deal with Breath, Pitch Bend, Modulation, etc.
|
// deal with Pitch Bend, Modulation, etc.
|
||||||
if (!slowMidi) breath();
|
pitch_bend();
|
||||||
halfTime = !halfTime;
|
portamento_();
|
||||||
if (halfTime) {
|
extraController();
|
||||||
pitch_bend();
|
readTeensySwitches();
|
||||||
portamento_();
|
if (((pinkySetting == LVL) || (pinkySetting == LVLP)) && pinkyKey){
|
||||||
} else {
|
// show LVL indication
|
||||||
if (slowMidi) breath();
|
} else updateSensorLEDs();
|
||||||
extraController();
|
doorKnobCheck();
|
||||||
updateSensorLEDs();
|
|
||||||
doorKnobCheck();
|
|
||||||
}
|
|
||||||
ccSendTime = millis();
|
ccSendTime = millis();
|
||||||
}
|
}
|
||||||
if (millis() - pixelUpdateTime > pixelUpdateInterval) {
|
if (millis() - pixelUpdateTime > pixelUpdateInterval) {
|
||||||
|
@ -835,6 +862,7 @@ void pitch_bend() {
|
||||||
// handle input from pitchbend touchpads and
|
// handle input from pitchbend touchpads and
|
||||||
// on-pcb variable capacitor for vibrato.
|
// on-pcb variable capacitor for vibrato.
|
||||||
int vibMax;
|
int vibMax;
|
||||||
|
int vibMaxBite;
|
||||||
int calculatedPBdepth;
|
int calculatedPBdepth;
|
||||||
byte pbTouched = 0;
|
byte pbTouched = 0;
|
||||||
int vibRead = 0;
|
int vibRead = 0;
|
||||||
|
@ -848,6 +876,7 @@ void pitch_bend() {
|
||||||
|
|
||||||
|
|
||||||
vibMax = vibMaxList[vibSens - 1];
|
vibMax = vibMaxList[vibSens - 1];
|
||||||
|
vibMaxBite = vibMaxBiteList[vibSensBite - 1];
|
||||||
|
|
||||||
if (vibControl){ //bite vibrato
|
if (vibControl){ //bite vibrato
|
||||||
if (biteJumper){ //PBITE (if pulled low with jumper, use pressure sensor instead of capacitive bite sensor)
|
if (biteJumper){ //PBITE (if pulled low with jumper, use pressure sensor instead of capacitive bite sensor)
|
||||||
|
@ -857,21 +886,22 @@ void pitch_bend() {
|
||||||
}
|
}
|
||||||
if (vibReadBite < vibThrBite) {
|
if (vibReadBite < vibThrBite) {
|
||||||
if (UPWD == vibDirection) {
|
if (UPWD == vibDirection) {
|
||||||
vibSignal = vibSignal * 0.5 + 0.5 * map(constrain(vibReadBite, (vibZeroBite - vibMax), vibThrBite), vibThrBite, (vibZeroBite - vibMax), 0, calculatedPBdepth * vibDepth[vibrato]);
|
vibSignal = vibSignal * 0.5 + 0.5 * map(constrain(vibReadBite, (vibZeroBite - vibMaxBite), vibThrBite), vibThrBite, (vibZeroBite - vibMaxBite), 0, calculatedPBdepth * vibDepth[vibrato]);
|
||||||
} else {
|
} else {
|
||||||
vibSignal = vibSignal * 0.5 + 0.5 * map(constrain(vibReadBite, (vibZeroBite - vibMax), vibThrBite), vibThrBite, (vibZeroBite - vibMax), 0, (0 - calculatedPBdepth * vibDepth[vibrato]));
|
vibSignal = vibSignal * 0.5 + 0.5 * map(constrain(vibReadBite, (vibZeroBite - vibMaxBite), vibThrBite), vibThrBite, (vibZeroBite - vibMaxBite), 0, (0 - calculatedPBdepth * vibDepth[vibrato]));
|
||||||
}
|
}
|
||||||
} else if (vibReadBite > vibThrBiteLo) {
|
} else if (vibReadBite > vibThrBiteLo) {
|
||||||
if (UPWD == vibDirection) {
|
if (UPWD == vibDirection) {
|
||||||
vibSignal = vibSignal * 0.5 + 0.5 * map(constrain(vibReadBite, vibThrBiteLo, (vibZeroBite + vibMax)), vibThrBiteLo, (vibZeroBite + vibMax), 0, (0 - calculatedPBdepth * vibDepth[vibrato]));
|
vibSignal = vibSignal * 0.5 + 0.5 * map(constrain(vibReadBite, vibThrBiteLo, (vibZeroBite + vibMaxBite)), vibThrBiteLo, (vibZeroBite + vibMaxBite), 0, (0 - calculatedPBdepth * vibDepth[vibrato]));
|
||||||
} else {
|
} else {
|
||||||
vibSignal = vibSignal * 0.5 + 0.5 * map(constrain(vibReadBite, vibThrBiteLo, (vibZeroBite + vibMax)), vibThrBiteLo, (vibZeroBite + vibMax), 0, calculatedPBdepth * vibDepth[vibrato]);
|
vibSignal = vibSignal * 0.5 + 0.5 * map(constrain(vibReadBite, vibThrBiteLo, (vibZeroBite + vibMaxBite)), vibThrBiteLo, (vibZeroBite + vibMaxBite), 0, calculatedPBdepth * vibDepth[vibrato]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
vibSignal = vibSignal * 0.5;
|
vibSignal = vibSignal * 0.5;
|
||||||
}
|
}
|
||||||
} else { //lever vibrato
|
}
|
||||||
vibRead = touchRead(vibratoPin); // SENSOR PIN 15 - built in var cap
|
if (vibControl != 1) { //lever vibrato
|
||||||
|
vibRead = touchRead(vibratoPin); // SENSOR PIN 15 - built in var cap
|
||||||
if (vibRead < vibThr) {
|
if (vibRead < vibThr) {
|
||||||
if (UPWD == vibDirection) {
|
if (UPWD == vibDirection) {
|
||||||
vibSignal = vibSignal * 0.5 + 0.5 * map(constrain(vibRead, (vibZero - vibMax), vibThr), vibThr, (vibZero - vibMax), 0, calculatedPBdepth * vibDepth[vibrato]);
|
vibSignal = vibSignal * 0.5 + 0.5 * map(constrain(vibRead, (vibZero - vibMax), vibThr), vibThr, (vibZero - vibMax), 0, calculatedPBdepth * vibDepth[vibrato]);
|
||||||
|
@ -985,60 +1015,103 @@ void doorKnobCheck() {
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
void extraController() {
|
void extraController() {
|
||||||
|
bool CC2sw;
|
||||||
|
bool CC1sw;
|
||||||
|
int extracCC;
|
||||||
// Extra Controller is the lip touch sensor (proportional) in front of the mouthpiece
|
// Extra Controller is the lip touch sensor (proportional) in front of the mouthpiece
|
||||||
exSensor = exSensor * 0.6 + 0.4 * touchRead(extraPin); // get sensor data, do some smoothing - SENSOR PIN 16 - PCB PIN "EC" (marked K4 on some prototype boards)
|
exSensor = exSensor * 0.6 + 0.4 * touchRead(extraPin); // get sensor data, do some smoothing - SENSOR PIN 16 - PCB PIN "EC" (marked K4 on some prototype boards)
|
||||||
|
if (pinkySetting == EC2){
|
||||||
|
//send 0 or 127 on extra controller CC2 depending on pinky key touch
|
||||||
|
if (pinkyKey && extraCT2) {
|
||||||
|
if (lastPinkyKey != pinkyKey){
|
||||||
|
midiSendControlChange(extraCT2, 127);
|
||||||
|
lastPinkyKey = pinkyKey;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (lastPinkyKey != pinkyKey){
|
||||||
|
midiSendControlChange(extraCT2, 0);
|
||||||
|
lastPinkyKey = pinkyKey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (pinkySetting == ECSW){
|
||||||
|
if (pinkyKey){
|
||||||
|
//send extra controller CC2 only
|
||||||
|
CC2sw = 1;
|
||||||
|
CC1sw = 0;
|
||||||
|
} else {
|
||||||
|
//send extra controller primary CC only
|
||||||
|
CC2sw = 0;
|
||||||
|
CC1sw = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//send both primary CC and CC2
|
||||||
|
CC2sw = 1;
|
||||||
|
CC1sw = 1;
|
||||||
|
}
|
||||||
if (extraCT && (exSensor >= extracThrVal)) { // if we are enabled and over the threshold, send data
|
if (extraCT && (exSensor >= extracThrVal)) { // if we are enabled and over the threshold, send data
|
||||||
if (!extracIsOn) {
|
if (!extracIsOn) {
|
||||||
extracIsOn = 1;
|
extracIsOn = 1;
|
||||||
if (extraCT == 4) { //Sustain ON
|
if ((extraCT == 4) && CC1sw) { //Sustain ON
|
||||||
midiSendControlChange(64, 127);
|
midiSendControlChange(64, 127);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (extraCT == 1) { //Send modulation
|
if ((extraCT == 1) && CC1sw) { //Send modulation
|
||||||
int extracCC = map(constrain(exSensor, extracThrVal, extracMaxVal), extracThrVal, extracMaxVal, 1, 127);
|
extracCC = map(constrain(exSensor, extracThrVal, extracMaxVal), extracThrVal, extracMaxVal, 1, 127);
|
||||||
if (extracCC != oldextrac) {
|
if (extracCC != oldextrac) {
|
||||||
midiSendControlChange(1, extracCC);
|
midiSendControlChange(1, extracCC);
|
||||||
}
|
}
|
||||||
oldextrac = extracCC;
|
oldextrac = extracCC;
|
||||||
}
|
}
|
||||||
if (extraCT == 2) { //Send foot pedal (CC#4)
|
if ((extraCT == 2) && CC1sw) { //Send foot pedal (CC#4)
|
||||||
int extracCC = map(constrain(exSensor, extracThrVal, extracMaxVal), extracThrVal, extracMaxVal, 1, 127);
|
extracCC = map(constrain(exSensor, extracThrVal, extracMaxVal), extracThrVal, extracMaxVal, 1, 127);
|
||||||
if (extracCC != oldextrac) {
|
if (extracCC != oldextrac) {
|
||||||
midiSendControlChange(4, extracCC);
|
midiSendControlChange(4, extracCC);
|
||||||
}
|
}
|
||||||
oldextrac = extracCC;
|
oldextrac = extracCC;
|
||||||
}
|
}
|
||||||
if ((extraCT == 3) && (breathCC != 9)) { //Send filter cutoff (CC#74)
|
if ((extraCT == 3) && (breathCC != 9) && CC1sw) { //Send filter cutoff (CC#74)
|
||||||
int extracCC = map(constrain(exSensor, extracThrVal, extracMaxVal), extracThrVal, extracMaxVal, 1, 127);
|
extracCC = map(constrain(exSensor, extracThrVal, extracMaxVal), extracThrVal, extracMaxVal, 1, 127);
|
||||||
if (extracCC != oldextrac) {
|
if (extracCC != oldextrac) {
|
||||||
midiSendControlChange(74, extracCC);
|
midiSendControlChange(74, extracCC);
|
||||||
}
|
}
|
||||||
oldextrac = extracCC;
|
oldextrac = extracCC;
|
||||||
}
|
}
|
||||||
|
if ((extraCT2 ) && CC2sw){ //Send extra controller CC2
|
||||||
|
extracCC = map(constrain(exSensor, extracThrVal, extracMaxVal), extracThrVal, extracMaxVal, 1, 127);
|
||||||
|
if (extracCC != oldextrac2) {
|
||||||
|
midiSendControlChange(extraCT2, extracCC);
|
||||||
|
}
|
||||||
|
oldextrac2 = extracCC;
|
||||||
|
}
|
||||||
} else if (extracIsOn) { // we have just gone below threshold, so send zero value
|
} else if (extracIsOn) { // we have just gone below threshold, so send zero value
|
||||||
extracIsOn = 0;
|
extracIsOn = 0;
|
||||||
if (extraCT == 1) { //MW
|
if ((extraCT == 1) && CC1sw) { //MW
|
||||||
if (oldextrac != 0) {
|
if (oldextrac != 0) {
|
||||||
//send modulation 0
|
//send modulation 0
|
||||||
midiSendControlChange(1, 0);
|
midiSendControlChange(1, 0);
|
||||||
oldextrac = 0;
|
oldextrac = 0;
|
||||||
}
|
}
|
||||||
} else if (extraCT == 2) { //FP
|
} else if ((extraCT == 2) && CC1sw) { //FP
|
||||||
if (oldextrac != 0) {
|
if (oldextrac != 0) {
|
||||||
//send foot pedal 0
|
//send foot pedal 0
|
||||||
midiSendControlChange(4, 0);
|
midiSendControlChange(4, 0);
|
||||||
oldextrac = 0;
|
oldextrac = 0;
|
||||||
}
|
}
|
||||||
} else if ((extraCT == 3) && (breathCC != 9)) { //CF
|
} else if ((extraCT == 3) && (breathCC != 9) && CC1sw) { //CF
|
||||||
if (oldextrac != 0) {
|
if (oldextrac != 0) {
|
||||||
//send filter cutoff 0
|
//send filter cutoff 0
|
||||||
midiSendControlChange(74, 0);
|
midiSendControlChange(74, 0);
|
||||||
oldextrac = 0;
|
oldextrac = 0;
|
||||||
}
|
}
|
||||||
} else if (extraCT == 4) { //SP
|
} else if ((extraCT == 4) && CC1sw) { //SP
|
||||||
//send sustain off
|
//send sustain off
|
||||||
midiSendControlChange(64, 0);
|
midiSendControlChange(64, 0);
|
||||||
}
|
}
|
||||||
|
if ((extraCT2 ) && CC2sw){ //CC2
|
||||||
|
//send 0 for extra ctr CC2
|
||||||
|
midiSendControlChange(extraCT2, 0);
|
||||||
|
oldextrac2 = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1046,12 +1119,12 @@ void extraController() {
|
||||||
|
|
||||||
void portamento_() {
|
void portamento_() {
|
||||||
|
|
||||||
if (biteJumper){ //PBITE (if pulled low with jumper, use pressure sensor instead of capacitive bite sensor)
|
if (biteJumper) { //PBITE (if pulled low with jumper, use pressure sensor instead of capacitive bite sensor)
|
||||||
biteSensor=analogRead(bitePressurePin); // alternative kind bite sensor (air pressure tube and sensor) PBITE
|
biteSensor=analogRead(bitePressurePin); // alternative kind bite sensor (air pressure tube and sensor) PBITE
|
||||||
} else {
|
} else {
|
||||||
biteSensor = touchRead(bitePin); // get sensor data, do some smoothing - SENSOR PIN 17 - PCB PINS LABELED "BITE" (GND left, sensor pin right)
|
biteSensor = touchRead(bitePin); // get sensor data, do some smoothing - SENSOR PIN 17 - PCB PINS LABELED "BITE" (GND left, sensor pin right)
|
||||||
}
|
}
|
||||||
if (!vibControl){
|
if (0 == vibControl) {
|
||||||
// Portamento is controlled with the bite sensor (variable capacitor) in the mouthpiece
|
// Portamento is controlled with the bite sensor (variable capacitor) in the mouthpiece
|
||||||
if (portamento && (biteSensor >= portamThrVal)) { // if we are enabled and over the threshold, send portamento
|
if (portamento && (biteSensor >= portamThrVal)) { // if we are enabled and over the threshold, send portamento
|
||||||
if (!portIsOn) {
|
if (!portIsOn) {
|
||||||
|
@ -1061,7 +1134,8 @@ void portamento_() {
|
||||||
} else if (portIsOn) { // we have just gone below threshold, so send zero value
|
} else if (portIsOn) { // we have just gone below threshold, so send zero value
|
||||||
portOff();
|
portOff();
|
||||||
}
|
}
|
||||||
} else {
|
} else if (1 == vibControl) {
|
||||||
|
// Portamento is switched to lever control
|
||||||
leverPortRead = touchRead(vibratoPin);
|
leverPortRead = touchRead(vibratoPin);
|
||||||
if (portamento && (leverPortRead <= (leverPortZero-leverPortThr))) { // if we are enabled and over the threshold, send portamento
|
if (portamento && (leverPortRead <= (leverPortZero-leverPortThr))) { // if we are enabled and over the threshold, send portamento
|
||||||
if (!portIsOn) {
|
if (!portIsOn) {
|
||||||
|
@ -1071,6 +1145,10 @@ void portamento_() {
|
||||||
} else if (portIsOn) { // we have just gone below threshold, so send zero value
|
} else if (portIsOn) { // we have just gone below threshold, so send zero value
|
||||||
portOff();
|
portOff();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// no control for portamento
|
||||||
|
if (portIsOn)
|
||||||
|
portOff();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1087,7 +1165,7 @@ void portOn() {
|
||||||
|
|
||||||
void port() {
|
void port() {
|
||||||
int portCC;
|
int portCC;
|
||||||
if (!vibControl)
|
if (1 != vibControl)
|
||||||
portCC = map(constrain(biteSensor, portamThrVal, portamMaxVal), portamThrVal, portamMaxVal, 0, 127);
|
portCC = map(constrain(biteSensor, portamThrVal, portamMaxVal), portamThrVal, portamMaxVal, 0, 127);
|
||||||
else
|
else
|
||||||
portCC = constrain((leverPortZero-leverPortThr-leverPortRead),0,127);
|
portCC = constrain((leverPortZero-leverPortThr-leverPortRead),0,127);
|
||||||
|
@ -1112,6 +1190,12 @@ void portOff() {
|
||||||
|
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
|
|
||||||
|
void readTeensySwitches() { //these seem to slow things down, so do it less often
|
||||||
|
pinkyKey = (touchRead(halfPitchBendKeyPin) > touch_Thr); // SENSOR PIN 1 - PCB PIN "S1"
|
||||||
|
specialKey = (touchRead(specialKeyPin) > touch_Thr); //S2 on pcb
|
||||||
|
}
|
||||||
|
|
||||||
void readSwitches() {
|
void readSwitches() {
|
||||||
|
|
||||||
// Read touch pads (MPR121), compare against threshold value
|
// Read touch pads (MPR121), compare against threshold value
|
||||||
|
@ -1142,7 +1226,8 @@ void readSwitches() {
|
||||||
|
|
||||||
pinkyKey = (touchRead(halfPitchBendKeyPin) > touch_Thr); // SENSOR PIN 1 - PCB PIN "S1"
|
pinkyKey = (touchRead(halfPitchBendKeyPin) > touch_Thr); // SENSOR PIN 1 - PCB PIN "S1"
|
||||||
|
|
||||||
int qTransp = pinkyKey ? pinkySetting-12 : 0;
|
|
||||||
|
int qTransp = (pinkyKey && (pinkySetting < 25)) ? pinkySetting-12 : 0;
|
||||||
|
|
||||||
// Calculate midi note number from pressed keys
|
// Calculate midi note number from pressed keys
|
||||||
|
|
||||||
|
|
|
@ -11,9 +11,10 @@
|
||||||
#define CCN_Port 5 // Controller number for portamento level
|
#define CCN_Port 5 // Controller number for portamento level
|
||||||
#define CCN_PortOnOff 65// Controller number for portamento on/off
|
#define CCN_PortOnOff 65// Controller number for portamento on/off
|
||||||
|
|
||||||
// Send breath CC data no more than every CC_INTERVAL (other CC is sent with double interval)
|
// Send breath CC data no more than every CC_BREATH_INTERVAL
|
||||||
// milliseconds (due to timing errors, the value should be about half the actual wanted value)
|
// milliseconds (due to timing errors, the value should be about half the actual wanted value)
|
||||||
#define CC_INTERVAL 2
|
#define CC_BREATH_INTERVAL 1
|
||||||
|
#define CC_INTERVAL 10
|
||||||
|
|
||||||
|
|
||||||
#define breathLoLimit 0
|
#define breathLoLimit 0
|
||||||
|
|
|
@ -20,6 +20,10 @@
|
||||||
|
|
||||||
//Magic value where pinky button means "pitch bend"
|
//Magic value where pinky button means "pitch bend"
|
||||||
#define PBD 12
|
#define PBD 12
|
||||||
|
#define EC2 25
|
||||||
|
#define ECSW 26
|
||||||
|
#define LVL 27
|
||||||
|
#define LVLP 28
|
||||||
|
|
||||||
//Vibrato direction
|
//Vibrato direction
|
||||||
#define UPWD 1
|
#define UPWD 1
|
||||||
|
@ -55,7 +59,7 @@ extern unsigned short octave;
|
||||||
extern unsigned short curve;
|
extern unsigned short curve;
|
||||||
extern unsigned short velSmpDl; // 0-30 ms
|
extern unsigned short velSmpDl; // 0-30 ms
|
||||||
extern unsigned short velBias; // 0-9
|
extern unsigned short velBias; // 0-9
|
||||||
extern unsigned short pinkySetting; // 0 - 11 (QuickTranspose -12 to -1), 12 (pb/2), 13 - 24 (QuickTranspose +1 to +12)
|
extern unsigned short pinkySetting; // 0 - 11 (QuickTranspose -12 to -1), 12 (pb/2), 13 - 24 (QuickTranspose +1 to +12), 25 (EC2), 26 (ECSW), 27 (LVL), 28 (LVLP)
|
||||||
extern unsigned short dipSwBits; // virtual dip switch settings for special modes (work in progress)
|
extern unsigned short dipSwBits; // virtual dip switch settings for special modes (work in progress)
|
||||||
extern unsigned short priority; // mono priority for rotator chords
|
extern unsigned short priority; // mono priority for rotator chords
|
||||||
extern unsigned short vibSens; // vibrato sensitivity
|
extern unsigned short vibSens; // vibrato sensitivity
|
||||||
|
@ -66,6 +70,9 @@ extern unsigned short vibSensBite; // vibrato sensitivity (bite)
|
||||||
extern unsigned short vibSquelchBite; //vibrato signal squelch (bite)
|
extern unsigned short vibSquelchBite; //vibrato signal squelch (bite)
|
||||||
extern unsigned short vibControl;
|
extern unsigned short vibControl;
|
||||||
extern unsigned short fastPatch[7];
|
extern unsigned short fastPatch[7];
|
||||||
|
extern unsigned short extraCT2; // OFF:1-127
|
||||||
|
extern unsigned short levelCC; // 0-127
|
||||||
|
extern unsigned short levelVal; // 0-127
|
||||||
extern uint16_t gateOpenEnable;
|
extern uint16_t gateOpenEnable;
|
||||||
extern uint16_t specialKeyEnable;
|
extern uint16_t specialKeyEnable;
|
||||||
extern byte rotatorOn;
|
extern byte rotatorOn;
|
||||||
|
@ -99,7 +106,6 @@ extern int lastBite;
|
||||||
extern byte biteJumper;
|
extern byte biteJumper;
|
||||||
|
|
||||||
extern int exSensor;
|
extern int exSensor;
|
||||||
extern int lastEx;
|
|
||||||
|
|
||||||
extern int pitchBend;
|
extern int pitchBend;
|
||||||
|
|
||||||
|
|
|
@ -46,3 +46,8 @@ void updateSensorLEDs() {
|
||||||
analogWrite(pLedPin, 0);
|
analogWrite(pLedPin, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ledMeter(byte indicatedValue){
|
||||||
|
analogWrite(bLedPin, map(constrain(indicatedValue, 0, 127), 0, 127, 0, BREATH_LED_BRIGHTNESS)); // full glow at maximum value
|
||||||
|
analogWrite(pLedPin, map(constrain(indicatedValue, 0, 127), 127, 0, 0, PORTAM_LED_BRIGHTNESS)); // full glow at minimum value
|
||||||
|
}
|
||||||
|
|
|
@ -8,5 +8,6 @@ void statusLed(bool state);
|
||||||
void statusLedFlash(uint16_t delayTime);
|
void statusLedFlash(uint16_t delayTime);
|
||||||
void statusLedBlink();
|
void statusLedBlink();
|
||||||
void updateSensorLEDs();
|
void updateSensorLEDs();
|
||||||
|
void ledMeter(byte indicatedValue);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -777,7 +777,7 @@ const MenuEntrySub velSmpDlMenu = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const MenuEntrySub velBiasMenu = {
|
const MenuEntrySub velBiasMenu = {
|
||||||
MenuType::ESub, "VEL BIAS", "VEL BIAS", &velBias, 0, 9, MenuEntryFlags::EMenuEntryWrap,
|
MenuType::ESub, "VEL BOOST", "VEL BOOST", &velBias, 0, 9, MenuEntryFlags::EMenuEntryWrap,
|
||||||
[](SubMenuRef __unused, char* out, const char** __unused unit) {
|
[](SubMenuRef __unused, char* out, const char** __unused unit) {
|
||||||
if (velBias) numToString(velBias, out);
|
if (velBias) numToString(velBias, out);
|
||||||
else strncpy(out, "OFF", 4);
|
else strncpy(out, "OFF", 4);
|
||||||
|
@ -840,6 +840,16 @@ const MenuEntrySub extraMenu = {
|
||||||
, nullptr
|
, nullptr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const MenuEntrySub extraCC2Menu = {
|
||||||
|
MenuType::ESub, "EXCTR CC2", "EXCTR CC2", &extraCT2, 0, 127, MenuEntryFlags::EMenuEntryWrap,
|
||||||
|
[](SubMenuRef __unused, char* out, const char** __unused unit) {
|
||||||
|
if(extraCT2) numToString(extraCT2, out);
|
||||||
|
else strncpy(out, "OFF", 4);
|
||||||
|
},
|
||||||
|
[](const MenuEntrySub & __unused sub) { writeSetting(EXTRA2_ADDR,extraCT2); }
|
||||||
|
, nullptr
|
||||||
|
};
|
||||||
|
|
||||||
const MenuEntryStateCh vibratoSubMenu = { MenuType::EStateChange, "VIBRATO", VIBRATO_MENU };
|
const MenuEntryStateCh vibratoSubMenu = { MenuType::EStateChange, "VIBRATO", VIBRATO_MENU };
|
||||||
|
|
||||||
const MenuEntrySub deglitchMenu = {
|
const MenuEntrySub deglitchMenu = {
|
||||||
|
@ -856,10 +866,18 @@ const MenuEntrySub deglitchMenu = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const MenuEntrySub pinkyMenu = {
|
const MenuEntrySub pinkyMenu = {
|
||||||
MenuType::ESub, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 24, MenuEntryFlags::ENone,
|
MenuType::ESub, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 28, MenuEntryFlags::ENone,
|
||||||
[](SubMenuRef __unused,char* textBuffer, const char** __unused unit) {
|
[](SubMenuRef __unused,char* textBuffer, const char** __unused unit) {
|
||||||
if (pinkySetting == PBD)
|
if (pinkySetting == PBD)
|
||||||
strncpy(textBuffer, "PBD", 4);
|
strncpy(textBuffer, "PBD", 4);
|
||||||
|
else if (pinkySetting == EC2)
|
||||||
|
strncpy(textBuffer, "EC2", 4);
|
||||||
|
else if (pinkySetting == ECSW)
|
||||||
|
strncpy(textBuffer, "ECS", 4);
|
||||||
|
else if (pinkySetting == LVL)
|
||||||
|
strncpy(textBuffer, "LVL", 4);
|
||||||
|
else if (pinkySetting == LVLP)
|
||||||
|
strncpy(textBuffer, "LVP", 4);
|
||||||
else
|
else
|
||||||
numToString(pinkySetting-12, textBuffer, true);
|
numToString(pinkySetting-12, textBuffer, true);
|
||||||
},
|
},
|
||||||
|
@ -867,13 +885,25 @@ const MenuEntrySub pinkyMenu = {
|
||||||
, nullptr
|
, nullptr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const MenuEntrySub lvlCtrlCCMenu = {
|
||||||
|
MenuType::ESub, "LEVEL CC", "LEVEL CC", &levelCC, 0, 127, MenuEntryFlags::EMenuEntryWrap,
|
||||||
|
[](SubMenuRef __unused, char* out, const char** __unused unit) {
|
||||||
|
if(levelCC) numToString(levelCC, out);
|
||||||
|
else strncpy(out, "AT", 4);
|
||||||
|
},
|
||||||
|
[](const MenuEntrySub & __unused sub) { writeSetting(LEVEL_CC_ADDR,levelCC); }
|
||||||
|
, nullptr
|
||||||
|
};
|
||||||
|
|
||||||
const MenuEntry* controlMenuEntries[] = {
|
const MenuEntry* controlMenuEntries[] = {
|
||||||
(MenuEntry*)&portMenu,
|
(MenuEntry*)&portMenu,
|
||||||
(MenuEntry*)&pitchBendMenu,
|
(MenuEntry*)&pitchBendMenu,
|
||||||
(MenuEntry*)&extraMenu,
|
(MenuEntry*)&extraMenu,
|
||||||
|
(MenuEntry*)&extraCC2Menu,
|
||||||
(MenuEntry*)&vibratoSubMenu,
|
(MenuEntry*)&vibratoSubMenu,
|
||||||
(MenuEntry*)°litchMenu,
|
(MenuEntry*)°litchMenu,
|
||||||
(MenuEntry*)&pinkyMenu
|
(MenuEntry*)&pinkyMenu,
|
||||||
|
(MenuEntry*)&lvlCtrlCCMenu
|
||||||
};
|
};
|
||||||
|
|
||||||
const MenuPage controlMenuPage = {
|
const MenuPage controlMenuPage = {
|
||||||
|
@ -934,7 +964,7 @@ const MenuEntrySub vibSquelchMenu = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const MenuEntrySub vibSenseBiteMenu = {
|
const MenuEntrySub vibSenseBiteMenu = {
|
||||||
MenuType::ESub, "SENSE BTE", "LEVEL", &vibSensBite, 1, 12, MenuEntryFlags::ENone,
|
MenuType::ESub, "SENSE BTE", "LEVEL", &vibSensBite, 1, 17, MenuEntryFlags::ENone,
|
||||||
[](SubMenuRef __unused,char* textBuffer, const char** __unused unit) {
|
[](SubMenuRef __unused,char* textBuffer, const char** __unused unit) {
|
||||||
numToString(vibSensBite, textBuffer);
|
numToString(vibSensBite, textBuffer);
|
||||||
},
|
},
|
||||||
|
@ -952,9 +982,11 @@ const MenuEntrySub vibSquelchBiteMenu = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const MenuEntrySub vibControlMenu = {
|
const MenuEntrySub vibControlMenu = {
|
||||||
MenuType::ESub, "CONTROL", "CONTROL", &vibControl , 0, 1, MenuEntryFlags::EMenuEntryWrap,
|
MenuType::ESub, "CONTROL", "CONTROL", &vibControl , 0, 2, MenuEntryFlags::EMenuEntryWrap,
|
||||||
[](SubMenuRef __unused, char* out, const char** __unused unit) {
|
[](SubMenuRef __unused, char* out, const char** __unused unit) {
|
||||||
if (vibControl)
|
if (2 == vibControl)
|
||||||
|
strncpy(out, "BTH", 4);
|
||||||
|
else if (1 == vibControl)
|
||||||
strncpy(out, "BIT", 4);
|
strncpy(out, "BIT", 4);
|
||||||
else
|
else
|
||||||
strncpy(out, "LVR", 4);
|
strncpy(out, "LVR", 4);
|
||||||
|
|
|
@ -99,6 +99,12 @@ void readEEPROM(const bool factoryReset) {
|
||||||
writeSetting(DAC_MODE_ADDR, DAC_MODE_FACTORY);
|
writeSetting(DAC_MODE_ADDR, DAC_MODE_FACTORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(settingsVersion < 33) {
|
||||||
|
writeSetting(EXTRA2_ADDR, EXTRA2_FACTORY);
|
||||||
|
writeSetting(LEVEL_CC_ADDR, LEVEL_CC_FACTORY);
|
||||||
|
writeSetting(LEVEL_VAL_ADDR, LEVEL_VAL_FACTORY);
|
||||||
|
}
|
||||||
|
|
||||||
writeSetting(VERSION_ADDR, EEPROM_VERSION);
|
writeSetting(VERSION_ADDR, EEPROM_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +133,7 @@ void readEEPROM(const bool factoryReset) {
|
||||||
curve = readSettingBounded(BREATHCURVE_ADDR, 0, 12, BREATHCURVE_FACTORY);
|
curve = readSettingBounded(BREATHCURVE_ADDR, 0, 12, BREATHCURVE_FACTORY);
|
||||||
velSmpDl = readSettingBounded(VEL_SMP_DL_ADDR, 0, 30, VEL_SMP_DL_FACTORY);
|
velSmpDl = readSettingBounded(VEL_SMP_DL_ADDR, 0, 30, VEL_SMP_DL_FACTORY);
|
||||||
velBias = readSettingBounded(VEL_BIAS_ADDR, 0, 9, VEL_BIAS_FACTORY);
|
velBias = readSettingBounded(VEL_BIAS_ADDR, 0, 9, VEL_BIAS_FACTORY);
|
||||||
pinkySetting = readSettingBounded(PINKY_KEY_ADDR, 0, 24, PINKY_KEY_FACTORY);
|
pinkySetting = readSettingBounded(PINKY_KEY_ADDR, 0, 28, PINKY_KEY_FACTORY);
|
||||||
fastPatch[0] = readSettingBounded(FP1_ADDR, 0, 127, 0);
|
fastPatch[0] = readSettingBounded(FP1_ADDR, 0, 127, 0);
|
||||||
fastPatch[1] = readSettingBounded(FP2_ADDR, 0, 127, 0);
|
fastPatch[1] = readSettingBounded(FP2_ADDR, 0, 127, 0);
|
||||||
fastPatch[2] = readSettingBounded(FP3_ADDR, 0, 127, 0);
|
fastPatch[2] = readSettingBounded(FP3_ADDR, 0, 127, 0);
|
||||||
|
@ -148,11 +154,14 @@ void readEEPROM(const bool factoryReset) {
|
||||||
vibDirection = readSettingBounded(VIB_DIRECTION_ADDR, 0, 1, VIB_DIRECTION_FACTORY);
|
vibDirection = readSettingBounded(VIB_DIRECTION_ADDR, 0, 1, VIB_DIRECTION_FACTORY);
|
||||||
breathCC2 = readSettingBounded(BREATH_CC2_ADDR, 0, 127, BREATH_CC2_FACTORY);
|
breathCC2 = readSettingBounded(BREATH_CC2_ADDR, 0, 127, BREATH_CC2_FACTORY);
|
||||||
breathCC2Rise = readSettingBounded(BREATH_CC2_RISE_ADDR, 1, 10, BREATH_CC2_RISE_FACTORY);
|
breathCC2Rise = readSettingBounded(BREATH_CC2_RISE_ADDR, 1, 10, BREATH_CC2_RISE_FACTORY);
|
||||||
vibSensBite = readSettingBounded(VIB_SENS_BITE_ADDR, 1, 12, VIB_SENS_BITE_FACTORY);
|
vibSensBite = readSettingBounded(VIB_SENS_BITE_ADDR, 1, 17, VIB_SENS_BITE_FACTORY);
|
||||||
vibSquelchBite = readSettingBounded(VIB_SQUELCH_BITE_ADDR, 1, 30, VIB_SQUELCH_BITE_FACTORY);
|
vibSquelchBite = readSettingBounded(VIB_SQUELCH_BITE_ADDR, 1, 30, VIB_SQUELCH_BITE_FACTORY);
|
||||||
vibControl = readSettingBounded(VIB_CONTROL_ADDR, 0, 1, VIB_CONTROL_FACTORY);
|
vibControl = readSettingBounded(VIB_CONTROL_ADDR, 0, 2, VIB_CONTROL_FACTORY);
|
||||||
dacMode = readSettingBounded(DAC_MODE_ADDR, DAC_MODE_BREATH, DAC_MODE_PITCH, DAC_MODE_FACTORY);
|
dacMode = readSettingBounded(DAC_MODE_ADDR, DAC_MODE_BREATH, DAC_MODE_PITCH, DAC_MODE_FACTORY);
|
||||||
trill3_interval = readSettingBounded(TRILL3_INTERVAL_ADDR, 3, 4, TRILL3_INTERVAL_FACTORY);
|
trill3_interval = readSettingBounded(TRILL3_INTERVAL_ADDR, 3, 4, TRILL3_INTERVAL_FACTORY);
|
||||||
|
extraCT2 = readSettingBounded(EXTRA2_ADDR, 0, 127, EXTRA2_FACTORY);
|
||||||
|
levelCC = readSettingBounded(LEVEL_CC_ADDR, 0, 127, LEVEL_CC_FACTORY);
|
||||||
|
levelVal = readSettingBounded(LEVEL_VAL_ADDR, 0, 127, LEVEL_VAL_FACTORY);
|
||||||
|
|
||||||
//Flags stored in bit field
|
//Flags stored in bit field
|
||||||
fastBoot = (dipSwBits & (1<<DIPSW_FASTBOOT))?1:0;
|
fastBoot = (dipSwBits & (1<<DIPSW_FASTBOOT))?1:0;
|
||||||
|
|
|
@ -55,6 +55,9 @@
|
||||||
#define VIB_CONTROL_ADDR 96
|
#define VIB_CONTROL_ADDR 96
|
||||||
#define TRILL3_INTERVAL_ADDR 98
|
#define TRILL3_INTERVAL_ADDR 98
|
||||||
#define DAC_MODE_ADDR 100
|
#define DAC_MODE_ADDR 100
|
||||||
|
#define EXTRA2_ADDR 102
|
||||||
|
#define LEVEL_CC_ADDR 104
|
||||||
|
#define LEVEL_VAL_ADDR 106
|
||||||
|
|
||||||
#define EEPROM_SIZE 102
|
#define EEPROM_SIZE 102
|
||||||
|
|
||||||
|
@ -73,7 +76,7 @@
|
||||||
|
|
||||||
|
|
||||||
//"factory" values for settings
|
//"factory" values for settings
|
||||||
#define EEPROM_VERSION 32
|
#define EEPROM_VERSION 33
|
||||||
#define BREATH_THR_FACTORY 1400
|
#define BREATH_THR_FACTORY 1400
|
||||||
#define BREATH_MAX_FACTORY 4000
|
#define BREATH_MAX_FACTORY 4000
|
||||||
#define PORTAM_THR_FACTORY 2600
|
#define PORTAM_THR_FACTORY 2600
|
||||||
|
@ -117,9 +120,11 @@
|
||||||
#define VIB_SENS_BITE_FACTORY 3
|
#define VIB_SENS_BITE_FACTORY 3
|
||||||
#define VIB_SQUELCH_BITE_FACTORY 10
|
#define VIB_SQUELCH_BITE_FACTORY 10
|
||||||
#define VIB_CONTROL_FACTORY 0
|
#define VIB_CONTROL_FACTORY 0
|
||||||
|
|
||||||
#define TRILL3_INTERVAL_FACTORY 4
|
#define TRILL3_INTERVAL_FACTORY 4
|
||||||
#define DAC_MODE_FACTORY DAC_MODE_BREATH
|
#define DAC_MODE_FACTORY DAC_MODE_PITCH
|
||||||
|
#define EXTRA2_FACTORY 0
|
||||||
|
#define LEVEL_CC_FACTORY 11
|
||||||
|
#define LEVEL_VAL_FACTORY 127
|
||||||
|
|
||||||
#define NO_CHECKSUM 0x7F007F00
|
#define NO_CHECKSUM 0x7F007F00
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue