[an error occurred while processing this directive]
nmz-archiv
nmz 2003/06 | Seite 13
52. Jahrgang | Juni
Internet/Computer
Sich dem Goldenen Schnitt annähern
Die grafische Programmiersprache Max/MSP, Teil 2
Im ersten Teil dieser Serie (nmz
5/2003) habe ich Max/MSP dem weit verbreiteten Paradigma der
„klassischen“ Programmiersprachen gegenübergestellt.
Es zeigte sich, dass der Übergang zwischen der Herstellung
eines Programmes und seiner Ausführung bei Max/MSP denkbar
klein ist.
Das Prinzip autarker Funktionseinheiten, Objekte genannt, die bei
Bedarf durch Nachrichten miteinander kommunizieren, ermöglicht
es, Programme zu ändern, während sie schon laufen. Das
ist in der traditionellen Software-Architektur in diesem grundsätzlichen
Umfang nicht vorgesehen. Zum anderen wurde deutlich, dass grafische
Darstellungen im Allgemeinen dem Computer-Anwender oft den Zugang
erleichtern, indem durch bekannte Metaphern aus der realen Welt
hilfreiche Brücken zu immateriellen Domänen gebaut werden
können. Im Fall von Max/MSP lassen sich die Daten, die vom
Programm generiert werden, mit überraschendem Erfolg als Dinge
mit durchaus gegenständlichen Eigenschaften missverstehen,
die durch Funktionen, die in den Kästchen versteckt sind, modifiziert
werden können. Diese Datendinge fahren miteinander durch Kabel
von einem angeschlossenen Objekt zum nächsten, um dort weiter
gesiebt, gesägt oder geschreddert zu werden. Am Schluss kommen
sie dann heraus und machen einen Ton.
Code
Wie leicht die Lösung einer Entwicklungsaufgabe mit Max/MSP
von der Hand gehen kann, wird im hier abgebildeten Beispiel-Patch
gezeigt. Es soll die Fibonacci-Reihe berechnet werden. Bei dieser
Zahlenreihe wird, beginnend mit den Initialelementen „0“
und „1“, jede Zahl aus der Summe der beiden vorangehenden
Zahlen gebildet : 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144…
Das Besondere an dieser Reihe ist, dass sich die Verhältnisse
von aufeinander folgenden Zahlenpaaren zunehmend dem Goldenen Schnitt
annähern: 8 : 5 = 1,6; 13 : 8 = 1,625; 21 : 13 = 1,615; 34
: 21 = 1,619. Anders ausgedrückt verhält sich ein Element
der Reihe (etwa 13) zu seinem nächstkleineren Nachbarn (8)
wie die Summe der beiden (21) zum größeren Element (13).
Programm zur Berechnung
und Ausgabe der Fibonacci-Reihe
Da jede Zahl der Fibonacci-Reihe aus der Summe ihrer beiden Vorgänger
gebildet wird, lässt sich die Berechnung als rekursive Schleife
anlegen. Das Ergebnis eines Durchlaufs wird in der folgenden Berechnung
als Ausgangswert eingesetzt. Weiterhin benötigen wir das erste
Initialelement, „0“, eine Additions-Einheit mit dem
zweiten Initialelement als Argument „1“, [+ 1], eine
Bedingung, bei deren Erreichen der Prozess beendet wird, [> 1000]
mit [gate], sowie eine Ausgabe zur grafischen Anzeige jedes Zyklusergebnisses.
Verfolgen wir den Ablauf des Programms Schritt für Schritt.
Nach dem Anklicken des Startwerts „0“ wird dieser über
den Nachrichtenverteiler [t i i i] an zwei weitere Objekte geschickt.
Da in Max/MSP (fast) alle Nachrichten von rechts nach links abgearbeitet
werden, wird der Wert zunächst an das Objekt [> 1000] übermittelt.
Die Prüfung ergibt, dass „0“ nicht größer
„1000“ ist, und der Wert „0“ für „falsch“
wird von [> 1000] an das nachfolgende Objekt [!- 1] übergeben.
Hier wird der Wert invertiert und demzufolge eine „1“
an den linken Eingang von [gate] weitergereicht. Das [gate] ist
nun geöffnet und reicht Nachrichten, die an seinem rechten
Eingang eingehen, an seinen Ausgang durch. Da dieser Strang des
Nachrichtenverteilers [t i i i] abgearbeitet ist, ist dessen mittlerer
Ausgang an der Reihe. Der dort an den linken Eingang von [+ 1] ausgegebene
Initialwert „0“ löst dessen Addition um den Wert
des Arguments „1“ aus. Das Ergebnis „1“
geht an [gate] und wird dort durchgereicht, da [gate], wie zuvor
beschrieben, geöffnet wurde. Von dort geht die „1“
über ein Hilfsobjekt [prepend] an das grafische Anzeigefeld
unten rechts. Dieses ist beim Programmstart zu-nächst noch
leer und enthält nun als Ergebnis des Durchlaufs das erste
Element der Fibonacci-Reihe, „1“. Außerdem geht
das Ergebnis „1“ an das Hilfsobjekt [pipe], das die
Nachricht speichert und um einige Mikrosekunden zurückhält,
bis der aktuelle Zyklus beendet ist.
Da der mittlere Strang des Nachrichtenverteilers [t i i i] nun
ebenfalls abgearbeitet ist, wird sein linker Ausgang aktiv. Der
Initialwert „0“ wird abschließend an den rechten
Eingang des Objekts [+ 1] geschickt und überschreibt dort als
Argument für die Addition im nächsten Zyklus das Initialargument
„1“. Nun kann [pipe] das zurückgehaltene Ergebnis
an den Nachrichtenverteiler [t i i i] schicken, und der Ablauf beginnt
von vorn: Prüfung, ob die Endbedingung „größer
1000“ bereits erreicht wurde, Addition mit dem vorangegangenen
Reihenelement, Hinzufügen zur grafischen Ausgabe, Speicherung
des Ergebnisses als Argument für die nächste Addition.
Bei Erreichen der Abbruchbedingung [> 1000] wird [gate] für
den Durchlass weiterer Nachrichten gesperrt, die Programm-Schleife
stoppt.
Media
Was hier für arithmetische Aufgaben innerhalb der Max-Bibliothek
vorgestellt wurde, lässt sich durch die Erweiterungs-Bibliotheken
MSP und Jitter in sehr ähnlicher Weise auf die Lösung
von Aufgaben aus dem Audio- und Videobereich übertragen. Erst
in der Kombination dieser drei Säulen entfaltet die Entwicklungsumgebung
ihre volle Stärke, gerade im angewandten und gestalterischen
Bereich.
So einfach und flexibel Max/MSP zu handhaben ist, so leicht zu
unterschätzen sind die Nachteile, die sich der Anwender mit
dieser Sprache einhandeln kann. Einerseits kommt der hohe Bedienkomfort
nicht umsonst, sondern geht auf Kosten der Effizienz eines Programms.
Andererseits neigen große Projekte in Max/MSP leicht dazu,
unübersichtlich und in der Folge unzuverlässig zu werden,
da in anderen Sprachen vorhandene wirkungsvolle Werkzeuge und Methoden
zur Strukturierung komplexer Programmkonstrukte fehlen. Trotz dieser
Einschränkungen kann Max/MSP als hervorragendes Instrument
zur Erstellung von Prototypen sowie Programmen geringen bis mittleren
Umfangs in einer Geschwindigkeit dienen, die mit konventionellen
Entwicklungsinstrumenten wenn überhaupt, dann nur unter extremen
Bedingungen erreicht werden könnte.