2.2 Die Kontroll-Ebene

Zunächst müssen wir die Grundlagen der Kontroll-Ebene von Pd erarbeiten. Denn, wie schon erwähnt, arbeitet Pure Data zunächst nur mit Daten, d.h., mit Zahlen (und mit der Hilfe von Buchstaben). (In den Beispielen werden wir es aber möglichst gleich wieder auf den Klang anwenden.)

2.2.1 Rechenoperationen und Reihenfolgen

2.2.1.1 Theorie

2.2.1.1.1 Grundrechenarten

Wie schon gesagt wurde, arbeitet ein Computer nur mit Zahlen. Pd arbeitet hingegen mit Zahlen und mit sogenannten „Symbolen“, also Buchstaben. Grundlegender sind aber die Zahlen; wir haben ja im ersten Beispiel schon erfahren, dass so wichtige Parameter wie Tonhöhe oder Lautstärke eines Klanges in Pd nicht mit den herkömmlichen musikalischen Bezeichnungen, etwa c1 für eine Tonhöhe oder pianissimo für eine Dynamik bestimmt werden, sondern eben nur mit Zahlen. Darum widmen wir uns nun zunächst den Grundlagen der Arbeit mit Zahlen auf der Kontroll-Ebene in Pd:

In Number-Boxen oder Message-Boxen können wir Zahlen eingeben. Bei bestimmten Objekten können wir nun Rechenoperationen mit diesen Zahlen durchführen. Setzen wir zum Beispiel das Objekt „+“ und schließen an seinen rechten und linken Inlet sowie an den Outlet Number-Boxen an:

Geben wir nun in die rechte obere Number-Box die Zahl 4 ein (im Execute-Mode einmal in die Number-Box klicken, Zahl eintippen, Enter drücken) und in die linke obere Box die Zahl 5. Nun erscheint auf der unteren Box die Zahl 9, also die Summe von 4 und 5. Das „+“-Objekt hat also zwei Inlets, in die wir Zahlen eingeben, und einen Outlet, in dem das Ergebnis der Arbeit des Objekts, die in der Addition besteht, erscheint.

Hier sehen wir eine wichtige Regel von Pd: Bei Kontroll-Objekten mit mehreren Inputs müssen wir immer in der Reihenfolge von rechts nach links die Informationen eingeben. Oder anders gesagt, ein Objekt erhält Inputs. Es erzeugt aus diesen Inputs aber erst einen Output, wenn es den Input ganz links erhält (deshalb unterscheidet man auch „kalte“ Inlets, bei denen äußerlich erstmal nichts passiert, von „heißen“, bei denen sofort nach Eingabe auch äußerlich etwas passiert.) Diesem Sachverhalt werden wir ständig wiederbegegnen.

Nach dem gleichen Prinzip funktionieren die anderen Grundrechenarten Subtraktion, Multiplikation, Division und Potenz:

Möchte man nun mit dem selben Wert mehrere Rechnungen gleichzeitig durchführen, z.B. 3*3 und 3*4, dann kann man die Number-Box oder Message-Box einfach an mehrere Inlets anschließen (hier verwenden wir der Einfachheit halber als Multiplikator keinen Input, sondern ein Argument („*3“ und „*4“); in den vorherigen Beispielen haben wir hingegen gar keine Argumente vorgegeben, sondern nur Inputs. Wenn wir ein Objekt ohne Argument schreiben, geht Pd erst einmal von einem Wert „0“ als Argument aus.):

Möchte man zwei ganz verschiedene Rechnungen gleichzeitig ausführen, muss man seinen Mausklick mit einem „Bang“ vervielfältigen (Put Bang oder Shift-Ctrl-B). Der Bang kann im Execute-Mode angeklickt werden.

2.2.1.1.2 Reihenfolgen

Wollen wir die beiden Ergebnisse wiederum miteinander addieren, müssen wir dafür sorgen, dass die beiden Ergebnisse in der richtigen Reihenfolge, nämlich von rechts nach links in das „+“-Objekt eingehen.

Um dies sicherzustellen, gibt es das „trigger“-Objekt:

trigger“ erhält als Input einen Bang, eine Zahl, ein Symbol, einen Pointer oder eine Liste (zu Pointer und Listen später mehr). Dadurch gestartet, vervielfacht „trigger“ diesen Input und gibt ihn oder ihn transfomiert in einen Bang von rechts nach links als Outputs heraus. Was herauskommen soll, bestimmt man durch Argumente (bang, float, symbol, pointer, list), hier ist es zweimal Bang, somit sind zwei Outlets entstanden (je mehr Argumente, desto mehr Outlets).

Die Number-Boxen der ersten Operationen, deren Ergebnisse dann wiederum addiert werden, können wir nun weglassen und die Outputs von oben gleich als Inputs weiterverwenden (Platz sparen). Wenn wir allerdings zwischendurch einmal wissen wollen, was an einem Ausgang herauskommt, können wir das Objekt „print“ verwenden.

print“ druckt quasi im Pd-Hauptfenster seinen Input aus. In diesem Fenster werden übrigens auch alle Fehler gemeldet. Schreiben wir z.B. das nicht existente Objekt „zzzgghhh“, wird es nicht erstellt und im Pd-Hauptfenster erscheint eine Fehlermeldung („zzzgghhh ... couldn’t create“).

So kann man beispielsweise sehen, in welcher Reihenfolge „trigger“ arbeitet, indem man „print“ noch verschiedene Argumente gibt (die Ergebnisse erscheinen im Pd-Hauptfenster untereinander, d.h., zeitlich hintereinander (zum Thema Reihenfolgen siehe noch 2.2.1.4)):

2.2.1.1.3 Expression

Größere mathematische Ausdrücke lassen sich zusammenfassen mit dem Objekt „expr“. Als Argument schreibt man die Rechnung (dabei eine korrekte Klammerung berücksichtigen, wie im Mathe-Unterricht gelernt!):

Um das Ergebnis zu erhalten, muss man einen Bang geben.

Man kann aber auch sogenannte „Variablen“ einsetzen; sie heißen hier: $f1, $f2, $f3 etc. (die Zählung beginnt bei 1). Damit entstehen Eingänge von links nach rechts, in die wir Zahlen eingeben können (wie immer kommt der Output, sobald ganz links ein Wert gegeben wurde. Daher sollten alle anderen Werte vorher eingegeben werden).

Zu beachten: Bei „expr“-Rechnungen (ohne Inputs), bei denen eine sogenannte float-Zahl, das heißt eine Komma-Zahl (und nicht eine ganze Zahl) herauskommen soll, muss man einer der beteiligten Zahlen einen Punkt beifügen (siehe zu floats noch 2.2.1.4).

Potenzrechnungen folgen dieser Syntax: „expr pow ([Basis], [Exponent])“. Also im Fall von 2 hoch 3: „expr pow (2, 3)“.

2.2.1.1.4 Weitere Rechenoperationen

