Max/MSP

 

Max/MSP (Cycling74): grafische Programmieroberfläche = Objekte zur Klangerzeugung / Klangveränderung / Klangsteuerung können mit virtuellen Kabeln verbunden werden.

Mitte der 1980er Jahre am IRCAM von Miller Puckette entwickelt, zunächst (um 1990) von Opcode verkauft, später (ab 1999) von Cycling74.

  • Max (nach Max V. Mathews) = grundlegende Umgebung (MIDI, Steuerung, Benutzeroberfläche und Zeitgeber)
  • MSP (Max Signal Processing) = hunderte von Audio processing Objekten (vom Filter bis zum Harddisk-Recording), die in Max eingesetzt werden können


Beispiel eines MIDI-gesteuerten Synthesizers innerhalb von Max/MSP


Max Features

  • beliebige Anzahl von Programmen sind möglich
  • Umgebung für Mac und PC
  • beliebige Anzahl von MIDI-inputs und -outputs
  • Quicktime movies
  • Programmierhilfen und Debugging
  • Cross-Platform SDK, um die Software nach eigenen Wünschen anzupassen

MSP Features

  • mehr als 150 Audio-processing Objekte für alle Belange zwischen Synthese, Sampling und Signal Processing.
  • MME (Multi Media Extensions (Windows)), DirectSound, und ASIO Support unter Windows, Core Audio support unter Mac OS X.
  • Beliebig viele Harddisk-Recording und playback streams mit Audiofiles mit bis zu 32 Tracks.
  • Audiowiedergabe inklusive varispeed, looping, rückwärts.
  • Schnittstellen für grafisches Filter Design und Hüllkurven / Funktionsgenerator.
  • AIFF, WAV, Sound Designer II (Macintosh), AU und MP3 werden unterstützt.
  • Aufbau von beliebigen MIDI-gesteuerten polyphonen Samplern, Synthesizern etc wird unterstützt.
  • VST-PlugIns und -Instrumente werden in jeder denkbaren Konfiguration unterstützt.

 

Grundlagen

Nach dem Öffnen von MAX/MSP gelangt man erstmal an eine weiße Oberfläche links (Patcher) mit einer Reihe von Auswahlmöglichkeiten/Modulen auf der rechten Seite:


Patcher und Modulliste (Object Explorer) bei MaxMSP 6.1

Im Patcher können die Module beliebig zu einem Patch zusammengefügt werden.

Grundlegende Prinzipien

  • Module werden meist über einen Auslöser ("Bang") angesteuert werden, wie z.B. über einen Button, eine Zahl, ein Keyboard o.ä.
  • auf der oberen Seite der Module sind die Eingänge, auf der unteren die Ausgänge.
  • Eigenschaften und Werte der Module lassen sich über den "Inspector" ändern
  • Patches kann man ausprobieren, sobald man sie mit dem kleinen Schloss links unten abgeschlossen hat (auch via STRG+e).


basic modules in MaxMSP

Grundlegende Elemente sind Auslöser wie Buttons, Message-Boxes, Toggle (= 1 oder 0) und Presets oder Kommentare (comment), String/Integer/Double-Ausgaben (number, flonum) oder Container für Sub-Patches (bpatcher) mit Ein- und Ausgängen (inlet/outlet)

 

Max Einführung (MIDI-Steuerung)

via Math -> random lassen sich zufällige Zahlen von 0 bis zu einer beliebigen Zahl-1 (und damit via MIDI zufällige Tonhöhen) erzeugen:


Zahlencodierung für Tonhöhen via MIDI
(Manzo 2011, S. 19)

Mit Zahlen zwischen 0 und 128 lassen sich alle musikalisch erreichbaren Tonhöhen via MIDI wiedergeben.

Mit Notes -> makenote lassen sich MIDI-Tonhöhen mit drei Parametern erzeugen: Velocity (Anschlagsstärke: 0-127) / Dauer (in ms) / Kanal (0-15)

Mit MIDI -> noteout wird die in makenote erzeugte Note als MIDI-Befehl ausgegeben. Hierbei ist es wichtig, dass der erste Eingang die Zahl für die Tonhöhe erhält und der zweite Eingang die Zahl für die Velocity (diese beiden Eingänge müssen mit den entsprechenden Ausgängen von makenote verbunden sein)

Der Auslöser für den Zufallsgenerator (Math -> random) kann ein Button sein, aber auch ein Taktgeber (via Timing -> metro), der den Button ansteuert.

Der Taktgeber wiederum wird über einen Toggle-Button (Basic -> toggle) aus- und eingeschaltet.

Über einen zweiten Zufallsgenerator kann auch die Velocity gesteuert werden

Man kann auch via Sliders -> slider einen Schieberegler einsetzen (default mit Werten zwischen 0 und 127), z.B. für die Temposteuerung (Ausgang des Sliders am rechten Eingang des Taktgebers anschließen; Wertebereich kann über den Inspektor verändert werden)


Script für zufällige Tonhöhen und Lautstärken mit Millisekunden gesteuertem Tempo (via metro)

zufall.maxpat

Wenn anstelle von Millisekunden die Notenfolge in Takten und Zählzeiten geschehen soll, dann sollte anstelle von Timing -> metro lieber Timing -> tempo eingesetzt werden (mit vier Eingängen: Bang, BPM-Zahl, Zählzeit, Noten pro Zählzeit). Die Eingänge von Tempo können dann entweder wieder via Slider gesteuert werden (diesmal Slider -> dial) oder auch via Auswahlknöpfe (Basic -> message):


Script für zufällige Tonhöhen und Lautstärken mit BPM-gesteuertem Tempo (via tempo)
zufall.maxpat

Für eine nichtzufällige Steuerung braucht man ein Keyboard (unter Slider -> kslider); es können auch Tönhöhen via Notes -> notein von anderen Modulen übernommen werden (bzw. via Notes -> noteout an andere Module weitergegeben werden). notein und noteout haben drei Aus- bzw. Eingänge (Tonhöhe, Velocity, Kanal).

Die Klangfarbe (bzw. welches MIDI-Instrument gespielt werden soll = Program Change) kann via MIDI -> pgmout und einen daran angeschlossenen Slider verändert werden. Via MIDI -> pgmin können auch Program Change-Daten von außen empfangen werden.

Das Modulationsrad kann via MIDI -> ctlout (Control Change) und einen Slider verändert werden. Via MIDI -> ctlin können auch Modulationsrad-Daten (und auch andere Controller Change-Daten) von außen empfangen werden.

Das Pitchbend-Rad kann via MIDI -> bendout (pitch bend) und einen Slider verändert werden. Via MIDI -> bendlin können auch Pitchbend-Daten von außen empfangen werden.


Script für MIDI-Steuerung, Modulation, Pitchbend, Klangfarbenauswahl (Program Change)
midi_steuerung.maxpat

Mit Hilfe von Selectboxen und Radiobuttons lassen sich auch Intervalle und Akkord in Abhängigkeit vom Eingangssignal erzeugen:

Über Math -> + und einer Nummernausgabe (Basic -> number) lassen sich parallel zur eingehenden Tonhöhe weitere Tonhöhen erzeugen.

Die Änderungen lassen sich als Zahlen entweder direkt über Buttons (Basic -> button) und eine Message-Box (Basic -> Message) hinzuaddieren oder es geht auch via Drop-Down-Menüs (Interface -> umenu): Über den Inspector (rechts) die Eigenschaften aufrufen und dort in "Menu Items" mit Kommata getrennt die Intervallnamen eingeben. Die Zählung der Items erfolgt dann von 0 aufwärts, so dass man vom Unisono bis Oktave die Zahlen von 0 bis 12 hat, die dann hinzuaddiert werden.

Wenn man zwei Intervalle hinzuaddiert kann man diese auch als Akkorde zusammenfassen. Über Basic -> message kann man mit einzelnen Zahlen bei den Intervall-Drop-Down-Menüs die geeigneten Intervalle auswählen (3 = kleine Terz, 4 = große Terz, 6 = Tritonus, 7 = Quinte, 8 = kl. Sexte).

Über Radiobuttons (Basic -> radiogrou) und ein Sammelauswahlfeld (Control -> select) lassen sich diese Auswahlen zusammenfassen. Bei den Radiobutons hilft wieder der Inspector, in dem man die "Number of Items" einstellen kann(bei 4 geht die Zählung von 0-3). Beim Sammelauswahlfeld wird über die Zahlenfolge 0 1 2 3 bestimmt, zu welchem Ausgang das Signal geschickt wird = welche Message-Buttons aktiviert werden = welche Intervalle in den beiden Intervall-Dropdown-Menüs ausgewählt werden.

All diese Dinge lassen sich jetzt z.B. über einen Zeitgeber und eine Zufallsfunktion verändern. Direkt lassen sich diese Akkorde auch via MIDI von aussen oder über ein zweites Keyboad steuern (Slider -> kslider).


Script für die Erzeugung von Intervallen und Akkorden
midi_steuerung_akkorde.maxpat

Mit Hilfe von MIDI -> midiinfo lässt sich die MIDI-Quelle am Computer bestimmen, über die Signale aus- und eingelassen werden. Wenn man es mit einem Interface -> umenu verbindet, erhält man ein Auswahlmenü, mit dem man die entsprechende MIDI-Quelle einschalten kann.

Über Notes -> flush oder MIDI -> midiflush lassen sich "Notenhänger" löschen, die entstehen, wenn kein MIDI-off-Signal gesendet wird (am besten die Töne mit Notes -> makenote ausgeben, da hier immer eine Dauer bis zum Ende der Note eingestellt werden kann). Die Noten selbst lassen sich via Sliders ->nslider auch als Noten darstellen.

Mit Hilfe von Data -> borax lassen sich jede Menge Informationen aus eingehenden MIDI-Signalen bzw. Notes herausholen, wie z.B. die Reihenfolge der Noten, wie viele Noten gleichzeitig gedrückt sind, die Tonhöhe, Anschlagsgeschwindigkeit, Dauer, Abstand zwischen zwei Noten etc.
All diese Informationen können dazu verwendet werden, um neue Noten-Events auszulösen. Über Control -> sel oder Control -> select können hier if/else-Schleifen gelegt werden, mit denen bestimmt wird, dass z.B. ab einer bestimmten Note, Dauer, Tonhöhe, Reihenfolge, Notenanzahl etc. ein neues Ereignis ("Bang") ausgelöst wird.


Script für die Ermittlung von MIDI-Daten und die Auswahl von MIDI-Quellen
midi_borax.maxpat

 

MSP Einführung (Digitale Audiosignalverarbeitung)

Audiomodule (unter MSP -> zu finden) haben anstelle der MAX/MIDI-Module gelb-schwarze Kabelverbindungen sowie eine Tilde (~) als Erkennungsmerkmal. Um sie mit einer MIDI-Steuerung zu verbinden müssen die MIDI-pitch- und -verlocity-Werte in Frequenzen und Amplituden umgerechnet werden. Dies geschieht über die Module Math -> mtof (MIDI to Frequency) und Math -> zmap (Mapping von einer Skala in eine andere, d.h. bei Velocity auf Amplitude: der Bereich von 0-127 nach 0.0-1.0). Bei der Ausgabe muss die Amplitude dann via MSP Operators -> *~ mit dem neu skalierten Wert verrechnet werden.

Unter MSP Synthesis findet man die verschiedenen Oszillatoren wie z.B. für Sinus- (MSP Snythesis -> cycle~), Sägezahn- (MSP Snythesis -> saw~), Dreieck- (MSP Snythesis -> tri~) und Rechteckschwingungen (MSP Snythesis -> rect~).

Über MSP Routing -> gate~ lassen sich die Kanäle für die Oszillatoren an- und ausschalten. Dies kann über ein Auswahlmenü (Interface -> umenu) via Control -> select mit dem Ansteuern von Basic -> toggle geschehen.

Die Audioausgabe kann entweder über MSP I/O -> dac~ mit einem Toggle-Schalter ein- und ausgeschaltet werden oder einfacher mit einem Audio -> ezdac~ Audiobutton.

 


Script für Tonhöhensteuerung und Wellenformauswahl von verschiedenen Oszillatoren
synth_grundschwingungen.maxpat

Wenn die Kabelverbindungen unübersichtlicher werden können die Module in Subpatches geordnet werden: Mit Hilfe von Control -> p kann ein Subpatch erstellt werden, in das eine Gruppe von Modulen eingebaut werden kann. Die Eingänge werden via Basic -> inlet mit der Außenwelt verbunden und die Ausgänge via Basic -> outlet. Mit einem Doppelklick lässt sich das Subpatch öffnen und weiter bearbeiten.


Das gleiche Script wie oben, nur mit Subpatch für die Oszillatoren


Subpatch mit Oszillatoren
synth_subpatch.maxpat

Über MSP Filters -> svf~ kann man ein Multifunktionsfilter einsetzen (Hoch-/Tief-/Bandpass-/Bandsperre-Filter), dessen Ausgänge ähnlich wie bei den Oszillatoren via MSP Routing -> gate~ und Interface -> umenu / Control -> select und Basic -> toggle ausgewählt werden können.

Da die Amplitudeninformation (Math -> zmap) für das Gesamtklangergebnis gilt, wird sie erst am Ende der Kette aufmoduliert:


Hoch-/Tief-/Bandpass-/Bandsperre-Filter
synth_filter.maxpat

Auch das Filtermodul lässt sich via Control -> p zu einem Subpatch zusammenfassen (wobei die Slider und Menüs immer außerhalb des Subpatches liegen sollten):


Hoch-/Tief-/Bandpass-/Bandsperre-Filter im Subpatch
synth_filter_subpatch.maxpat

Sehr viel mehr und komfortablere Filtermöglichkeiten bietet das Audio -> filtergraph~ in Verbindung mit MSP Filter -> biquad~, in dem beliebige Filterfunktionen ausgewält werden können (über Basic -> Message mit der Eingabe "Clear" kann das Filter resettet werden, falls es übersteuert, über Basic -> Message mit der Eingabe "set $1" wird eine Variable gesetzt, in die der aktuelle Wert der Filtereinstellung jeweils an den Schieberegler weiter geleitet wird, so dass sich bei Veränderungen der Filterkoeffizienten die Schieberegler entsprechend mitbewegen können).


Synthesizerpatch mit flexiblem Filter
synth_filter_function.maxpat


Mit Hilfe von Audio -> function lassen sich Kurven zeichnen, die man über MSP Functions -> line~ als Hüllkurve für z.B. die Amplitude verwenden kann. Um die Hüllkurve mit dem Tastenanschlag zu starten braucht sie einen "Bang" via Basic -> button.


Synthesizerpatch mit zeichenbarer ADSR-Hüllkurve
synth_envelope.maxpat

Über das Multiplikationsmodul MSP Operators -> *~ lässt sich auch die Amplitude eines Tongenerators in der Frequenz eines zweiten Tongenerators modulieren. Über Messages -> r (bzw. receive) und Messages -> s (bzw. send) lassen sich Werte ohne Patchkabel versenden, via Patching -> loadbang kann man beim Laden eines Patches bestimmte Werte vorgeben (auch gut für einen Reset während der Laufzeit)


Beispiel für eine Amplitudenmodulation (AM, Tremolo und Ringmodulation)
synth_AM.maxpat

Über das Additionsmodul MSP Operators -> +~ lässt sich auch die Frequenz eines Tongenerators in der Frequenz eines zweiten Tongenerators modulieren


Beispiel für eine Frequenzmodulation (Vibrato und FM)
synth_FM.maxpat

 

 

Über "Interaction -> Key" können auch Eingaben von der Tastatur als MIDI-Befehle umgewandelt werden. So lässt sich MaxMSP auch mit MakeyMakey verbinden, wo man folgende Tastatur-Codes braucht:

left arrow = 28
right arrow = 29
up arrow = 30
down arrow = 31

a = 79
d = 100
s = 115
w = 119

(vorsicht: die Zahlen sind keine ASCII Char Codes, sie lassen sich ermitteln, indem man die Key-Eingabe mit einer Nummern-Ausgabe verbindet)

Über eine Selcet-Box ("control -> select") kann ermittelt werden, welche Taste gedrückt wurde, und man kann der Taste einen Wert zuweisen, der dann für die Erzeugung der jeweiligen MIDI-Note verwendet wird:


Patch: Tastatureingaben zu MIDI via MAX/MSP: beispiel_makeymakey.maxpat