/*
Hauptprogramm: Hier werden alle globalen Variablen angelegt
und die einzelnen Funktionen aufgerufen.
*/
// Potentiometer //
//int potiPin[] = {A0,A1,A2,A3,A4,A5}; //Poti input pin auf Arduino, nicht nötig da Multiplexer
int controllerNr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //Midi Controller Nr. 20/21/22 ...
int controllerWert[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int potiWert_alt[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int potiWert_diff[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int potiWert[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //Poti Wert direkt aus analogRead()
int bit1 = 0;
int bit2 = 0;
int bit3 = 0;
int bit4 = 0;
// Buttons //
int buttonPin[] = {12, 13}; //Anschluss Pin auf Arduino
int buttonNr[] = {26,27}; //AusgabeNr der Midi Info
int buttonStat[] = {0, 0}; //Status, in dem sich der Button befindet (gedrückt/nicht gedrückt)
int buttonStat_alt[] = {0, 0}; //Alter Status, in dem sich der Button befindet (gedrückt/nicht gedrückt)
int LEDPin[] = {10, 11};
void setup()
{
/*Serielle Schnittstelle wird aktiviert (benötigt um entweder
im seriellen Monitor oder über hairless Midi Daten zu empfangen)*/
Serial.begin(115200);
//Einlese Pin Multiplexer bzw. alle Potentiometer
pinMode(A0, INPUT);
//Ausgabe Pin S0/S1/S2/S3 Multiplexer für Auswahl Potentiometer
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
//Button Pins werden als Input deklariert
pinMode(12, INPUT);
pinMode(13, INPUT);
//Ausgabe Pin LED
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop()
{
potentiometer();
buttons();
}
//--------- MidiSendInfo ---------//
/*
Die MIDI-Nachricht besteht aus drei Bytes.
Das erste Byte ist das "Status Byte". Das zweite und dritte Byte sind immer "DatenBytes",
sie enthalten also die Information. Dabei kann die Art der Information jedoch je nach dem Status variieren.
Soll beispielsweise eine Note gesendet werden, gibt das zweite Byte die Tonhöhe an (0-127)
und das dritte Byte die Lautstärke an (0-127, da 8 Bit = 1 Byte)
Wichtig ist, die "Datenbytes" unterscheiden sich je nach Typ der Nachricht, der durch das
"Status Byte" festgelegt wird.
Siehe die folgende Tabelle, um herauszufinden, welche Bytes welche Funktion haben:
https://www.midi.org/specifications-old/item/table-2-expanded-messages-list-status-bytes
*/
void midiSendInfo(byte statusByte, byte dataByte1, byte dataByte2)
{
Serial.write(statusByte);
Serial.write(dataByte1);
Serial.write(dataByte2);
}
//--------- Potentiometer ---------//
/*
Ausgelagerte Funktion "potentiometer()" welche alle Potentiometer ansteuert.
Damit mit einem analogen Pin mehrere Potis schnell nach einander ausgelesen werden,
wird ein Multiplexer benötigt (z.B. 74HCT4051).
Der Arduino Uno verfügt über sechs Analoge Pins (A0-A5 = 6 Pins).
*/
void potentiometer()
{
int midiKanal = 176; // MIDI Kanal 1 (Channel 1)
int diff = 3; //Differenz, um Schwankungen zu minimieren
for (int i = 0; i < 10; i++)
{
bit1 = bitRead(i, 0);
bit2 = bitRead(i, 1);
bit3 = bitRead(i, 2);
bit4 = bitRead(i, 3);
/*
Serial.print(bit1);
Serial.print(bit2);
Serial.print(bit3);
Serial.println(bit4); */
digitalWrite(2, bit1); //Zähler in 4 Bit unterteilen (0 entspricht least sicifant)
digitalWrite(3, bit2); //aus i das 2. Bit nehmen
digitalWrite(4, bit3);
digitalWrite(5, bit4);
delay(10);
potiWert[i] = analogRead(A0); //Wert zwischen 0 und 1023 wird von Poti[i] ausgelesen
potiWert_diff[i] = (potiWert_alt[i] - potiWert[i]);
potiWert[i] = 0.6 * potiWert[i] + 0.4 * analogRead(A0); //antiwiggle
controllerWert[i] = map(potiWert[i], 0, 1023, 0, 127); //Umrechnung der Skala von 0-1023 in 0-127 (1 Byte)
//Serial.println(controllerWert[i]);
if (abs(potiWert_diff[i]) > diff)
{
//midiSendInfo(midiKanal, controllerNr[i], controllerWert[i]);
Serial.print("Poti ");
Serial.print(i);
Serial.print(" - Aktuell: ");
Serial.print(potiWert[i]);
Serial.print(", Alt: ");
Serial.print(potiWert_alt[i]);
Serial.print(", Diff: ");
Serial.print(potiWert_diff[i]);
Serial.print(", Umgerechnet: ");
Serial.println(controllerWert[i]);
}
potiWert_alt[i] = potiWert[i]; //neuen "alten" Wert abspeichern
}
//delay(2); //kleine Pause, für stabilere Sensor Werte (Zahl in ms)
}
//--------- Buttons ---------//
/*
Ausgelagerte Funktion "buttons()" welche alle Taster ansteuert
*/
void buttons()
{
int midiKanal = 144; // MIDI Kanal 2 (Channel 2)
for (int i = 0; i < 2; i++) //Loop für 2 Buttons
{
buttonStat[i] = digitalRead(buttonPin[i]); //Den aktuellen Stand des Buttons lesen
if (buttonStat[i] == LOW && buttonStat_alt[i] == HIGH) //Button wird gedrückt und war davor nicht gedrückt
{
//midiSendInfo(midiKanal, buttonNr[i], 127); //Note an
//Ausgabe im seriellen Monitor zur Kontrolle
Serial.print("Schalter ");
Serial.print(i);
Serial.println(" - aus");
//LED anschalten
digitalWrite(LEDPin[i], LOW);
}
else if (buttonStat[i] == HIGH && buttonStat_alt[i] == LOW) //Button wird losgelassen und war davor nicht losgelassen
{
//midiSendInfo(midiKanal, buttonNr[i], 0); //Note aus
//Ausgabe im seriellen Monitor zur Kontrolle
Serial.print("Schalter ");
Serial.print(i);
Serial.println(" - an");
//LED ausschalten
digitalWrite(LEDPin[i], HIGH);
}
/*Der vorherige Button Status wird in den alten geschrieben,
so kann beim nächsten durchlauf wieder richtig überprüft werden */
buttonStat_alt[i] = buttonStat[i];
}
}Loading
cd74hc4067
cd74hc4067