Mon May 03, 2021 8:18 am
Hello Larason2, thank you for sharing your program, I have used it just for encoding pedalboard on a small "KeeYees Pro Micro ATmega32U4 Module de Développement 5V 16MHz Micro USB pour Arduino IDE Leonardo Bootloader".
(Having some problems with the length of the wire (near 3 meters) and parasites for some notes, I choose to separate functions, my Arduino Mega just converting MidiSerial from the keyboards to MidiUSB and the I2C Bus for buttons and pistons and their Leds). I just modifying it for less writing, using loops and array and that save a lot of codes and add a debouncing function. I think you could use the same method and save a lot lines of code...
----------------------------------------------------------
// Name: Pedal_encoder
// Created: 16/04/2021
// Author: JMG
// Ce programme fonctionne au choix avec un Arduino Mega ou avec un équivalent Leonardo moyennant quelques
// ajustement au niveau de l'affectation des pins et de la commande Serial. Il prévu pour un pédalier de 30 marches
// matricé en 4x8. (Deux notes manquent !) Le matricage est de type diode montée en cathode commune c'est à dire que
// toutes les diodes d'une même colonne ont leur cathode relièe au meme potentiel pendant la scrutation de chaque anode
// (que l'interrupteur soit d'un coté ou de l'autre de la diode ne change qrien quant au résultat de la mesure.)
// Pour plus d'infos voir les commentaires dans le code.
// En décommantant #define DEBUG 1 on peut debugger sur le moniteur série .
//#define DEBUG 1
unsigned long debounceTimeStamp;
int debounceDelay = 10;
byte keysC[4][8]; //Pedalier: Tableau contenant l'état des touches O=enfoncée ou 1=relachée; [Col=Mx][Row=P]
byte lastC[4][8]; //Pedalier: Tableau contenant l'état des touches lors de précédente boucle
// Definition des constantes
uint8_t channel = 0; // canal midi pédalier
const uint8_t ped_Note[4][8] = {
{0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B},
{0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33},
{0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B},
{0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43},
};
/*
// Déclaration Pin pour Arduino Mega
const uint8_t pinRow[8] = {22, 24, 26, 28, 30, 32, 34, 36};
const uint8_t pinCol[4] = {23, 25, 27, 29};
*/
// Déclaration Pin pour Leonardo utilise Serial1 au lieu de Serial
const uint8_t pinRow[8] = {21, 20, 19, 18, 15, 14, 16, 10};
const uint8_t pinCol[4] = {6, 7, 8, 9};
int noteOn = 0x90;
int noteOff = 0x80;
int velocity = 0x64;
void setup() {
noteOn = noteOn + channel;
noteOff = noteOff + channel;
// Start Serial
#ifdef DEBUG
Serial.begin(38400);
#else
Serial1.begin(31250);
#endif
// Initialise lastC
for (int Mx=0; Mx < 4; Mx++) {
for (int P=0; P < 8; P++) {
lastC[Mx][P] = 1;
}
}
//Initialize Keyboard C
for (int Mx = 0; Mx < 4; Mx++) {
pinMode(pinCol[Mx], INPUT);
}
for (int P = 0; P < 8; P++) {
pinMode(pinRow[P], INPUT);
}
}
void loop() {
if (millis() - debounceTimeStamp >= debounceDelay) {
// Read Keyboard C <=> Pedalier
//Set Row pins to read
for (int P = 0; P < 8; P++) {
pinMode(pinRow[P], INPUT_PULLUP);
}
// Scrute dans chaque colonne (Mx) les rangées (P)
for (int Mx = 0; Mx < 4; Mx++) {
// met la cathode de la diode à la masse
pinMode(pinCol[Mx], OUTPUT);
digitalWrite(pinCol[Mx], LOW);
for (int P = 0; P < 8; P++) {
// lit valeur sur la rangée si inter fermé = note enfoncée => ==0
keysC[Mx][P] = digitalRead(pinRow[P]);
}
// Remet la colonne en mode INPUT
pinMode(pinCol[Mx], INPUT);
}
/*
// Envoi des messages midi correspondant à l'état des notes
// Si Note enfoncée alors keysC[Col=Mx][Row=P] = 0
// si note enfoncée (==0) et précédent ==1 alors envoi NoteON
// si note relachée (==1) et précédent ==0 alors envoi NoteOff
// si pas de changement on fait rien
*/
for (int Mx = 0; Mx < 4; Mx++) {
debounceTimeStamp = millis();
for (int P = 0; P < 8; P++) {
if ((keysC[Mx][P] == 0) and (lastC[Mx][P] == 1)) {
MidiSend(noteOn,ped_Note[Mx][P], velocity);
lastC[Mx][P] = 0;
}
if ((keysC[Mx][P] == 1) and (lastC[Mx][P] == 0)) {
MidiSend(noteOff,ped_Note[Mx][P], velocity);
lastC[Mx][P] = 1;
}
} // fin for P
} // fin for Mx
} // fin du if
}
#ifdef DEBUG
void MidiSend(int cmd, int note, int vel) {
Serial.print(cmd, HEX);
Serial.print(" ");
Serial.print(note, HEX);
Serial.print(" ");
Serial.println(vel, HEX);
}
#else
void MidiSend(int cmd, int note, int vel) {
Serial1.write(cmd);
Serial1.write(note);
Serial1.write(vel);
}
#endif