Ziel dieser Reihe ist es einen eigenen Sampler mithilfe der visuellen Programmiersprache Max umzusetzen. Nach und nach will ich die einzelnen Komponenten entwickeln und ein vollwertiges Instrument für Ableton Live bauen, auch wenn diese DAW in Sachen Sampler mehr als ausreichend ausgestattet ist. Es geht hier ja in erster Linie auch um den Lerneffekt. Im Anschluss ist dann geplant dieses Projekt in C++/JUCE umzusetzen, was vom Umfang her etwas mehr Arbeit sein wird.

Was ist ein Sampler?

Per Definition ist ein Sampler ein Synthesizer, der Töne in unterschiedlicher Länge aufzeichnen kann und diese dann in verschiedensten Tonhöhen mithilfe einer Piano-Tastatur wiedergeben kann. Bei dieser Definition will ich es zunächst einmal belassen. Die Feinheiten folgen dann in späteren Artikeln.

Die bekanntesten Software Sampler sind sicherlich Kontakt von Native Instruments, Motu’s MachFive, Falcon von UVI oder der Halion von Steinberg. Aber auch jede DAW hat mittlerweile fast immer einen Sampler mit an Bord, manchmal – wie in Renoise – bildet dieser sogar den Mittelpunkt der Workstation.

Die Möglichkeiten in Kontakt sind … vielfach!

Aber von solchen Schwergewichten wollen wir hier zunächst gar nicht sprechen. Ich will mich erstmal an die einfache Definition halten und ein Instrument bauen, welches mithilfe eines Midi-Controllers ein Sample in verschiedenen Tonhöhen wiedergibt. Somit wären wir auch schon beim Thema dieses ersten Teils: Wie teile ich meinem Instrument mit, welchen Taste des Keyboards wir gerade drücken, wie stark wir diese anschlagen und wann wir sie wieder loslassen?

Mididaten

Zunächst einmal ziehe ich mir ein leeres Max4L-Instrument in die Instrumentleiste. Von den bereits vorgegeben Komponenten entferne ich zunächst einmal die Kommentare.

Wir brauchen am Eingang Midi-Daten und am Ausgang irgendwann Audio…

Wir haben somit also ein midiin Objekt als Eingang und ein plugout~ Objekt am Ausgang, welches später das Audiomaterial an Ableton weitergibt. Dieses Objekt benötigen wir in diesem Teil aber noch nicht. Mir geht erstmal nur darum meine Eingaben am Midi-Keyboard zu empfangen.

Immer empfehlenswert ist es, per Rechtsklick auf ein Objekt die Hilfeseite dieses Objekts zu öffnen und zu schauen, was man damit anstellen kann.

Die Hilfeseiten der einzelnen Objekte ersetzen mit Leichtigkeit eine ellenlange Dokumentation

Das midiin Objekt zapft also einen bestimmten Midi-Port an und empfängt rohe Midi-Daten. Hört sich zunächst schonmal ganz nützlich an. Den Midi-Port gebe ich in Ableton direkt beim Track an, in dem das Instrument erstellt wird. (An dieser Stelle sei kurz erwähnt, dass der Track in Ableton auch auf Aufnahme geschaltet sein muss, sonst werden gar keine Midi-Daten eines Keyboards an das Instrument weitergeleitet).

Damit ich mir anschauen kann, wie die rohen Midi-Daten aussehen verbinde ich den Ausgang des midiin Objekts mit dem Eingang eines print Objekts. Das print Objekt gibt alle möglichen Daten seines Eingangs in der Max Console aus.

Beim Drücken und Loslassen einer Taste werden gleich 6 Werte in die Konsole geschrieben

Ok, beim Drücken einer Taste werden die Werte 144, 59 und 113 in die Console geschrieben und wenn ich die Taste wieder loslasse nochmal drei Werte: 128, 59 und 0. Kryptisch, kryptisch. Was sollen mir diese Zahlen sagen?

Wenn ich mir nochmal die Hilfeseite des midiin Objekts anschaue kann ich rechts die midiin reference einblenden. Dort bekommt man Hinweise zu verwandten Objekten. In dieser Liste fällt mir sofort das midiparse Objekt ins Auge, denn die kurze Beschreibung sagt: Interpret raw MIDI data. Perfekt.

Ich erzeuge also ein neues Objekt (n) und schreibe midiparse hinein. Jetzt entferne ich die Verbindung von midiin zum print Objekt, verbinde midiin mit midiparse. Das midiparse Objekt verfügt über einen Haufen Ausgänge und wenn ich mit dem Mauszeiger darüber fahre, wird mit in einem kleinen PopUp angezeigt, was hier ausgegeben wird. Gleich der erste, linke Ausgang gibt mir die Tonhöhe(Pitch) und die Anschlagstärke(Velocity) aus … genau das habe ich gesucht. Also verbinde ich den linken Ausgang mit dem print Objekt und schaue, was jetzt ausgegeben wird.

Tonhöhe und Velocity in einer Liste

Der erste Wert ist die Tonhöhe(57) – hier ein A3 – und der zweite Wert ist die Anschlagstärke. Da auch beim Loslassen der Taste ein NoteOff Wert ausgegeben wird, hat jede zweite Printanweisung die Anschlagstärke 0. Ich möchte die Werte aber einzeln haben, damit ich später damit weiterarbeiten kann. Ich muß also irgendwie diese Liste “entpacken”.

Ich rufe mir einmal die Hilfe des midipack Objekts auf und sehe in dem Beispiel-Patch sofort, dass dort ein unpack Objekt verwendet wurde um die einzelnen Elemente der Liste abzugreifen. Also erzeuge ich mir ein unpack Objekt und mache aus dem print Objekt gleich mal zwei. Zusätzlich beschrifte ich die print Objekte, indem ich hinter dem print Befehl einfach eine passende Bezeichnung angebe. So kann ich in der Console besser sehen, welches print Objekt welchen Wert anzeigt.

Einmal Pitch und einmal Velocity…

Genau das wollte ich erreichen. Dies war jetzt ein relativ langer Artikel für ein ziemlich simples Problem, aber wir arbeiten uns ja gerade in Max For Live ein und lernen alle Elemente gerade erst kennen. Das nächste mal will ich dann auch endlich mal etwas hören 😉 …