moses“: Als Input kommt eine Zahl; diese wird von „moses“, je nach dem, ob sie im Verhältnis zum Argument kleiner oder größer/gleich ist, an verschiedene Outlets ausgegeben. Wenn man also „moses“ das Argument 10 gibt und als Input eine Zahl kleiner als 10, kommt diese im linken Outlet wieder heraus. Gibt man als Input 10 oder eine größere Zahl ein, kommt diese dann aus dem rechten Outlet heraus.

select“ (meist abgekürzt: „sel“): Als Input eine Zahl, als Output links ein Bang, wenn die eingehende Zahl mit dem Argument übereinstimmt. Alle anderen eingehenden Zahlen werden rechts unten ausgegeben.

Relational Tests

==“: Ist der linke Input gleich dem Argument bzw. dem rechten Input, erscheint als Output eine 1, ansonsten 0:

>=“: Ist der linke Input größer als das Argument bzw. der rechte Input oder gleich, kommt als Output 1, ansonsten 0.

>“: Ist der linke Input größer als das Argument bzw. der rechte Input, kommt als Output 1, ansonsten 0.

!=“: Ist der linke Input ungleich dem Argument bzw. des rechten Input, kommt als Output 1, ansonsten 0.

<“: Ist der linke Input kleiner als das Argument bzw. der rechte Input, kommt als Output 1, ansonsten 0.

<=“: Ist der linke Input kleiner als das Argument bzw. der rechte Input oder gleich, kommt als Output 1, ansonsten 0.

Noch zwei weitere Rechenmodule:

Das Ergebnis einer Division kann man statt in einem Kommawert (17/7=2.428) auch differenziert ausdrücken: 17/7=2 Rest 3. Ein solches Ergebnis mit „Rest“ erhalten wir in Pd mit „div“ und „mod“:

Dann gibt es noch wichtige höhere mathematische Operatoren (zum Verständnis bitte im Mathebuch aus der schulischen Oberstufe nachschlagen):

sin“ = Sinusfunktion

cos“ = Cosinusfunktion

tan“ = Tangensfunktion

log“ = (natürlicher) Logarithmus

abs“ = Betrag

sqrt“ = Quadratwurzel

Zuletzt noch ein Algorithmus (Algorithmen sind Rechenoperationen, die der Rechner auf Basis eingegebener Werte selbständig durchführt):

Random“ erzeugt eine Zufallszahl innerhalb eines gegebenen Rahmens. Die untere Grenze ist standardmäßig („by default“) 0; die obere Grenze gibt man als Argument ein (nur ganze Zahlen); die obere Grenze ist exklusiv, das heißt, wenn man „random 4“ eingibt, kommt bei jedem Bang als Input unten eine zufällige Zahl heraus, und zwar entweder 0, 1, 2 oder 3.

2.2.1.1.5 Float und Counter

Lernen wir noch im Zusammenhang mit Zahlenoperationen das „float“-Objekt kennen (Abk. „f“). Es ist ein Speicher für Zahlen. In den rechten Input gibt man eine Zahl ein. Damit wird sie im Objekt gespeichert und kann irgendwann später wieder abgerufen werden: Schickt man in den linken Inlet einen Bang, kommt die gespeicherte Zahl im Outlet wieder heraus (siehe zu „float“ auch 2.2.1.4).

Man kann auch eine Zahl direkt in den linken Eingang schicken, dann kommt sie gleich unten wieder heraus (und wird für den weiteren Abruf (Bang) gespeichert).

Oft wird bei Pd ein Zähler (engl. „counter“) gebraucht, der von einem Startwert aus in ganzen Zahlen hochzählt. Dies sieht dann so aus:

Zur Erklärung:

Wir geben dem „f“-Objekt zuerst den Startwert „0“. Wenn wir dann das erste Mal auf den Bang links klicken, kommt aus dem „f“-Objekt die 0 heraus und geht in das „+ 1“-Objekt hinein. Aus dem kommt unten dann 0+1=1 heraus. Diese 1 geht wieder rechts oben in das „f“-Objekt, so dass, wenn ich das nächste Mal auf den Bang klicke, diese 1 herauskommt, und dann im „+ 1“-Objekt zur 2 wird usw.

2.2.1.1.6 Zusammenfassung
  • An den Rechen-Objekten wird eine grundsätzliche Regel von Pd ersichtlich: Die Inputs für ein Kontroll-Objekt sollten immer von rechts nach links erfolgen. Um dies zu gewährleisten, benötigen wir häufig das Objekt „trigger“, das mehrere Outputs konsequent nacheinander von rechts nach links ausgibt.

  • Ein „Bang“ ist wie ein Mausklick, der weitergegeben oder empfangen wird.

  • Mit „print“ lassen sich im Hauptfenster Zwischenergebnisse eines Patches anzeigen. Was zeitlich nacheinander folgt, ist hier untereinander aufgeführt.

2.2.1.2 Anwendungen

Kommen wir zu Anwendungen des gerade Besprochenen (alles, was mit Klang zu tun hat wird erst später genauer erklärt):

2.2.1.2.1 Zwei Töne – zwei Lautstärken

Wollen wir zum Beispiel zwischen zwei Tönen wechseln, einem tieferen, leiseren und einem höheren, lauteren, können wir das durch folgende Kombination erreichen, da wir nun auf die beiden Bangs für jeden Ton klicken können:

2.2.1.2.2 Ein Intervall

Für einen Zweiklang braucht man zwei „osc~“-Objekte. Wenn man wie folgt die Werte der Number-Box ändert, bewegt sich ein Intervall (Quint) auf und ab:

Im Pd-Hauptfenster werden hier, dank des „print“-Objekts, die Frequenzen der beiden Töne angezeigt.

2.2.1.2.3 Zufallsmelodie

Der Zufall kommt ins Spiel!

Bei jedem Klick auf den Bang erklingt ein anderer Ton zwischen 200 und 1000 Hertz – eine Zufallsmelodie.

Noch ein paar reine Rechenbeispiele:

2.2.1.2.4 Runden
2.2.1.2.5 Wie lange dauert eine Partitur?

Eine Angabe, die Komponisten immer wieder benötigen: Man hat ein Stück im Tempo Viertel = 72 und einer gesamten Anzahl von 324 Vierteln geschrieben. Wie lange dauert das Stück in Sekunden?

Ergebnis: 270 Sekunden, also 4 Minuten 30 Sekunden.

2.2.1.2.6 Reihe hochzählen

Dieser Counter zählt immer von 0 bis 6; nach der 6 fängt er wieder bei 0 an.

2.2.1.2.7 Random ohne Dopplungen

Wer bisher alles Vorgestellte verstanden hat, sollte folgende Aufgabenstellung meistern können, die allerdings nicht ganz trivial ist:

