Geschrieben am

MIDI-Controller selber bauen (Teil 6) Array und for-Schleife Tutorial

Wir erweitern unser Arduino-Programm um so viele Potis wie möglich gleichzeitig abzufragen und als MIDI-Controller zu verschicken. Dafür benutzen wir zwei absolute Klassiker der Programmier-Technik:

  • das array
  • die for-Schleife

Alles natürlich wieder so einfach erklärt, dass auch Programmier-Anfänger mitmachen können. Und wer das Prinzip einmal verstanden hat kann es nicht nur für den Arduino benutzen sondern in praktische allen programmier-Sprachen die es gibt.

Den kompletten Code gibt’s nach dem Link:

int controlChange = 176; // MIDI kanal 1

int potiPin[] = {A0,A1,A2,A3,A4,A5};
int controllerNummer[] = {20,21,22,23,24,25};
int controllerWert[] = {0, 0, 0, 0, 0, 0};
int controllerWertAlt[] = {0, 0, 0, 0, 0, 0};
int potiWert[] = {0, 0, 0, 0, 0, 0};

int i = 0;

void setup() {
 Serial.begin(9600);
}

void loop() {
 for (i = 0; i < 5; i++) {
  potiWert[i] = analogRead(potiPin[i]);
  controllerWert[i] = map(potiWert[i],0,1023,0,127);
 
  if (controllerWert[i] != controllerWertAlt[i]) {
   Serial.write(controlChange);
   Serial.write(controllerNummer[i]);
   Serial.write(controllerWert[i]);
  }
  controllerWertAlt[i] = controllerWert[i];
 }
}

In hier noch die Schaltungsskizze:
midi-out-arduion-schaltung-tutorial

5 Gedanken zu „MIDI-Controller selber bauen (Teil 6) Array und for-Schleife Tutorial

  1. Hallo

    Woran kann es liegen, dass bei mir durchgehend midi befehle gesendet werden?
    Also die Eingänge schwanken immer zwischen zwei zahlen und somit ist der alte wert immer anders als der neue wert und somit wird immer ein midi befehl gesendet.
    ich habe einen arduino due wobei der analogRead durch analogReadResolution auf 10 bit gestellt ist also die gleiche bit rate wie beim uno

    Liebe Grüße

    1. Hallo Rax,
      das ist ganz normal und tritt bei mir auch auf. Das sind kleine Schwankungen, die wir über den map-Befehl quasi unabsichtlich hochrechnen. Dies lässt sich durch einen Kondensator oder eine Zeile Code noch glätten – werden wir auch in einer Folge noch drüber sprechen! 🙂
      Viel Erfolg!
      Götz

  2. Hallo götz…. Ich habe schon viel über deine tutorials gelernt… Dafür großes lob….
    Jetzt zu meiner Frage…
    Wie kann ich mir ein bestimmten wert der vom array im int gespeichert wurde einzeln anzeigen lassen?
    mfg marc

    1. Hallo Marc,
      vielen Dank! Mit
      arrayName[Nummer]
      kannst du eine bestimmte Stelle des Arrays ansprechen um etwas reinzuschreiben oder auszugeben. Willst du also z.B. die fünfte Stelle im Array über die serielle Leitung ausgeben schreibst du:
      Serial.write(arrayName[4]);

  3. Hallo Götz!
    Vielen Dank für die Anregungen. Ich finde dass Du toll erklären kannst.
    Als ich die Videos gesehen habe hat mich das Bastel-Fieber gepackt!

    Ich habe versucht das Programm mit mehreren Potis umzuschreiben und es funktioniert leider nicht richtig.

    Mein Vorhaben:
    Ich möchte mit mehreren Poti´s die Lautstärken der Midi-Kanäle am Soundgerät Ketron SD2 verändern.

    Deshalb habe ich aus dem „controlChange“-Befehl ein Array gemacht und die Midikanäle dort erfasst.
    int controlChange[] = {178,122,176,179,180, 181];
    Die ControllerNummer habe ich im Array immer auf 7 gesetzt.

    In der Loop-Schleife habe ich dann Serial.Write (controlChange[i]);
    verwendet.

    Das Programm meldet keinen Schreibfehler oder so.
    Wenn ich das dann am Soundgerät ausprobiere ist das grundsätzlich so, dass die Lautstärke sich auch verändert. Allerdings mit der Nebenwirkung dass der Tastendruck zeitlich verzögert wird.
    Also die Töne kommen zeitverzögert. Das verändert sich auch nicht mit
    dem verändern der Poti-Stellungen.
    Über den Monitor kann ich sehen, dass ständig Befehle verschickt werden. Das kann aber die Ungenauigkeit sein, die Du in Video 14 beschreibst. DAs habe ich noch nicht getestet.

    Das Programm hat aber funktioniert, wenn ich ohne Arrays nur 1 Poti (also einen Midikanal) programmiert habe, so wie der Ursprung in deinem Video.

    Kannst du mir sagen, was ich falsch gemacht habe?

    Am SD2 kann man im Live-Auftritt nichts verändern. Spielen tu ich mit einem Midi-Akkordeon. Um hier flexibler zu sein was den Soundmix betrifft, würde mir so ein Midi-Controller enorm helfen um bei unterschiedlichen Musikanlagen das Verhältnis der Lautstärken Bass, Diskant, Akkord usw. zu beeinflussen.

Kommentar verfassen