banjorobbie
New Member
Hello, I'm having difficulty with triggering the correct notes with my capacitive sensors running on an Arduino Mega. Sensors work fine if triggering allocated notes in the double if statements of the loop as such...
...However, if I want to choose a scale for the sensors to play using a pot and change to...
... then I run into problems. For example, for each successive tap of sensor 1 I will get a different note of the chosen scale. This happens for all the sensors.
What I want to happen is that each sensor has its own note from any chosen scale. Can anyone provide a small example on how I could solve this matter please? Any help much appreciated....
Code:
if (sensorHit1 != lastSensorHit1)
if (sensorHit1 && !lastSensorHit1)
{
digitalWrite(ledPin1, HIGH);
MIDI.sendNoteOn(80, 127, 1); // Send a Note (pitch 80, velo 127 on channel 1)
MIDI.sendControlChange(64, 127, 1);
}
Code:
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);
}
What I want to happen is that each sensor has its own note from any chosen scale. Can anyone provide a small example on how I could solve this matter please? Any help much appreciated....
Code:
#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);
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;
}