And his is my code, working and, let's say completed version. Explications in the next post ...
/* DEXTROLER Midi Truc, version 01, 28.12.2010, Rennes-France par xDEx - Victor Proda /// xdex@free.fr
Merci a Makari - Gael Signol pour son Grooooos coup de main!
License GNU
REFS (par ordre de parution):
1. http://little-scale.blogspot.com/2007/11/pots-and-switches-to-midi-data.html
Digital and Analog Data to MIDI Output by Sebastian Tomczak
2. midi_cc_test.pde by Benjamin Eckel
http://blog.datasingularity.com/?p=34
3. http://www.arduino.cc/en/Tutorial/ShiftIn
Parallel to Serial Shifting-In with a CD4021BE
4. http://www.arduino.cc/playground/Learning/4051
Analog Multiplexer/Demultiplexer - 4051
*/
#define e 1 // delta machin truc
byte status_byte = 176;
// control change sur channel 1
byte cc_on_byte = 127;
// data to send if button is pressed
byte cc_off_byte = 0;
// data to send if button is depressed
// set controller numbers for the pots
byte ana_cc_0[] = {30, 31, 38, 39, 34, 35, 42, 43}; // EQ 1-8
byte ana_cc_1[] = {32, 33, 40, 41, 36, 37, 44, 45}; // EQ 8-16
byte ana_cc_2[] = {54, 53, 56, 51, 55, 52, 57, 50}; // FILTERS AND FX
byte ana_cc_3[] = {20, 0, 22, 0, 21, 0, 23, 0}; // VOLUME FADERS
byte data_ana_cc_0[] = {
255, 255, 255, 255, 255, 255, 255, 255};
byte data_ana_cc_1[] = {
255, 255, 255, 255, 255, 255, 255, 255};
byte data_ana_cc_2[] = {
255, 255, 255, 255, 255, 255, 255, 255};
byte data_ana_cc_3[] = {
255, 255, 255, 255, 255, 255, 255, 255};
// set controller numbers for the switches
byte dig_cc_0[] = {00, 04, 8, 12, 01, 05, 9, 13}; // BOUTONS BLOCK 1
byte dig_cc_1[] = {02, 06, 10, 14, 03, 07, 11, 15}; // BOUTONS BLOCK 2
byte dig_cc_2[] = {60, 61, 62, 63, 64, 65, 66, 67}; // BOUTONS CUE ET FX
byte dig_cc_3[] = {70, 71, 72, 73, 74, 75, 76, 77}; // BOUTONS PONTES
// plein de Zeros pour les switches
byte data_dig_cc_0[] = {0, 0, 0, 0, 0, 0, 0, 0};
byte data_dig_cc_1[] = {0, 0, 0, 0, 0, 0, 0, 0};
byte data_dig_cc_2[] = {0, 0, 0, 0, 0, 0, 0, 0};
byte data_dig_cc_3[] = {0, 0, 0, 0, 0, 0, 0, 0};
//Data entrees analogiques
byte data0 = 0;
byte data1 = 0;
byte data2 = 0;
byte data3 = 0;
//Les Ports E/S
int latchPin = 5; // set the latch pin
int clockPin = 7; // set the clock pin
int dataPin_0 = 6;// set the data in pin 1
int dataPin_1 = 8;// set the data in pin 2
int dataPin_2 = 9;// set the data in pin 3
//int dataPin_2 = 10;// set the data in pin 4, UNUSED
byte digital_data = 0;
int state_0 = 0;
int state_1 = 0;
int state_2 = 0;
int state_3 = 0;
//Position Centrale pour le potarrrrrr (en DEC, et seulement tou qui sont traites)
byte finalpotar_1 = 108;
//variables a potar - def de la position Zero pour chaque pot, 0 (zero pour ne pas traiter)
byte vpotana_cc_0[] = {63, 57, 63, 56, 60, 57, 61, 58}; // EQ 1-8
byte vpotana_cc_1[] = {60, 0, 56, 0, 53, 0, 54, 0}; // EQ 8-16
byte vpotana_cc_2[] = {0, 0, 0, 0, 0, 0, 0, 0}; // FILTERS AND FX
byte vpotana_cc_3[] = {0, 0, 0, 0, 0, 0, 0, 0}; // VOLUME FADERS
//Important pour les calculs a virgulle flotante ...
float potartmp=0.00;
//Ze Setup Truc ...
void setup() {
Serial.begin(31250); // SERIAL MIDI
//Serial.begin(28800); //SERIAL CONSOLE DEBUG
//Serial.begin(9200); //SERIAL CONSOLE DEBUG
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin_0,INPUT);
pinMode(dataPin_1,INPUT);
pinMode(dataPin_2,INPUT);
//Si vous le dites ...
digitalWrite(latchPin,HIGH);
digitalWrite(clockPin,HIGH);
}
//Debut de l'initiation dans la Magie Noire ...
void loop() {
delayMicroseconds(20);
digitalWrite(latchPin,0);
byte myDataIn = 0;
for (int j=7; j>=0; j--)
{
digitalWrite(clockPin, 0);
delayMicroseconds(20);
/////// INPUT 01 NUMERIQUE
state_0 = digitalRead(dataPin_0);
if (state_0) {
if(data_dig_cc_0[j] != 1) {
Serial.print(status_byte);
Serial.print(dig_cc_0[j]);
Serial.print(cc_on_byte);
data_dig_cc_0[j] = 1;
}
}
else {
if(data_dig_cc_0[j] != 0) {
Serial.print(status_byte);
Serial.print(dig_cc_0[j]);
Serial.print(cc_off_byte);
data_dig_cc_0[j] = 0;
}
}
/////// INPUT 02 NUMERIQUE
digitalWrite(clockPin, 0);
delayMicroseconds(20);
state_1 = digitalRead(dataPin_1);
if (state_1) {
if(data_dig_cc_1[j] != 1) {
Serial.print(status_byte);
Serial.print(dig_cc_1[j]);
Serial.print(cc_on_byte);
data_dig_cc_1[j] = 1;
}
}
else {
if(data_dig_cc_1[j] != 0) {
Serial.print(status_byte);
Serial.print(dig_cc_1[j]);
Serial.print(cc_off_byte);
data_dig_cc_1[j] = 0;
}
}
/////// INPUT 03 NUMERIQUE
digitalWrite(clockPin, 0);
delayMicroseconds(20);
state_2 = digitalRead(dataPin_2);
if (state_2) {
if(data_dig_cc_2[j] != 1) {
Serial.print(status_byte);
Serial.print(dig_cc_2[j]);
Serial.print(cc_on_byte);
data_dig_cc_2[j] = 1;
}
}
else {
if(data_dig_cc_2[j] != 0) {
Serial.print(status_byte);
Serial.print(dig_cc_2[j]);
Serial.print(cc_off_byte);
data_dig_cc_2[j] = 0;
}
}
/////// INPUT 04 NUMERIQUE
/* digitalWrite(clockPin, 0);
delayMicroseconds(20);
state_3 = digitalRead(dataPin_3);
if (state_3) {
if(data_dig_cc_3[j] != 1) {
Serial.print(status_byte);
Serial.print(dig_cc_3[j]);
Serial.print(cc_on_byte);
data_dig_cc_3[j] = 1;
}
}
else {
if(data_dig_cc_3[j] != 0) {
Serial.print(status_byte);
Serial.print(dig_cc_3[j]);
Serial.print(cc_off_byte);
data_dig_cc_3[j] = 0;
}
}
*/
/////// Personne ne sait a quoi ca peut bien servir ...
digitalWrite(clockPin, 1);
}
digitalWrite(latchPin, 1);
/////// ANALOG INPUT 1
for(byte i = 0; i <= 7; i++) {
PORTD = i * 4;
data0 = analogRead(0) /4; //On divise par 4, et non par 8 pour passer de 1023 a 127, par la suite, on redivise le resultat en 2
if(abs(data_ana_cc_0[i] - data0) > e) {
sendMidi(ana_cc_0[i], data0,vpotana_cc_0[i]);
data_ana_cc_0[i] = data0;
}
}
/////// ANALOG INPUT 2
for(byte i = 0; i <= 7; i++) {
PORTD = i * 4;
data1 = (analogRead(1)) / 4;
if(abs(data_ana_cc_1[i] - data1) > e) {
sendMidi(ana_cc_1[i], data1,vpotana_cc_1[i]);
data_ana_cc_1[i] = data1;
}
}
/////// ANALOG INPUT 3
for(byte i = 0; i <= 7; i++) {
PORTD = i * 4;
data2 = analogRead(2) /4;
if(abs(data_ana_cc_2[i] - data2) > e) {
sendMidi(ana_cc_2[i], data2,vpotana_cc_2[i]);
data_ana_cc_2[i] = data2;
}
}
/////// ANALOG INPUT 4
for(byte i = 0; i <= 7; i++) {
PORTD = i * 4;
data3 = analogRead(3) /4;
if(abs(data_ana_cc_3[i] - data3) > e) {
sendMidi(ana_cc_3[i], data3,vpotana_cc_3[i]);
data_ana_cc_3[i] = data3;
}
}
}
//La chose de Gael pour le potards ... Merciiiiii Gaeeeeeeeel !!!!!!!!!!!
void sendMidi(byte controlNum, byte val, byte vpotana) {
if(vpotana != 0){
if(val <= 2*vpotana){
val=floor(val*((float)finalpotar_1/(float)vpotana));
}
else{
potartmp=ceil(2*(float)finalpotar_1+(val-2*(float)vpotana)*((127-(float)finalpotar_1)/(127-(float)vpotana)));
val=potartmp;
}
if(abs(val - 2*finalpotar_1) <= 2){
val=2*finalpotar_1;
}
}
Serial.print(0xB0, BYTE);
Serial.print(controlNum, BYTE);
//Chose tres importante !!!
Serial.print(val /2, BYTE );
}
//Uffff, c'est fini ...