Erstellen Sie einen Random-Patch, in dem es keine Zahlenwiederholungen gibt, also nie zweimal hintereinander dieselbe Zahl erscheint (im Gegensatz zum normalen „random“-Objekt). Viel Erfolg beim Analysieren der Lösung!

2.2.1.2.8 Weitere Aufgabenstellungen

a) Erzeugen Sie zwei Zufallsmelodien gleichzeitig.

b) Wählen Sie mit zwei Bangs zwei verschiedene (beliebige) Intervalle an.

c) Berechnen Sie mit „expr“ Exponentialfunktionen, z.B. y=x2 oder y=x (2+x) oder y=1-(2x).

2.2.1.3 Appendix

2.2.1.3.1 Input für Bang

Ein Bang ist quasi ein Mausklick. Er kann also angeklickt werden und gibt diesen Klick weiter bzw. kann als Input einen Klick erhalten und darstellen (und wiederum weitergeben). Dieser Input muss aber nicht selbst ein Bang sein. Das Objekt „bang“ konvertiert jedes Kontroll-Ereignis, das es als Input erhält, in einen Bang, also zum Beispiel auch jede Zahl:

2.2.1.3.2 Zahlendarstellung

Zahlen mit vielen Kommastellen sind nicht vollständig mit der Standard-Number-Box zu lesen. Man kann die Number-Box aber vergrößern, indem man mit der rechten Maustaste in die Box klickt und auf „Properties“ geht, bei „width“ einen größeren Wert eingibt und abschließend auf „Ok“ klickt.

Ein weiterer Aspekt sind Zahlen größer als 999999. Sie werden vereinfacht dargestellt, nämlich als Produkt (mit max. zwei Kommastellen) von 1000000. Die 1000000 wird dargestellt als „e+006“.

Entsprechendes gilt für Zahlen kleiner als -999999 und für Zahlen zwischen 1 und -1 mit mehr als vier Stellen hinter dem Komma.

2.2.1.3.3 Mehr zu Trigger

Das „trigger“-Objekt kann nicht nur Bangs verteilen, sondern auch Zahlen (später werden wir weitere Möglichkeiten kennenlernen). Es wird übrigens meist als „t“ abgekürzt, und statt der Argumente „bang“ und „float“ gebraucht man nur „b“ und „f“:

2.2.1.4 Für besonders Interessierte

2.2.1.4.1 Über Reihenfolgen

By default werden (derzeit) Objekte bzw. Verbindungen in der Reihenfolge ausgeführt, in der sie (zeitlich) gesetzt wurden:

Sichtbar ist dies natürlich nicht und darum grundsätzlich zu vermeiden!

2.2.1.4.2 Zu Float

f“ steht für „floating point“, zu deutsch „Fließkomma-Zahl“. Genau genommen ist damit eine Zahl mit Werten hinter dem Kommabereich gemeint, im Gegensatz zu ganzen Zahlen. Wenn man nur mit ganzen Zahlen arbeiten will, kann man statt „float“ in Pd auch immer „int“ (Abk. „i“) einsetzen. Anders als Max/Msp, arbeitet Pd jedoch grundsätzlich mit float-Zahlen.

2.2.2 Verschiedenartige Daten

2.2.2.1 Theorie

2.2.2.1.1 Bang – ein GUI-Objekt

Der „Bang“, quasi ein Mausklick, steht genau genommen für die Buchstabenkombination b-a-n-g. Buchstabenkombinationen sind als sogenannte Symbole neben den Zahlen die zweite Datenform, mit der Pd arbeitet. Einige Objekte erkennen bestimmte Wörter und arbeiten auf deren Input hin. Viele Objekte reagieren auf das Symbol „Bang“. Da es so häufig vorkommt, gibt es speziell für „Bang“ eine grafische Repräsentation, den aufblinkenden Kreis (Put Bang). Eine solche Repräsentation nennt man „GUI“-Objekt. (GUI = graphical user interface, also eine graphische Darstellung von etwas bzw. eine veränderbare Grafik, die dadurch neue Werte erzeugt und weitergeben kann).

2.2.2.1.2 Messages

Betrachten wir in diesem Zusammenhang das Objekt „writesf~“ (ausnahmsweise sei hier noch ein Audio-Objekt eingeführt, da Symbole meist in diesen Zusammenhängen gebraucht werden; im Audio-Kapitel wird näher auf das Objekt selbst eingegangen), welches Klang als wav-Datei speichert. Es funktioniert folgendermaßen: Zunächst weisen wir ihm über die Message-Box den Namen zu, unter dem der Klang gespeichert werden soll, und zwar mit der Message: „open [Dateiname]“; wenn also die Datei zum Beispiel „test.wav“ heißen soll, dann lautet der Vorgang „open test.wav“. Danach geben wir mit den Messages „start“ und „stop“ Anfang und Ende der Aufnahme an.

Normalerweise wählen wir den Namen aus und starten dann auch gleich die Aufnahme. Die Reihenfolge bleibt natürlich wichtig – ehe das „writesf~“-Objekt mit der Aufnahme beginnen kann, muss es wissen, wie die zu speichernde Datei heißen soll. Dies könnte man beispielsweise mit „trigger“ lösen:

Messages können aber auch hintereinander geschickt werden, in dem man sie, getrennt durch ein Komma, in dieselbe Message-Box schreibt:

2.2.2.1.3 Listen

Die Message „open test.wav“ ist eine Verbindung aus zwei Symbolen (denn es sind zwei durch ein Leerzeichen getrennte Wörter). Eine solche Reihung von zwei oder mehreren Symbolen (oder Zahlen) nennt man „Liste“. Mit dem Objekt „pack“ kann man eine Liste aus mehreren „Elementen“ erstellen. Als Argumente gibt man Hinweise, welche Art von Elementen die Liste enthalten soll. Eine Zahl wird, wie bei „trigger“, mit „float“* (Abk. „f“) ausgedrückt, ein Symbol mit „symbol“ (Abk. „s“). Will man also aus den beiden Messages „hallo“ und „43“ eine Liste erstellen, verwende man das pack-Objekt wie dargestellt:

Auch hier gilt wieder: Erst wenn der Inlet ganz links eine Eingabe erhält, erfolgt der (richtige) Output. (Klickt man zuerst auf „hallo“, ohne vorher den rechten Input für „pack“ gegeben zu haben, erscheint stattdessen nur ein "list hello 0".) Den Output von „pack“ können wir vorerst nur mit dem „print“-Objekt sehen. Dieses zeigt dann an: „list hallo 43“. Diese Liste kann man nun aber auch wieder in ihre Elemente zerlegen, und zwar mit dem Umkehrungsobjekt (Umkehrungsobjekte gibt es in Pd viele) „unpack“, das nach dem gleichen Prinzip wie „pack“ funktioniert, nur erscheint hier als Ouput, was dort als Input erscheint.

print“ gibt nun „43“ und „symbol hallo“ aus. Alles, was nicht Zahl ist, wird also mit dem besonderen Hinweis („Selector“ genannt) seiner Datenart ausgewiesen.

