Hallo zusammen,
Ich habe mit 6 4051 Multiplexern die Digitalen Inputs an meinem Arduino Mega erweitert. Ich möchte dort insgesamt 60 Taster anschließen und damit Midi-Noten verschicken.
Mein Problem ist, dass wenn ich einen der Taster drücke nichts passiert.
Hier ist mein Code:
int controlChange = 176; //Midikanal 1
byte controllerNummer[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80};
byte controllerWert[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte controllerWertAlt[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte faderWert[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// byte smoothWert[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int taste[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
int tasteAlt[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
boolean tasteGedrueckt[] = {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false};
int faderPin[] = {A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14};
int tastePin[] = {30,31,32,33,34,35,36};
byte bit1 = 0;
byte bit2 = 0;
byte bit3 = 0;
int i = 0;
void setup() {
Serial.begin(9600);
//Select Pins 4051
pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
//Input Pins 4051 Buttons
pinMode(30, INPUT);
pinMode(31, INPUT);
pinMode(32, INPUT);
pinMode(33, INPUT);
pinMode(34, INPUT);
pinMode(35, INPUT);
pinMode(36, INPUT);
}
void loop() {
//Durchschalten der 4051
for(int i = 0; i <= 60; i++){
bit1 = bitRead(i,0);
bit2 = bitRead(i,1);
bit3 = bitRead(i,2);
digitalWrite(22, bit1);
digitalWrite(23, bit2);
digitalWrite(24, bit3);
tasteAbfragen(i,30,controllerNummer[16]);
tasteAbfragen(i+8,31, controllerNummer[24]);
tasteAbfragen(i+16,32, controllerNummer[32]);
tasteAbfragen(i+24,33, controllerNummer[40]);
tasteAbfragen(i+32,34, controllerNummer[48]);
tasteAbfragen(i+40,35, controllerNummer[56]);
}
//Fader abfragen
for(i = 0; i < 14; i++){
faderWert[i] = analogRead(faderPin[i]);
controllerWert[i] = map(faderWert[i], 0, 1023, 0, 127);
faderWert[i] = 0.2 * faderWert[i] + 0.8 * analogRead(faderPin);
if(controllerWertAlt[i] != controllerWert[i]){
Serial.write(controlChange);
Serial.write(controllerNummer[i]);
Serial.write(controllerWert[i]);
}
controllerWertAlt[i] = controllerWert[i];
}
// smoothWert = 0.6 * smoothWert + 0.4 * analogRead(faderPin[i]);
}
//Tasten abfragen
void tasteAbfragen(int zaehler, int digitalPin, int ctrlNummer){
taste[zaehler] = digitalRead(digitalPin);
if(taste[zaehler] == HIGH && tasteAlt[zaehler] == LOW){
sendeMIDI(controlChange, ctrlNummer, 127);
tasteAlt[zaehler] = taste[zaehler];
}
if(taste[zaehler] == LOW && tasteAlt[zaehler] == HIGH){
sendeMIDI(controlChange, ctrlNummer, 0);
taste[zaehler] = taste[zaehler];
}
}
//Midi Senden
void sendeMIDI(byte statusByte, byte dataByte1, byte dataByte2){
Serial.write(statusByte);
Serial.write(dataByte1);
Serial.write(dataByte2);
}