Im ersten Teil dieser Serie () 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.
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).
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.
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.
Link zu Pd, einer Max ähnlichen Sprache in der public domain
http://www-crca.ucsd.edu/~msp/Pd_documentation/index.htmBeispiel des Programmes, das im Text erwähnt wird als ausführbares Programm, welches unter Mac OS9 läuft.