Wenn Sie oberhalb kein Werkzeugverzeichnis sehen, dann klicken Sie bitte hier:   Wenn Sie auch andere Themen sehen wollen hier: . Natürlich würde ich mich auch über eine Eintragung ins Gästebuch freuen

Grau geschriebener Text bezeichnet Information, die zwar auch interessant, aber für die meisten Leser unwesentlich ist.

1. Einleitung

Max ist eine graphische Programmierumgebung zur Echtzeitkontrolle von MIDI-Geräten, ist aber davon abgesehen auch für die allgemeine Manipulation von Zeichen und Zahlen verwendbar. Dabei wird der Datenfluss von einem zum nächsten Objekt über Leitungen (Patch cordes) dargestellt. Das Programm entstand 1986 am IRCAM in Paris und war für für lange Zeit nur auf der Apple Macintosh-Plattform verfügbar (Download). Seit 8/2003 ist auch eine Windows-Version erhältlich. (Download). Da es in C geschrieben ist, ist es für dieser Sprache Kundige ein Leichtes, selbst weitere Objekte zu entwickeln.

Der Programmname Max wurde zu Ehren von Max Matthews, dem Urvater der Computermusik gewählt, den ich selbst an der Stanford University kennen lernen konnte. Max Matthews war aber entgegen anders lautenden Behauptungen nicht der Urheber dieses Programms.

Später kam als Ergänzung MSP(Max Signal Processing) dazu, das die Möglichkeit erschloss neben der Mididaten-Handhabung durch Max auch Digitalsignale zu verwenden. Man kann mit Hilfe von MSP Sound synthetisieren und diesen, oder auch durch Mikrofon eingespeisten Ton, in Echtzeit weiter verarbeiten. Seit 2002 gibt es eine weitere Erweiterung für Live-Videobearbeitung und 3D-Grafik mit der Bezeichnung Jitter, über die aber an dieser Stelle nichts berichtet wird, weil wir uns hier nur mit Ton und 2-D Grafik beschäftigen wollen. (nato 0+55, eine Serie von Externals für Max zur Kontrolle von Realtime Video, war quasi ein Vorläufer von jitter, wurde jedoch nur von 1999-2001 entwickelt ).

Max/MSP gehört zu den sogenannten 4th-generation-languages (4GLs), die es dem Programmierenden eher erlauben sich auf die Struktur des Programmes zu konzentrieren, als darauf, wie sie es dem Computer begreiflich machen sollen. Die Programmierung ist modular, was so viel bedeutet wie die Möglichkeit Objekte zu erzeugen, die, in sinnvoller Weise zusammengruppiert, wieder ein Objekt ergeben können, wobei auch diese wieder in größere Einheiten zusammengefasst werden können usw.

Inzwischen (5/2009) hat die letzte Version von Max/MSP die Nummer 5.0.7. Die Version 5 hat zahlreiche nützliche Verbesserungen gebracht sowie auch ein paar neue Objekte.Diese lecture notes bezogen sich ursprünglich auf Version 4.3, enthalten aber damit noch immer 90% der wesentlichen Inhalte des Programms. Um auch auf Besitzer von Version 5 Bezug zu nehmen, sind die Aspekte, die in der neuen Version anders sind mit dem Symbol Max5gif gekennzeichnet.

Warnung Im Verlauf dieser lecture notes sind zahlreiche runterladbare Beispieldateien angegeben. Wenn Sie ein .sit-File downloaden und öffnen und es anschließend nicht sehen, oder wenn Sie MAX mit mehreren Monitoren betreiben beachten Sie, dass ein Fenster (insbes. das für den Output wichtige Max-Fenster) seine Koordinaten beibehält, auch wenn nur mehr ein einziger Monitor angeschlossen ist. Das heißt das Fenster ist, hat man es vorher auf einen Zweitmonitor gezogen, nicht mehr sichtbar. Um es wieder auf den Hauptmonitor zu bringen, muss man es beim Öffnen im Window-Menü alt-klicken! (Ein Verstellen der Monitorauflösung bringt keine solchen Probleme).

Das Programm bietet mehrere Fenster. Das wichtigste ist das "Patcher Window", das den graphischen Programmcode enthält. Man ruft es auf mit New>Patcher und erhält dabei ein Fenster, in dem am oberen Rand alle verfügbaren Werkzeuge zur Verfügung gestellt werden. Am unteren Rand sieht man bei Rollover über ein Objekt dessen Bezeichnung. Die Bezeichnung Patcher leitet sich aus der Zeit der Analogcomputer her, bei denen Schaltelemente mit steckbaren Kabeln zu sogenannten Patches verbunden wurden.

In diesem ersten Zustand, nämlich der Authoring-Umgebung des Patcher-Fensters, kann man durch anwählen eines Werkzeugs und platzieren im Fenster, sowie durch das Verbinden von Inlets und Outlets ein Programm erstellen. Max bezeichnet das Fenster in diesem Zustand als "unlocked". Um das Programm laufen zu lassen, wird das Fenster durch einen Befehl-Klick auf die Fensterfläche (nicht auf ein Objekt) von der Autorenumgebung in die Runtime-Umgebung umgeschaltet (geht auch mit den GetInfo-Fenstern). Das Gleiche erreicht man unter dem MacOS außerdem, wenn man auf den Button am rechten oberen Rand des Arbeitsfensters klickt. Max bezeichnet es dann als "locked". Zurückgeschaltet wird ebenso wieder mit Befehl-Klick. Man kann aber ein Programm auch in der Authoring-Umgebung laufen lassen, wenn man auf ein Objekt, z. B. einen Button, cmd-klickt.

In Version sieht das Fenster folgendermaßen aus:

Dabei wird das lock/unlock über das Vorhängeschloss im linken unteren Eck vorgenommen. Das Pluszeichen öffnet die Objektpalette, die nun statt der Leiste erscheint:

und mit dem Kreuz besteht die Möglichkeit in das Patcherfenster hinein zu zoomen.

Ein weiteres wichtiges Fenster ist das Max-Fenster. In ihm zeigt der Computer seinen Output. Sowohl messages aus dem System (z.B. Fehlermeldungen) als auch User-generierter Output (z.B. aus einem print-Objekt). Das Fenster des Floating Inspectors wiederum gibt spezifische Parametrisierungsmöglichkeiten für ein angewähltes Objekt, sofern solche in ihm inplementiert sind, z.B. bei der number box

Man kann prinzipiell Programmelemente und -strukturen mit cmd-D kopieren. Es kann aber durchaus vorkommen, dass sie dann nicht mehr richtig funktionieren (z. B. so geschehen mit . Das Objekt hatte sein Argument verloren und 0 statt 1000 angenommen. Auch einfaches neu schreiben des Parameters 1000 reichte nicht aus, sondern es musste der gesamte Text in der Objektbox erneuert werden.).

Der ursprüngliche Entwickler von Max, Miller Puckette, unterhält seit 1996 ein open-source cross-platform Programm mit der Bezeichnung PD (pure Data). Ein Community-Zentrum befindet sich am IEM (Institut für Elektronische Musik) in Graz . Das Programm kann im Wesentlichen alles was Max kann, ist aber im Handling etwas weniger elegant und benutzerfreundlich.

Der Speicherort, an dem Max bevorzugt nach Files suchen soll, wird in Options>File Preferences eingestellt. Wichtig z. B. bei read-messages.

1.1 Cross-Platform Development

Beim Übertragen eines Patchers - egal ob im Mailverkehr oder auf eine andere Plattform muss man sich der Textform bedienen. D.h. man sichert den zu übertragenden Patcher unter File>Save as... mit der Option Max text file. Die so erhaltene .mtx-Textdatei kann man nun als Mailanhang verschicken oder auf einen anderen Computer, auch mit einem anderen Betriebssystem kopieren. Ein .mtx-File kann wieder mit dem Öffnen... Dialog in Max geöffnet werden. Ab Version 4.5.5 kann man auch den Text direkt aus der Zwischenablage in ein offenes Patcherfenster einsetzen, wenn man die Datei vorher in einem Textverarbeitungsprogramm geöffnet und den Text in die Zwischenablage kopiert hat.

Dort öffnet man die Datei in einem Textverarbeitungsprogramm, kopiert die komplette Liste in den Zwischenspeicher und fügt sie in eine neue, zunächst leere Patcherdatei ein. Es erscheint dann sofort die gewohnte Darstellung in dem Patcherfenster.

Zumindest unter MacOS 10.4.11 kann man allerdings keine .mtx-Datei (Max Patch als Textfile), die unter Max 4.3.2 am Mac erzeugt wurde, in ein leeres Patcherfenster in einem MacOS 10.4.11 einfügen. Mit unter Max 4.6.3 erzeugten Patches gibt es keine Probleme beim Einfügen der als Text gesicherten Datei, weder in einen leeren Patch von 4.6.3, noch in einen von 4.3.2. In diesem Zusammenhang gibt es in der Version 4.6.3 auch die Option File>New from Clipboard, die es erlaubt, das in der Zwischenablage befindliche Textfile direkt in einem neuen Patcherfenster zu öffnen.

2. Die Programmelemente

Am Kopf dieser Seite findet man die Werkzeugleiste der sogenannten Interface Objects. Durch anklicken der einzelnen Werkzeuge auf dieser Webseite kommt man zu einem Link mit einer näheren Beschreibung. Dabei zeichnet sich das erste Werkzeug (New Object) dadurch aus, dass es selbst wieder eine große Vielzahl von möglichen Funktionsformen, den sogenannten User Objects annehmen kann, die angezeigt werden, wenn man das leere New object in der Autorenumgebung alt-klickt. Die übrigen Interface Objects sind "eindimensional", das heißt sie ermöglichen im Wesentlichen nur eine bestimmte Funktion. Aber auch hierbei gibt es unterschiedliche Parameter für diese Funktion, die man durch Aufrufen der zugehörigen Hilfefunktion abfragen kann. Diese Hilfe erhält man, wenn man in der Autorenumgebung das Objekt alt-klickt. - An diesem Punkt wäre es sinnvoll, kurz mit einigen der ersten (etwa 8) Objekte zu experimentieren um eine ungefähre Idee der Funktionsweise von Objekten zu bekommen.

Bei vielen Objekten gibt es auch eine Info-Funktion (Object>Get Info…  oder cmd-I). Man erhält dabei die Möglichkeit, das Objekt in verschiedene Darstellungs- und mitunter auch -funktionsarten zu konfigurieren. Für die vielen Spielarten des New Object-Objekts befindet sich eine Beschreibung in der Max43Reference.pdf-Datei, resp. erhält man die Info durch alt-klick.

Beachte, dass manche der angewählten Optionen erst im Runtime-Modus angezeigt werden, etwa die Textfarbe eines Comment Objekts.

Setzt man ein Objekt in das Patcherfenster, so erhält man dabei auch am linken unteren Rand des Fensters eine Kurzbeschreibung des Objekts.

in Version gibt es für die Eigenschaft ein eigenes inspector-Fenster. Z.B. für Zahlenboxen:

Der Programmablauf ist dergestalt, das einzelne Objekte, repräsentiert durch Boxen über Patch Cords ihre Messages schicken. Eine Message wird über eine Message-Box an ein Objekt und von dort nach Bedarf weiter geschickt. Eine Message kann eine Zahl sein, eine Liste von Zahlen, die durch Zwischenräume getrennt sind, ein Wort - von Max als symbol bezeichnet- oder jedwede Kombination von Zahlen und Symbolen. Der Inhalt einer Message bestimmt ihren Typ. Alle diejenigen Messages, die ein Objekt versteht, erhält man am Mac durch ctrl-alt Klick auf das Objekt, unter Windows mit alt-rechte Maustaste in der Autorenumgebung.

Neben den im Programm mitgelieferten Objekten findet man unter www.cycling74.com/community/ eine Sammlung von zum Teil kommerziellen Objekten, die vielfältige Operationen ausführen - von der Erzeugung von Zufallszahlen bis zur Erkennung von Video Gesten.

Die Präferenzen in der Pfadsuche lassen sich - wenn etwas anderes als der Default gewünscht wird - über Options>File Preferences oder mit angeben. Siehe auch das conformpath object.

2.1 Das Options-Menü

Diese Menü enthält ein paar interessante Grundeinstellungen: All Windows active sollte nicht gecheckt sein. Das bedeutet, dass wenn man einen Wert in einem Patcher Fenster verändert dieses auch in den Vordergrund kommen muss. Autofix width würde ich ebenfalls nicht checken, da sich sonst ein bereits in der Größe fertig gestyltes Objekt beim Ändern eines seiner Parameter wieder vergrößern oder verkleinern und damit das Design kaputt machen kann. Auch segmented patch cords sind meist erst in der Endausfertigung eines Patchers interessant.

2.2 Erstellen einer Applikation

Mit Max kann man stand-alone Programme erstellen, indem man File>Build Collective/Application aufruft.

3.Eine Aktion auslösen

Zum Thema Menüs siehe später.

3.1 Bang & Co.

Das Button-Objekt hat einen Inlet und einen Outlet bang. Unabhängig davon was man in den Inlet hinein schickt leuchtet es kurz gelb auf und sendet einen sogenannten Bang aus, mit dem eine Aktion in denjenigen Objekten ausgelöst werden kann, die einen Bang empfangen können. Auch das direkte Klicken des Objekts schickt einen Bang.

Das Objekt schickt beim Laden des Patchers (oder zum Testen des Patchers auch bei Doppelklick) einen Bang.

Aber auch viele andere Objekte lösen eine Aktion aus, wenn man sie anklickt. Da gibt es z. B. das Toggle-Objekt , das beim Anklicken abwechselnd 0 und 1 aussendet, also ein Ein/Ausschalter ist. Auch die led funktioniert ganz ähnlich

Will man aus einem Bang mehrere machen, so gibt es das bangbang-Objekt

will man hingegen nur ein einziges Mal einen Bang auslösen, auch wenn immer wieder Bangs ankommen (Einmal-Schalter), so verwendet man .

Ein ubutton ist ein unsichtbarer Button, der über eine Grafik gelegt werden kann. (d/l ubuttonhint.sit)

Mit Hilfe der stay-on-value im Get Info kann man bewirken, dass er sein hilite bei Erhalt eines bestimmten Wertes behält. siehe ubutton-help und dort even more.

das trigger object schickt einen Input an beliebig viele Outlets in der üblichen Reihenfolge (siehe trigger-help)

