Aus Linux-Magazin 09/2005

Klangprogramme bauen mit Pd

Pure Data ist ein reichhaltiger Baukasten zur Signalverarbeitung, mit dem sich Synthesizer, Sampler und Midi-Geräte zusammenstecken lassen. Mit Erweiterungsmodulen beherrscht Pd sogar 3D-Grafik und Video.

Es fällt schwer, zu sagen, um welche Art von Software es sich bei Pd [1] handelt. Einschlägigen Websites bezeichnen es als grafische Programmierumgebung für Musik. Der Name Pure Data ist dabei Programm: Pd verarbeitet reine Daten, ohne sich zunächst groß darum zu kümmern, was sie darstellen. Dass eine Menge Zahlen eine hörbare Wellenform repräsentiert, spielt bei der Berechnung keine Rolle. Allerdings stellt Pd viele Elemente zur Verfügung, die vor allem bei der Audioverarbeitung nützlich sind.

Spezialist für Klangerzeugung

Mit Pd lassen sich grafisch virtuelle Synthesizer bauen, die jedes Detail der Klangsynthese selbst bestimmen. Wer nicht so tief einsteigen möchte, setzt aus fertigen Elementen eigene Instrumente oder Sequencer zusammen. Pd verarbeitet und erzeugt auch Midi-Daten und macht so das Zusammenspiel mit Keyboards und anderen Midi-Geräten möglich – allerdings erst ab Version 0.39 mit Alsa-Midi. Das Programm beherrscht die LADSPA-Schnittstelle (siehe folgenden Artikel) und arbeitet auch mit den meisten anderen Soundprogrammen zusammen. Schließlich ist Pd durch C-Programmierung und diverse Skriptsprachen so erweiterbar, dass sich praktisch jede denkbare Audio-Anwendung zusammenstecken lässt.

Der Benutzer baut mit Pd visuell Signalnetze (Patches) auf, die aus vier Grundelementen bestehen, denen grafisch kleine Kästchen entsprechen: Objekte (Object), Nachrichten (Message), GUI-Elemente (GUI) und Kommentare (Comment). Beim Start von »pd«, erscheint ein schmuckloses Tk-Fenster mit einem Menü, den beiden Aussteuerungsanzeigen »IN« und »OUT« und dem Error-Button »DIO« (Abbildung 2).

Der Parameter »-alsa« startet Pd mit Alsa-Support, »-jack« für Jack. Die Konfigurationsdatei »~/.pdrc« nimmt die gleichen Parameter in jeweils einer Zeile auf. Der Menüpunkt »File | New« öffnet eine neue Arbeitsfläche für ein Patch. Pd kennt zwei Modi: zum Editieren (Edit Mode) und zum Abspielen (Run Mode). Zwischen den beiden schaltet der Benutzer über einen Menüpunkt oder die Tastenkombination [Strg]+[E] um.

Objekte verbinden

Verfügbare Elemente zum Bau der Patches finden sich im Menü »Put«. Hat der Benutzer zum Beispiel ein Objekt auf der Fläche platziert, blinkt darin ein Cursor für die Eingabe des Objektnamens. Klickt er dann auf ein anderes Objekt oder die freie Fläche, versucht Pd das passende Objekt in seiner Sammlung zu finden. Gelingt dies, zeichnet es an die Box kleine Markierungen für Signalein- und -ausgabe (Inlets und Outlets). So ist »delay« ein vorhandenes Objekt, »xyz« dagegen nicht (Abbildung 1).

Im letzten Fall stellt Pd natürlich auch keine Inlets und Outlets dar. Im Terminalfenster (oder Pd-Ausgabefenster, je nach Version) erscheint die Fehlermeldung »couldn\’t create«. Es gibt in Pd also keine Liste tatsächlich verfügbarer Objekte. Der Benutzer muss ihre Namen kennen und in die Kästchen eintippen (Abbildung 1). Bewegt er die Maus über einen Ausgang, wird der Zeiger zu einem kleinen Kreis. Durch Klicken und Ziehen lässt sich dann eine Verbindung zu einem anderen grafischen Element herstellen. Unerwünschte Verbindungen löscht die [Entf]-Taste.

