Wenn/Dann-Anweisung

Q-SYS Control 101 Training (German) : Flow Control

3 ) Einfache Kommunikation

12m 54s

4 ) Block Controller

18m 50s

6 ) Flow Control

36m 23s

7 ) Fazit „Control 101“

1m 29s

Übungsbeschreibung

Wenn/Dann-Anweisung 10m 38s

Erforsche den Entscheidungsprozess der Wenn/Dann-Anweisung und erstelle damit bedingte Anweisungen, die dein Q-SYS Design steuern.

Video Transkript

Wenn/Dann-Anweisung 10m 38s
0:08
Das ist es! Alles hat uns an diesen Punkt geführt! Das ganz Ausgeben, Kommentieren, die
0:14
Baumstruktur-Metadaten, Funktionen und Variablen – das alles waren nur Puzzleteile. Und jetzt …
0:20
jetzt machen wir endlich etwas damit.
0:22
Darf ich vorstellen – die Wenn/Dann-Anweisung. Sie ist die grundlegende Entscheidungskomponente
0:27
unseres Skripts. Wenn dies wahr ist, tue X. Wenn das wahr ist, tue Y. Wenn du aufs Gas trittst,
0:33
bewegt sich das Auto. Wenn diese Aufnahme beim ersten Take klappt, müssen wir nicht am Samstag
0:38
weitermachen.
0:40
Gefühlt haben wir diesen Entscheidungsprozess schon gestreift, als wir den EventHandler mit
0:44
Funktionen kombinierten.
0:46
Am Ende konnten wir mit dem EventHandler eine Funktion starten, die dann ihre Aufgabe ausführte.
0:53
Ich drücke den Knopf, und die Funktion erfolgt. Dabei findet aber keine wirkliche
0:58
Entscheidung oder Analyse statt, weil die Funktion immer dasselbe macht, wenn der EventHandler
1:02
ausgelöst wird, egal of der Button gerade ein- oder ausschaltet.
1:07
Aber jetzt können mit unserem Wenn/Dann qualifizierende Bedingte Anweisungen geben.
1:14
Der Hauptteil einer Wenn/Dann-Anweisung sieht so aus:
1:17
Wenn [qualifizierende Anweisung]
1:20
Dann [Ergebnis]
1:22
Ende
1:24
Damit stellen wir sicher, dass das Ergebnis nur unter bestimmten Bedingungen eintritt. Ich habe euch
1:29
z. B. einen Fader gezeigt, der gelb wurde, wenn er das obere Ende des Regelwegs erreichte. Dazu
1:37
nehmen wir eine Wenn/Dann-Anweisung wie diese:
1:41
Wird Controls.MrFader.EventHandler ausgelöst, startet das eine Funktion()
1:48
Wenn Controls.MrFader.Value größer ist als 0
1:54
Dann ist Controls.MrFader.Color = „gelb“
2:01
Ende (einmal für die Wenn/Dann-Anweisung),
2:05
und dann ein zweites Mal Ende für die Funktion.
2:10
Bei Bewegung des Faders wird sein EventHandler andauernd ausgelöst, aber seine Funktion ändert
2:16
die Farbe des Reglers nur, wenn dessen Wert im angegebenen Bereich liegt.
2:22
Aber wir haben hier noch nichts, was die Farbe des Faders wieder zurückverwandelt, wenn er wieder
2:26
unter 0 Dezibel fällt. Du könntest natürlich eine zweite Wenn/Dann-Anweisung einsetzen, wie:
2:33
„Wenn der Wert geringer ist als 0, dann ändere die Farbe in … Aquamarin“, aber es gibt noch eine
2:40
effizientere Methode. Der Hauptteil unserer Wenn/Dann-Anweisung kann auch ein „sonst“
2:46
enthalten.
2:48
Das „sonst“ erlaubt die Definition eines alternativen Ergebnisses, das eintritt, wenn die
2:53
qualifizierende Anweisung nicht erfüllt wird. In diesem Fall brauchen wir diese zweite Wenn/Dann-
2:59
Anweisung nicht, weil das mit einer simplen „sonst“-Anweisung im Hauptteil der ersten Wenn/Dann-
3:04
Anweisung ausgedrückt werden kann.
3:07
Das funktioniert wunderbar: Unser Fader ist am oberen Ende des Regelwegs gelb, und überall sonst
3:12
aquamarin.
3:14
Außerdem können wir unsere Wenn/Dann-Anweisung weiter modifizieren, und zwar mit einem
3:19
„SonstWenn“. Dies sind zusätzliche qualifizierende Anweisungen, die nacheinander analysiert
3:26
werden, wenn die vorausgehende Anweisung nicht zutrifft. Während es bei unserer einfachen
3:32
Wenn/Dann-Anweisung nur zwei mögliche Ergebnisse gibt, eröffnet der Zusatz „SonstWenn“ eine
3:39
unbegrenzte Zahl möglicher Resultate.
3:42
Ich beginne einfach mit diesem Fader, dem ich eine dritte Farbe hinzufüge, wenn er das untere Ende
3:48
seines Regelwegs erreicht. Ich nehme ein „SonstWenn“ … Wert kleiner -40, dann ist die Farbe „Grau“.
4:00
Wenn nun der Regler die erste Bedingung, höher als 10 zu sein, nicht erfüllt, wird geprüft, ob er die
4:06
zweite Bedingung erfüllt, nämlich unter -40 zu sein. Wenn ja, ist die Farbe Grau. Wenn nicht, gilt die
4:14
„Sonst“-Bedingung und die Farbe ist Aquamarin.
4:17
Vergesst nicht, auch die Variablen für euch zu nutzen. Ich kann das Schreiben dieser Wenn/Dann-
4:22
Anweisung erleichtern, indem ich oben eine globale Variable definiere, z.B. Y = Controls.MrFader.
4:32
Jetzt muss ich das nicht jedes Mal eintippen, ich kann einfach Y.Value und Y.Color nehmen und es
4:39
damit auch etwas lesefreundlicher machen.
4:42
Denkt daran, dass dies eine sehr einfache Anweisung ist. In jedem eurer Ergebnisse können
4:49
verschiedene Dinge passieren, für unterschiedlichste Steuerungselemente und deren Baumstruktur-
4:54
Parameter wie Values oder deren Strings. Oder ihr sprecht die Methode einer Steuerung an. Diese
5:01
kann, wie ihr euch vielleicht erinnert, einen Trigger auslösen, der wiederum mit etwas anderem in
5:07
eurem Design verschaltet ist, z. B. einem Snapshot. Ihr könnt eure Ergebnisse sehr kompliziert
5:13
gestalten und damit viele Dinge passieren lassen.
5:16
Auch mit euren qualifizierenden Anweisungen könnt Ihr die Komplexität steigern. So könntet ihr mit
5:22
einer „und“-Anweisung definieren, dass zwei verschiedene Dinge gleichzeitig wahr sein müssen, oder
5:27
mit einer „oder“-Anweisung, dass eines der beiden ausreicht, um die Bedingung zu erfüllen. Das lässt
5:33
sich auch mit Klammereinschüben kombinieren, um sehr spezifische Bedingungen zu setzen.
5:38
Vergesst auch nicht, die Ausgabe- (Print) und Kommentar-Werkzeuge einzusetzen. In den Hauptteil
5:45
des Ergebnisses kannst du einen Ausgabebefehl einfügen, um dessen Umsetzung zu prüfen. Damit
5:51
lässt sich sehr gut nachweisen, ob deine Funktion korrekt arbeitet. Wenn das Skript umfangreicher
5:56
wird, füge einen Kommentar in einfacher Sprache hinzu, damit du oder jemand anderes später weiß,
6:03
was die Code-Teile bedeuten.
6:05
Du kannst das Skript neu formatieren, indem du auf Funktionen innerhalb deiner Funktionen
6:10
referenzierst. Diese Wenn/Dann-Anweisung z. B. liest sich schwierig. Also nehme ich das komplette
6:17
erste Ergebnis und definiere es am Anfang des Skripts als eine benannte Funktion.
6:23
Nennen wir diese Funktion einfach „Ergebnis1“. Dann schließe ich diese Funktion mit einem „Ende“
6:29
ab und kann mich in der Wenn/Dann-Anweisung auf die Funktion beziehen, anstatt das Ganze
6:34
einzutippen. Jetzt mache ich das Gleiche mit „Ergebnis2“. Ich schneide es hier heraus und definiere
6:42
es hier oben neu als eigene Funktion und beziehe mich dann in meiner Wenn/Dann-Anweisung auf diese.
6:49
Jetzt ist meine Wenn/Dann-Anweisung viel leichter zu lesen, weil ich diese langen Befehlsungetüme
6:55
durch den Namen der Funktion ersetzt habe, die nur unter den richtigen Bedingungen gestartet wird.
7:02
Eines ist euch vielleicht in dieser letzten Funktion aufgefallen, vor dem ich euch warnen sollte, und
7:06
das ist ein doppeltes Gleichheitszeichen. Wechseln wir zu einem wirklich simplen Skript, um das
7:13
genauer anzusehen. Hier habe ich einen einzelnen Button. Bei Wert 1 erfolgt die Ausgabe „an“,
7:21
ansonsten die Ausgabe „aus“. Sieht für mich nach ziemlich saubere, Code aus, aber das Debug-
7:28
Fenster meldet einen Fehler. Warum wohl?
7:31
Für mich und dich ergibt dieses Gleichheitszeichen sprachlich einen Sinn: „Wenn der Wert gleich 1 ist,
7:37
mach das Ding“. Aber für einen Computer ist ein Gleichheitszeichen eine Handlungsaufforderung. Es
7:43
fordert ihn auf, eine Sache in eine andere umzuwandeln – das wollen wir hier aber gar nicht! Wenn
7:48
du also einfach nur zwei Dinge miteinander vergleichen willst, nimm das doppelte Gleichheitszeichen,
7:53
das Symbol für Äquivalenz.
7:56
Im Computer-Sprech heißt das „Wenn der Wert des Reglers 1 entspricht“, dann tun wir etwas. Hier
8:04
kann man schnell danebenliegen, wenn man seine ersten Wenn-Aussagen schreibt. Also Vorsicht!
8:10
Ihr erinnert euch hoffentlich daran, dass wir in den Steuerungskomponenten mit
8:14
Steuerungsfunktionen einfache Aufgaben erledigen können. Hier drin gibt es ca. dreißig verschiedene
8:20
Funktionen; das sind im Prinzip vorausgewählte Skriptblöcke. Der Block „Logic AND“ verlangt z.B. an
8:28
beiden Eingängen einen Wert von 1, damit er 1 ausgibt.
8:33
Dies ist das Gleiche wie diese Wenn/Dann-Anweisung: Wenn „Controls.Inputs 1 und 2“ 1
8:41
entsprechen, dann ist „Controls.Outputs.Value“ 1. „Sonst“ ist der Wert 0. Ihr seht wohl schon, dass
8:52
diese Steuerungsfunktionen sich für simple Logik-Pfade eignen, aber ihnen fehlen die
8:57
Anpassungsmöglichkeiten, die ein eigenes Skript bietet. Die qualifizierenden Anweisungen und
9:04
Ergebnisse dieser Steuerungsfunktionen sind in Stein gemeißelt und können nur eine Sache, während
9:10
ein Skript so flexibel sein kann, wie ihr wollt.
9:14
Zum Schluss erstellen wir noch Wenn/Dann-Anweisungen im Block Controller. Den „Wenn“-Block
9:19
findet ihr unter der Kategorie „Flow Control“. Hier lauten die Bezeichnungen „Wenn/Tue“, aber das
9:28
Konzept ist das gleiche. Ihr könnt die qualifizierende Anweisung mit dem „If“-Slot definieren und das
9:35
erwünschte Ergebnis hier im „Do“-Slot einfügen.
9:40
Mit einem Klick auf das Zahnrad könnt ihr den Hauptteil dieses Blocks umstrukturieren und eine
9:45
„Sonst“-Anweisung einfügen, und so viele „SonstWenn“-Anweisungen wie Ihr wollt. Genau wie im
9:52
Lua-Scripting lassen sich mehrere Befehle in jedem „Do“-Abschnitt stapeln, man kann auf andere
9:59
Funktionen oder Variablen referenzieren, die ihr an anderer Stelle definiert habt; ihr könnt mit
10:05
weiteren logischen Operatoren in euren „Wenn“- und „Sonst-Wenn“-Slots die Komplexität steigern;
10:12
und ihr könnt „Debug print“- und Kommentar-Blöcke anhängen, damit alles übersichtlich bleibt.
10:18
Also los, habt ein bisschen Spaß! Im Control Worksheet warten einige Übungen zu Wenn/Dann-
10:23
Anweisungen auf Euch. Und dann werdet gern kreativ und seht, was ihr noch alles mit all dem
10:28
anstellen könnt, was ihr in dieser Schulung bisher gelernt habt. Wen ihr dann soweit seid, geht zum
10:33
nächsten Video.