Der Funktionsumfang von Processing kann durch eine Reihe verschiedener Bibliotheken (engl.: libraries) erweitert werden. Eine Bibliothek ist eine Sammlung von Funktionen oder Klassen, die eine Programmiersprache um weitere Befehle erweitert.
Bei Python spricht man von Modulen statt von Bibliotheken, das Prinzip ist aber dasselbe. Das Einbinden von Python-Modulen werden wir noch an anderer Stelle besprechen.
Am Beispiel der minim-Bibliothek wollen wir herausfinden, wie man eine Bibliothek in Processing einbindet und wie man mit ihr programmiert. Sie ist eine umfangreiche und altbewährte Sammlung von Klassen und Methoden zur Klangerzeugung und -manipulation.
Damit die Funktionen der Bibliothek in unserem Sketch bekannt sind und verwendet werden können, muss die Bibliothek zunächst importiert werden. Das bedeutet, dass wir eine Zeile Code schreiben müssen, die die Datei mit den Klassen- und Funktionsdefinitionen unserem Sketch hinzufügt. Einige Bibliotheken werden schon mit Processing ausgeliefert (DXF Export, Networt etc.) und können direkt über das Kontextmenü (s. Abbildung) importiert werden, weitere sind aus der IDE heraus herunterzuladen. Die folgende Abbildung zeigt, dass die minim-Bibliothek noch nicht in Processing bekannt ist. Wir laden sie also herunter:
Die Eingabe von minim in das Filtereingabefeld oben links zeigt die gewünschte Bibliothek an:
Mit der Schaltfläche Install wird die Bibliothek heruntergeladen und in der IDE installiert. Dieser Vorgang muss für weitere Sketches nicht wiederholt werden. Es kann sein, dass einige Bibliotheken, die im Java-Mode von Processing funktionieren, nicht mit dem Python-Mode kompatibel sind.
Anschließend kann über Sketch->Library importieren die Bibliothek minim ausgewählt werden. Die folgende Abbildung zeigt die entsprechende Codezeile:
Wenn wir nun unseren Sketch laufen lassen, wird der Code in der externen Bibliothek durch den Compiler in unser Programm einbezogen.
Zu jeder Bibliothek gehört eine Referenz, die dokumentiert, wie sie zu installieren ist und welche Schnittstelle sie bietet. Im Englischen spricht man auch von Application Programming Interface (API). Hiermit sind alle Funktionen gemeint, die die Bibliothek zum Programmieren zur Verfügung stellt. Die minim-Referenz ist nicht über die Website von Processing, jedoch leicht über eine Suchmaschine zu finden.
Nahezu alle Referenzen von Bibliotheken enthalten Beispiele in der Java-Syntax, sodass für die Anwendung im Python-Mode die entsprechende Anpassung vorgenommen werden muss.
Durch das Hinzufügen von Bibliotheken aus dem Netz wird auch die Liste der Beispiele in der Processing-IDE erweitert (Datei -> Beispiele) - allerdings auch nur in Java-Syntax.
Bevor wir eine Sounddatei in unserem Sketch abspielen können, muss diese dem data
-Ordner hinzugefügt werden. Das kann über den Dateimanager unseres Betriebssystems geschehen oder einfach über Sketch -> Datei hinzufügen.
Nun können wir den Code schreiben, der unsere Datei zum Klingen bringt.
# minim-Bibliothek laden
add_library('minim')
def setup():
# Ein minim-Objekt erzeugen.
minim = Minim(this)
# Sounddatei laden und einer Variablen zuweisen
song = minim.loadSample("song.mp3")
Nichts zu hören? Das liegt daran, dass die mimim-Klasse Methoden bereithält, die das Abspielen von Klängen genau steuern können. Um unseren Song abspielen zu können, reicht eine weitere Zeile:
song.trigger()
Der Song wird jetzt bis zum Ende gespielt, es sei denn, das Programm wird vorher gestoppt.
minim kann die folgenden Dateiformate abspielen:
Erik Bartmann weist in seinem hervorragenden Processing-Buch darauf hin, dass man einen Sketch um die Funktion stop()
ergänzen sollte. Sie wird aufgerufen, wenn der Sketch beendet wird und gibt Speicherresourcen frei, die minim in Anspruch nimmt (Bartmann, 2010).
def stop():
# Ausführung von Minim in diesem Sketch stoppen
minim.stop()
# Ausführung der übergeordneten Klasse stoppen
super.stop()
Zum Abschluss dieses Beispiels noch einmal der komplette Code:
# minim-Bibliothek laden
add_library('minim')
def setup():
# Ein minim-Objekt erzeugen.
minim = Minim(this)
# Sounddatei laden und einer Variablen zuweisen
song = minim.loadSample('song.mp3')
song.trigger()
def draw():
pass
def stop():
# Ausführung von Minim in diesem Sketch stoppen
minim.stop()
# Ausführung von Minim in der übergeordneten Klasse stoppen
super.stop()
Neben der Klasse AudioSample
, die wir im vorangegangenen Beispiel verwendet haben, bietet minim noch die Klassen AudioPlayer
und AudioOutput
. AudioPlayer
ist mithilfe der Referenz nahezu selbsterklärend. Zu AudioOutput
wollen wir uns noch ein kleines Beispiel ansehen.
Wir wollen durch die Mausbewegung eine Sinus-Wellenform verändern und damit einen Retro-Videospielesound erzeugen:
add_library('minim')
def setup():
global sinus
size(400,200)
frequenz = 0
amplitude = 1.0
minim = Minim(this)
# Audioausgang freischalten
output = minim.getLineOut(minim.STEREO)
# Oszillator für Sinus-Wellenform erzeugen
sinus = SineWave(frequenz, amplitude, output.sampleRate())
# Dem Ausgang das Sinus-Signal hinzufügen
output.addSignal(sinus)
def draw():
# Übertragen der Mausbewegung auf der x-Achse in einen anderen Wertebereich
frequenz = map(mouseX, 0, width*2, 20, 1000)
# Frequenz entsprechend anpassen
sinus.setFreq(frequenz)
def stop():
minim.stop()
super.stop()