Creative Coding

btk

Till Nagel

Extern 1 - Woche 10

Aufgaben

Abschlussprojekt: Zustand der BTK

Entwerft und gestaltet ein dynamisches System, welches Besuchern erlaubt, den aktuellen Zustand der BTK zu erkennen.

Im Handout Abschlussprojekt WS 08/09 (PDF) findet ihr weitere wichtige Hinweise und Informationen.

Teamwork ist ein essentieller Bestandteil. Das Abschlussprojekt wird in Teams von drei Personen entwickelt. Bis zum 09.01.2009 muss sich jede Gruppe per E-Mail an uns identifiziert haben. Alle anderen werden wir zufällig in Gruppen ordnen.

Besprechung Recherche 09.01.2009
Zwischenpräsentation 16.01.
Projektarbeit 23.01. – 05.02.
Endpräsentation & Abgabe 16.02.

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!

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.


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.

Bibliotheken im Sketch-Folder

Wenn die Bibliotheken (oder wenn man keine Rechte hat, den Processing-Programm Ordner zu verändern) kann man externe Bibliotheken auch direkt im Sketch-Ordner speichern.

  1. In den Sketch-Ordner gehen (Menü: Sketch > Show Sketch Folder)
  2. Neuen Ordner "code" anlegen
  3. Die Bibliotheks Dateien hier rein kopieren (z.B. die JAR Dateien)
  4. In Processing verwenden

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

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.

Creative Commons Lizenz: Namensnennung-NichtKommerziell-Weitergabe unter gleichen Bedingungen 2.0 (Deutschland)

© 2008 Till Nagel, All rights reserved – Alle Rechte vorbehalten.