// __ __ _____ _____ _____ _____ _ _ _ // // | \/ |_ _| __ \_ _| / ____| | | | | | // // | \ / | | | | | | || | | | ___ _ __ | |_ _ __ ___ | | | ___ _ __ // // | |\/| | | | | | | || | | | / _ \| '_ \| __| '__/ _ \| | |/ _ \ '__| // // | | | |_| |_| |__| || |_ | |___| (_) | | | | |_| | | (_) | | | __/ | // // |_| |_|_____|_____/_____| \_____\___/|_| |_|\__|_| \___/|_|_|\___|_| // // yt.com/technikblock bit.ly/technikblock technikblock.de // //Potis und Fader //Arrays (0 bis 6 zählen) int potipin[] = {A0,A1,A2,A3,A4,A5}; //Analoge Inputs int controllernote[] = { 1, 3, 2, 5, 6, 4}; //MIDI Note int controllerwert[]= {0 ,0 ,0 ,0 ,0 , 0}; //MIDI Wert int controllerwertalt[]= {0 ,0 ,0 ,0 ,0 , 0}; //alter MIDI Wert int potiwert[]= {0 ,0 ,0 ,0 ,0 , 0}; //Potiwert int smoothpoti[]= {0 ,0 ,0 ,0 ,0 , 0}; //Potiwert geglättet //Buttons //Arrays (von 0 bis 6 zählen) int button[] = {LOW,LOW,LOW,LOW,LOW, //Buttondruck 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 buttonalt[] = {LOW,LOW,LOW,LOW,LOW, //alter Buttondruck 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 buttonpin[] = { 4, 8, 7,53,51,49,47, //Digitale Inputs 23,27,31,37,44,42,46, 50,24,26,32,36,45,43, 41,39,35,33,29,25,52, 48,40,38,34,30,28,22, 6, 5, 9}; int midinote[] = {57,58,59,60,61,62,63, //MIDI Noten 64,65,66,67,68,69,70, 71,72,73,74,75,76,77, 78,79,80,81,82,83,84, 85,86,87,88,89,90,91, 92,93,94}; long lastdebouncetime = 0; //letztes mal als der Knopf getoggelt wurde long debouncedelay = 40; //Debounce Zeit Standard: 50 int midinoteon = 144; //Status-Byte (144 = Note On) int midicontrolchange = 176; //Status-Byte (176 = Control Change) int i = 0; //Variable zum schreiben und lesen der Menge void setup() { //Setup Serial.begin(9600); //serielle Beginn und Geschwindigkeit (seriell: 9600, MIDI: 31250) for (i = 0; i < 37; i++) { //38 Buttons pinMode(buttonpin[i], INPUT_PULLUP); //definiert digitalen Pin als Input mit Pullup Resistor } } void loop() { //Loop //Potis und Fader for (i = 0; i < 6; i++) { //6 Potis potiwert[i] = analogRead(potipin[i]); //ließt Analoge Pins smoothpoti[i]= (6 * smoothpoti[i] + 4 * potiwert[i])/10; //0,6 vom geglätteten Poti + 0,4 vom alten Poti (Gleitkommazahl-Berechnung vermieden) controllerwert[i] = map(smoothpoti[i],0,1023,0,127); //umrechnen von alter Skala(0-1023) zu neuer Skala(0-127) if (controllerwert[i] != controllerwertalt[i]) { //Wenn der Controllerwert nicht gleich (!=) controllerwertalt ist, dann: Serial.write(midicontrolchange); //schreibe MIDI Kanal Serial.write(controllernote[i]); //schreibe MIDI Note Serial.write(controllerwert[i]); //schreibe MIDI Wert controllerwertalt[i] = controllerwert[i]; //alten mit neuem controllerwert vergleichen } } //Buttons for (i = 0; i < 38; i++) { //38 Buttons button[i] = digitalRead(buttonpin[i]);} //ließt Digitale Pins lastdebouncetime = millis(); for (i = 0; i < 38; i++) { if (button[i] == HIGH && buttonalt[i] == LOW) { //Wenn Button hoch, dann schreibe: Serial.write(midinoteon); //schreibe MIDI Kanal Serial.write(midinote[i]); //MIDI Note (24 = C1) Serial.write(0); //MIDI Velocity (0 = 0%) buttonalt[i] = button[i]; } if (button[i] == LOW && buttonalt[i] == HIGH) { //Wenn Button tief, dann schreibe: Serial.write(midinoteon); //schreibe MIDI Kanal Serial.write(midinote[i]); //MIDI Note (24 = C1) Serial.write(127); //MIDI Velocity (127 = 100%) buttonalt[i] = button[i]; } } while ((millis() - lastdebouncetime) < debouncedelay){ //do nothing } } // Midi Syntax // // Status-Byte Data-Byte Data-Byte // Art, Kanal Note Velocity // 1 011 0000 0 1101010 0 0101111 // // Status-Byte: // 1 000 Note off // 1 001 Note on (144) // 1 010 Poly Presure // 1 011 Control Change (176) // 1 100 Program Change // 1 101 Channel Aftertouch // 1 110 Pitch Bend // // Data-Bytes jeweils 0-127 dezimal // // binär -> dezimal