Bugfixes galore. Added sensor level indicators in sensor adjust settings. Added MIDI note range check with octave repeat.
This commit is contained in:
parent
314bdccada
commit
932988f08d
1 changed files with 136 additions and 49 deletions
|
@ -21,7 +21,7 @@ PROGRAMME FUNCTION: EVI Wind Controller using the Freescale MP3V5004GP breath
|
||||||
|
|
||||||
|
|
||||||
#define ON_Delay 20 // Set Delay after ON threshold before velocity is checked (wait for tounging peak)
|
#define ON_Delay 20 // Set Delay after ON threshold before velocity is checked (wait for tounging peak)
|
||||||
#define touch_Thr 1800 // sensitivity for Teensy touch sensors
|
#define touch_Thr 800 // sensitivity for Teensy touch sensors
|
||||||
#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
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ PROGRAMME FUNCTION: EVI Wind Controller using the Freescale MP3V5004GP breath
|
||||||
// EEPROM addresses for settings
|
// EEPROM addresses for settings
|
||||||
#define VERSION_ADDR 0
|
#define VERSION_ADDR 0
|
||||||
#define BREATH_THR_ADDR 2
|
#define BREATH_THR_ADDR 2
|
||||||
#define breathMaxVal_ADDR 4
|
#define BREATH_MAX_ADDR 4
|
||||||
#define PORTAM_THR_ADDR 6
|
#define PORTAM_THR_ADDR 6
|
||||||
#define PORTAM_MAX_ADDR 8
|
#define PORTAM_MAX_ADDR 8
|
||||||
#define PITCHB_THR_ADDR 10
|
#define PITCHB_THR_ADDR 10
|
||||||
|
@ -91,9 +91,9 @@ PROGRAMME FUNCTION: EVI Wind Controller using the Freescale MP3V5004GP breath
|
||||||
#define OCTAVE_ADDR 40
|
#define OCTAVE_ADDR 40
|
||||||
|
|
||||||
//"factory" values for settings
|
//"factory" values for settings
|
||||||
#define VERSION 12
|
#define VERSION 13
|
||||||
#define BREATH_THR_FACTORY 350
|
#define BREATH_THR_FACTORY 350
|
||||||
#define breathMaxVal_FACTORY 1000
|
#define BREATH_MAX_FACTORY 1000
|
||||||
#define PORTAM_THR_FACTORY 1730
|
#define PORTAM_THR_FACTORY 1730
|
||||||
#define PORTAM_MAX_FACTORY 3300
|
#define PORTAM_MAX_FACTORY 3300
|
||||||
#define PITCHB_THR_FACTORY 1200
|
#define PITCHB_THR_FACTORY 1200
|
||||||
|
@ -261,6 +261,7 @@ byte subVibrato = 0;
|
||||||
byte subDeglitch = 0;
|
byte subDeglitch = 0;
|
||||||
|
|
||||||
byte ccList[4] = {0,2,7,11}; // OFF, Breath, Volume, Expression
|
byte ccList[4] = {0,2,7,11}; // OFF, Breath, Volume, Expression
|
||||||
|
int pbDepthList[13] = {0,8192,4096,2731,2048,1638,1365,1170,1024,910,819,744,683};
|
||||||
|
|
||||||
byte cursorNow;
|
byte cursorNow;
|
||||||
|
|
||||||
|
@ -275,6 +276,8 @@ unsigned long buttonRepeatTime = 0;
|
||||||
unsigned long buttonPressedTime = 0;
|
unsigned long buttonPressedTime = 0;
|
||||||
unsigned long buttonRepeatInterval = 50;
|
unsigned long buttonRepeatInterval = 50;
|
||||||
unsigned long buttonRepeatDelay = 400;
|
unsigned long buttonRepeatDelay = 400;
|
||||||
|
unsigned long pixelUpdateTime = 0;
|
||||||
|
unsigned long pixelUpdateInterval = 100;
|
||||||
unsigned long cursorBlinkTime = 0; // the last time the cursor was toggled
|
unsigned long cursorBlinkTime = 0; // the last time the cursor was toggled
|
||||||
unsigned long cursorBlinkInterval = 300; // the cursor blink toggle interval time
|
unsigned long cursorBlinkInterval = 300; // the cursor blink toggle interval time
|
||||||
unsigned long patchViewTime = 0;
|
unsigned long patchViewTime = 0;
|
||||||
|
@ -285,7 +288,6 @@ unsigned long lastDeglitchTime = 0; // The last time the fingering was c
|
||||||
unsigned long ccSendTime = 0L; // The last time we sent CC values
|
unsigned long ccSendTime = 0L; // The last time we sent 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
|
||||||
|
|
||||||
int mainState; // The state of the main state machine
|
int mainState; // The state of the main state machine
|
||||||
|
@ -300,18 +302,25 @@ int breathLevel=0; // breath level (smoothed) not mapped to CC value
|
||||||
int oldbreath=0;
|
int oldbreath=0;
|
||||||
|
|
||||||
int pressureSensor; // pressure data from breath sensor, for midi breath cc and breath threshold checks
|
int pressureSensor; // pressure data from breath sensor, for midi breath cc and breath threshold checks
|
||||||
|
int lastPressure;
|
||||||
byte velocitySend; // remapped midi velocity from breath sensor (or set to static value if selected)
|
byte velocitySend; // remapped midi velocity from breath sensor (or set to static value if selected)
|
||||||
|
|
||||||
int biteSensor=0; // capacitance data from bite sensor, for midi cc and threshold checks
|
int biteSensor=0; // capacitance data from bite sensor, for midi cc and threshold checks
|
||||||
byte portIsOn=0; // keep track and make sure we send CC with 0 value when off threshold
|
byte portIsOn=0; // keep track and make sure we send CC with 0 value when off threshold
|
||||||
int oldport=0;
|
int oldport=0;
|
||||||
|
int lastBite=0;
|
||||||
|
|
||||||
int exSensor=0;
|
int exSensor=0;
|
||||||
byte extracIsOn=0;
|
byte extracIsOn=0;
|
||||||
int oldextrac=0;
|
int oldextrac=0;
|
||||||
|
int lastEx=0;
|
||||||
|
|
||||||
int pitchBend=0;
|
int pitchBend=0;
|
||||||
int oldpb=8192;
|
int oldpb=8192;
|
||||||
|
int pbUp=0;
|
||||||
|
int pbDn=0;
|
||||||
|
int lastPbUp=0;
|
||||||
|
int lastPbDn=0;
|
||||||
|
|
||||||
int vibDepth[8] = {0,31,63,127,254,1023,2047,4095}; // these values need too be looked over
|
int vibDepth[8] = {0,31,63,127,254,1023,2047,4095}; // these values need too be looked over
|
||||||
|
|
||||||
|
@ -336,7 +345,7 @@ void setup() {
|
||||||
if (readSetting(VERSION_ADDR) != VERSION){
|
if (readSetting(VERSION_ADDR) != VERSION){
|
||||||
writeSetting(VERSION_ADDR,VERSION);
|
writeSetting(VERSION_ADDR,VERSION);
|
||||||
writeSetting(BREATH_THR_ADDR,BREATH_THR_FACTORY);
|
writeSetting(BREATH_THR_ADDR,BREATH_THR_FACTORY);
|
||||||
writeSetting(breathMaxVal_ADDR,breathMaxVal_FACTORY);
|
writeSetting(BREATH_MAX_ADDR,BREATH_MAX_FACTORY);
|
||||||
writeSetting(PORTAM_THR_ADDR,PORTAM_THR_FACTORY);
|
writeSetting(PORTAM_THR_ADDR,PORTAM_THR_FACTORY);
|
||||||
writeSetting(PORTAM_MAX_ADDR,PORTAM_MAX_FACTORY);
|
writeSetting(PORTAM_MAX_ADDR,PORTAM_MAX_FACTORY);
|
||||||
writeSetting(PITCHB_THR_ADDR,PITCHB_THR_FACTORY);
|
writeSetting(PITCHB_THR_ADDR,PITCHB_THR_FACTORY);
|
||||||
|
@ -358,7 +367,7 @@ void setup() {
|
||||||
}
|
}
|
||||||
// read settings from EEPROM
|
// read settings from EEPROM
|
||||||
breathThrVal = readSetting(BREATH_THR_ADDR);
|
breathThrVal = readSetting(BREATH_THR_ADDR);
|
||||||
breathMaxVal = readSetting(breathMaxVal_ADDR);
|
breathMaxVal = readSetting(BREATH_MAX_ADDR);
|
||||||
portamThrVal = readSetting(PORTAM_THR_ADDR);
|
portamThrVal = readSetting(PORTAM_THR_ADDR);
|
||||||
portamMaxVal = readSetting(PORTAM_MAX_ADDR);
|
portamMaxVal = readSetting(PORTAM_MAX_ADDR);
|
||||||
pitchbThrVal = readSetting(PITCHB_THR_ADDR);
|
pitchbThrVal = readSetting(PITCHB_THR_ADDR);
|
||||||
|
@ -400,6 +409,7 @@ void setup() {
|
||||||
display.drawBitmap(0,0,nuevi_logo_bmp,128,64,1);
|
display.drawBitmap(0,0,nuevi_logo_bmp,128,64,1);
|
||||||
display.display();
|
display.display();
|
||||||
delay(5000);
|
delay(5000);
|
||||||
|
state = DISPLAYOFF_IDL;
|
||||||
mainState = NOTE_OFF; // initialize main state machine
|
mainState = NOTE_OFF; // initialize main state machine
|
||||||
if (!touchSensor.begin(0x5A)) {
|
if (!touchSensor.begin(0x5A)) {
|
||||||
while (1); // Touch sensor initialization failed - stop doing stuff
|
while (1); // Touch sensor initialization failed - stop doing stuff
|
||||||
|
@ -444,6 +454,7 @@ void loop() {
|
||||||
} else velocitySend = velocity;
|
} else velocitySend = velocity;
|
||||||
breathLevel=constrain(max(pressureSensor,initial_breath_value),breathThrVal,breathMaxVal);
|
breathLevel=constrain(max(pressureSensor,initial_breath_value),breathThrVal,breathMaxVal);
|
||||||
breath(); // send breath data
|
breath(); // send breath data
|
||||||
|
fingeredNote=noteValueCheck(fingeredNote);
|
||||||
if ((fingeredNote >= 0) and (fingeredNote <= 127)){ // don't send midi out of range
|
if ((fingeredNote >= 0) and (fingeredNote <= 127)){ // don't send midi out of range
|
||||||
usbMIDI.sendNoteOn(fingeredNote, velocitySend, activeMIDIchannel); // send Note On message for new note
|
usbMIDI.sendNoteOn(fingeredNote, velocitySend, activeMIDIchannel); // send Note On message for new note
|
||||||
dinMIDIsendNoteOn(fingeredNote, velocitySend, activeMIDIchannel - 1);
|
dinMIDIsendNoteOn(fingeredNote, velocitySend, activeMIDIchannel - 1);
|
||||||
|
@ -459,6 +470,7 @@ void loop() {
|
||||||
} else if (mainState == NOTE_ON) {
|
} else if (mainState == NOTE_ON) {
|
||||||
if (pressureSensor < breathThrVal) {
|
if (pressureSensor < breathThrVal) {
|
||||||
// Value has fallen below threshold - turn the note off
|
// Value has fallen below threshold - turn the note off
|
||||||
|
activeNote=noteValueCheck(activeNote);
|
||||||
if ((activeNote >= 0) and (activeNote <= 127)){ // don't send midi out of range
|
if ((activeNote >= 0) and (activeNote <= 127)){ // don't send midi out of range
|
||||||
usbMIDI.sendNoteOff(activeNote, velocitySend, activeMIDIchannel); // send Note Off message
|
usbMIDI.sendNoteOff(activeNote, velocitySend, activeMIDIchannel); // send Note Off message
|
||||||
dinMIDIsendNoteOff(activeNote, velocitySend, activeMIDIchannel - 1);
|
dinMIDIsendNoteOff(activeNote, velocitySend, activeMIDIchannel - 1);
|
||||||
|
@ -475,15 +487,17 @@ void loop() {
|
||||||
if ((millis() - lastDeglitchTime) > deglitch) {
|
if ((millis() - lastDeglitchTime) > deglitch) {
|
||||||
// whatever the reading is at, it's been there for longer
|
// whatever the reading is at, it's been there for longer
|
||||||
// than the debounce delay, so take it as the actual current state
|
// than the debounce delay, so take it as the actual current state
|
||||||
if (fingeredNote != activeNote) {
|
if (noteValueCheck(fingeredNote) != activeNote) {
|
||||||
// Player has moved to a new fingering while still blowing.
|
// Player has moved to a new fingering while still blowing.
|
||||||
// Send a note off for the current note and a note on for
|
// Send a note off for the current note and a note on for
|
||||||
// the new note.
|
// the new note.
|
||||||
velocity = map(constrain(pressureSensor,breathThrVal,breathMaxVal),breathThrVal,breathMaxVal,7,127); // set new velocity value based on current pressure sensor level
|
velocity = map(constrain(pressureSensor,breathThrVal,breathMaxVal),breathThrVal,breathMaxVal,7,127); // set new velocity value based on current pressure sensor level
|
||||||
|
fingeredNote=noteValueCheck(fingeredNote);
|
||||||
if ((fingeredNote >= 0) and (fingeredNote <= 127)){ // don't send midi out of range
|
if ((fingeredNote >= 0) and (fingeredNote <= 127)){ // don't send midi out of range
|
||||||
usbMIDI.sendNoteOn(fingeredNote, velocitySend, activeMIDIchannel); // send Note On message for new note
|
usbMIDI.sendNoteOn(fingeredNote, velocitySend, activeMIDIchannel); // send Note On message for new note
|
||||||
dinMIDIsendNoteOn(fingeredNote, velocitySend, activeMIDIchannel - 1);
|
dinMIDIsendNoteOn(fingeredNote, velocitySend, activeMIDIchannel - 1);
|
||||||
}
|
}
|
||||||
|
activeNote=noteValueCheck(activeNote);
|
||||||
if ((activeNote >= 0) and (activeNote <= 127)){ // don't send midi out of range
|
if ((activeNote >= 0) and (activeNote <= 127)){ // don't send midi out of range
|
||||||
usbMIDI.sendNoteOff(activeNote, 0, activeMIDIchannel); // send Note Off message for previous note (legato)
|
usbMIDI.sendNoteOff(activeNote, 0, activeMIDIchannel); // send Note Off message for previous note (legato)
|
||||||
dinMIDIsendNoteOff(activeNote, 0, activeMIDIchannel - 1);
|
dinMIDIsendNoteOff(activeNote, 0, activeMIDIchannel - 1);
|
||||||
|
@ -495,16 +509,36 @@ void loop() {
|
||||||
}
|
}
|
||||||
// Is it time to send more CC data?
|
// Is it time to send more CC data?
|
||||||
if (millis() - ccSendTime > CC_INTERVAL) {
|
if (millis() - ccSendTime > CC_INTERVAL) {
|
||||||
|
// Read touch pads (Teensy built in) and put value in variables
|
||||||
|
specialKey=(touchRead(0) > touch_Thr); //S2
|
||||||
|
halfPitchBendKey=(touchRead(1) > touch_Thr); //S1
|
||||||
// deal with Breath, Pitch Bend and Modulation
|
// deal with Breath, Pitch Bend and Modulation
|
||||||
breath();
|
breath();
|
||||||
pitch_bend();
|
pitch_bend();
|
||||||
portamento_();
|
portamento_();
|
||||||
|
extraController();
|
||||||
ccSendTime = millis();
|
ccSendTime = millis();
|
||||||
}
|
}
|
||||||
|
if (millis() - pixelUpdateTime > pixelUpdateInterval){
|
||||||
|
drawSensorPixels();
|
||||||
|
pixelUpdateTime = millis();
|
||||||
|
}
|
||||||
lastFingering=fingeredNote;
|
lastFingering=fingeredNote;
|
||||||
|
//do menu stuff
|
||||||
|
menu();
|
||||||
}
|
}
|
||||||
//_______________________________________________________________________________________________ FUNCTIONS
|
//_______________________________________________________________________________________________ FUNCTIONS
|
||||||
|
|
||||||
|
// MIDI note value check with out of range octave repeat
|
||||||
|
int noteValueCheck(int note){
|
||||||
|
if (note > 127){
|
||||||
|
note = 115+(note-127)%12;
|
||||||
|
} else if (note < 0) {
|
||||||
|
note = 12-abs(note)%12;
|
||||||
|
}
|
||||||
|
return note;
|
||||||
|
}
|
||||||
|
|
||||||
// Send a three byte din midi message
|
// Send a three byte din midi message
|
||||||
void midiSend3B(byte midistatus, byte data1, byte data2) {
|
void midiSend3B(byte midistatus, byte data1, byte data2) {
|
||||||
Serial3.write(midistatus);
|
Serial3.write(midistatus);
|
||||||
|
@ -569,12 +603,12 @@ void dinMIDIsendProgramChange(byte value, byte ch) {
|
||||||
void breath(){
|
void breath(){
|
||||||
int breathCCval;
|
int breathCCval;
|
||||||
breathLevel = breathLevel*0.8+pressureSensor*0.2; // smoothing of breathLevel value
|
breathLevel = breathLevel*0.8+pressureSensor*0.2; // smoothing of breathLevel value
|
||||||
breathCC = map(constrain(breathLevel,breathThrVal,breathMaxVal),breathThrVal,breathMaxVal,0,127);
|
breathCCval = map(constrain(breathLevel,breathThrVal,breathMaxVal),breathThrVal,breathMaxVal,0,127);
|
||||||
if (breathCC != oldbreath){ // only send midi data if breath has changed from previous value
|
if (breathCCval != oldbreath){ // only send midi data if breath has changed from previous value
|
||||||
if (breathCC){
|
if (breathCCval){
|
||||||
// send midi cc
|
// send midi cc
|
||||||
usbMIDI.sendControlChange(breathCC, breathCCval, activeMIDIchannel);
|
usbMIDI.sendControlChange(ccList[breathCC], breathCCval, activeMIDIchannel);
|
||||||
dinMIDIsendControlChange(breathCC, breathCCval, activeMIDIchannel - 1);
|
dinMIDIsendControlChange(ccList[breathCC], breathCCval, activeMIDIchannel - 1);
|
||||||
}
|
}
|
||||||
if (breathAT){
|
if (breathAT){
|
||||||
// send aftertouch
|
// send aftertouch
|
||||||
|
@ -589,9 +623,9 @@ void breath(){
|
||||||
|
|
||||||
void pitch_bend(){
|
void pitch_bend(){
|
||||||
int calculatedPBdepth;
|
int calculatedPBdepth;
|
||||||
int pbUp = touchRead(23);
|
pbUp = touchRead(23);
|
||||||
int pbDn = touchRead(22);
|
pbDn = touchRead(22);
|
||||||
int vibRead = touchRead(1);
|
int vibRead = touchRead(15);
|
||||||
if ((vibRead > vibThr)&&(vibRead > (oldvibRead+7))){
|
if ((vibRead > vibThr)&&(vibRead > (oldvibRead+7))){
|
||||||
if (dirUp){
|
if (dirUp){
|
||||||
pitchBend=oldpb*0.7+0.3*(8192 + vibDepth[vibrato]);
|
pitchBend=oldpb*0.7+0.3*(8192 + vibDepth[vibrato]);
|
||||||
|
@ -605,20 +639,20 @@ void pitch_bend(){
|
||||||
pitchBend=oldpb*0.7+0.3*(8192 + vibDepth[vibrato]);
|
pitchBend=oldpb*0.7+0.3*(8192 + vibDepth[vibrato]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pitchBend = oldpb*0.7+8192*0.3; // released, so smooth your way back to zero
|
// pitchBend = oldpb*0.7+8192*0.3; // released, so smooth your way back to zero
|
||||||
if ((pitchBend > 8187) && (pitchBend < 8197)) pitchBend = 8192; // 8192 is 0 pitch bend, don't miss it bc of smoothing
|
// if ((pitchBend > 8187) && (pitchBend < 8197)) pitchBend = 8192; // 8192 is 0 pitch bend, don't miss it bc of smoothing
|
||||||
}
|
}
|
||||||
oldvibRead = vibRead;
|
oldvibRead = vibRead;
|
||||||
if (PBdepth){
|
if (PBdepth){
|
||||||
calculatedPBdepth = (1/PBdepth*8192);
|
calculatedPBdepth = pbDepthList[PBdepth];
|
||||||
if (halfPitchBendKey) calculatedPBdepth = calculatedPBdepth/2;
|
if (halfPitchBendKey) calculatedPBdepth = calculatedPBdepth*0.5;
|
||||||
}
|
}
|
||||||
if ((pbUp > pitchbThrVal) && PBdepth){
|
if ((pbUp > pitchbThrVal) && PBdepth){
|
||||||
pitchBend=pitchBend*0.8+0.2*map(constrain(pbUp,pitchbThrVal,pitchbMaxVal),pitchbThrVal,pitchbMaxVal,8192,(8192 + calculatedPBdepth));
|
pitchBend=pitchBend*0.6+0.4*map(constrain(pbUp,pitchbThrVal,pitchbMaxVal),pitchbThrVal,pitchbMaxVal,8192,(8193 + calculatedPBdepth));
|
||||||
} else if ((pbDn > pitchbThrVal) && PBdepth){
|
} else if ((pbDn > pitchbThrVal) && PBdepth){
|
||||||
pitchBend=pitchBend*0.8+0.2*map(constrain(pbDn,pitchbThrVal,pitchbMaxVal),pitchbThrVal,pitchbMaxVal,8192,(8191 - calculatedPBdepth));
|
pitchBend=pitchBend*0.6+0.4*map(constrain(pbDn,pitchbThrVal,pitchbMaxVal),pitchbThrVal,pitchbMaxVal,8192,(8192 - calculatedPBdepth));
|
||||||
} else if (oldvibRead < vibThr){
|
} else if (oldvibRead < vibThr){
|
||||||
pitchBend = pitchBend*0.8+8192*0.2; // released, so smooth your way back to zero
|
pitchBend = pitchBend*0.6+8192*0.4; // released, so smooth your way back to zero
|
||||||
if ((pitchBend > 8187) && (pitchBend < 8197)) pitchBend = 8192; // 8192 is 0 pitch bend, don't miss it bc of smoothing
|
if ((pitchBend > 8187) && (pitchBend < 8197)) pitchBend = 8192; // 8192 is 0 pitch bend, don't miss it bc of smoothing
|
||||||
}
|
}
|
||||||
pitchBend=constrain(pitchBend, 0, 16383);
|
pitchBend=constrain(pitchBend, 0, 16383);
|
||||||
|
@ -632,13 +666,13 @@ void pitch_bend(){
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
void extraController(){
|
void extraController(){
|
||||||
exSensor=exSensor*0.6+0.4*touchRead(15); // get sensor data, do some smoothing
|
exSensor=exSensor*0.6+0.4*touchRead(16); // get sensor data, do some smoothing
|
||||||
if (extraCT && (exSensor >= extracThrVal)) { // if we are enabled and over the threshold, send portamento
|
if (extraCT && (exSensor >= extracThrVal)) { // if we are enabled and over the threshold, send data
|
||||||
if (!extracIsOn) {
|
if (!extracIsOn) {
|
||||||
extracIsOn=1;
|
extracIsOn=1;
|
||||||
if (extraCT == 2){ //Sustan ON
|
if (extraCT == 2){ //Sustain ON
|
||||||
usbMIDI.sendControlChange(65,127, activeMIDIchannel);
|
usbMIDI.sendControlChange(64,127, activeMIDIchannel);
|
||||||
dinMIDIsendControlChange(65,127, activeMIDIchannel - 1);
|
dinMIDIsendControlChange(64,127, activeMIDIchannel - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (extraCT == 1){ //Send modulation
|
if (extraCT == 1){ //Send modulation
|
||||||
|
@ -658,15 +692,15 @@ void extraController(){
|
||||||
oldextrac = 0;
|
oldextrac = 0;
|
||||||
} else if (extraCT == 2){ //SUS
|
} else if (extraCT == 2){ //SUS
|
||||||
//send sustain off
|
//send sustain off
|
||||||
usbMIDI.sendControlChange(65,0, activeMIDIchannel);
|
usbMIDI.sendControlChange(64,0, activeMIDIchannel);
|
||||||
dinMIDIsendControlChange(65,0, activeMIDIchannel - 1);
|
dinMIDIsendControlChange(64,0, activeMIDIchannel - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
void portamento_(){
|
void portamento_(){
|
||||||
biteSensor=biteSensor*0.6+0.4*touchRead(0); // get sensor data, do some smoothing
|
biteSensor=biteSensor*0.6+0.4*touchRead(17); // get sensor data, do some smoothing
|
||||||
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) {
|
||||||
portOn();
|
portOn();
|
||||||
|
@ -691,7 +725,7 @@ void portOn(){
|
||||||
|
|
||||||
void port(){
|
void port(){
|
||||||
int portCC;
|
int portCC;
|
||||||
portCC = map(constrain(biteSensor,portamThrVal,portamMaxVal),portamThrVal,portamMaxVal,1,127);
|
portCC = map(constrain(biteSensor,portamThrVal,portamMaxVal),portamThrVal,portamMaxVal,0,127);
|
||||||
if (portCC!=oldport){
|
if (portCC!=oldport){
|
||||||
usbMIDI.sendControlChange(CCN_Port, portCC, activeMIDIchannel);
|
usbMIDI.sendControlChange(CCN_Port, portCC, activeMIDIchannel);
|
||||||
dinMIDIsendControlChange(CCN_Port, portCC, activeMIDIchannel - 1);
|
dinMIDIsendControlChange(CCN_Port, portCC, activeMIDIchannel - 1);
|
||||||
|
@ -731,26 +765,22 @@ void readSwitches(){
|
||||||
uint16_t touchValue = touchSensor.touched();
|
uint16_t touchValue = touchSensor.touched();
|
||||||
|
|
||||||
// Octave rollers
|
// Octave rollers
|
||||||
if (((touchValue >> 2) & 0x01) && ((touchValue >> 4) & 0x01)) octaveR = 6; //R6 = R5 && R3
|
if (((touchValue >> 6) & 0x01) && ((touchValue >> 8) & 0x01)) octaveR = 6; //R6 = R5 && R3
|
||||||
else if ((touchValue >> 4) & 0x01) octaveR = 5; //R5
|
else if ((touchValue >> 6) & 0x01) octaveR = 5; //R5
|
||||||
else if ((touchValue >> 3) & 0x01) octaveR = 4; //R4
|
else if ((touchValue >> 9) & 0x01) octaveR = 4; //R4
|
||||||
else if ((touchValue >> 2) & 0x01) octaveR = 3; //R3
|
else if ((touchValue >> 8) & 0x01) octaveR = 3; //R3
|
||||||
else if ((touchValue >> 1) & 0x01) octaveR = 2; //R2
|
else if ((touchValue >> 11) & 0x01) octaveR = 2; //R2
|
||||||
else if ((touchValue >> 0) & 0x01) octaveR = 1; //R1
|
else if ((touchValue >> 10) & 0x01) octaveR = 1; //R1
|
||||||
|
|
||||||
// Valves and trill keys
|
// Valves and trill keys
|
||||||
K4=((touchValue >> 5) & 0x01);
|
K4=((touchValue >> 7) & 0x01);
|
||||||
K1=((touchValue >> 6) & 0x01);
|
K1=((touchValue >> 4) & 0x01);
|
||||||
K2=((touchValue >> 7) & 0x01);
|
K2=((touchValue >> 5) & 0x01);
|
||||||
K3=((touchValue >> 8) & 0x01);
|
K3=((touchValue >> 2) & 0x01);
|
||||||
K5=((touchValue >> 9) & 0x01);
|
K5=((touchValue >> 3) & 0x01);
|
||||||
K6=((touchValue >> 10) & 0x01);
|
K6=((touchValue >> 0) & 0x01);
|
||||||
K7=((touchValue >> 11) & 0x01);
|
K7=((touchValue >> 1) & 0x01);
|
||||||
|
|
||||||
// Read touch pads (Teensy built in) and put value in variables
|
|
||||||
//K4=touchRead(15) > touch_Thr; <<< this has been changed so K4 is now pin 5 on MPR121 (prev R6)
|
|
||||||
specialKey=touchRead(0) > touch_Thr; //S2
|
|
||||||
halfPitchBendKey=touchRead(1) > touch_Thr; //S1
|
|
||||||
|
|
||||||
// Calculate midi note number from pressed keys
|
// Calculate midi note number from pressed keys
|
||||||
fingeredNote=startNote-2*K1-K2-3*K3-5*K4+2*K5+K6+4*K7+octaveR*12+(octave-3)*12+transpose-12;
|
fingeredNote=startNote-2*K1-K2-3*K3-5*K4+2*K5+K6+4*K7+octaveR*12+(octave-3)*12+transpose-12;
|
||||||
|
@ -2831,6 +2861,63 @@ void drawSetupCtMenuScreen(){
|
||||||
display.display();
|
display.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawSensorPixels(){
|
||||||
|
int pos,oldpos;
|
||||||
|
int redraw=0;
|
||||||
|
if ((state == BREATH_ADJ_IDL) || (state == BREATH_ADJ_THR) || (state == BREATH_ADJ_MAX)){
|
||||||
|
pos = map(constrain(pressureSensor, breathLoLimit, breathHiLimit), breathLoLimit, breathHiLimit, 28, 118);
|
||||||
|
oldpos = map(constrain(lastPressure, breathLoLimit, breathHiLimit), breathLoLimit, breathHiLimit, 28, 118);
|
||||||
|
if (pos!=oldpos){
|
||||||
|
display.drawPixel(oldpos, 38, BLACK);
|
||||||
|
display.drawPixel(pos, 38, WHITE);
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
lastPressure=pressureSensor;
|
||||||
|
}
|
||||||
|
if ((state == PORTAM_ADJ_IDL) || (state == PORTAM_ADJ_THR) || (state == PORTAM_ADJ_MAX)){
|
||||||
|
pos = map(constrain(biteSensor,portamLoLimit,portamHiLimit), portamLoLimit, portamHiLimit, 28, 118);
|
||||||
|
oldpos = map(constrain(lastBite,portamLoLimit,portamHiLimit), portamLoLimit, portamHiLimit, 28, 118);
|
||||||
|
if (pos!=oldpos){
|
||||||
|
display.drawPixel(oldpos, 38, BLACK);
|
||||||
|
display.drawPixel(pos, 38, WHITE);
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
lastBite=biteSensor;
|
||||||
|
}
|
||||||
|
if ((state == PITCHB_ADJ_IDL) || (state == PITCHB_ADJ_THR) || (state == PITCHB_ADJ_MAX)){
|
||||||
|
pos = map(constrain(pbUp, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118);
|
||||||
|
oldpos = map(constrain(lastPbUp, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118);
|
||||||
|
if (pos!=oldpos){
|
||||||
|
display.drawPixel(oldpos, 38, BLACK);
|
||||||
|
display.drawPixel(pos, 38, WHITE);
|
||||||
|
redraw=1;
|
||||||
|
}
|
||||||
|
pos = map(constrain(pbDn, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118);
|
||||||
|
oldpos = map(constrain(lastPbDn, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118);
|
||||||
|
if (pos!=oldpos){
|
||||||
|
display.drawPixel(oldpos, 38, BLACK);
|
||||||
|
display.drawPixel(pos, 38, WHITE);
|
||||||
|
redraw=1;
|
||||||
|
}
|
||||||
|
if (redraw){
|
||||||
|
display.display();
|
||||||
|
redraw=0;
|
||||||
|
}
|
||||||
|
lastPbUp=pbUp;
|
||||||
|
lastPbDn=pbDn;
|
||||||
|
}
|
||||||
|
if ((state == EXTRAC_ADJ_IDL) || (state == EXTRAC_ADJ_THR) || (state == EXTRAC_ADJ_MAX)){
|
||||||
|
pos = map(constrain(exSensor, extracLoLimit, extracHiLimit), extracLoLimit, extracHiLimit, 28, 118);
|
||||||
|
oldpos = map(constrain(lastEx, extracLoLimit, extracHiLimit), extracLoLimit, extracHiLimit, 28, 118);
|
||||||
|
if (pos!=oldpos){
|
||||||
|
display.drawPixel(oldpos, 38, BLACK);
|
||||||
|
display.drawPixel(pos, 38, WHITE);
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
lastEx=exSensor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void writeSetting(byte address, unsigned short value){
|
void writeSetting(byte address, unsigned short value){
|
||||||
union {
|
union {
|
||||||
byte v[2];
|
byte v[2];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue