Kapitel 5. Sonstiges

Inhaltsverzeichnis

5.1 Arbeit erleichtern
5.1.1 Theorie
5.1.2 Anwendungen
5.1.3 Appendix
5.1.4 Für besonders Interessierte
5.2 Visuelles
5.2.1 Theorie
5.2.2 Anwendungen
5.2.3 Appendix
5.2.4 Für besonders Interessierte

5.1 Arbeit erleichtern

5.1.1 Theorie

5.1.1.1 Unterpatches

Wie man Subpatches in Pd anlegt, haben wir bereits unter 2.2.4.4 gelernt. Jetzt soll nur noch einmal verdeutlicht werden, wie sie sinnvoll zu gebrauchen sind.

Haben wir einen Patch wie diesen ...

patches/5-1-1-1-subpatch1.pd

... können für Ordnung sorgen und alles, worauf wir nicht unmittelbar zugreifen, in einen Subpatch auslagern:

patches/5-1-1-1-subpatch2.pd

Sinnvoll ist aber auch, je nach Inhalt mehrere Subpatches anzulegen, wenn man später eine bestimmte Sache bearbeiten will.

patches/5-1-1-1-subpatch3.pd

So können wir uns etwa für einen Patch einen bestimmten Algorithmus bauen, der dann an verschiedenen Orten verwendet wird:

patches/5-1-1-1-modul.pd

Man spricht in diesem Fall auch von einem „Modul“.

5.1.1.2 Abstraktionen

Haben wir nun einen universell anwendbaren Subpatch, zum Beispiel den folgenden, der zwei Sekunden in einen Array aufnimmt und dann mit einer bestimmten Geschwindigkeit und variablen Lautstärke abspielt:

patches/5-1-1-2-abstraktion1.pd

... und möchten ihn an verschiedenen Orten verwenden, haben wir das Problem, dass nach jedem Duplizieren erst einmal der Array darin umbenannt werden muss und ein neuer Input (für die Geschwindigkeit) gegeben werden muss. Stattdessen können wir aber auch eine Abstraktion daraus machen; dies ist ein Patch, der als separate Datei abgespeichert wird und sich dann vielfach mit Variablen aufrufen lässt.

Wir nehmen den Subpatch von eben und speichern ihn unter dem Namen „record.pd“ ab. Dann beginnen wir einen gänzlich neuen Patch, aber speichern diesen im selben Verzeichnis wie „record.pd“ unter dem Namen „main“. Anschließend schreiben wir als Objekt „record“:

record“ ist eigentlich kein Objekt von Pd. Ist allerdings ein Patch mit diesem Namen (plus der Endung ".pd") in dem selben Verzeichnis vorhanden, wird ein Objekt erstellt, das diesen Patch wie ein wie ein Subpatch beinhaltet.

Der Vorteil dabei besteht in den Variablen. Laden wir wieder den „record.pd“-Patch (File Open). Darin können wir in Objekte Variablen der Form „$1“, „$2“ etc. schreiben. Setzen wir zum Beispiel Variablen für den Arraynamen und für die Geschwindigkeit:

Nun können wir im „main.pd“-patch wieder unser neues Objekt „record“ schreiben, und zwar mit zwei Argumenten für die beiden Variablen, also als erstes Argument einen Namen für den Array und als zweites die Abspielgeschwindigkeit.

Die Lautstärke, die wir weiterhin im Mainpatch ändern wollen, setzen wir genau wie bei einem Subpatch als Inlet.

Nun bleibt aber noch das Problem, dass wir, wenn wir in dem Mainpatch mehrfach die Abstraktion „record“ laden, jedes Mal dem Array darin einen eigenen Namen geben müssen. Es gibt dafür eine spezielle Option in Pd, für einen bestimmten Patch eine individuelle Zufallszahl quasi als Namen zu generieren. Diese wird mit $0 erzeugt. Wir machen die Abstraktion „z-zahl.pd“:

Es wird eine Zufallszahl mit Offset 1000 erzeugt, von der aus dann hochgezählt wird. Jedes Mal wenn wir nun die Abstraktion aufrufen, wird eine andere Zahl erzeugt:

Damit geben wir nun dem Array einen eigenen Namen. Konventionell geschieht das in der Form: $0-[Arrayname]. Ansonsten brauchen wir nur noch eine Variable ($1) für die Geschwindigkeit. Die Lautstärke soll weiterhin variabel bleiben.

Zuletzt können wir noch grafische Elemente einer Abstraktion mit der Funktion "Graph on Parent" in das spätere Objekt holen. In dem Patch „record“ erstellen wir für die Lautstärke statt des Inlets eine Nummern-Box, dann klicken wir mit der rechten Maustaste irgendwo auf die weiße Fläche, Properties. Dort haken wir „graph on parent“ und dann „apply“ an:

Wir sehen darauf ein rotes Rechteck. Alle GUI-Objekte, die vollständig innerhalb dieses roten Feldes sind, werden dann in dem späteren Objekt angezeigt. Wir bewegen die Nummern-Box für die Lautstärke in die Box, speichern „record.pd“ und schreiben anschließend das Objekt in einem neuen Patch:

Im neuen Patch:

Wir können die Größe und Position dieses roten Feldes hier ändern:

Graph on Parent funktioniert auch mit Subpatches.