Dies gilt auch zu beachten, wenn ein anderer Input von „pack“ als der ganz linke ein Symbol ist; dann muss Folgendes im Input stehen:

Ein Problem mit „pack s s“: Allein der erste Input braucht nicht extra als Symbol ausgewiesen zu sein. Im zweiten aber muss dann entweder „symbol“ vorangestellt sein oder die Message muss noch durch ein „symbol“-Objekt konvertiert werden:

Hier sehen wir auch: Eine Liste, die mit einer Zahl beginnt, wird nicht extra als Liste bezeichnet; beginnt sie hingegen mit einem Symbol, steht ausdrücklich „list“ dabei.

2.2.2.1.4 Messages mit Variablen

Werfen wir noch einen genaueren Blick auf die Message-Boxen:

In den Inhalt einer Message-Box lassen sich Variablen integrieren. Dies erfolgt hier ähnlich, aber doch etwas anders als bei „expr“: Zunächst heißen hier die Variablen nur „$1, $2“ etc. Gibt man bei „zahl $1“ etwa als Input eine Zahl ein, erscheint als Output aus der Message-Box der vollständige Ausdruck mit dieser Zahl.

Sollen es aber mehrere Variablen sein, „zahl $1 $2“, entstehen nicht mehrere Eingänge (wie in „expr“), sondern es verbleibt der eine Eingang, dem wir hier mehrere Zahlen als Liste geben:

Symbole müssen als Symbol gekennzeichnet sein:

2.2.2.1.5 Messages: Set

Wir können den Inhalt einer Message-Box auch komplett neu bestimmen, und zwar mit einer vorgeschalteten Message-Box mit dem Symbol „set“:

So kann der Inhalt einer Message-Box im Execute-Mode (vgl. den letzten Punkt unter 2.1.3) geändert werden.

In Kombination mit einer Variablen kann man dann beispielsweise aus dem Output einer Number-Box eine Message machen:

2.2.2.1.6 Makefilename

Nicht zulässig ist, eine Variable ohne trennendes Leerzeichen zu integrieren. Dafür benötigt man das Objekt „makefilename“, das Symbole mit variablem Feld ohne Leerzeichentrennung erstellt. Die Variablen, die man in ein Argument einfügt, lauten hier für Zahlen „%d“, für Symbole „%s“:

2.2.2.1.7 Openpanel

Das Objekt „readsf~”“ spielt ein schon bestehendes Soundfile ab, das zum Beispiel auf der Festplatte gespeichert ist. Es braucht eine Message „open [Name des Soundfiles]“. Mit „Name des Soundfiles“ ist dessen Ort auf einem Datenträger gemeint. Das heißt, wenn der Patch, in dem wir „readsf~“ verwenden, im Verzeichnis c:/Pd/Pd-patches/ gespeichert ist und das Soundfile „hallo.wav“ ebenfalls in diesem Verzeichnis liegt, müssen wir nur „open hallo.wav“ als Input geben. Ist „hallo.wav“ aber zum Beispiel im darüber liegenden Verzeichnis c:/Pd/, müssen wir schreiben: „../hallo.wav“ oder wenn es im darunter liegenden Verzeichnis c:/Pd/Pd-patches/soundfiles/ liegt, „/soundfiles/hallo.wav.“ Wenn es in c:/soundfiles/ liegt: „open ../../soundfiles/hallo.wav“. Oder wenn es auf einem anderen Datenträger liegt, zum Beispiel auf d:/soundfiles, muss es heißen „open d:/soundfiles/hallo.wav“.

Diese manchmal komplizierten Verzeichnispfad-Ausdrücke lassen sich mit dem Objekt „openpanel“ einfacher wiedergeben. Erhält es einen Bang, öffnet sich ein Fenster mit dem Inhalt der verfügbaren Datenträger des Computers. Klicken wir darin nun eine Datei doppelt an, gibt „openpanel“ in Pd den gesamten Pfad für diese Datei (als Symbol) aus:

(Ist ein Patch noch nicht gespeichert, geht Pd (unter Windows) vom Pfad pd/bin/ aus.)

2.2.2.1.8 Einfache Speicher für Daten

Wie schon mit dem „float“-Objekt erklärt (2.2.1.1.5), können Daten innerhalb des Patches mit den Objekten „float“, „symbol“ und „lister“ gespeichert werden (sind allerdings weg wenn der Patch geschlossen wird). „float“ und „lister“ werden meist abgekürzt zu „f“ und „l“.

Der rechte Inlet erhält eine Zahl, ein Symbol oder eine Liste, die damit im Objekt gespeichert werden und später wieder abgerufen werden können, indem man in den linken Inlet einen Bang schickt; das Gespeicherte erscheint dann im Outlet.

Zahl, Symbol oder Liste lassen sich auch direkt in den linken Eingang schicken – dann kommen sie unmittelbar unten wieder heraus (und werden im Objekt bis auf weiteres gespeichert).

2.2.2.1.9 Route

Ein Objekt, das verschiedene Datentypen sortieren kann, ist „route“. Es kann sowohl Typen (Zahl, Symbol, Liste, Bang) zuweisen ...

(Alles, was nicht zugewiesen werden kann, wird im ganz rechten Ausgang ausgeschieden.)

... als auch Listen bestimmten selbst gewählten Namen zuordnen:

Zahlen und Symbole lassen sich hier allerdings nicht vermischen; „route 22 dieter“ funktioniert also nicht.

2.2.2.1.10 Demultiplex

route“ verteilt einen Input auf verschiedene Ausgänge, je nach Präfix. „demultiplex“ (Abk. „demux“, beide in pd extended) verteilt einen Input je nach Angabe im anderen Inlet auf verschiedene Ausgänge. Zunächst erhält „demux“ als Argument die Nummern der Ausgänge, angefangen bei 0: „demux 0 1 2 3“.

Es sind nun zwei Eingänge (bei „demux“ sind es immer nur zwei) und vier Ausgänge (entsprechend den vier Argumenten) entstanden. In den rechten Inlet geben wir nun eine Zahl ein, die die Nummer des Ausgangs bezeichnet, zum Beispiel 3. Danach geben wir irgendetwas (Zahl, Symbol oder Liste) in den linken Inlet ein und es kommt am dritten Outlet heraus.

Hier wird ersichtlich, dass Pd häufig bei 0, nicht bei 1 zu zählen beginnt.

2.2.2.1.11 Spigot

Ein weiteres wichtiges Objekt ist „spigot“. Je nachdem, ob sein rechter Input 0 oder 1 ist, lässt „spigot“ einen Input entweder durch oder nicht – ähnlich wie ein Tor, das entweder offen oder geschlossen ist.

2.2.2.1.12 Toggle