Neben den nicht weiter erklärungsbedürftigen Kommentaren kennt Pd noch Message-Objekte, die beim Anklicken Nachrichten verschicken. Dabei kann es sich um Zahlen, Listen, Strings und so fort handeln. Häufig verwenden Patches Message-Objekte zur User-Interaktion. Ein Spezialfall sind Message-Objekte mit mehreren Zeilen. Sie treten in vielen Patches auf und führen in der ersten Zeile meist nur ein Semikolon. Diese Zeile löscht gewissermaßen den Default-Empfänger der Nachricht. In jeder folgenden Zeile steht zuerst der Empfänger, dann folgt die Nachricht.

Abbildung 1: Wenn Pd ein Objekt nicht kennt, zeichnet es keine In- und Outlets (Oben). Existierende Objekte lassen sich dagegen über diese Anschlüsse verbinden (Mitte). Das Beispiel-Patch (unten) addiert mit »+« zwei Zahlen und gibt das Resultat mit »print« aus.

Abbildung 1: Wenn Pd ein Objekt nicht kennt, zeichnet es keine In- und Outlets (Oben). Existierende Objekte lassen sich dagegen über diese Anschlüsse verbinden (Mitte). Das Beispiel-Patch (unten) addiert mit »+« zwei Zahlen und gibt das Resultat mit »print« aus.

Message-Objekte sind optisch an der Einbuchtung auf der rechten Seite zu erkennen. In der rechten unteren Ecke des oberen Fensters in Abbildung 2 steht ein solches Message-Objekt. Es schickt dem globalen Objekt »Pd« die Nachricht, »dsp« auf »0« zu setzen, also die Audioverarbeitung zu stoppen. Der Wert »1« anstelle von »0« schaltet sie ein.

Grafischer Rechner

Für Zahlenwerte verwendet Pd so genannte Number-Elemente. Ihre Kästchen haben oben rechts eine abgeschnittene Ecke (Abbildung 1). Im Run-Mode verändert der Benutzer den Wert durch Anklicken und Verschieben des Cursors bei gedrückter Maustaste. Das Rechnen-Patch in Abbildung 1 besteht aus zwei Nummern-Elementen, der Addier-Operation und einem Print-Objekt.

Ändert man die linke Zahl, erhält der Plus-Operator sie als Nachricht. Auf dem Outlet schickt er das Ergebnis an das Print-Objekt. Überraschenderweise passiert nichts, wenn sich die rechte Zahl verändert. Das liegt daran, dass Pd zwischen heißen (hot) und kalten (cold) Eingängen unterscheidet: Viele Objekte werden nur dann aktiv, wenn sie am linken, dem heißen Eingang eine Nachricht empfangen. Der rechte Eingang speichert dagegen meist den gesetzten Wert.

Um auch den rechten Eingang zu aktivieren, leitet man die Nachrichten durch einen »trigger«, der gewissermaßen zur Message noch den Auslöser betätigt. Der Nachrichtenfluss gehorcht der Depth-first-Regel, ein Zweig wird also erst ganz abgearbeitet, bevor der nächste an die Reihe kommt.

Etwas zum Hören

Neben allgemeinen Funktionen zur Datenverarbeitung bringt Pd spezielle Audio-Objekte mit. Der Schalter »compute audio« im Hauptfenster aktiviert die Soundverarbeitung global (Abbildung 2). Pd berechnet die Audiowerte dann parallel für alle offenen Patches. Die Ausgabe ist über geeignete Objekte auch in jedem einzelnen Patch abschaltbar, etwa über einen Lautstärkeregler.

Objekte, die Audiosignale verarbeiten, kennzeichnet Pd mit einer Tilde. Zum Beispiel erzeugt der einfache Oszillator »osc~« eine Kosinus-Schwingung. Er verarbeitet einen optionalen Parameter, der die Frequenz der Schwingung angibt, zum Beispiel »osc~ 440« für 440 Hz. Ohne den Parameter erwartet das Objekt an seinem Inlet ein Audiosignal.

