Beim Abrufen und Einstellen von Informationen in den Zeitzustand ist es möglich, komplexere Tasten zu verwenden als einfache Symbole wie :foo
und :bar
. Sie können auch Zeichenketten im URL-Stil verwenden, wie z.B. "/foo/bar/baz"
. Sobald wir mit Pfaden arbeiten, können wir dann die Vorteile des ausgeklügelten Pattern-Matching-Systems von Sonic Pi nutzen, um get
und sync
mit ähnlichen' und nicht mit
identischen’ Pfaden zu synchronisieren. Lass uns einen Blick darauf werfen.
Angenommen wir möchten auf ein Ereignis warten, das die folgenden drei Pfad-Segmente enthält:
sync "/*/*/*"
Hiermit kann man auf jegliches Time State Ereignis syncen, dass aus exakt drei Pfadsegmenten besteht, unabhängig davon, was genau der Inhalt der Segmente ist. Schauen wir uns das an einem Beispiel an:
cue "/foo/bar/baz"
cue "/foo/baz/quux"
cue "/eggs/beans/toast"
cue "/moog/synths/rule"
Allerdings wird es nicht auf Ereignisse “matchen”, die weniger oder mehr Pfad-Segmente hätten. Die folgenden würden nicht erkannt und damit kein Ereignis triggern:
cue "/foo/bar"
cue "/foo/baz/quux/quaax"
cue "/eggs"
Jeder *
bedeutet irgendein Inhalt. Das heisst, wie können Pfade mit nur einem Segment mit /*
oder Pfade aus fünf Segmenten mit /*/*/*/*/*
erkennen
Wenn wir wissen, womit das Segment beginnen oder enden wird, können wir zusätzlich zu einem Teilsegmentnamen ein *
verwenden. Zum Beispiel: "/foo/b*/baz"
passt auf jeden Pfad, der drei Segmente hat, von denen das erste foo
, das letzte baz
und das mittlere Segment alles sein können, was mit b
beginnt. Also, es würde passen:
cue "/foo/bar/baz"
cue "/foo/baz/baz"
cue "/foo/beans/baz"
Allerdings erkennt es nicht das Folgende:
cue "/foo/flibble/baz"
cue "/foo/abaz/baz"
cue "/foo/beans/baz/eggs"
Du kannst das *
auch an den Anfang des Segments setzen, um die letzten Zeichen eines Segments anzugeben: "/foo/*zz/baz"
, das jedem 3-Segment cue
oder set
entspricht, wobei das erste Segment foo
ist, das letzte baz
ist und das mittlere Segment mit zz
endet, wie "cue "/foo/whizz/baz"
.
Manchmal weiß man nicht, wie viele Pfadsegmente man zuordnen möchte. In diesen Fällen kannst Du den mächtigen Doppelstern: **
wie "/foo/**/**/baz"
verwenden, der übereinstimmt:
cue "/foo/bar/baz"
cue "/foo/bar/beans/baz"
cue "/foo/baz"
cue "/foo/a/b/c/d/e/f/baz"
Du kann das ?
verwenden, um auf ein bestimmtes einzelnes Zeichen zu erkennen. "/?oo/bar/baz"
passt auf:
cue "/foo/bar/baz"
cue "/goo/bar/baz"
cue "/too/bar/baz"
cue "/woo/bar/baz"
foo
cue "/foo/bar/quux"
cue "/foo/beans/quux"
cue "/foo/eggs/quux"
foo
cue "/foo/aux/baz"
cue "/foo/bux/baz"
cue "/foo/cux/baz"
foo
cue "/foo/aux/baz"
cue "/foo/bux/baz"
cue "/foo/cux/baz"
cue "/foo/dux/baz"
cue "/foo/eux/baz"
Wenn du sync
oder get
aufrufst, kannst du Mustererkenner in beliebiger Reihenfolge kombinieren um jedes beliebige Time State Event, das durch cue
oder set
erzeugt wurde zu erkennen. Lass uns ein verrücktes Beispiel anschauen:
in_thread do
sync "/?oo/[a-z]*/**/ba*/{quux,quaax}/"
sample :loop_amen
end
sleep 1
cue "/foo/beans/a/b/c/d/e/bark/quux/"
Für die Neugierigen, diese Regeln zur Mustererkennung basieren auf der Open Sound Control Spezifikation zur Mustererkennung, die hier im Detail erklärt ist: http://opensoundcontrol.org/spec-1_0