#include <Wire.h>
#include <ResponsiveAnalogRead.h>
#include <MIDI.h>
#include <DS_MCP4018.h>
MCP4018 MCP;
const byte LinearRegulatorControlPin = 23;
const byte TCTRL_Pedal_Type_Pin = 30;//determine which type of pedal
const byte Pedal_Sense_Pin = 31;//detect when pedal is inserted
const byte ADC1 = 15;//Pin 15 (A1) for continuous expression pedal data - OR digital pin for footswitch operation
const byte RS_ADC2_Pin = 32;
const unsigned long debounceTime = 35;
bool PedalDetected = false;
bool PedalStatusChanged = false;
bool PedalPluggedIn = false;
int rawData;
int CurPedalVal = 0;
int PrevPedalVal = 1;
int VoltageLow = 7;
int VoltageHigh = 970;
const byte ExprPed = 0;
const byte SingleFS = 1;
const byte DualFS = 2;
byte PedalMode = SingleFS;
ResponsiveAnalogRead analog(ADC1, true);
void setup() {
Serial.begin(115200);
//Turn on power for Pedal (Using external voltage regulator)
pinMode(LinearRegulatorControlPin, OUTPUT);
digitalWrite(LinearRegulatorControlPin, HIGH);
delay(10);
//Test digital pot nMCP4018 and set resistance
MCP.reset();
if(!MCP.begin()) Serial.print("\nMCP4018 could not be found...");
else Serial.println("MCP found!");
MCP.setWiperResistance(10000);
MCP.setWiperPercent(93);//93 is good for Roland FC7
Serial.println("MCP resistance set to:" + String(MCP.getWiperResistance()));
Serial.println("MCP wiper percent set to:" + String(MCP.getWiperPercent()));
pinMode(Pedal_Sense_Pin, INPUT_PULLUP);//Button to detect if pedal is plugged in
pinMode(TCTRL_Pedal_Type_Pin, OUTPUT);
if (PedalMode == ExprPed) {
digitalWrite(TCTRL_Pedal_Type_Pin, LOW);//LOW sets pedal as EXPR pedal; HIGH sets as footswitch(es)
pinMode(RS_ADC2_Pin, INPUT);
analog.setActivityThreshold(12);//12 is very stable and a good compromise//4 is very sensitive
analog.enableEdgeSnap();
}
else if (PedalMode == SingleFS) {
digitalWrite(TCTRL_Pedal_Type_Pin, HIGH);//LOW sets pedal as EXPR pedal; HIGH sets as footswitch(es)
pinMode(ADC1, INPUT_PULLUP);
pinMode(RS_ADC2_Pin, INPUT);
}
else if (PedalMode == DualFS) {
digitalWrite(TCTRL_Pedal_Type_Pin, HIGH);//LOW sets pedal as EXPR pedal; HIGH sets as footswitch(es)
pinMode(ADC1, INPUT_PULLUP);
pinMode(RS_ADC2_Pin, INPUT_PULLUP);
}
}//end void Setup
void loop() {
PedalDetect();
if (PedalDetected) {
OutputMIDI();
}
}
void OutputMIDI() {
if (PedalMode == ExprPed){
analog.update();
if (analog.hasChanged()) {
rawData = analog.getValue();
rawData = constrain(rawData, VoltageLow, VoltageHigh);
CurPedalVal = map(rawData, VoltageLow, VoltageHigh, 0, 127);//CurPedalVal[y] = map(rawData[y], VoltageLow, VoltageHigh, MIDIMin[y], MIDIMax[y]);
CurPedalVal = constrain(CurPedalVal, 0, 127);//CurPedalVal[y] = constrain(CurFaderVal[y], MIDIMin[y], MIDIMax[y]);
if (CurPedalVal != PrevPedalVal) {
PrevPedalVal = CurPedalVal;
Serial.println("MIDI Value: " + String(CurPedalVal));
//Serial.println("Current Pedal Raw Value:" + String(rawData));
usbMIDI.sendControlChange(64, CurPedalVal , 1);
}
}// if
}//if (PedalMode == ExprPed){
else if (PedalMode == SingleFS){
FS1State();
}//else if (PedalMode == SingleFS){
else if (PedalMode == DualFS) {
FS1State();
FS2State();
}
}//end void OutputMIDI
void PedalDetect(){
//const unsigned long debounceTime = 35;
static unsigned long Last_Reading_Time_Pedal_Detect = 0;
unsigned long Current_Reading_Time_Pedal_Detect = millis();
if (Current_Reading_Time_Pedal_Detect - Last_Reading_Time_Pedal_Detect > debounceTime) {
if (digitalRead(Pedal_Sense_Pin) == HIGH) {
PedalDetected = true;
if (!PedalPluggedIn) {
PedalPluggedIn = true;
PedalStatusChanged = true;
}
else PedalStatusChanged = false;
}
else {
PedalDetected = false;
if (PedalPluggedIn) {
PedalPluggedIn = false;
PedalStatusChanged = true;
}
else PedalStatusChanged = false;
}
Last_Reading_Time_Pedal_Detect = millis();
}//if
if (PedalStatusChanged) {
PedalStatusChanged = false;
if (PedalPluggedIn) Serial.println("A pedal was inserted.");
else Serial.println("A pedal was removed.");
}
}//end void PedalDetect
void FS1State(){
static unsigned long Last_Reading_Time_Pedal_DetectFS1 = 0;
unsigned long Current_Reading_Time_Pedal_DetectFS1 = millis();
static bool FS1_Data_Sent = false;
if (Current_Reading_Time_Pedal_DetectFS1 - Last_Reading_Time_Pedal_DetectFS1 > debounceTime) {
if(digitalRead(ADC1) == HIGH){
if (!FS1_Data_Sent){
Serial.println("ADC1 is HIGH!");
Serial.println("Sending MIDI Note ON");
Serial.println("");
FS1_Data_Sent = true;
}
}
else {
if (FS1_Data_Sent){
Serial.println("ADC1 is LOW!");
Serial.println("Sending MIDI Note OFF");
Serial.println("");
FS1_Data_Sent = false;
}
}
Last_Reading_Time_Pedal_DetectFS1 = millis();
}//if
}//end void FS1State
void FS2State(){
static unsigned long Last_Reading_Time_Pedal_DetectFS2 = 0;
unsigned long Current_Reading_Time_Pedal_DetectFS2 = millis();
static bool FS2_Data_Sent = false;
if (Current_Reading_Time_Pedal_DetectFS2 - Last_Reading_Time_Pedal_DetectFS2 > debounceTime) {
if(digitalRead(RS_ADC2_Pin) == HIGH){
if (!FS2_Data_Sent){
Serial.println("RS_ADC2_Pin is HIGH!");
Serial.println("Sending MIDI Note OFF");
Serial.println("");
FS2_Data_Sent = true;
}
}
else {
if (FS2_Data_Sent){
Serial.println("RS_ADC2_Pin is LOW!");
Serial.println("Sending MIDI Note ON");
Serial.println("");
FS2_Data_Sent = false;
}
}
Last_Reading_Time_Pedal_DetectFS2 = millis();
}//if
}//end void FS2State