Mehr über jedes Objekt verrät die Pd-Hilfe, die jeweils über die rechte Maustaste erreichbar ist. Um überhaupt etwas zu hören, braucht Pd eine Schnittstelle zur Audiohardware, die es über OSS, Alsa oder Jack ansprechen kann. Das entsprechende Element dafür heißt »dac~« (Digital Analog Converter).

Abbildung 2: Das obere Fenster enthält einen einfachen Synthesizer mit Lautstärke- und Frequenzregelung und Visualisierung der Schwingung. Halb verdeckt ist in der unteren Hälfte das Pd-Hauptfenster zu sehen.

Abbildung 2: Das obere Fenster enthält einen einfachen Synthesizer mit Lautstärke- und Frequenzregelung und Visualisierung der Schwingung. Halb verdeckt ist in der unteren Hälfte das Pd-Hauptfenster zu sehen.

Simpler Synth

Das einfachste Patch besteht aus einem Signalgenerator »osc~ 440« verbunden mit der Ausgabe »dac~«. Wer genau hinsieht, wird feststellen, dass Pd Audioverbindungen etwas dicker zeichnet als Kontrollverbindungen. Schaltet man mit »compute audio« die Audioberechnung ein, ist ein Sinuston mit 440 Hz zu hören, der wie das Freizeichen im Telefon klingt. Es empfiehlt sich allerdings, vor dem Einschalten die Lautstärke sicherheitshalber etwas herunterzuregeln. Bleiben die Lautsprecher stumm, kann das verschiedene Ursachen haben. Pd bietet deshalb unter »Media | Test Audio and MIDI« ein Patch zum grundlegenden Funktionstest.

Ein etwas komplexeres Beispiel zeigt Abbildung 2. Es enthält zwischen Oszillator und Ausgabe einen Multiplikator für Audiosignale »*~«, der die Amplitude mit einer Fließkommazahl multipliziert, die er über das rechte Inlet erhält. So lässt sich eine einfache Lautstärkeregelung realisieren. Der Lautstärkezweig benutzt außerdem das Pd-Objekt »dbtorms«, das zwischen der Einheit dB (von 0 bis 100) und der Amplitudeneinheit (von 0 bis 1) wandelt. Dieses Mal fehlt im Oszillatorkästchen die Frequenzangabe, sodass es am Eingang ein Audiosignal erwartet. Das Objekt »sig~« erzeugt aus Kontrollwerten ein solches Signal. Es ist wiederum am Eingang mit einem Number-Controller verschaltet, der die Frequenz bestimmt.

Ein Audiosignal lässt sich mit einer Lautstärke-Hüllkurve »line~« verbinden, die zum Beispiel den Ton erst sanft ansteigen lässt und ihn dann auf einem Wert hält. Für komplexere Klänge bietet Pd auch ADSR-Objekte, die die vier zeitlichen Phasen eines Klangs modellieren: Attack, Decay, Sustain, Relase.

Klangsynthese

Mit mehreren Oszillatoren lassen sich verschiedene Methoden der Klangerzeugung implementieren. Bei der FM-Synthese (Frequenz-Modulation) beispielsweise werden zwei Schwingungen so miteinander gekoppelt, dass neue Frequenzen entstehen. Unter dem Namen »A07.frequency.mod.pd« findet sich dafür ein einfaches Patch in der Pd-Hilfe, die auch Beispiele für additive Synthese und Phasenmodulation enthält.

Pd eignet sich gut dafür, verschiedene Synthesearten zu veranschaulichen. Es enthält einfach benutzbare Visualisierungsobjekte. Nach Pd-Art verbindet der Synthesizer-Konstrukteur dafür sein Patch an geeigneter Stelle mit einem Objekt namens »tabwrite~« (Abbildung 2). Sein Parameter ist der Name des Anzeige-Elements, im Beispiel »waveform«. Solche Graphen entstehen mit Hilfe des Menüs »Put | Graph«. Drückt der Benutzer den dort ebenfalls angeschlossenen Knopf (der Kreis im Quadrat), übergibt »tabwrite~« die aktuellen Daten an das Graphen-Objekt, das die entstehende Wellenform anzeigt.

