Al obtener y establecer información en el Estado de Tiempo, es posible utilizar claves más complejas que los símbolos básicos como :foo
y :bar
. También se pueden utilizar cadenas de estilo URL llamadas rutas como "/foo/bar/baz"
. Una vez que empecemos a trabajar con rutas, podemos empezar a aprovechar el sofisticado sistema de concordancia de patrones de Sonic Pi para get
(obtener) y sync
(sincronizar) con rutas similares en lugar de idénticas. Echemos un vistazo.
Let’s assume we want to wait for the next event that has three path segments:
sync "/*/*/*"
This will match any Time State event with exactly three path segments, regardless of their names. For example:
cue "/eggs/beans/toast"
cue "/moog/synths/rule"
However, it will not match paths with fewer or more path segments. The following will not match:
cue "/eggs"
Each *
means any content. So we could match paths with just one segment with /*
or paths with five segments with /*/*/*/*/*
Si sabemos con qué va a empezar o terminar el segmento, podemos utilizar un *
además de un nombre de segmento parcial. Por ejemplo: "/foo/b*/baz"
coincidirá con cualquier ruta que tenga tres segmentos, el primero de los cuales es foo
, el último baz
y el segmento del medio puede ser cualquier cosa que empiece por b
. Por lo tanto, coincidiría:
However, it wouldn’t match the following:
También puede colocar el *
al principio del segmento para especificar los últimos caracteres de un segmento: "/foo/*zz/baz"
que coincidirá con cualquier cue
o set
de 3 segmentos donde el primer segmento sea foo
, el último sea baz
y el segmento del medio termine con zz
como "cue "/foo/whizz/baz"
.
A veces no se sabe con cuántos segmentos de la ruta se quiere hacer coincidir. En estos casos puede utilizar la poderosa estrella doble: **
como "/foo/**/baz"
que coincidirá:
You can use the ?
character to match against a single char such as "/?oo/bar/baz"
which will match:
cue "/goo/bar/baz"
cue "/too/bar/baz"
cue "/woo/bar/baz"
Si sabe que un segmento puede ser uno de un número selecto de palabras, puede utilizar los comparadores {
y }
para especificar una lista de opciones como "/foo/{bar,beans,eggs}/quux"
que sólo coincidirá con lo siguiente:
Por último, puede comparar con una selección de letras si utiliza los comparadores [
y ]
para especificar una lista de opciones como "/foo/[abc]ux/baz"
que sólo coincidirá:
También puede utilizar el carácter -
para especificar rangos de letras. Por ejemplo, "/foo/[a-e]ux/baz"
, que sólo coincidirá con:
Al llamar a sync
o get
eres libre de combinar “matchers” en el orden que consideres oportuno para hacer coincidir poderosamente cualquier evento de Time State creado por cue
o set
. Veamos un ejemplo muy rebuscado:
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/"
For those curious, these matching rules are based on the Open Sound Control pattern matching specification which is explained in detail here: http://opensoundcontrol.org/spec-1_0