Inhaltsverzeichnis
In diesem Kapitel geht es noch nicht direkt um die Herstellung von Musik, sondern zunächst um computertypische bzw. Pd-typische Arbeitsweisen mit Daten. Da solches jedoch für Musiker erfahrungsgemäß etwas abstrakt und unattraktiv erscheint, werden wir möglichst viel von diesem Stoff gleich auf ein klingendes Beispiel anwenden – allerdings noch ohne dabei zu erklären, wie Klang im Computer eigentlich erzeugt wird. Das soll erst im folgenden Kapitel 3 Gegenstand sein. Die Beispielpatches muss man selber in Pd nachbauen. Dies hat einen guten Lerneffekt. Ab Kapitel 3 sind dann größere Patches auch als eigene Dateien verfügbar unter www.kreidler-net.de/pd/patches/patches.zip.
Nachdem wir Pd gestartet haben, erscheint auf dem Monitor das Pd-Hauptfenster. Wir holen uns eine neue Programmierfläche, indem wir im Menü oben auf File und dann New klicken.
Ein neues Fenster geht auf. Wir setzen darin eine Objekt-Box: Put Object, oder mit der Tastatur, wie dahinter steht: Ctrl-1 (hier die Windows-Kürzel; sie sind auf anderen Plattformen eventuell anders).
... woraufhin am Maus-Zeiger eine blaue Box hängt ...
Anschließend klicken wir irgendwo auf die weiße Fläche des neuen Fensters, um die Maus wieder von der Objekt-Box zu entkoppeln. In die Box tippen wir ein: „osc~ 440“.
Um das Geschriebene zu fixieren, klicken wir zuletzt irgendwo auf die weiße Fläche außerhalb der Box:
(Das Zeichen „~“ bedeutet „Tilde“; speziell in Pd brauchen wir es oft.)
Wir sehen nun eine rechteckige Box mit kleinen schwarzen Rechtecken in den Ecken oben und unten. Die oberen Rechtecke heißen „Inlets“ (oder „Eingänge“), das untere Rechteck ist ein „Outlet“ (oder „Ausgang“).
Wenn wir mit dem Cursor auf das Rechteck des Outlet gehen, verändert er sein Erscheinungsbild zu einem Kreis (quasi ein Steckplatz für ein Kabel).
Klicken wir nun auf das Rechteck und bewegen die Maus bei gedrückter Maustaste, können wir eine Linie damit ziehen, als würden wir ein Kabel verlegen.
Noch haben wir jedoch kein Objekt, in welches das Kabel eingesteckt werden könnte und das Kabel verschwindet wieder, sobald wir die Maustaste loslassen. Setzen wir also ein weiteres Objekt wie vorhin beschrieben und nennen es „dac~“. Wir platzieren es unterhalb des „osc~“-Objekts, indem wir das Objekt einmal anklicken, so dass es blau wird, und bei gedrückter Maustaste durch Bewegung der Maus das Objekt verschieben. Danach ziehen wir erneut ein Kabel aus dem Outlet von „osc~“ und führen es an den Inlet von „dac~“. Dort angekommen, wird der Cursor wieder zum Kreis.
Lassen wir nun die Maustaste los, ist das Kabel von „osc~ 440“ sozusagen bei „dac~“ eingesteckt. Jetzt sollten wir einen Ton hören. Wenn nicht, muss geprüft werden, ob im Haupt-Pd-Fenster rechts oben bei „compute audio“ ein Häkchen gesetzt ist (in Linux: ob das Feld rot ist). Wenn nicht, das Häkchen per Mausklick setzen:
(Mit der Funktion „compute audio“ lässt sich einstellen, dass man programmieren kann, ohne dabei Klang zu generieren. Dies erspart dem Computer oft unnötige Rechenleistung – obwohl heutige Rechner damit kaum noch Probleme haben dürften.)
Wir hören nun also einen Ton, und zwar das eingestrichene a, den sogenannten Kammerton, der die Frequenz von 440 Hertz hat (die Bedeutung von „Frequenz“ und „Hertz“ wird später erklärt). Verbinden wir noch zusätzlich den Outlet von „osc~ 440“ mit dem rechten Inlet von „dac~“.
Damit sollte in beiden Lautsprechern des Computers etwas erklingen. Nun bringen wir eine Number-Box an (Put Number oder Tastatur Ctrl-3) und schließen sie über ihren Outlet an den Inlet des Objekts „osc~“ an. Dann wechseln wir in den sogenannten „Execute-Mode“ (Edit Edit mode, oder Tastatur Ctrl-E; der Cursor ändert sein Aussehen in einen Pfeil). Danach gehen wir mit der Maus auf die Number-Box, klicken diese an und bewegen die Maus bei gehaltener Taste auf und ab:
Dadurch ändern sich die Zahlen und somit die Tonhöhe. Es sollten allerdings Werte von mindestens 100 sein; der Werte-Bereich lässt sich feiner variieren, indem man die Shift-Taste gedrückt hält, gleichzeitig in die Box klickt und die Maus nach oben oder unten bewegt.
Eine andere Möglichkeit, Zahlen in die Number-Box einzugeben, wäre in die Box zu klicken, manuell über die Tastatur einen Wert einzugeben und ihn mit „Enter“ zu bestätigen.
Nun wechseln wir wieder in den anderen Modus, den „Edit Mode“ (wieder Edit Edit mode, oder Tastatur Ctrl-E). Mit dem Cursor, der nun wieder eine Hand ist, gehen wir über die Verbindung zwischen „osc~“ und „dac~“, wobei der Cursor zum X wird, und klicken darauf, so dass die Verbindungsschnur blau wird.
Dann gehen wir auf Edit Cut oder drücken die Backspace-Taste. So wird eine Verbindung gelöscht. Außerdem löschen wir so auch die zweite Verbindung zum „dac~“. Nun bringen wir dazwischen ein weiteres Objekt an, nämlich „*~ 0“, und verbinden es folgendermaßen mit den anderen Objekten:
Schaffen wir uns nun etwas Platz: Wir vergrößern rechts unten das Fenster, in dem wir in die Ecke ganz rechts unten im Fenster klicken und bei gedrückter Maustaste eine neue Fenstergröße ziehen.
Dann klicken wir rechts unten in der Nähe des „dac~“-Objektes in den weißen Hintergrund, halten die Maustaste gedrückt und ziehen das erscheinende Rechteck so, dass darin das „dac~“- und das „*~“-Objekt eingeschlossen sind.
Auf diese Weise können wir immer einen Teil eines Patches selektieren. (So können auch Boxen gelöscht werden: Indem man sie selektiert und dann auf Edit Cut geht oder einfach Backspace drückt.)
Wenn wir nun die Maustaste loslassen, sind die beiden markierten Objekte blau. Nun klickt man in eines der beiden markierten Objekte, hält geklickt und zieht sie zusammen nach unten, so dass wir mehr Platz darüber frei haben.
Um anschließend die Markierung wieder aufzuheben, klickt man irgendwo auf die weiße Hintergrundfläche.
Dann bringen wir zwei „Message“-Boxen (Put Message oder Ctrl-2) wie folgt an und versehen eine mit dem Inhalt „0“, die andere mit „1“.
Wir gehen wieder in den Execute-Mode (wieder Edit Edit mode oder Ctrl-E) und klicken abwechselnd auf die beiden Message-Boxen: Bei 1 geht der Ton an, bei 0 aus.
In dem soeben erstellten Beispiel sind schon die meisten Elemente von Pd enthalten. Schauen wir genau hin – wir haben drei verschiedene Arten von Boxen verwendet: Objekt, Message und Number.
Die Objekt-Boxen sind viereckig, die Message-Boxen haben rechts eine Einbuchtung, die Number-Boxen rechts oben ein stumpfes Eck.
Alle diese Boxen haben Ein- und Ausgänge („Inlets“ und „Outlets“). Die Eingänge befinden sich immer oben, die Ausgänge unten. Man kann immer von einem Ausgang zu einem Eingang (in dieser Abfolge) Verbindungen ziehen. Es gibt einen Edit-Mode und einen Execute-Mode. Im Edit-Mode programmiert man, im Execute-Mode führt das Programm aus. Man kann die beiden Modi äußerlich durch die verschiedenen Cursor-Gestalten unterscheiden:
Schauen wir weiter genau hin: Es gibt zwei verschiedene Arten von „Kabeln“, dicke und dünne. Von der Number-Box zum „osc~“-Objekt verläuft ein dünnes Kabel, vom „osc~“-Objekt aus verläuft ein dickes Kabel. Das bedeutet, durch ein dickes Kabel strömen Signale, während durch ein dünnes nur Kontrolldaten gehen. Mit „compute audio“ im Pd-Hauptfenster stellen wir ein, ob die Signale tatsächlich geschickt werden sollen oder nur dann, wenn man das Häkchen aktiviert. Darüber hinaus haben alle Objekte, die Signale erzeugen oder mit Signalen als Input arbeiten (Input = das, was in ein Inlet geht; Output = was aus einem Outlet kommt), hinter ihrem Namen die Tilde: „~“ verzeichnet; die haben alle anderen Objekte nicht! Diese beiden Ebenen nennen wir „Kontroll-Ebene“ (wo nur Kontrolldaten fließen) und „Signal-Ebene“ (wo auch Signale fließen).
Wir hatten zunächst das Objekt „osc~ 440“ geschrieben, den sogennanten „Oszillator“, und darauf hörten wir einen Ton mit 440 Hertz (was „Hertz“ ist, wird später erklärt). Dann hatten wir die Number-Box angebracht und darin neue Werte eingegeben, worauf der Ton nicht länger bei 440 Hertz. blieb, sondern die Frequenz des neu gegebenen Wertes annahm. Das ist eine grundlegende Struktur von Pd: Ein Objekt hat einen Namen (wenn es auch mit Signalen arbeitet, hat der Namen am Ende eine Tilde), dann kommt ein Leerzeichen und darauf folgen ein oder mehrere Argumente (hier war das Argument zunächst die „440“. Diese können bei den meisten Objekten ersetzt werden durch neue Werte, die in die Inlets eingegeben werden (in den meisten Fällen erfolgt die Änderung, anders als beim „osc~“-Objekt hier, dann durch den ganz rechten Inlet).
Ab dann gelten nur noch die Input-Werte (im Beispiel hier also 300 statt 440).
Als Informationen können wir in Number-Boxen oder in Message-Boxen Zahlen eingeben. In Message-Boxen können wir auch Buchstaben schreiben, das sind dann sogenannte Symbole. Alle diese Informationen nennen wir Atoms. Ein Atom steht also in einer Message-Box oder in einer Number-Box (mehr zu Atoms siehe Abschnitt 2.1.5).
Noch eine wichtige Bezeichnung: Das Programm, das wir schreiben, nennt man Patch. Ein Patch ist zunächst nur eine weiße Fläche, sozusagen eine weiße Leinwand, auf das wir dann unser Programm schreiben. Wir nennen diese weiße Fläche auch Canvas (englisch = Leinwand).
Es gibt den Edit Mode und den Execute Mode (man schaltet zwischen beiden hin und her mit Ctrl-E oder im Menü unter Edit Edit mode). Im Edit Mode setzt man alle Teile eines Patches, im Execute Mode startet man alle Operationen sowie den Klang.
Innerhalb eines Patches gibt es die Kontroll-Ebene und die Signal-Ebene (Kontroll-Objekte haben keine Tilde am Ende ihres Namens und sind mit dünnen Kabeln verbunden, Signal-Objekte haben eine Tilde am Ende und sind mit dicken Kabeln verbunden). Die Signal-Ebene ist nur aktiv, wenn im Pd-Hauptfenster rechts oben „compute audio“ aktiviert ist.
Die Elemente des Patches sind Objekte, Messages und Numbers.
Ein Objekt hat häufig ein oder mehrere Argumente (im Englischen „creation argument“ genannt), die aber durch einen Input geändert werden können.
Eine Message ist ein fester Wert im Execute mode und wird zusammen mit dem Patch gespeichert. Wenn in eine Message-Box geklickt wird, führt das dazu, dass die darin befindliche Message an alle Objekte verschickt wird, die mit ihrem Ausgang verbunden sind. In einer Number-Box hingegen kann man im Execute mode verschiedene Werte eingegeben, die dann jedoch nicht gespeichert werden.
Noch ein paar zusätzliche Dinge, die die Arbeit mit Pd erleichtern:
Klickt man mit der rechten Maustaste auf die weiße Fläche („Canvas“) des Patches, und öffnet das Menü Help, erscheint eine Liste mit allen Objekten von Pd.
Klickt man mit der rechten Maustaste in ein Objekt, öffnet sich ein Pulldown-Menü, über das sich die Help-Datei für das Objekt anwählen lässt, worin das entsprechende Objekt näher erklärt wird.
Sehr hilfreich wird es bald sein, Teile des Patches zu verdoppeln. Man selektiert einen Bereich (wie unter 2.1.1 beschrieben, als es darum ging, mehr Platz zu schaffen), so dass die selektierten Boxen blau sind, und geht auf Edit Duplicate bzw. Ctrl-D. Damit ist der markierte Bereich verdoppelt und die Kopie erscheint als selektierter Bereich, der sich verschieben lässt (auf eine der blauen Boxen klicken, gedrückt halten, den Bereich verschieben und an der gewünschten Stelle die Maustaste wieder loslassen).
Grundsätzlich kann man wesentlich bequemer und schneller arbeiten, wenn man die Tastaturkürzel („Keyboard Shortcuts“) verwendet. Für viele der über die Menüs anwählbaren Funktionen gibt es Tastaturkürzel, die in den Menüs neben den entsprechenden Funktionen notiert sind.
Beim Programmieren kann es sehr schnell komplex werden. Um später noch die Bedeutung eines bestimmten Patches zu verstehen, empfiehlt es sich, seinen Patch zu kommentieren. Kommentare fügt man mit Put Comment (bzw. Ctrl-5) ein. Damit lässt sich etwas Beliebiges schreiben, das den Patch erklärt.
Wenn wir das bislang Erläuterte begriffen haben, haben wir schon die wichtigsten Grundlagen der Struktur der Benutzeroberfläche von Pd erarbeitet. Nun kommen wir zur Struktur der Programmierung selbst.
Eine Message für ein Objekt hat zwei Teile: erstens den Hinweis auf eine Methode (Selector), zweitens kein, ein oder mehrere Werte (Argumente). Zum Beispiel ist die Message „5“ eigentlich die Message „float 5“, mit den beiden Atomen „float“ und „5“. Die Message „bang“ besteht nur aus dem Selector „bang“ und enthält keine Argumente. Oder die Message „1 2 3 4 5“ ist eigentlich die Message „list 1 2 3 4 5“.
Ein Atom kann eines von drei Typen sein: eine Zahl (Programmiersprache = „float“) mit einem 32-Bit-Wert, ein Symbol, das eine Buchstabenfolge ist, oder ein Pointer, der eine Art Adresse ist (dazu kommen wir erst in Kapitel 5.2.3).
Die Message „float 5“ besteht aus den beiden Typenbezeichnern Symbol und Float, der Typ Symbol mit dem Wert „float“ (ein String) und der nachfolgende Typ Float mit dem Wert „5“.
Der Selector ist immer ein Symbol. Da Objekte auf veschiedene Messages unterschiedlich reagieren können, wird durch den Selector vorab eine nähere Bestimmung erzeugt..