3.2 Timing

Soll eine Auslösung öfter in regelmäßigen Abständen stattfinden, so bedient man sich des Metro-Objekts . Sein Parameter wird im rechten Inlet gesetzt und gibt an, alle wieviele msek ein Bang gesendet werden soll.

Will man ein Metronom, das zusätzlich noch die msek aufaddiert, so verwendet man den clocker. (im folgenden Beispiel wird je 1/3sek ein Bang geschickt und in der number box aufaddiert.

Ein Beispiel für die Verwendung von clocker als Zeitschalter findet man hier: d/l clockerIfBeispiel.sit

Das delay-Objekt verzögert ein Bang um die Anzahl von msek, die als Argument angegeben sind. Dieses kann auch im rechten Inlet als Interger oder Floating gesetzt werden. (siehe Beispiel Lauflicht).

Will man Zahleneingaben verzögert weitergeben, so verwendet man . Es hat n-1 outlets, wenn es n Inlets hat. Das rechteste Inlet gibt die Verzögerungszeit an, das linkeste löst die Weitersendung aus. Die Anzahl der Inlets wird durch die Parameter von pipe gegeben, der Zahlentyp ebenfalls (Integer und Floating sind möglich - auch gemischt). Dabei merkt sich pipe die eingegangenen interger oder floating Werte und gibt sie nach einer gesetzten Verzögerungszeit wieder so ab, dass die Verzögerung zwischen triggern des linkesten Inlets und Wiedergabe der anderen Inlets dem Wert des rechtesten Outlets, oder des letzten Parameters in pipe entspricht. Beachte bei der Ausgabe der Werte die rechts vor links-Regel. (d/l pipeBeispiel.sit).

Um mehrere Eingänge zu synchronisieren verwendet man buddy. Es sendet alle seine Eingänge (die Zahl der Inlets wird als Parameter eingetragen, default sind 2) dann, wenn der letzte Inlet seinen Wert erhalten hat, egal in welcher Reihenfolge man die Werte sendet. Es muss auch nicht der linkeste Inlet als letztes gesetzt werden. (d/l buddyBeispiel.sit).

Im Gegensatz dazu sendet bondo alles, wenn irgeneiner seiner Inlets gebangt wird (siehe auch bondo-help)

3.3 Tastatur

Oft ist es nützlich abzufragen ob eine Taste der Computertastatur angeschlagen wurde. Dazu verwendet man das Objekt (siehe auch 7.1 key) Im linken Outlet kommen die dezimalen ASCII-Werte der Taste der Taste heraus, im mittleren der key code Wert - den ich aber eher verweiden würde, weil er nicht einheitlich ist - und im rechten ein Offsetwert falls ein modifier key gedrückt wurde (alt, shift, ctrl und dergl. Siehe key-help). Ein angehängtes -Objekt hilft eine bestimmte Taste heraus zu filtern.

4. Einfache Mathematik

Die number box lässt sich in GetInfo gestalten, weitere Möglichkeiten ergeben sich aus dem Font-Menü. Die Anzahl der angezeigten Nachkommastellen ergibt sich aus der Breite der Box.

4.1 Zahlentypen

An "Zahlentypen" gibt es Ganzzahlen und Fließkommazahlen, repräsentiert durch und Wenn man im Runtime-Modus auf so ein Objekt klickt (das Dreieck wird gelb), kann man durch Tippen von Zahlen einen Wert eingeben, oder den Zahlenwert durch Klick-and-drag und auf oder abwärts ziehen verändern. Eine weitere Möglichkeit besteht darin, den Wert aus einer message box in den Inlet einer number box zu leiten. Die Anzahl der maximal möglichen Nachkommastellen ist sechs.

Beim Integerobjekt gibt es aber noch eine andere bemerkenswerte Eigenschaft: Ruft man seine Info auf (mit cmd-I), so gibt es unter Display Style auch die Möglichkeit Midi-Werte oder Notennamen zu wählen.

Außer Zahlen gibt es noch Zeichen und Zeichenfolgen, die in Max als symbols bezeichnet werden. Bei Zeichenfolgen mit Zwischenraum (z.B. Max und Moritz) ist zu beachten, dass als Zwischenraum der geschützte Zwischenraum verwendet wird - erzeugt mit alt-blank.

4.2 Operationen

Mathematische Operationen werden durch verschiedene Spielarten des New Object ausgeführt.

dabei gibt es neben den Grundrechnungsarten (+ - * /) auch Vergleichsoperationen (>, <, >=, <=, ==, != letzteres ist NOT equal). Zum Potenzieren gibt es das pow object

Der Variablentyp bei den Grundrechnungsarten ist im Normalfall integer. Will man floating point haben, so muss man ein entsprechendes Dummy-Argument in das Objekt setzen:

Auch logische Operationen sind möglich:

(d/l logical.sit)

Dieses Beispiel zeigt die Verwendung von logical AND:

(d/l ANDBeispiel.sit)

Will man Symbole (Buchstaben) aneinander reihen, so benutzt man in Max nicht, wie man es von eingen Programmiersprachen gewohnt ist das Zeichen & (da dieses so wie in der Sprache C hier ein bitwise-AND bedeutet) sondern append   (siehe append-help).

Das Objekt erlaubt es, zusammengesetzte mathematische Operationen einzugeben. Dazu folgende zwei Beispiele:

Addieren einer Zahl zu einem Produkt zweier Zahlen
Umwandeln einer Midi-Note in Schwingungsfrequenz in Hertz
Die Beispiele hier sind natürlich nicht funktionell, da es sich nur um Bilder handelt.
Zum Ausprobieren muss man sie in Max/Msp nachbauen.

Die Inlets können Integers sein ($i1 bis $i9), Floats ($f1 bis $f9) oder Symbols ($s1 bis $s9) und/oder konstanten desselben Typs. (Um einen Beistrich als symbol einzugeben muss man einen verkehrten Schrägstrich [MacOS: alt-sh 7] davor setzen).

Wichtig im musikalischen Zusammenhang ist die Modulofunktion (%) da sich mit ihr zum Beispiel auch herauslesen lässt um welche Note es sich handelt, unabhängig von der Oktave.

Grundregeln der Verarbeitungsreihenfolge

1) RIGHT TO LEFT

Es wird von rechts nach links abgearbeitet. Deshalb löst auch die letzte Message den Abarbeitungsbefehl (z.B. Output) aus.

Eine message box mit mehreren Argumenten wird aber normal von links nach rechts abgearbeitet.

Sind Objekte genau untereinander angeordnet, so gilt

2) BOTTOM TO TOP

3) Die Message läuft weiter

Triggert eine Message ein Objekt, so sendet dieses Objekt wiederum seine Message bevor irgendetwas anderes geschieht.

4.3 I/O

Manche Objekte eignen sich sowohl für Ein- als auch für Ausgabe. Da gibt es zum Beispiel die Gruppe der Slider:

