Hinweis: Dieser Abschnitt des Tutorials behandelt den fortgeschrittenen Umgang mit großen Verzeichnissen Deiner eigenen Samples. Das wird nützlich, wenn Du eigene Sample Packs heruntergeladen oder gekauft hast und diese in Sonic Pi nutzen möchtest.
Du kannst diesen Abschnitt überspringen, wenn Dir die mitgelieferten Samples ausreichen und Du keine eigenen brauchst.
Wenn du mit großen Ordnern externer Samples arbeitest, kann es mühselig sein, jedes Mal den vollständigen Pfad eingeben zu müssen, um ein bestimmtes Sample abzuspielen.
Sagen wir, Du hast zum Beispiel folgenden Ordner auf Deinem Computer:
/pfad/zu/meinen/samples/
Wenn wir in den Ordner schauen, finden wir folgende Samples:
100_A#_melody1.wav
100_A#_melody2.wav
100_A#_melody3.wav
120_A#_melody4.wav
120_Bb_guit1.wav
120_Bb_piano1.wav
Üblicherweise können wir den vollständigen Pfad nutzen um das Piano-Sample abzuspielen:
sample "/pfad/zu/meinen/samples/120_Bb_piano1.wav"
Wenn wir das Gitarren-Sample abspielen wollen können wir ebenfalls den vollständigen Pfad nutzen:
sample "/pfad/zu/meinen/samples/120_Bb_guit.wav"
Wie auch immer, beide Aufrufe verlangen von uns, dass wir die Namen der Samples innerhalb des Verzeichnisses kennen. Was, wenn wir nur schnell die einzelnen Samples nacheinander hören wollen?
Wenn wir das erste Sample in einem Verzeichnis abspielen wollen, müssen wir nur den Verzeichnisnamen zum Sample und den Index 0 eingeben. Das geht so:
sample "/pfad/zu/meinen/samples/", 0
Wir können sogar eine Vernküpfung zu unserem Verzeichnis anlegen, indem wir eine Variable nutzen:
samps = "/pfad/zu/meinen/samples/"
sample samps, 0
Wenn wir nun das zweite Sample in unserem Verzeichnis abspielen wollen, müssen wir lediglich den Index 1 anfügen:
samps = "/pfad/zu/meinen/samples/"
sample samps, 1
Beachte, dass wir nicht mehr die Namen der Samples im Verzeichnis kennen müssen, wir benötigen nur das Verzeichnis (oder haben eine Verknüpfung zu diesem). Wenn wir nach einem Index fragen, der größer als die Anzahl der Samples ist, fängt die Liste einfach von vorne an - wie bei Ringen. Also egal welche Nummer wir nutzen, es ist garantiert, dass wir ein Sample aus dem Verzeichnis bekommen.
Gewöhnlich reicht das Indizieren aus, aber manchmal benötigen wir mehr Möglichkeiten beim Organisieren unserer Samples. Glücklicherweise ergänzen viele Sample-Packs nützliche Informationen in ihre Dateinamen. Lass uns noch einmal einen Blick auf die Dateinamen in unserem Verzeichnis werfen:
100_A#_melody1.wav
100_A#_melody2.wav
100_A#_melody3.wav
120_A#_melody4.wav
120_Bb_guit1.wav
120_Bb_piano1.wav
In diesen Dateinamen sind einige Informationen enthalten. Zuerst haben wir die BPM (“beats per minute”) des Samples. D.h. das Piano Sample hat 120 BPM und unsere ersten drei Melodien haben 100 BPM. Außerdem steht in den Samplenamen die Tonart. Das Gitarren-Sample ist in Bb und die Melodien sind in A#. Diese Information ist für das Mixen der Samples in unserem Code sehr wichtig. Zum Beispiel wissen wir, dass wir das Piano-Sample nur mit Code verwenden können, der 120 BPM und die Tonart Bb hat.
Es stellt sich heraus, dass wir dies spezielle Namensgebung unserer Sample-Sets im Code nutzen können, um herauszufiltern, was wir wollen. Wenn wir zum Beispiel mit 120 BPM arbeiten, können wir mit folgendem Code alle Samples filtern, deren Name den String “120” enthält:
samps = "/pfad/zu/meinen/samples/"
sample samps, "120"
Dieser Code wird das erste passende Sample abspielen. Wenn wir das zweite passende Sample abspielen wollen, müssen wir nur einen Index nutzen:
samps = "/pfad/zu/meinen/samples/“
sample samps, "120", 1
Wir können sogar mehrere Filter gleichzeitig nutzen. Der folgende Code findet für uns ein Sample, dessen Name sowohl den String “120” als auch den String “A#” enthält:
samps = "/pfad/zu/meinen/samples/"
sample samps, "120", "A#"
Schließlich können wir auch noch unsere üblichen Optionen beim Abspielen des Samples anhängen:
samps = "/pfad/zu/meinen/samples/"
sample samps, "120", "Bb", 1, lpf: 70, amp: 2
Das Filter-System für Samples versteht zwei Typen von Informationen: Quellen und Filter. Quellen bieten Informationen, um eine Liste möglicher Kandidaten zu versammeln. Eine Quelle kann in zwei Formen angegeben werden:
Der sample
-Befehl sammelt alle Quellen und erzeugt daraus eine lange Liste von Kandidaten. Für diese Liste durchsucht er zunächst alle gültigen Verzeichnispfade und fügt dann alle darin enthaltenen Dateien in den Formaten .flac
, .aif
, .aiff
, .wav
, .wave
hinzu.
Schau Dir z. B. den folgenden Code an:
samps = "/pfad/zu/meinen/samples/"
samps2 = "/pfad/zu/meinen/samples2/"
path = "/pfad/zu/meinen/samples3/foo.wav"
sample samps, samps2, path, 0
Hier sammeln wir alle Samples aus zwei Verzeichnissen und fügen noch einen einzelnen Sample hinzu. Wenn "/pfad/zu/meinen/samples/"
3 Samples und "/path/to/my/samples2/"
12 Samples enthielte, hätten wir insgesamt 16 mögliche Samples, die wir indexieren und filtern können (3 + 12 + 1).
Normalerweise werden nur die Sample-Dateien des angegebenen Verzeichnisses in der Kandidatenliste versammelt. Manchmal möchtest Du vielleicht eine ganze Reihe ineinander verschachtelter Ordner mit Samples durchsuchen und filtern. Das kannst Du mit einer rekursiven Suche nach allen Samples in allen Unterordnern erreichen, indem Du **
an das Ende des Pfads stellst:
samps = "/path/to/nested/samples/**"
sample samps, 0
Sei aber vorsichtig, weil eine Suche über viele Verzeichnisse hinweg lange dauern kann. Allerdings wird der Inhalt aller Ordner, die Du als Quellen angegeben hast, zwischengespeichert; die Suche wird also nur beim ersten Mal langsam sein.
Ein wichtiger Punkt zum Abschluss: Die Quelle muss als erstes angegeben werden. Wenn Du keine Quelle angibst, werden die mitgelieferten Samples für die Standardliste ausgewählt, mit der Du dann weiter arbeitest.
Wenn Du einmal die Kandidatenliste hast, kannst du die folgenden Filtertypen zur weiteren Auswahl benutzen:
"foo"
Filtert alle Dateinamen, in denen diese Zeichenkette vorkommt (ohne den Verzeichnispfad und die Dateiendung)./fo[oO]/
Filtert alle Dateinamen, die diesem regulären Ausdruck entsprechen (ohne den Verzeichnispfad und die Dateiendung).:foo
- Filtert alle Kandidaten, wo dieses Kennwort genau dem Dateinamen entspricht (ohne den Verzeichnispfad und die Dateiendung).lambda{|a| ... }
- Procs mit einem Argument werden als Filter für Kandidaten oder Generator-Funktionen behandelt. Diesem wird die Liste der aktuellen Kandidaten übergeben und er gibt eine neue Liste von Kandidaten zurück (eine Liste gültiger Pfade zu Sample-Dateien).1
- Zahlen wählen direkt den Kandidaten aus, dessen Index dieser Zahl entspricht (wenn nötig wird wie bei einem Ring von vorne begonnen).Wir können z. B. alle Samples in einem Verzeichnis herausfiltern, deren Dateinamen die Zeichenkette "foo"
enthalten, und davon das erste passende Sample mit halber Geschwindigkeit spielen:
sample "/path/to/samples", "foo", rate: 0.5
Sieh’ Dir dazu den Hilfeeintrag zu sample
mit vielen Anwendungsbeispielen an. Achte darauf, dass die Sortierung der Filter eine Rolle spielt.
Schließlich: Du kannst eine Liste verwenden, wo immer Du eine Quelle oder einen Filter anwendest. Die Liste wird automatisch aufgelöst und ihr Inhalt so behandelt, als wäre er eine normale Quellen- oder Filterangabe. Deshalb bedeuten die folgenden Aufrufe von sample
alle dasselbe:
sample "/path/to/dir", "100", "C#"
sample ["/path/to/dir", "100", "C#"]
sample "/path/to/dir", ["100", "C#"]
sample ["/path/to/dir", ["100", ["C#"]]]
Das war ein komplizierter Abschnitt für alle, die tiefer in Sample-Pakete einsteigen möchten. Mach’ Dir keine Sorgen, wenn vieles von dem, was hier steht, für Dich im Moment noch wenig Sinn macht. Es ist gut möglich, dass Du davon vieles noch nicht brauchst. Dennoch, Du wirst schon merken, wenn Du es brauchst, und dann kannst Du zurückkommen und den Abschnitt noch einmal lesen, wenn Du einmal mit umfangreichen Sample-Sammlungen hantieren möchtest.