I have an issue with this piece of code concerning the use of 3 capcitance sensors each outputting a midi note chosen from one of three scales selected with a pot. Regarding the sensors triggering notes and the pot selecting scales, everything is perfect. 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!!
#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;
}
each sensor will play each of the scale's notes by itself with each finger press
keep tapping
... does that mean that you tap the sensor and you hear one note, then you tap again and hear the next note, and so on?