Slider
hslider horizontaler Slider, dessen Größe so wie bei dem comment Objekt verändert werden kann. Bereichsweite, Offset und Skalierungsfaktor sind über GetInfo wählbar.
uslider vertikaler Slider, dessen Größe so wie bei dem comment Objekt verändert werden kann. Bereichsweite, Offset und Skalierungsfaktor sind über GetInfo wählbar. Der Bereich kann mittels der size-Angabe verändert werden.
kslider keyboard slider. Es gibt ihn in 2 Größen, die so wie range und offset in GetInfo wählbar sind. Man kann ferner zwischen monophonem und polyphonem Modus wählen, wobei im polyphonen Modus kein polyphoner Input möglich ist - nur Output
slider Veraltete Form. Verarbeitet Ganzzahlen. Bereichsweite, Offset und Skalierungsfaktor sind über GetInfo wählbar. Leider ist die Slidergröße immer proportional der Bereichsweite

Eine andere Form ist das dial Objekt, das analog einem Slider funktioniert

es gibt auch einen zweidimensionalen pictslider. Links die Eingabe für die horizontale Komponente, rechts die für die vertikale

4.3.1 Output

Output erscheint mittels eines im Max-Fenster (Nicht im Patcher-Fenster!). Im Print Objekt kann ein Argument gesetzt sein oder auch nicht. Je nachdem sieht der Output unterschiedlich aus:

(Beachte, dass die Zwischenräume beim zweiten Beispiel geschützte Blanks (alt-blank) sein müssen, sonst wird nur das 1. Wort wiedergegeben.)

Eine Art des optischen Outputs im Sinne einer Statusanzeige bieten button , toggle , und led .

4.3.2 Input

Neben den oben angeführten Eingabemethoden, die zugleich auch Output liefern, gibt es weitere Eingabeoptionen. Jedes Zahlenobjekt, Integer oder Floating Point , ermöglicht die Eingabe, entweder durch ziehen, wobei auch gleich der Wert gesendet wird, oder durch anwählen und eintippen der Zahl.

Will man durch Klicken einen bestimmten, vorgegebenen Wert setzen, so verwendet man eine message box mit set. Sie wird entweder durch anklicken getriggert oder durch ein Bang im Inlet.

Mit set kann man auch einen beliebigen string setzen, mit append an eine vorhandene message anfügen, mit prepend voransetzen.

Sind Parameter einer message mit einem Komma getrennt, so werden sie der Reihe nach (von links nach rechts!) gesendet. (Will man ein Komma mit set, append oder prepend behandeln, so muss man set /, schreiben).

liefert:

print: 1

print: 2

print: 3

print: 4

print: 5

 

Mit dem $-Zeichen kann man eine bestimmte Position einer Liste ansprechen:

Über die Verwendung von messages mit receives siehe später.

4.4 Zufälligkeiten

gibt man eine andere Zahl als 0 für den seed, so ist die Abfolge der Zufallszahlen reproduzierbar, was zum Testen von Vorteil sein kann.


Das Objekt erlaubt einen Random Walk:

(d/l drunkbeispiel.sit)

4.5 Schalter und Filter

Der Gswitch schaltet zwischen zwei Inputströmen hin und her. Auch ein direktes Klicken auf den Switch betätigt den Schalter. Umgekehrt schaltet das Ggate (oder Gswitch2)

Das Select Objekt vergleicht den Input mit einem oder mehreren vorgegebenen Werten und schickt bei Gleichheit an den entsprechenden Output (siehe select-Hilfe). Dabei können Zahlen, aber auch Strings verglichen werden. Im folgenden Beispiel ist die Achtel Note die dritte im Menü. Da im Falle von vier menue items diese programmseitig automatisch mit 0,1,2 und 3 durchnummeriert werden, liefert die Wahl des dritten menue items die Zahl 2, wodurch der der Zahl 2 korrespondierende Outlet des select objects bangt.

Das folgende Beispiel harmonisiert die C-Dur Tonleiter mit Dreiklängen (Terzlage)

  (d/l SelectBeispiel.sit)

das change Objekt zeigt an, ob sich etwas an seinem linken Inlet ändert. Kommt dieselbe Zahl noch einmal an, die gerade gekommen war, so wird sie nicht mehr über das linkeste Outlet hinausgeschickt (auch wenn die number box am Outlet inzwischen anderweitig verändert worden war). Wird die Zahl 0 erreicht, bangt der rechteste Outlet, wird die Zahl 0 verlassen, bangt der mittlere Outlet.

das clip Objekt setzt jeden Integer, Float oder Listenwert der tiefer als sein erstes Argument (setzbar im 2. Inlet) ist auf diesen, jeden der höher als sein zweites Argument (setzbar im 3. Inlet) ist auf jenen.

4.6 Counter

siehe auch Lauflicht2-Beispiel.

4.7 Container

Das bag Objekt ermöglicht es, Integers zu sammeln. Hat bag kein Argument, so gibt es keine Wiederholung, d.h. es wird nur eine einzige Zahl eines bestimmten Wertes behalten. (d/l bagBeispiel.sit)

Eine Möglichkeit die Settings anderer Objekte auch in einer externen Datei zu speichern bietet das preset Objekt

mit shift-klick auf einen der Punkte werden alle Daten aller Objekte des Patchers abgespeichert. Ein Klick auf einen der besetzten (dunklen) Punkte stellt alle Objekte auf die dort gespeicherten Werte. Die gesamten Werte des preset-Objekts können herausgeschrieben werden.

5. Midi

5.1. Midi Setup

Man muss zunächst mit dem im Betriebssystem befindlichen Programm die Midi-Konfiguration abbilden, z. B. bei MacOS 10.3 mit Hilfe des Programms Audio-Midi-Konfiguration

Man kann nun in der oberen Werkzeugleiste auf Konfig testen klicken, oder aus dem Menü Midi-Geräte den Punkt Midi-Konfiguration testen… wählen. Spielt man dann auf dem Eingabegerät einen Ton, so leuchtet der entsprechende Anschluss rot auf. Klickt man mit dem Cursor (der aus zwei Achtelnoten mit Balken besteht) auf ein Ausgabegerät, so hört man eine kurze kakophone Sequenz.

Dabei ist es wichtig festzulegen welche Kanäle der jeweils durch "hinzufügen" spezifizierten Geräte welche Funktionen erfüllen:

Die Midigeräte müssen, um kommunizieren zu können, natürlich auch auf die gewählten Kanäle eingestellt werden.

Steckt man die Midikabel während des Betriebs ab und an, so kann es vorkommen, dass das Interface die Geräte nicht mehr erkennt. Dann ist es notwendig Max zu beenden und nochmals zu starten.

Unter Windows OS sind alle MIDI devices in Max verfügbar, die korrekt im System installiert wurden und in den Sounds- und Audiogeräte-Einstellungen   aufscheinen (Start>Systemsteuerung>Sounds und Audiogeräte).

File>Midi Setup… liefert je nach System ein Dialogfenster, das die Midi-Einstellungen ermöglicht. Unter MacOS 10.3 und Max 4.3 sind hier der Buchstabe a als Kürzel für den Input Device (z.B. Midigitarre) und b als Kürzel für den Output-Device (also z.B. Synth) der oben gezeigten Konfiguration Keyboard/Proteus gewählt. Der Offset muss 0 sein, da das Programm Audio-Midi-Konfiguration keine höhere Kanalnummer als 16 erlaubt.