Wie bei „spigot“, haben wir schon beim Objekt „==“ und den anderen Relational Tests gesehen, dass 0 und 1 häufig gebrauchte Informationen in Pd sind. Daher gibt es – ähnlich wie „bang“ für einen Mausklick – für den Wechsel zwischen 0 und 1 ein eigenes grafisches Objekt, den sogenannten „toggle“ (Put Toggle oder Shift-Ctrl-T).

Toggle sieht aus wie ein Ein- und Ausschalter und kann in vielen Fällen auch so verstanden werden. Aber man sollte sich immer bewusst sein, dass in der Maschinensprache jeweils nur der Wechsel zwischen 0 und 1 dargestellt wird.

So können wir an „spigot“ einen Toggle anschließen und damit leicht erkennen, ob das „Tor“ gerade offen ist oder geschlossen. Oder ein Relational Test zeigt, ob etwas zutrifft oder nicht:

2.2.2.2 Anwendungen

Wenden wir nun einiges hiervon wieder an:

2.2.2.2.1 Eine Liste mit Tonhöhe und Lautstärke

Mit Listen wollen wir einem Oszillator eine Tonhöhe zuweisen und eine Lautstärke daran koppeln:

2.2.2.2.2 Ein-/Ausschalter

Im ersten Beispiel haben wir schon gesehen, dass wir den Ton mit den Messages „1“ und „0“ ein- und ausschalten konnten. Folglich können wir diesen Schalter auch mit einem Toggle bauen:

2.2.2.2.3 Tonhöhen mit Namen

Einem Oszillator wollen wir verschiedene Tonhöhen mit (frei gewählten) Namen zuordnen:

2.2.2.2.4 Eine einfache Sequenz

Wir bauen einen Zähler, der bei jedem Bang dem Oszillator eine bestimmte andere Tonhöhe zuweist:

Erhält „route“ statt einer Liste nur den passenden Wert zu einem seiner Argumente, gibt es an dem entsprechenden Ausgang einen Bang aus. In diesem Beispiel ist „route“ also eine Zusammenfassung mehrerer Selektoren (man hätte stattdessen auch eine Reihe von „sel-“Objekten an den Zähler anschließen können: „sel 1“, „sel 2“ etc.).

Den ganz rechten Ausgang von „route“ brauchen wir nicht zu ‚verkabeln’, solange der Input immer zu den Argumenten von „route“ passt.

2.2.2.2.5 Ein limitierter Counter

Wir bauen ein Zähler, der automatisch von 10 hochzählt und bei 17 stoppt:

So können wir etwa Funktionswerte für einen bestimmten Bereich schnell erhalten. Hier als Beispiel einfach die quadratische Funktion y=2x für den Bereich von 1 bis 10:

Bei solchen Rekursionen (wo ein Output wieder zum Input wird) wie der Counter sie beinhaltet, muss man sehr aufpassen, nicht in eine sogenannte Endlosschleife zu geraten. Geben wir in diesem Beispiel hier nach erstmaliger Rechnung nicht wieder den Anfangswert, sondern öffnen das Tor und starten gleich die Rechnung, wird über 10 hinaus ohne Ende immer weiter hochgezählt.

2.2.2.2.6 Weitere Aufgabenstellungen

a) Erstellen Sie eine Sequenz von Listen mit Tonhöhe und Lautstärke.

b) Erstellen Sie eine Funktion, bei der wir mit einer Liste von zwei Zahlen, die den Start- und Endwert des x-Bereiches angeben, einen Ausschnitt berechnen können – also z.B. die Werte der Funktion y=3x für den Bereich von x=-2 bis x=4.

2.2.2.3 Appendix

2.2.2.3.1 Symbol-Boxen

Analog zur Number-Box gibt es auch die Symbol-Box (wird aber nur selten in Pd verwendet). So kann z.B. „sel“ auch mit Symbolen verwendet werden:

2.2.2.3.2 Slider

Auf der Kontroll-Ebene gibt es noch zwei weitere GUI-Objekte: den Slider und das Radio. Der Slider (Put HSlider oder VSlider oder die Shortcuts davon) ist eine graphische Repräsentation einer Number-Box, allerdings auf einen Ausschnitt begrenzt, by default zwischen 0 und 127:

2.2.2.3.3 Radio

Das Radio (Put Hradio oder Vradio) ist ebenfalls eine graphische Repräsentation einer Number-Box, aber stark vergröbert: Nur wenige Zahlen (by default von 0 bis 7) können durch Klick auf die verschiedenen Kästchen ausgeworfen werden.

Slider und Radio gibt es horizontal und vertikal; der Unterschied besteht allein im Aussehen.

2.2.2.3.4 Anwendung von Slider und Radio

Mit einem Slider sind verschiedene Tonhöhen anwählbar, mit einem Radio verschiedene Lautstärke-Stufen:

So hat man eine visuell gut verständliche Oberfläche, um Parameter eines Patches zu ändern. Das ist vor allem dann hilfreich, wenn man live auf der Bühne Elektronische Musik spielt.

2.2.2.4 Für besonders Interessierte: Alternative Typenbezeichnungen und mehr zu den Kästchen

Eine „float“-Spezifikation kann (z.B. bei „trigger“) in Pd häufig statt mit „f“ auch mit einer Zahl ausgedrückt werden (deren Wert manchmal eine Rolle spielen kann, jedoch nicht immer – z.B. gilt ihr Wert bei „f“ oder „pack“, aber nicht bei „t“):

Da jedoch darunter freilich die Klarheit leidet, ist die Verwendung einer Zahl in der Regel nicht ratsam.

Noch etwas Allgemeines zu den Kästchen: 1. Alle Kästchen sind strenggenommen Objekte, die Messages empfangen und senden können und auf diese Messages dann ihren Eigenschaften entsprechend reagieren. 2. Die Verbindungen geben an, welches Objekt an welche anderen Objekte Messages weitersendet. Dabei gilt, dass, wenn ein Objektausgang (Outlet) mit den Eingängen von mehreren anderen Objekten verbunden ist, alle diese Objekte diese Message erhalten. Die Reihenfolge ist dabei in pd (absichtsvoll) nicht definiert. 3. Es gibt GUI-Objekte, die durch Benutzerinteraktion diese Messages erzeugen und versenden. Beispiele für GUI Objekte: bang, toggle, slider und canvas.

2.2.3 Zeitoperationen

Musik findet bekanntlich in der Zeit statt. Darum ist es für eine Audio-Programmiersprache natürlich wichtig, dass die zeitliche Abfolge gesteuert werden kann (also Dauern/Rhythmen und Abfolgen erzeugt werden können).

2.2.3.1 Theorie

2.2.3.1.1 Metro

Das erste elementare Objekt hierfür ist „metro“. Wie der Name andeutet, handelt es sich um ein Metronom. Wenn man es einschaltet (ein- aussschalten mit 1/0 im linken Eingang, also dem Toggle), erscheinen unten Bangs in dem zeitlichen Abstand, den man durch ein Argument bzw. im rechten Input angibt.

