Extern 1 - Woche 9
Aufgaben
I1: PDF-Erzeugung
Nimm eins deiner alten Sketche und baue das so um, dass die erstellten Grafiken als PDF gespeichert werden.
I2: Wellenform
Installiere die Sound-Bibliothek Minim und importiere sie. Dann lade zunächst eine Musik-Datei (z.B. eine MP3) und lass diese in Processing abspielen.
Wenn das funktioniert, nutze die audioPlayer.mix.get(sampleNumber)
Funktion, und stelle die Wellen in Echtzeit dar.

Variante: Nutze audioPlayer.left
und audioPlayer.right
um eine Stereo-Visualiserung zu erzeugen.
I3: Clap your hands!
Lösung (Variation)Nutze das Mikrophon als Steuerelement. So kannst du etwa die Farbe eines Elements von der Umgebungslautstärke abhängig machen. Oder eine Grafik über die Tonhöhe beeinflussen. Oder oder ...
Bibliotheken
Processing wurde entwickelt, um Grafiken und Bewegung zu erzeugen und auf allgemeine, einfache Eingabegeräte wie Maus und Tastatur zu reagieren. Damit hat es absichtlich und bewußt einen recht eingeschränkten Fokus. Mit Hilfe von Bibliotheken kann man erweiterte Funktionalitäten verwenden, die Processing nicht direkt zu Verfügung stellt. Eine Bibliothek besteht aus Anweisungen und Klassen, die benutzt und/oder erzeugt werden können. Der Code dieser Bibliotheken ist – wie selbst geschrieben – in Processing (oder Java) progammiert. Der Vorteil an einer Bibliothek ist, dass diese auf einfache Weise eingebunden werden kann.
Mit solchen Libraries wird es über Grafikerzeugung und Bildbearbeitung hinaus möglich, etwa Audio und Video zu benutzen oder mit externen Geräten zu kommunizieren. Auch das Einlesen von Daten aus dem Internet und viele weitere Manipulationen werden erleichtert.
Import
Um eine Bibliothek verwenden zu können, muss sie im Processing-Programm hinzugefügt werden. Dies geschieht mit einer einzelnen Zeile, in der die Bibliothek importiert wird. Diese kann man entweder selbst in den Code reinschreiben, oder über das Menü "Sketch > Import Library" auswählen. Um zum Beispiel die grafischen Anweisungen schneller mit Hilfe der Grafikkarte ausführen zu können, fügt man folgende Zeile am Anfang des Progamms hinzu:
Die Anweisung import
besagt, dass nun alle Klassen aus der angegebenen Bibliothek verwendet werden können. Der
processing.opengl.*
bezeichnet den Namen der Bibliothek. (Genauer: Die Klassen liegen im Paket processing.opengl und
werden wegen des Asterisk-Platzhalters alle geladen.)
Core libraries & Contributions
Processing bringt von Haus aus einige grundlegenden Bibliotheken mit, wie etwa die OpenGL und die PDF Bibliotheken. Diese Core Libraries müssen nicht extra herunter geladen werden und können direkt importiert werden.
Andere Bibliotheken wurden nicht mit Processing mit geliefert und müssen vor der Verwendung erst herunter geladen werden. Man findet diese im Internet und kann sie für seine Processing-Umgebung installieren.
Installation externer Bibliothken
Um eine externe (Contribution-)Bibliothek verwenden zu können, muss man diese erst herunter laden und installieren. Meist wird eine Zip-Datei angeboten, die man direkt im Processing-Ordner entpacken kann. Nach erfolgreicher Installation taucht die Bibliothek dann auch im "Sketch > Import Library"-Menü auf.
PDFs
Diese Bibliothek ermöglicht das direkte Erzeugen von PDF-Dateien aus Processing. Die Grafikanweisungen werden als Vektorgrafiken im PDF gespeichert
und können so beliebig skaliert werden und in sehr hohen Auflösungen gedruckt werden. So wird eine stets gleichbleibende Qualität im Druck erreicht
und die erzeugten Grafiken können gut als Ausgangsbasis für Prints verwendet werden. Bilder, die direkt vom Bildschirm gespeichert wurden (z.B.
mit saveFrame()
sind in einer zu niedrigen Auflösung (typischerweise 72 oder 96 dpi). Im Druck wird dies sichtbar, und die
Ausdrucke pixelig.
Zur Erstellung von PDFs muss zunächst die Bibliothek importiert werden.

Importieren der PDF-Bibliothek über das Menü
Nun werden die PDF-Anweisungen importiert und können im Code eingesetzt werden.
Einzelbild
Um ein einzelnes Bild zu erzeugen, kann folgendermaßen vorgegangen werden:
In Zeile 4 des Beispiels wird in der size()
Anweisung gesagt, dass die Grafik als PDF erzeugt werden soll, und zwar in einer
Datei mit Namen "circles.pdf". (Dabei wird sich kein Ausgabefenster öffnen; es wird nur das PDF erstellt.)

PDF-Ausgabe: 100%

PDF-Ausgabe: 600% Zoom
Wie in den unterschiedlich skalierten Bildern gut zu erkennen, bleibt die Qualität immer gleich gut.
Aufnahme
Alternativ kann man auch festlegen, dass alles im PDF gespeichert wird, was auch auf der Zeichenfläche zu sehen ist. Dazu
verwendet man die beiden Anweisungen beginRecord()
und endRecord()
. Der Vorteil ist,
dass man beobachten kann, wie das Ergebnis aussieht. Im folgenden Beispiel kann per Mausklick bestimmt werden, wann das PDF
erzeugt wird.
Akustik
Was Sound ist, und wie man ihn üblicherweise visualisiert, wird im Folgenden gezeigt. (Dieser Überblick ist minimalistisch gehalten, diese Grundlagen sollten bekannt sein.)
Frequenz und Tonhöhe
Schallwellen besitzen eine sinusförmige Form. Wellenlänge heisst der Abstand zweier benachbarter Punkte gleiches Pegels. Die Frequenz beschreibt die Anzahl der Wellen je Sekunde. Töne sind Schwallwellen mit bestimmten Frequenzen. Je höher die Frequenz, dester höher der Ton. Ein Klang sind mehrere Töne übereinander gelegt.

Abbildung der Frequenzen eines Klangs.
Amplitude und Lautstärke
Die Amplitude eines Tons wird als die Höhe der Welle repräsentiert. Ein lauter Ton hat eine hohe Welle und eine große Amplitude. Und andersrum: eine kleine Amplitude repräsentiert einen leiseren Ton. Die Lautstärke wird in Dezibel gemessen. Die Wahrnehmungsschwelle beim Menschen liegt bei 0dB, während die Schmerzgrenze bei ca. 130dB liegt. Zu beachten ist, das die Skala logarithmisch ist, d.h. dass der Mensch erst bei einer Erhöhung von 10dB eine Verdopplung der Lautstärke wahrnimmt.

Abbildung der (überlagerten) Wellen eines Klangs.
Links
- Ars Auditus: Populärwissenschaftliche Erläuterungen zum Thema Akustik
- Wikipedia: Universalien der Musikwahrnehmung
- Ach, und ... nicht die Ohren kaputt machen! ;)
Sound-Bibliotheken
Es gibt verschiedene Sound-Bibliotheken für Processing. Diese haben jeweils Vor- und Nachteile, teilweise technischer Natur, teilweise
wie man mit den Anweisungen und Klassen programmieren muss.
Sonia war die erste Sound-Bibliothek für Processing, wobei Ess zur Zeit die meist benutzte sein dürfte. Dennoch empfehle ich die neueste Bibliothek Minim, weil
sie einen einfachen Eindruck macht und gut dokumentierte Beispiele mit liefert.
- Ess: "Ess is a sound library that allows sound sample data to be loaded or streamed (AIFF, WAVE, AU, MP3), generated in real-time [...], manipulated (raw or via built-in filters), saved (AIFF, WAVE), analyzed (FFT) or simply played back."
- Sonia: "The Sonia Library provides advanced audio capabilities such as multiple sample playback, realtime sound synthesis, realtime FFT (frequency) analysis of the microphone input, and writing .wav files from samples."
- Minim: "Minim is an audio library [...] to provide an easy to use audio library for people developing in the Processing environment. The philosophy behind the API is to make integrating audio into your sketches as simple as possible while still providing a reasonable amount of flexibility for more advanced users."
Minim
Zunächst muss diese Bibliothek natürlich importiert werden. Dann müssen die Soundfunktionalitäten als Erstes überhaupt gestartet werden.
Hierzu muss die Anweisung Minim.start(this);
aufgerufen werden.
AudioPlayer: Track abspielen
Um einen Track abspielen zu lassen, muss erst eine Sounddatei geladen werden. Diese Datei sollte – wie immer – im data-Ordner
innerhalb des Sketches liegen. Dann kann diese Datei mit Minim.loadFile()
geladen werden. Gespeichert werden kann der Track
dann in einer Variable vom Datentyp AudioPlayer
.
Im Beispiel wird das Musikstück sofort nach dem Laden mit Hilfe von audioPlayer.play();
gestartet. Beim Beenden des Programms
wird der AudioPlayer geschlossen und damit das Abspielen beendet.
Samples verwenden
Die einzelnen Amplituden können nun verwendet werden, z.B. um sie anzuzeigen. Dazu kann auf den Mono-Kanal via
song.mix.get(i)
zugegriffen werden. Achtung: Die Werte sind normalisiert, reichen also von -1 bis +1.
AudioInput: Mikrophon oder LineIn verwenden
Wenn man nun Geräusche und Töne aufnehmen oder anzeigen möchte, kann dies mit Hilfe von AudioInput
realisiert werden.