Zweierlei gilt es zu beachten: Man kann den Inhalt einer Abstraktion vom Mainpatch aus sehen und verändern (einfach im Mainpatch auf das Objekt klicken). Die Veränderung darin wird aber nicht gespeichert! Nur wenn man die Datei der Abstraktion selbst als normalen Patch in Pd öffnet, kann man ihn auch ändern und speichern. Außerdem können in einer Abstraktion die $-Variablen nur in Objekten geschrieben werden. In Message-Boxen bezeichnet $1, wie sonst auch, nur einen Input in die Message-Box (siehe 2.2.2.1.4). Wir helfen uns beispielsweise so:

Und wir müssen natürlich, wenn wir den Mainpatch kopieren und irgendwo andernorts (in einem anderen Verzeichnis, auf einem anderen Computer) verwenden möchten, auch den „record“-patch mit kopieren. Wir können Abstraktionn aber auch immer verfügbar machen, wenn wir sie im Verzeichnis „extra“ innerhalb des Pd-Verzeichnisses speichern. Alle darin liegenden Patches sind immer als Abstraktionen verfügbar. Ebenso kann man aber auch ein eigenes Verzeichnis mit Abstraktionen anlegen, das standardmäßig geladen werden soll. Wir stellen einen solchen Verzeichnispfad in File Path ein.

5.1.1.3 Pd erweitern

Viele nützliche Objekte, die nicht in der ursprünglichen Version von Pd enthalten sind, wurden mittlerweile von vielen Programmierern weltweit erstellt. Man nennt diese Objekte „Externals“. Mehrere Externals sind wiederum zu „Libraries“ (dt. Bibliotheken) zusammengefasst, wie zum Beispiel die zexy-library oder die maxlib-library. Man muss sie in den Ordner „Extra“ und überdies in den Ladevorgang integrieren (File Startup). Mittlerweile gibt es auch „Pd extended“, das bereits weitere, zur ursprünglichen Version hinzugefügte Bibliotheken enthält.

Außerdem lässt sich Pd durch Zusatzprogramme ergänzen. Das bekannteste ist GEM, mit dem man, statt wie sonst mit Klang, mit Video-Daten und -Dateien arbeiten kann. Darüber hinaus lassen sich beispielsweise mit open sound control Daten aus anderen Programmen, die ebenfalls über einen OSC-Anschluss verfügen, in Pd integrieren. Die Pd-Versionen einiger Programmierer sind vor lauter Erweiterungen fast nicht mehr wiederzuerkennen.

5.1.2 Anwendungen

5.1.2.1 Customize your Pd

Wie bereits im letzten Kapitel angedeutet, kann man Pd stark individualisieren. Erstellen wir uns einige nützliche Abstraktionen.

Für den normalen Programmiergebrauch etwa ein „dac~“ mit eingebautem Lautstärkeschieber, nun genannt „dac“:

patches/dac.pd

Einen DSP-Schalter, genannt „+dsp“:

patches/+dsp.pd

Eine Darstellung für die Wellenform:

patches/wave.pd

5.1.2.2 Weitere Aufgabenstellungen

Als Abstraktionen:

a) Bauen Sie den DSP-Schalter in die „dac“-Abstraktion ein, ebenso einen Schalter, der auf stumm schaltet und wieder zurück.

b) Bauen Sie einen Kompressor.

c) Bauen Sie eine Darstellung des eingehenden Spektrums.

5.1.3 Appendix

5.1.3.1 Ein Patch automatisch erstellen

Wir haben einen Patch mit einem Subpatch namens „test“. Im Hauptpatch senden wir diesem Subpatch durch „s pd-test“ nun folgende Messages, in der Reihenfolge von oben nach unten:

obj“ erstellt ein Objekt; wir geben die x/y-Koordinaten sowie den Namen des Objekts mit Argumenten dahinter, ebenso die Message-Box. Die Verbindung funktioniert folgendermaßen: „connect [Objekt-Nummer] [Outlet-Nummer] [Objekt-Nummer] [Inlet-Nummer]“. Die Objekte werden in der Reihenfolge ihrer Erzeugung nummeriert, die Outlets und Inlets von links nach rechts. Alles jeweils bei 0 beginnen. Mit der Message „clear“ löschen wir den Inhalt des Subpatches.

Hier eine Übersicht über alle Befehle. Manche funktionieren gegenwärtig (Juni 2008) allerdings nicht:

Nun können wir – wenn auch auf etwas komplizierte Weise – beispielsweise eine bestimmte Anzahl von Arrays mit einer Abstraktion erzeugen, was anders in Pd nicht zu realisieren ist (vgl. 3.2.3.1):

patches/ntables.pd

Mit dieser Abstraktion beispielsweise erzeugen wir in dem Subpatch zehn Arrays mit der Größe 44100:

Und auf diese Weise können wir den Subpatch in unserem Hauptpatch anlegen:

5.1.4 Für besonders Interessierte

5.1.4.1 Eigene Objekte schreiben

...kann man natürlich auch. Pd ist ja eigentlich nur eine Oberfläche für eine Programmierung in der Programmiersprache C. Mit dieser können eigene Objekte („Externals“) geschrieben werden. Hierzu gibt es folgende Anleitung: http://iem.at/pd/externals-HOWTO/