Das Tempo wird in Millisekunden (Abk. ms) angegeben, also in Tausendstelsekunden. Wenn also einmal pro Sekunde ein Bang kommen soll, geben wir an: „metro 1000“; soll alle zwei Sekunden ein Bang erfolgen, „metro 2000“, alle halbe Sekunde (also Viertel=120) „metro 500“.

2.2.3.1.2 Delay

delay“ (Abk. „del“) verzögert einen eingehenden Bang um so viele Millisekunden wie dem Argument bzw. rechten Input entsprechen:

2.2.3.1.3 Pipe

Dasselbe wie mit Zahlen und beliebigen Symbolen funktioniert auch mit „pipe“. Als Argument gibt man wiederum die Verzögerungsdauer an. By default erwartet „pipe“ als Input Zahlen.

Will man ein Symbol durchschicken, muss dies als erstes Argument angegeben werden (mit „s“, wie bei Route). Als zweites (oder als rechten Input) benennt man die Dauer:

Außerdem kann „pipe“ wie „pack“/„unpack“ mehrere Eingänge und Ausgänge haben:

Listen handhabt „pipe“ wie „route“:

‚Wartet’ ein Input gerade in einem „del“ oder „pipe“, kann er mit der Message „clear“ (pipe) oder „stop“ (delay) auch gelöscht werden, ehe er wieder herauskommt:

2.2.3.1.4 Line

Mit „line“ erstellen wir eine Zahlenreihe in der Zeit. Das heißt, wir können dem Programm anweisen, innerhalb einer bestimmten Zeitspanne von einer Startzahl zu einer Zielzahl zu zählen. „line“ erhält normalerweise kein Argument. Im rechten Input geben wir die Dauer für die Zahlenreihe an (by default 0). Links geben wir den Zielwert an (by default 0, das kann als Argument anders angegeben werden).

Gibt man nun links einen neuen Zielwert an, springt er direkt dorthin, das heißt, der Wert rechts wurde wieder auf 0 gestellt und muss wieder neu vergeben werden (das ist eine Ausnahme in Pd; normalerweise speichern Pd-Objekte ihre „kalten“ Eingänge bis sie neu gesetzt werden). Man kann aber auch beide Werte (Zielwert und Dauerwert) als Liste geben:

Klickt man nun wieder auf die Message-Box, passiert nichts, denn „line“ ist jetzt bei 4000 angekommen und verbleibt dort. Gibt man in der Liste einen neuen Zielwert an, z.B. 50, macht „line“ nun eine Zählung von 4000 zu 50 (in 1000 Millisekunden).

Will man bei einer bestimmten Zahl beginnen und in einer bestimmen Zeitspanne zu einer anderen Zahl gehen, muss man also zuerst links (ohne zuvor rechts einen Wert gegeben zu haben) zum Anfangswert springen (mit einer einzelnen Message-Box) und dann die Liste geben. Wie am Ende von Abschnitt 2.2.2.1.2 schon gesagt wurde, kann man aber mehrere Messages in einer Message-Box unterbringen, getrennt jeweils durch ein Komma. Dann sieht es so aus:

In diesem Beispiel erfolgt also jedes Mal, wenn man auf die Message-Box klickt, eine Zählung von 1500 bis 4000 in 1000 Millisekunden.

2.2.3.1.5 Timer

timer“ ist eine Art Stoppuhr. Bei beiden Eingängen gibt man Bangs. Es wird immer der zeitliche Abstand zwischen dem linken Bang (den man daher zuerst gibt) und dem rechten gemessen (in Millisekunden):

Hier kann man auch sehen, dass Trigger-Operationen für den Computer keine zeitliche Ausdehnung haben, auch wenn sie klar nacheinander abfolgen:

(so auch unter 2.2.2.2.5)

timer“ ist eine (etwas unnötige) Ausnahme von der Pd-Regel, dass Inputs immer von rechts nach links erfolgen sollen.

2.2.3.2 Anwendungen

2.2.3.2.1 Automatische Zufallsmelodie

Nun können wir schon komplexere musikalische Anordnungen realisieren. Zum Beispiel eine schnelle Zufallsmelodie, die automatisch abläuft:

Probieren Sie im obigen Beispiel einmal verschiedene Geschwindigkeiten des Metronoms aus (als rechter Input in „metro“ eine Number-Box)!

2.2.3.2.2 Glissando

Wir können auch ein Glissando erstellen:

2.2.3.2.3 Glissando-Melodie

Oder beides kombinieren und eine zufällige Glissando-Melodie erstellen:

2.2.3.2.4 Unregelmäßige Zufallsrhythmen

Wir können auch unregelmäßige Rhythmen erzeugen, ebenfalls auf Zufallsbasis:

In diesem Beispiel kommen aus dem „metro“ Bangs im Abstand zwischen 0 und 999 Millisekunden (per Zufall). Will man z.B. Dauern im Abstand zwischen 500 und 1500 Millisekunden haben, muss man eine grundsätzliche Addition hinzufügen:

Einen solchen grundsätzlichen Zusatz (hier „+ 500“) zu einer Rechnung nennt man „Offset“.

2.2.3.2.5 Kanons

Diese Rhythmen können wir wieder an den Zugallsgenerator anschließen und kanonisch auf einen zweiten Oszillator übertragen:

(Die „*~ 0.4“ wird später erklärt.)

Oder gleich einen richtigen Kanon erstellen:

2.2.3.2.6 Pausen

Wir können auch automatisierte Pausen einfügen:

2.2.3.2.7 Crescendo/Decrescendo

Oder als Crescendi und Decrescendi („sig~“ wird ebenfalls später erklärt):

Hier wird wieder deutlich: Für Pd gibt es zunächst nur Rechenoperationen mit Zahlen. Ein Crescendo ist ebenso eine Zahlenreihe wie ein Glissando. Man könnte auch sagen: Ein Crescendo ist ein Glissando der Lautstärke.

2.2.3.2.8 Metronom

So können wir uns schon ein Metronom bauen:

Bauen wir es zuerst nur optisch, so dass als Metronomsignal ein Bang ausgegeben wird. Metronomangaben erfolgen als Schläge pro Minute, so wie in Partituren verzeichnet ist: Viertel = 60, Viertel = 100 etc.

Anfangs müssen wir also bpm (engl. Abk. für beats per minute = Schläge pro Minute) in Millisekunden umrechnen:

Das Ergebnis setzen wir als Zahlen für ein Metronom.

Nun wollen wir aber die Impulse nicht nur am Bang sehen, sondern auch hören. Nehmen wir wieder den Klang-Patch von vorhin und stellen einfach ein, dass ein kurzer Ton bei jedem Bang ausgegeben werden soll. Den kurzen Ton erstellen wir folgendermaßen:

Komplett:

In Verbindung haben wir nun ein Metronom gebaut. Später werden wir noch ein alternatives Klangsignal integrieren.