Mit diesen Elementen und einem Timer oder Metronom besteht auch die Möglichkeit, eine kontinuierliche Anzeige zu realisieren. Beispiele aus der Pd-Dokumentation führen vor, wie es geht. Granulare Synthese beherrscht Pd von Haus aus nicht, es gibt aber ein Erweiterungsmodul dafür. Die Grundlagen für Audiosynthese legt Pd-Autor Miller Puckette in seinem Online-Buch “Theory and Techniques of Electronic Music” dar [3].

Abbildung 3: Auch nur Daten: Das Pd-Zusatzpaket Gem beherrscht Bildoperationen und 3D-Grafik.

Abbildung 3: Auch nur Daten: Das Pd-Zusatzpaket Gem beherrscht Bildoperationen und 3D-Grafik.

Natürlich beherrscht Pd auch einfachere Anwendungen. Mit recht wenig Aufwand lässt sich zum Beispiel ein kleiner Midi-Synthesizer implementieren, dazu sind nur ein paar Midi-Objekte wie »midiin« und »midiout« und ein Sample-Player erforderlich, der über das Objekt »read« ein Sound-File liest.

Externe Helfer

Wem die mitgelieferten Objekte und Patches nicht genügen, der kann auf so genannte Externals zurückgreifen, externe Pakete, die sich nahtlos in Pd integrieren [4]. So realisiert das Fluid-External einen Fluidsynth-Soundfont-Sampler als Pd-Patch. Weil Externals in C geschrieben sind, können sie jede gewünschte Funktionalität in Pd integrieren. Tipps zum Selberschreiben gibt [5].

Für Anhänger anderer Programmiersprachen gibt es Alternativen. Die Flext-Bibliothek [6] ermöglicht Plugins in C++, die auch mit dem kommerziellen Pd-Konkurrenten Max (nur für Mac und Windows) arbeiten. Das API abstrahiert Unterschiede beider Systeme. Ein anderes Pd-Modul des Flext-Autors ist Basis für Pd-Erweiterungen in Python.

Ruby-Fans sollten einen Blick auf Gridflow [8] werfen, das auf Pd aufbaut und neben der Ruby-Sprachbindung viele Funktionen zur Bildverarbeitung bietet. Vor Gridflow war das die Domäne der Pd-Erweiterung Gem [9], die Bildoperationen und sogar 3D-Grafik in OpenGL bietet (Abbildung 3). Den Kreis schließt Pure Data Packet (PDP) [10], das sich speziell mit Videoverarbeitung beschäftigt und die Basis für den Echtzeit-Videoprozessor Pidip bildet [11].

Das User-Interface von Pure Data könnte in der Tat eine Überarbeitung vertragen, denn abgesehen vom Erscheinungsbild ist es auch nicht immer einfach zu bedienen, zum Beispiel bei der Auswahl der Objektboxen. Abgesehen davon ist Pd aber mit seinen Zusatzprogrammen ein mächtiger Baukasten zur visuellen Programmierung. Davon kann sich jeder anhand der zahlreichen Beispiele überzeugen, die noch dazu meist gut kommentiert sind. Ein Tipp: In den Patches den dB-Regler suchen und auf 70 bis 80 stellen, aber die Lautsprecher vorsichtshalber nicht zu laut aufdrehen.

Infos

[1] Pd: [http://puredata.org]

[2] Pd-Dokumentation: [http://crca.ucsd.edu/~msp/Pd_documentation]

[3] Miller Puckette, “Theory and Techniques of Electronic Music”: [http://crca.ucsd.edu/~msp/techniques]

[4] Externals Repository: [http://pure-data.sourceforge.net]

[5] Externals selber schreiben: [http://iem.kug.ac.at/pd/externals-HOWTO]

[6] Flext: [http://grrrr.org/ext/flext]

[7] Max/MSP: [http://www.cycling74.com/products/maxmsp.html]

[8] Gridflow: [http://gridflow.ca]

[9] Gem: [http://gem.iem.at]

[10] PDP: [http://zwizwa.fartit.com/pd/pdp/overview.html]

[11] Pidip: [http://ydegoyon.free.fr/pidip.html]

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben