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