2.2.3.2.9 Weitere Aufgabenstellungen

a) Erstellen Sie eine Zufallsmelodie, die alle halbe Sekunde zum nächsten Ton springt (alternativ: glissandiert).

b) Erstellen Sie ein Metronom mit unregelmäßigen Zufallsrhythmen (durchschnittliches Tempo verstellbar).

c) Erstellen Sie ein Metronom, das immer abwechselnd fünf Schläge im Tempo Viertel = 60 und fünf Schläge im Tempo Viertel = 100 macht.

d) Erstellen Sie eine Zufallsmelodie, die im Wechsel von zwei Sekunden eher hoch oder eher tief ist.

2.2.3.3 Appendix

2.2.3.3.1 Verteilung von Listen

Wie bei „line“ gesehen, kann man in Pd grundsätzlich einem Objekt mit mehreren Eingängen ganz links eine Liste geben, statt in jeden Eingang etwas einzugeben (allerdings gibt es Objekte, die davon ausgenommen sind). Die Elemente der Liste werden dann von rechts nach links auf die Eingänge verteilt:

2.2.3.3.2 Die zeitliche Auflösung von Kontrolldaten

Die zeitliche Auflösung von Arbeiten in der Kontroll-Ebene ist in Millisekunden.

Dies ist allerdings häufig nicht so voreingestellt; wie man sich denken kann, erfordert eine Rechnung in Millisekunden schon eine sehr hohe Leistung vom Prozessor (auch CPU* genannt). Bei „line“ beispielsweise ist voreingestellt, dass die Schritte im 20-Millisekundenabstand erfolgen:

Wenn man also in 100 Millisekunden von 0 bis 10 zählen will, macht der Computer alle 20 Millisekunden einen Schritt; im Output erscheinen daher nur die Zahlen im Abstand von zwei Schritten.

Dieses Intervall (in Millisekunden) lässt sich aber bei „line“ verstellen, als zweites Argument (das erste gibt den primären Zielwert der Zählung an, der dann ja allerdings durch den Input aufgehoben ist):

Zu bedenken ist allerdings, dass das Ergebnis nur solange „sauber“ ist, solange der Prozessor des Computers leistungsstark genug ist. Andernfalls kommt es zu Fehlern.

*CPU = central processing unit, zu deutsch „Hauptprozessor“ oder „Zentraleinheit“. Daneben gibt es häufig noch weitere Prozessoren, z.B. in der Grafikkarte, wo speziell grafische Operationen berechnet werden.

2.2.4 Sonstiges

Um den Umgang mit Pd noch zu verbessern, gibt es einige weitere Optionen.

2.2.4.1 Senden und Empfangen

2.2.4.1.1 Send/Receive

Um nicht alle Boxen immer mit ‚Kabeln’ verbinden zu müssen, gibt es die Möglichkeit, etwas zu „senden“ und zu „empfangen“. Dies erfolgt mit den Objekten „send“ und „receive“.

send“ erhält als Argument einen beliebigen Namen. Ein „receive“, das dann als Argument denselben Namen hat, erhält den Input des „Send“ und gibt ihn aus.

send“/„receive“ (Abk. „s“ und „r“) sind praktisch, wenn man z.B. eine Zahleninformation an vielen verschiedenen Orten braucht (worunter allerdings die Klarheit des Patches leidet).

Solche frei wählbaren Namen (wir kommen darauf später zurück) müssen immer zusammenhängende Buchstabenfolgen ohne Leerzeichen sein; einzelne Zahlen sind nicht zulässig.

2.2.4.1.2 Versand mit Listen

Hat man verschiedene Receiver (mit verschiedenen Namen), kann man von einer zentralen „Verteilungsstelle“ Nachrichten mit „remote“ zuweisen (vergleichbar „route“). Dem erteilt man eine Liste, deren erstes Element der Name des Empfängers ist und deren zweites Element die Nachricht selbst. Remote ist Teil von pd extended.

Eine ähnliche Möglichkeit ist, einer solchen Liste in einer Messagebox ein Semikolon voranzustellen; dann braucht man nur auf die Message-Box zu klicken, und die Nachricht wird verschickt.

2.2.4.1.3 Eine Reihe von Versand-Listen

So kann man auch viele verschiedene Nachrichten in einer Messagebox (mit einem einzigen Klick) verschicken:

Zwei Interpunktionszeichen innerhalb von Messages haben also eine besondere Bedeutung: Kommata (eine Reihe von mehreren Messages) und Semikola (die den Sender bedeuten).

Man beachte: Pd macht in Message-Boxen automatisch nach einem Semikolon einen Zeilenwechsel. Wenn wir also Folgendes schreiben:

und die Eingabe kopieren (Ctrl-D) oder den Patch schließen und neu öffnen, sieht das Ergebnis dann so aus:

Ebenso erfolgt in einem Comment (2.1.4.5.) nach einem Semikolon automatisch ein Zeilenumbruch.

2.2.4.1.4 Value

Eine weitere Möglichkeit, einen Wert zu verschicken, ist, ihn global, das heißt für den ganzen Patch festzulegen. Dies funktioniert mit „value“. Man gibt als Argument einen beliebigen Namen und als Input den Wert ein. An anderen Stellen im Patch kann man dann den Wert mit demselben Objekt und demselben Argument durch einen Bang erhalten:

2.2.4.2 Loadbang

Manche Werte möchten wir vielleicht gerne erhalten, bis wir den Patch das nächste Mal öffnen oder ein Wert soll gleich zu Beginn ge-bangt werden. Dafür gibt es „loadbang“ (schickt gleich beim Öffnen des Patches einen Bang) und „init“ (Abk. „ii“), das als Argument eine Zahl oder ein Symbol (oder eine Liste aus Zahlen, Symbolen oder Zahlen und Symbolen) ausgibt (pd extended).

2.2.4.3 GUI-Optionen

GUI steht für „graphical user interface“, also alle besonderen grafischen Objekte in Pd. GUI-Objekte sind Number- und Symbol-Box, Bang, Toggle, Slider, Radio, Canvas, sowie – zu denen kommen wir später – Array und VU. Alle GUI-Objekte haben noch erweiterte Funktionen. Zu denen gelangt man, wenn man mit der rechten Maustaste auf das Objekt klickt und im so erscheinenden Pulldown-Menü mit der linken Maustaste „Properties“ anwählt.

Hier lässt sich weiterhin Folgendes einstellen:

2.2.4.3.1 Number- und Symbol-Box

width entspricht der Größe der Box. Diese Angabe ist z.B. bei großen Zahlen bzw. Zahlen mit vielen Kommastellen erforderlich.

Mit lower und upper limit lässt sich der Bereich einstellen, der in die Box eingegeben werden kann (bei Zahlen z.B. ein Rahmen zwischen 0 und 1000).

