However, each sensor will play each of the scale's notes by itself with each finger press. This of course is not what I am intending as each sensor should only trigger its corresponding note. Thanks for any clues and tips!!
Code: Select all
#include <SPI.h>
#include <CapacitiveSensor.h>
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
// midi notes
int c3 = 36;
int d3 = 38;
int e3 = 40;
int g3 = 43;
int a3 = 45;
int c4 = 48;
int d4 = 50;
int e4 = 52;
int g4 = 55;
int a4 = 57;
int c5 = 60;
int d5 = 62;
int e5 = 64;
int g5 = 67;
int a5 = 69;
int c6 = 72;
/////// code & 2d array for scale selection
const int columns = 3;
const int scales = 3;
int potVal = 0;
const int notes[scales][columns] = {
{c3, d3, e3},
{c4, d4, e4},
{c5, d5, e5}
};
const int numberOfSensors = 3;
int sensorPin[numberOfSensors] = {38, 39, 40};
/////////
static const unsigned ledPin1 = 22; // LED pin on Arduino Mega
static const unsigned ledPin2 = 23;
static const unsigned ledPin3 = 24;
int val = 10; // this value is best around "10". works with "multiply"
// and "Threshold" to enable Polyphony!
int Threshold = (0); //Threshold of triggered mp3
int Multiply = (0); //increases or decreases the overal sensitivity
CapacitiveSensor cs_2_38 = CapacitiveSensor(2, 38); //Mega sensor pins
CapacitiveSensor cs_2_39 = CapacitiveSensor(2, 39);
CapacitiveSensor cs_2_40 = CapacitiveSensor(2, 40);
void setup()
{
for (int i = 0; i < numberOfSensors; i++) {
pinMode(sensorPin[i], INPUT);
Serial.begin(9600); //midi(31250)
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
}
}
void loop()
{
int potVal = map(analogRead(A2), 0, 1024, 0, 3);
for (int i = 0; i < numberOfSensors; i++) {
checkSensor(potVal, i);
}
}
void checkSensor(int scaleIndex, int columnIndex)
{
static boolean lastSensorHit1 = false;
static boolean lastSensorHit2 = false;
static boolean lastSensorHit3 = false;
bool sensorHit3 = cs_2_40.capacitiveSensor(Multiply) / val > (Threshold);
bool sensorHit2 = cs_2_39.capacitiveSensor(Multiply) / val > (Threshold);
bool sensorHit1 = cs_2_38.capacitiveSensor(Multiply) / val > (Threshold);
Multiply = map(analogRead(A0), 0, 1023, 150, 5);
Threshold = map(analogRead(A1), 0, 1023, 150, 5);
long total1 = cs_2_38.capacitiveSensor(Multiply);
long total2 = cs_2_39.capacitiveSensor(Multiply);
long total3 = cs_2_40.capacitiveSensor(Multiply);
int Art1 = total1 / val;
int Art2 = total2 / val;
int Art3 = total3 / val;
if (sensorHit1 != lastSensorHit1)
if (sensorHit1 && !lastSensorHit1)
{
digitalWrite(ledPin1, HIGH);
MIDI.sendNoteOn(notes[scaleIndex][columnIndex], 127, 1); // Send a Note (pitch 80, velo 127 on channel 1)
MIDI.sendControlChange(64, 127, 1);
}
else {
digitalWrite(ledPin1, LOW);
MIDI.sendNoteOff(notes[scaleIndex][columnIndex], 0, 1); // Stop the note
MIDI.sendControlChange(64, 0, 1);
}
if (sensorHit2 != lastSensorHit2)
if (sensorHit2 && !lastSensorHit2)
{
digitalWrite(ledPin2, HIGH);
MIDI.sendNoteOn(notes[scaleIndex][columnIndex], 127, 1); // Send a Note (pitch 79, velo 127 on channel 1)
MIDI.sendControlChange(64, 127, 1);
}
else {
digitalWrite(ledPin2, LOW);
MIDI.sendNoteOff(notes[scaleIndex][columnIndex], 0, 1); // Stop the note
MIDI.sendControlChange(64, 0, 1);
}
if (sensorHit3 != lastSensorHit3)
if (sensorHit3 && !lastSensorHit3)
{
digitalWrite(ledPin3, HIGH);
MIDI.sendNoteOn(notes[scaleIndex][columnIndex], 127, 1); // Send a Note (pitch 78, velo 127 on channel 1)
MIDI.sendControlChange(64, 127, 1);
}
else {
digitalWrite(ledPin3, LOW);
MIDI.sendNoteOff(notes[scaleIndex][columnIndex], 0, 1); // Stop the note
MIDI.sendControlChange(64, 0, 1);
}
lastSensorHit1 = sensorHit1;
lastSensorHit2 = sensorHit2;
lastSensorHit3 = sensorHit3;
}