Man sollte auch die nicht benutzten Devices auf "off" setzen. Macht man das nicht, so würde der Output auch auf dem DLS Synth, einem Softwaresynthesizer im Rechner zu hören sein (obwohl kein Port angewählt ist!). Hat man allerdings kein Midigerät am Ausgang zur Verfügung, so stellt ein Softwaresynthesizer eine brauchbare Alternative dar.

Der eingestellte Port kann nun z. B. in im Regelfall über seine Abkürzung angesprochen werden. Dabei bleibt es wichtig, dass die Kanalnummer sowohl in notein, als auch in Audi/Midi-Setup, als auch auf dem Input-Device (also etwa der Midi-Gitarre) die gleiche ist. Wird in notein kein Port (also a,b,c…) angegeben, so werden alle Ports empfangen. Wird keine Kanalnummer angegeben, so wird auf allen Kanälen empfangen. Im folgenden Beispiel empfängt das notein-Objekt auf Port c, Kanal 10 und gibt im rechten Outlet die Lautstärke, (velocity, wobei der Wert 0 ein Note-off bedeutet), im linken die Tonhöhe (pitch) der gesendeten Midi-Note wieder, wobei im folgenden Beispiel im Get-Info für die number box die Angabe "midi note name" gewählt wurde. Dieser Output geht in das noteout Objekt, das auf Port d auf Kanal 12 sendet:

Ein noteout ohne Portangabe spielt nichts!

Man kann die Portzuweisung aber auch mit Hilfe des Objekts elegant über ein Menü erledigen. Bangt man dieses Objekt, so kann man die soeben spezifizierten Midikanäle in ein Pop-up Menue Objekt (oder auch uemue genannt) eintragen. Damit können die Ein- und Ausgangsports direkt eingestellt werden. (d/l midiinfo.sit). Je nachdem ob man den rechten oder linken Inlet verwendet erhält man die Input- oder Outputports:

Mitunter kann es passieren, dass die Zuordnung der Portbezeichnung mittels Buchstaben nicht funktioniert. Man bekommt dann entweder gar nichts oder nur den ersten Port in der aufgeführten Reihenfolge. Dem kann man nur dadurch Abhilfe verschaffen, indem man den Port mittels midiinfo und umenue einliest - eine Utility dazu habe ich unter MidiTestSystem.sit abgelegt - oder indem man die Portzuweisung mittels der port-message und Angabe der Bezeichnung macht. Also statt: muss man dann verwenden, auch wenn im Midi-Setup gestanden ist. In diesem Fall ist es dann egal welchen Abkürzungsbuchstaben man im Midi-Setup verwendet hat. Unabhängig davon muss natürlich die Kanalnummer noch gesetzt werden.

Wenn man sich ein paar mal mit dem Verändern von Port- und/oder Kanalnummern herumspielt kann es vorkommen, dass dann plötzlich gar nichts mehr geht. Meist hat in so einem Fall das Midi-Interface Probleme bekommen und man muss es neu starten, am besten indem man Max, oder wenn nötig den ganzen Rechner neu startet.

5.2 Midi-In/Out

Das midiin und midiout Objekt empfängt, respektive sendet raw MIDI Daten Byte für byte, ohne dabei die MIDI messages zu analysieren. Diese Objekte kann man an andere anbinden, die MIDI Daten aufnehmen, verarbeiten oder wiedergeben. Das midiformat Objekt transformiert Integers zu raw Midi. Die Status Bytes für Raw Midi findet man in Max45GettingStarted.pdf S.64

Das notein Objekt sucht lediglich nach MIDI note-on messages (d.h. es findet kein Pitch Bend, Control Change etc. Was es natürlich schon findet ist ein note-off, weil das ja ein note-on mit velocity 0 ist) . Findet es etwas, dann liefern seine Outlets die key number, die velocity und die Kanalnummer. Das xnotein   Objekt liefert zusätzlich auch eine release velocity (siehe help).

Die Objekte bendin, xbendin, xbendin2, bendout, xbendout und xbendout2 empfangen oder senden pitch bend messages (siehe help). Max verwendet üblicherweise nur 7-bit Werte (Zahlen von 0 bis 127) für pitch bend Daten, und verwendet eine note-on message mit einer velocity von 0 um ein note-off auszudrücken. Es kann jedoch auch 14-bit precision pitch bend values und MIDI note-off messages erhalten und wiedergeben unter Berücksichtigung der release velocity mit Hilfe von xbendin, xbendout, xnotein und xnoteout.

Andere spezialisierte MIDI input Objekte sind ctlin für control change Daten, polyin für polyphonic key pressure Daten, touchin für aftertouch Daten, pgmin für program change Daten, rtin für real time messages und sysexin für system exclusive messages. Die Output-Gegenstücke sind noteout, polyout, ctlout, pgmout, touchout und bendout.

Von großem Nutzen ist das makenote Objekt. Es erzeugt eine Note einer bestimmten Dauer aus Werten für pitch, velocity und Tondauer in seinen Inlets (siehe makenote-help).

5.3 Midi-Filter

Das stripnote Objekt filtert aus jede Note-off message heraus (d.i. eine note-on messages mit einer velocity des Wertes 0). Im hier gezeigten stripnote-help wird links der pitch, rechts velocity verändert. Ist letztere 0, so wird der pitch nicht durchgelassen.

(d/l stripnoteBeispiel)

Daraus ergibt sich, dass gespielte Töne immer weiter klingen, weil der vel=0 Wert, der den Ton abschalten würde ja nicht durch gelassen wird.

5.4 Midi-Transformationen

In Max gibt es viele Objekte, die MIDI Daten bearbeiten: Das midiparse Objekt nimmt midiin-Daten (raw midi) an, analysiert ihren Typ und routet MIDI channel voice Daten an spezifische Outlets. Siehe help-Datei:

Das borax Objekt analysiert note-on Daten, die es von notein erhalten hat, und sendet Informationen in Bezug auf die Notendauer, die Zeit zwischen Note-ons, wie viele Noten zu einem gegebenen Moment gehalten werden, wie viele Noten insgesamt gespielt wurden, etc. siehe borax-help:

Als nützlich erweist sich z.B. das Messen der Delta-time zwischen Note-ons, wenn man die Metronomgeschwindigkeit eines gespielten Stückes durch Mittappen auf der Computer- oder sonst einer Tastatur messen will.

Komplexere Spielereien, wie die Änderung der Stimmenzuordnung erlaubt das poly Objekt.

5.5 Sequencing

Das seq Objekt ist ein einfacher MIDI sequencer, der eine Datensequenz aus midiin aufnehmen und später, sogar in einem anderen Tempo, abspielen kann. seq gesteuert über menü siehe umenue.help:

da seq raw Midi verwendet, muss man zum löschen hängen gebliebener Noten das midiflush object verwenden (siehe midiflush-help).

Das selbe als vielspur-Sequencer ist mtr, das die aufgenommenen Spuren entweder simultan oder einzeln wiedergeben kann. mtr ist aber nicht auf midiin als Eingabeobjekt beschränkt, sondern kann beliebige Inputs registrieren und dann wiedergeben. Um in mtr hängen gebliebene Noten abzuschalten verwendet man das flush object (siehe flush help)

Noch weiter gehen die Fähigkeiten des detonate Objekt. Es ist ein komplexer multi-track Sequencer mit einem grafischen editing window (öffnet sich beim Doppelklicken von detonate) und score-following Fähigkeit.

6. Äußerlichkeiten