Mit label kann man der Box einen angezeigten Namen geben (darunter stellen wir ein, wo der Name an der Box angezeigt werden soll).

Mit receive/send kann man in die Box eine send- und receive-Funktion einbauen. Wenn man z.B. in send „post1“ eingibt, und irgendwo einen Receiver „post1“ hat, erhält dieser alle Eingaben in die Number-Box. Entsprechendes gilt für die „receive“-Funktion.

Wie man in der Grafik sehen kann, verschwindet das Input- bzw. Output-Kästchen, wenn man die interne send- bzw. receive-Funktion aktiviert.

Die Änderungen werden wirksam, wenn wir unten auf „apply“ oder auf „ok“ klicken.

2.2.4.3.2 Bang

size bezeichnet die veränderbare Größe (in Pixeln).

intrrpt/hold besagt, wie lange der Bang aufleuchtet (in Millisekunden).

init bedeutet, dass der Wert (hier Bang) beim Öffnen des Patches gleich ausgegeben (wie bei Loadbang) wird.

Das send-Symbol / receive-Symbol ist wie in Number-Box eine interne „send-“ / „receive“-Funktion.

Mit name kann man wie in Number-Box ein „label“ erstellen. Hier wird die Position mit x- und y-Werten bestimmt. Zusätzlich kann man auch die Schriftart und die Schriftgröße einstellen, außerdem die Farben für Hintergrund, Vordergrund und Name ändern. Zuerst klicken wir in folgener Reihe an, was geändert werden soll, ...

... und anschließend auf eine vorgegebene Farbe ...

Unter „compose color“ lassen sich die Farben auch individuell generieren.

Mit „backgd“ ist der Hintergrund gemeint, also die ganze Fläche des Bangs, mit „front“ der Vordergrund, also die Farbe, in der bei Aktivierung (durch einen Input oder durch Anklicken) der Bang kurz aufleuchtet.

Alle Änderungen werden wiederum mit „Apply“ oder „Ok“ aktiv.

2.2.4.3.3 Toggle

Hier funktioniert alles analog zum Bang, bis auf value: Der Toggle wechselt ja standardmäßig immer zwischen 0 und 1. Hier kann man aber einstellen, dass statt der 0 (die 1 bleibt immer eine 1) ein anderer Wert kommt.

2.2.4.3.4 Slider

width: Breite (in Pixeln)

height: Höhe (in Pixeln)

bottom: Wert des Sliders, wenn der Zeiger ganz unten steht

top: Wert des Sliders, wenn der Zeiger ganz oben steht

lin: Entweder lineare oder logarithmische Zunahme /Abnahme innerhalb des Rahmens. Wenn man draufklickt, erscheint auf dem Feld „log“. Es gilt immer das, was gerade zu lesen ist.

Man beachte: Bei „log“ kann nicht „0“ als Eckwert stehen.

init: Der untere Wert des Rahmens wird gleich beim Öffnen des Patches ausgegeben.

steady on click: Der Zeiger wird durch Bewegung bei gehaltener Maustaste verschoben. Klickt man auf „steady on click“, erscheint „jump on click“, darauf springt der Zeiger direkt dorthin, wo man innerhalb des Sliders hinklickt.

Der Rest verhält sich wieder analog zum Bang.

2.2.4.3.5 Radio

Bei Radio funktioniert alles wie bei den anderen, bis auf number, die Anzahl der Kästchen.

2.2.4.3.6 Canvas

Am Ende von 2.1.2. hieß es, die weiße Fläche, auf die wir Objekte setzen, heißt „canvas“. Wir können aber noch weitere solcher Farbflächen hinzufügen (Put canvas). Sie haben keine Funktion außer der, farbige Flächen zu sein.

Die Fläche entält links oben ein blaues Quadrat – das ist das eigentliche Objekt. Die ganze Fläche ist das Produkt dieses Objekts, sozusagen dessen Output. Sie bedeckt alle davor erstellen Elemente des Patches und liegt unter allen danach erstellen.

Die Properties sind gleicher Art wie die der anderen GUI-Objekte.

2.2.4.3.7 Beispiele für umgestaltete GUI-Objekte
2.2.4.3.8 Fontgröße ändern

Unter Edit Font kann man die allgemeine Größe der Boxen ändern.

2.2.4.3.9 Tidy up

Schräge Verbindungen können selektiert und mit Edit Tidy up gerade gezogen werden. Das funktioniert allerdings häufig nicht.

2.2.4.4 Subpatches

2.2.4.4.1 Platz

Im Laufe des Programmierens wird der Platz eines Fensters irgendwann zu klein. Daher kann man Teile eines Patches in sogenannte „Sub-Patches“ auslagern. Wenn wir ein Objekt „pd“ und als Argument einen beliebigen Namen schreiben, z. B. „pd mein-subpatch“ (der Name darf kein Leerzeichen enthalten), öffnet sich ein neues Fenster. (Wenn dieses geschlossen wird, kann es später wieder geöffnet werden, indem man im Execute-Mode einmal auf das Objekt „pd mein-subpatch“ klickt). Hier hat man nun Platz für neue Teile des Patches.

Es gibt zwei Verbindungsmöglichkeiten zum darüberliegenden ersten Fenster des Patches: „send“ und „receive“ funktionieren über verschiedene Fenster hinweg genauso wie innerhalb eines Fensters:

Hieran sieht man auch, dass man unabhängig voneinander in verschiedenen Fenstern eines Patches zwischen Execute-Mode und Edit-Mode hin und her wechseln kann.

Die andere Möglichkeit der Verbindung besteht über die Objekte Inlet und Outlet. Platziert man im Unterfenster einen Inlet, erscheint im Objekt für das Unterfenster („pd mein-subpatch“) ein Eingang.

Schickt man nun im Hauptfenster in diesen Eingang z.B. eine Zahl, erscheint diese im Unter-Patch.

Umgekehrt verfährt man mit Outlet:

Mehrere Inlets bzw. Outlets werden nebeneinander gesetzt und so erscheinen die Inlet- / Outlet-Kästchen dann gleichfalls nebeneinander angeordnet:

Das Fenster eines Subpatches kann auch geschlossen werden und arbeitet trotzdem weiter, solange das Fenster des Hauptpatches nicht geschlossen wird.

2.2.4.4.2 Modularisierung

Subpatches beheben nicht nur Platzmangel, sondern dienen auch der Strukturierung des Patches. Das heißt, dass man Teile, die eine bestimmte Aufgabe erledigen, in einen eigenen Subpatch auslagert, so dass diese kleine 'Maschine' immer verfügbar ist. So einen Teil nennt man auch „Modul“. Als Beispiel sei hier ein Metronom angeführt, in das man statt Millisekunden-Werte BpM-Werte eingeben kann:

Selbstgewählte Namen können keine Leerzeichen enthalten, man ersetzt sie daher meist durch Bindestriche oder (wie in diesem Beispiel) mit Unterstrichen.