Es gibt zahlreiche Möglichkeiten, das Äußere eines Patchers oder einer ganzen Gruppe zusammengehöriger Patcher so zu gestalten, dass es nicht mehr nach Programmierung aussieht, sondern den selben Eindruck vermittelt, wie man ihn von kommerziellen Programmen her kennt.

6.1 Patch Cords

Mit Object>Show/Hide on Lock kann man Sichtbarkeiten von Objekten verändern (d/l

Patch Cords sind normalerweise direkte gerade Linie zwischen einem Outlet und einem Inlet. Checkt man aber Options>Segmented Patch Cords, so kann man diese auch in rechtwinkeligen Linienzügen führen.

Mit View>Hide Connections kann man die Patch Cords aber auch total verstecken.

Mit und kann man sich Patch Cords überhaupt ersparen (siehe Kap. 8.4.1).

6.2 LEDs

Sie kommen in 4 Farben (rot, grün, blau, gelb) und schwarz-weiß und funktionieren im Prinzip wie das toggle-Objekt mit dem Unterschied, dass ein Bang die LED nur kurz aufleuchten lässt, obwohl eine integer-number Box an ihrem Outlet abwechselnd 0 und 1 zeigt. Die Farben können über pict $1 gesetzt werden:

Die Nachleuchtzeit einer LED nach einem Bang kann in Get-Info eingestellt werden.

Über das delay-Objekt kann man zum Beispiel ein Lauflicht erzeugen:

(d/l Lauflicht.sit). Alternativ dazu:(d/l Lauflicht2.sit).

Beim ersten Beispiel ist zu beachten, dass der Output der LED nicht direkt in das delay-Objekt geleitet werden kann. Die number-Box ermöglicht es einen beliebigen delay in msek einzustellen.

6.3 Bilder und Filme

Bilder (.tif, .jpg, .psd etc.) aus der Zwischenablage können über edit>paste picture ( nicht einfach paste!) irgendwo auf dem Patcher Fenster platziert werden. Etwas raffinierter ist das Bilderhandling über das fpic-Objekt, das es unter anderem erlaubt Bilder auf Mausklick einzulesen. Das Get Info des fpic Objekts erlaubt es nicht nur Parameter zu setzen, sondern auch über ein Dialogfenster ein Bild zuzuordnen. Man kann einen graphischen Button erzeugen, indem man einen ubutton über ein Bild legt (siehe auch in Kap. 3.1). Über das Einlesen eines Bildes in fpic mittels read siehe später. (§siehe auch fpic help und dort patcher_offset_example.)

pictctrl  ermöglicht animierte Buttons (siehe help file).

Mit dem QuickTime Movie object kann man Filme einfügen, indem man zum Object Get Info aufruft (cmd-i) wonach sich ein PfadDialogFenster öffnet. Anschließend versieht man es mit einem playbar object , das man allerdings erst bangen muss, damit die Verbindung zum Fim hergestellt wird - sinnvoll wäre ein loadbang. (d/l Film.sit).

6.4 Benutzerhilfe

Das hint object liefert eine Fläche, bei der eine Benutzerinfo aufscheint, wenn der Cursor eine im Get Info vorbestimmte Zeit über ihr geblieben ist. (d/l ubuttonhint.sit)

6.5 Zeichnen

Das prominenteste Objekt in diesem Zusammenhang ist das lcd-object . Es besteht aus einem Rechteck mit einem Inlet und 4 Outlets. Wie in einem Paintprogramm kann man darin mit der Maus freihändig zeichnen. Will man das Gekritzel wieder löschen, so sendet man dem Inlet eine msg clear aus einer msg-box. Der erste Outlet links unten liefert ein Wertepaar, nämlich die Mausposition (unabhängig davon ob sich die Maus innerhalb oder außerhalb des lcd-objects befindet): Der zweite Outlet gibt die Position der Maus an, wenn sie nicht gedrückt ist (also die idle-Position). Damit diese angezeigt wird, muss noch eine kleine Ergänzung am Inlet erfolgen:

Der 3. Outlet zeigt an, ob die Maustaste gedrückt ist (1) oder nicht (0). Der 4. Outlet schließlich lässt einen Dump zu.

6.6 Programmcluster

Das pcontrol-Ojekt ermöglicht es, Patcherfenster anderer Patcher zu betätigen, aber auch sie zu laden. Auf diese Art und Weise ist es möglich, ähnlich einer Webseitenstruktur, von einer Startseite aus verschiedene Unterseiten aufzurufen.

Mit Hilfe von kann man in einem Patcher einen anderen einbauen (Subpatcher). Doppelklick auf das Objekt zeigt den im Patcher enthaltenen Patch an.

7. Textoperationen

haben wir bereits früher kennen gelernt, aber noch nicht genauer beschrieben. Es gibt dabei zwei Formen. Ohne Argument heisst der Output print:…, mit Argument heißt er <argument>:… Die Reihenfolge ergibt sich wieder mit der right to left und bottom to top Regel.

7.1 key

Mit dem key Objekt kann man feststellen welche Taste oder Tastenkombination gedrückt worden ist. (keyup liefert entsprechend die Information ob eine Taste, und wenn ja welche los gelassen worden war.)

Auch die rechte Maustaste, sowie modifier keys können erfasst werden, beim Mac allerdings umfassender als unter Windows. (Siehe Tutorial 20)-

7.2 Strings "addieren"

append object   (siehe append-help) und sprintf object (siehe sprintf-help).

7.3 Das Textfenster

Unter File>New> gibt es ein eigenes Textfenster wie bei einer Textverarbeitung. Nebst der üblichen Verwendung für Notizen kann man in diesem Fenster auch recht bequem Werte für bestimmte Objekte eingeben. So kann man ein table file dadurch erzeugen, dass man zunächst das Wort table schreibt (muss nicht sein) und dann eine durch Zwischenräume getrennte Werteliste der Ordinatenwerte folgen lässt. Hat man so ein Text file gespeichert, kann es von einem table object in einem patch gelesen werden (siehe Tabellen). Ein funbuff file erzeugt man, indem man das Wort funbuff schreibt, gefolgt von einer Liste von abwechselnd x und y Werten getrennt von Zwischenräumen. Andere Objekte für die man das auch machen kann sind unter anderem coll, env, lib, mtr und seq.

8. Höhere Mathematik

8.1 Werteskalen

Mit dem line object kann man den Output einer Zahlenfolge von einem Startwert zu einem Zielwert in einem bestimmten Zeitraum erzeugen. (Mit einem Metro object und einer Addition geht das nicht - zumindest bin ich bis jetzt auf keine brauchbare Lösung gekommen, da bei der Rekursion Stack overflows auftreten). Will man von 10 bis 75 in 5 sek zählen, und dann von 75 bis 10 in 1,5 sek, so setzt man

(d/l lineBeispiel.sit)  Der rechte Outlet sendet einen bang, wenn der Endwert erreicht wurde. line funktioniert auch mit Floating Points.

8.2 Tabellen

Es gibt mehrere Arten eine Tabelle zu erzeugen. Zum Beispiel erzeugt man eine neue Tabelle indem man File>New>Table aufruft und die Tabelle mit Get Info formatiert und dann die Werte einsetzt. So eine Tabelle kann man abspeichern, sie ist aber noch nicht mit einem Patcher assoziiert. Will man Letzteres, so erzeugt man zunächst ein table object , worauf sich ein Tabellenfenster öffnet. Man kann nun in diesem Fenster Werte zeichnen, oder eine andere Tabelle öffnen, das Auswahlrechteckwerkzeug anwählen, dann mit cmd-A alles auswählen, kopieren und ins andere Fenster mit einfügen übertragen. Eine weitere Möglichkeit besteht darin, die Werteeingabe für Tabellen mit einem Textfile zu vollziehen (siehe Kap 7.3). Man kann Daten aus einem Textfile mit kopieren/einfügen direkt in eine Tabelle bringen, aber auch umgekehrt gezeichnete Tabellen in ein Textfile kopieren.

Das Tabellenfenster öffnet sich, wenn man das table object im runtime-Modus doppelklickt.

Das Auslesen kann zum Beispiel mit 2 Slidern geschehen (d/l tableBeispiel.sit)

mit der msg write wird das table object veranlasst, über ein Pfaddialogfenster die Tabelle herauszuschreiben oder mit read entsprechend einzulesen. Damit man eine einmal erstellte Tabelle nicht versehentlich beim Schließen eines Patcherfensters verschmeisst, kann man das closebang object verwenden, das einen Bang an eine mit einem table object verbundene write Message schicken kann. Ebenso kann man mit loadbang eine Tabelle sofort beim Öffnen des Patchers einlesen.

siehe auch expr-help>Patcher More expr

Komplexere Formen, inklusive Interpolationen geschehen mit funbuff

8.3 Vektoroperationen

Das pack object packt Zahlen oder Symbole in eine Liste, unpack entpackt. Im Gegensatz zu pak (sprich "pock") wird der Outlet nur durch den linkesten Inlet aktiviert (bei pak tut das jeder Inlet).

Das coll object erlaubt es indizierte Datengruppen zu verwenden (d/l collBeispiel.sit)

8.4 Programmieren

8.4.1 send/receive

Manchmal wird ein Gewirr von patch cords zu unübersichtlich, sodass man besser mit send und receive arbeiten kann. Die Worte können entweder ausgeschrieben oder nur mit dem ersten Buchstaben abgekürzt werden: . Bei receive gibt es darüberhinaus noch die Möglichkeit, den Parameter über ein Inlet zu setzen. Zueinander gehörige send und receive Objekte erkennen einander am gleichen Parameter:

  (d/l SendReceiveBeispiel.sit)

Auch das message Objekt kann an ein receive senden, nämlich indem man am Beginn einen Strichpunkt setzt:

Notwendig ist die Verwendung von send/receive, wenn man mit subpatchers arbeitet.

8.4.2 Subpatcher

Mit Hilfe von Subpatchern kann man so etwas wie eigene Meta-Objekte erstellen. Meta deshalb, weil man sie ja nicht in C programmiert, sondern sie bestehen aus den Objekten der Werkzeugleiste. Dazu fügt man in einem Patch (hier "Musikinstrument20040913") ein patcher object ein, das sofort ein weiteres Fenster öffnent, nämlich das Subwindow mit dem Namen, den man im patcher object angegeben hat. (Der Name kann auch im nachhinein gesetzt werden). Um mit dem Hauptprogramm zu kommunizieren verwendet das Subwindow inlet objects und outlet objects: Es entstehen am patcher object automatisch ebensoviele Inlets und Outlets, wie man inlet und outlet objects im Subpatcher verwendet. Beim Sichern werden die Subpatches im Hauptpatcher integriert, man hat also nur eine Datei.

Im Folgenden eine kleine Spielerei: Der Subpatcher powsq erzeugt das Quadrat und die Wurzel einer Zahl, die im Subpatcher makemusi in MIDI-Töne übersetzt werden. Das Hauptprogramm hat nur die Steuerung der Eingabe über (2 Parameter)

(d/l Musikinstrument20040913.sit)

So wie in anderen bekannten Programmiersprachen gibt es auch in Max ein if-then-else object. Oft kann man solche Problemstellungen aber auch einfacher mit select und switches oder gates lösen. Das if object ist meines Erachtens eher ein nicht sehr handlicher Kompromiss. Trotzdem ein kleines Beispiel, das aus einer Randomtonreihe nur Tonpaare mit dem Abstand einer Oktave durch lässt:

(d/l if-then.sit) sowie eines, das einem zeitbegrenzten metro object enstspricht:

8.5 Menüs

umenue , ein Pop-Up Menü um Befehle anzuzeigen und zu schicken. Der Input erfolgt entweder indem man in GetInfo die Menüpunkte mit Beistrich getrennt eingibt, über append oder über setitem

beachte, dass es sich bei dem append nicht um eine Objekt Box, sondern eine Message Box handelt. clear löscht das gesamte Menü. Einzelne Menüpunkte werden durch eine Message Box mit delete i gelöscht, wobei i die Nummer des Menüpunktes (0,1,2…) ist.

Mit Hilfe von setcheck und checkitem kann man checkmarks setzen (siehe umenue.help>patcher checkitem)

Der Output aus umenue liefert links die Positionsnummer des angewählten Menüpunkts (0,1,2…) und rechts kann eine Message Box bedient werden, wenn der Menüpunkt so gewählt ist, dass er einen entsprechenden Befehl enthält.

das umenue object harmoniert gut mit einem select, welches je nach gewähltem menu item den entsprechenden Outlet bedient. Hat man z.B. im Menü die Begriffe Halbe Note, Viertel Note, Achtel Note und Sechzehntel Note, so kann man mit select checken welche Note gewählt wurde:

9. File I/O

9.1 Fileinput

openfile öffnet einen Standard-Fileinputdialog

9.2 Pfadfinder

Mit Hilfe des Objekts drop file kann man den Pfad und Typ eines Files aus dem HFS einlesen, wozu allerdings das File auf das Objekt gezogen werden muss.

die msg read, wie sie z.B. von fpic verwendet werden kann enthält im Normalfall nur den Namen der Bilddatei. Gefunden wird sie, wenn der Pfad zu ihrem Speicherort unter Option>File Preferences aufgeführt ist.

Mit Hilfe von ein Textfile ein. [Helpfile von text studieren].

Analog liest , kann man ein Binärfile mit 8-, 16- oder 32-bit Daten einlesen.

Das capture object kann eingehende Daten auf einem File speichern.

 

10. Audio (MSP)

Die Werkzeuge und Objekte, die sich mit der Verarbeitung von Audiosignalen befassen, gehören zur Programmerweiterung MSP (Max Signal Processing). Neben den neuen, für die Audioverarbeitung typischen Werkzeugen und Objekten finden natürlich auch diejenigen Verwendung, die wir bereits in Max kennen gelernt haben - insbesondere diejenigen, die allgemeine Funktionen ausüben, die nichts mit Midi-Verarbeitung zu tun haben. Die MSP-Analoga zu den max-Objekten haben eine ~. z.B. minimum und minimum~.

Der grundlegende Unterschied zwischen Max und MSP besteht darin, dass bei Max vom Benutzer eine Message geschickt werden muss (z.B. bang) damit etwas paassiert. Bei MSP besteht eine dauernde wechselseitige Beeinflussung von Outlet zu Inlet. Die time base dabei ist 1ms, d.h. jede tausendstel Sekunde wird ein Datenschub übertragen. Deshalb ist es besonders bei Audioverarbeitung wichtig den Menüpunkt Overdrive unter Options>Overdrive zu beachten. Ist Overdrive ungecheckt, haben die graphischen Prozesse die gleiche Priorität wie das Abarbeiten von Events. Das kann dazu führen, dass - besonders bei schwachen CPUs oder starker CPU-Beanspruchung - das Programm stottert. Checkt man aber Overdrive, dann werden Events prioritärvor dem Zeichnen behandelt.

10.1 Setup

Am Mac erfolgt nach dem Einstellen der Tonein- und Ausgabeoptionen in den Systemeinstellungen das Setup unter OS 10 im Dienstprogramm Audio-MIDI-Konfiguration. Unter Windows muss man sich an die Beschreibung der jeweiligen Soundkarten halten. Um In- und Output auf seine Funktionstüchtigkeit zu überprüfen gibt es unter Extras>Audiotester ein entsprechendes Fenster, bei dem aber sowohl für die Überprüfung des Eingangs, als auch für den Ausgangstest erst auf das "Start"-Feld gedrückt werden muss .

Den Status des Digital Signal Processor (DSP) erhält man, wenn man das adc~ Objekt in einem gelockten Patcher doppelklickt oder über Options>DSP—Status... - zum Beispiel in folgender Form (mit geöffnetem Fenster für das I/O Mapping, bei dem theoretisch 512 Kanäle zur Verfügung stehen):

das adc~Objekt (audio-digital-conversion) empfängt Audio-Kanäle und schickt den Input weiter an seine Outlets. Es wird mit der message start gestartet und mit stop gestoppt. Auch ein Toggle-Werkzeug am Inlet dient dem selben Zweck. Allerdings werden immer die Inputs sämtlicher Fenster geschaltet. Will man nur den Input eines einzelnen Fensters aktivieren, so sendet man startwindow an adc~. Dadurch wird der Input in diesem einen Fenster aktiviert und gleichzeitig in allen anderen ausgeschaltet.
Um den Zustand des Inputs (ein- oder ausgeschaltet) zu sehen kann man das ezdac~Objekt in das gleiche Fenster setzen (es benötigt keine Input-Leitung) je nach dem Schaltzustand des Inputs ist es normalfarbig oder dunkelgrau. An dieses oder an das adc~Objekt kann man dann noch eine Art VU-Meter anhängen mittels des meter~Werkzeugs und wenn man die Wellenform des Klangs sehen will, so hängt man noch ein scope~Werkzeug daran (d/l AudioInBeispiel.sitx):

10.2 Tonerzeugung

Das einfachste Element ist das Cycle~-Objekt (siehe T1 (Tutorial MSP #1)). Linkes Inlet: Frequenz in Hz, rechtes Inlet Sägezahngenerator zur Angabe des Phasenwinkels, den wir im Moment aber nicht näher beschreiben wollen. cycle~ verwendet eine Tabelle von 512 Samples um eine Funktion zu generieren. Gibt man nichts an, so wird eine Sinusschwingung verwendet, man kann aber auch eine in einem buffer~ - Objekt gespeicherte Funktion zuordnen.

Das zweite wichtige Element ist der D/A-Konverter . Das linke Inlet ist Kanal 1, das rechte Kanal 2. Schaltet man zwischen das Cycle~ - und das dac~ -Objekt noch einen signal multiply operator , so kann man mit seiner Hilfe die Lautstärke zwischen 0 und einem beliebigen Wert variieren. Will man die Eingabe für cycle~ musikalischer gestalten, so kann man ein mtof-Objekt an ein Keyboard anhängen, welches die Midinummer in eine Frequenz umrechnet. Auf einfache Weise kann man sich einen Sinusgenerator bauen (d/l Sinusgenerator).

10.5 Syntheseformen

granular, additiv, subtraktiv, wavetable, waveshaping, physical modeling

Additive Synthese,
Synthesis durch Modulation (frequency, pitch),
Samples lesen,
Sound-Dateien lesen (direct-to-disk),
Granulare Synthese.

10.6 Aufnahme/Wiedergabe

Eine einfache Anordnung zum Aufnehmen ist das record~ Objekt

mit dem buffer~ Objekt kann man die Kurve als .aiff-Datei herausschreiben

Sound processing (delay lines, transposition, reverberation, etc.)
Digitales Filtern,
Analysis eines Signals in Echtzeit (range, pitch, spectrum, etc.),
Optimierung der patch performance (dynamic routing, control of the processor, etc),
Sequencing Information.

11. Timeline

Eine Timeline ist eine grafische Anordnung von Max Messages, die an spezifische Objekte in spezifischen Patches zu spezifischen Zeitpunkten schickt. Die Timeline kann abgespielt werden mit Hilfe der Kontrollen im Timeline Fenster, oder auch von innerhalb eines Patches, der ein timeline object enthält. Eine neues Timeline Fenster erhält man aus File>New>Timeline, oder indem man timeline in eine leere Objektbox schreibt.

12. Scripts

13. Systeminformationen

Mit dem gestalt object kann man Informationen über System und Software erhalten.

14.Kommunikation

14.1 Softwareseitig

Max kann seinen Input von anderen Programmen erhalten, oder den Output an andere Programme weitergeben. Näheres findet man  hier in den AV-Lecture Notes

14.2 Hardwareseitig

Auf der Cycling74-Produktseite findet man eine Reihe von Produkten zur Steuerung nach außen, respektive zur Aufnahme von Sensordaten. Besonders interessant erscheint mir dabei die Anbindung von Sensoren der Fa. Electrotap

15. Eigene Objekte erstellen

Ab der Version 4.5 des Programms gibt es einen Software Development Kit (Max/Msp SDK) für Leute, die selbst Objekte entwerfen wollen. Allerdings bietet auch schon das jsui-Objekt eine Einstiegsmöglichkeit mittels JavaScript für Leute, die nicht gleich tief in Java hinuntersteigen wollen.

Eine weitere Möglichkeit besteht darin, aus Max-Primitives höhere Patches zu Bilden, wie es zum Beispiel Karlheinz Essl zusammen mit anderen in seiner RTC-lib (Real Time Composition Library für Max) anbietet und in seiner Lexikon-Sonate anwendet.

16. Übungen

Mit diesem Klick geht es zu den Übungen.

17. Links

Linkliste zu Max/MSP
Max Objects Database
Diverse Max Patches der SFU
Andreas Weixler, Bruckner-Uni Linz (2003)
Delay-Lines
neue, Max/MSP ähnliche Software von Miller Puckette
IRCAM
Werke wie die Lexikon Sonate von Karlheinz Essl verwenden Max
Patches von Snot Wong (vorwiegend MSP)
externe Objekte von Miller Puckette

Hersteller
3 Beispiele der fh Düsseldorf
http://cnmat.cnmat.berkeley.edu/Max/

Link zu max/msp/jitter f. Videokontrolle (z.B. Gestenerkennung, motion tracking etc.)

18. Abkürzungen

alt alt-taste, opt-Taste
cmd Command-Taste, Befehlstaste
ctrl Control-Taste, Strg-Taste
HFS Hierarchisches File System
msg message
s/w schwarz-weiß