Aratu música escrita para tocar y cambiar mientras suena

4. Dar nombre a las cosas

▶ Abrir en Aratu para escuchar y cambiar los ejemplos

Esta tabla es el corazón de esta parte: para cada cosa de Aratu, el nombre que tendría en programación, y a qué se parece.

En Aratu En términos de programación Parecido a
melodia = | do4 re mi fa | un enlace (binding) de un nombre a un valor; el valor es una secuencia de compases una constante: no cambia mientras suena; cada edición la define de nuevo
una línea una secuencia circular: al terminar, vuelve al principio un clip en loop en una DAW
drums { hh = …; bd = … } un registro o namespace: un mapa de nombres a líneas un objeto (drums.hh)
bajo.reverb.mix = 0.42 asignación de propiedad en una ruta de un mapa anidado (parte → efecto → parámetro) bajo.reverb.mix = 0.42 en JavaScript, o una regla de CSS
bajo: synth.saw -> lowpass -> reverb un pipeline: la salida de cada uno es la entrada del siguiente composición de funciones, reverb(lowpass(saw)), o el | de la terminal
synth.saw, piano.grand una clave de un catálogo (un enum): un nombre que elige un sonido listo un valor de una lista fija; no es un método
motif riff = [mi4 re do re] una macro: el nombre se cambia por su contenido donde aparece una función sin efectos secundarios, expandida en su lugar (inlining)
riff+2, riff+3st el motivo con un argumento: la transposición riff(2)
riff.inv, riff.retro, serie.P5 una transformación pura escrita con punto: devuelve un motivo nuevo y no cambia el original un método o propiedad calculada sin paréntesis
row serie = 0 11 3 4 … un vector (array) de enteros de 0 a 11 [0, 11, 3, 4, …]
| o o o o | from serie.P0 un zip del ritmo con el vector, que empieza de nuevo al terminar; cada o es un marcador para completar zip(ritmo, cycle(serie))
list temas { … } un array de melodías, contado desde 1 temas[1] en JavaScript es temas.2 en Aratu
temas.all, temas.random concatenación; elección al azar de un elemento temas.flat(), temas[random()]
{do|sol} elección al azar, sorteada en cada vuelta random.choice
c?30% un evento con probabilidad del 30% if (random() < 0.3)
seed 7 la semilla del generador pseudoaleatorio: la misma semilla da el mismo resultado Random(7)
pattern groove { … } un bloque con nombre de líneas un componente, una escena, una plantilla
play groove x3, fill una playlist: una secuencia con repeticiones, en loop una lista de escenas
|: :|, %, D.S. al coda saltos de la partitura, resueltos antes de tocar un goto que el compilador desenrolla
[mi4 re]x4, riffx4 repetición desenrollada: se vuelve cuatro copias loop unrolling
p:, mf: un estado que vale para las notas siguientes de la línea el "color actual" en una biblioteca de dibujo
300 Hz -> 4000 Hz over 4 bars interpolación de un valor en el tiempo (en escala logarítmica para frecuencias) tween, automatización por keyframes
una perilla enlace en los dos sentidos: girarla reescribe el número del texto two-way binding; el texto sigue siendo la fuente de verdad

¿at bar es un switch?

No exactamente. Un switch (o case) elige un camino entre varios, cada vez que se ejecuta, según un valor. Un at bar es una regla indexada por el tiempo: a partir del compás 9, eso vale, y sigue valiendo hasta que otra regla cambie lo mismo. Se parece más a un keyframe en una animación, o a un evento marcado en una línea de tiempo.

tempo: 110
bajo = | do2 _ sol1 _ |
at bar 5: bajo.reverb.mix = 0.6
at bar 9: bajo: out

Para saber el estado en el compás 12, Aratu junta las reglas de todos los compases hasta ahí: el reverb está en 0.6 (desde el 5) y el bajo está fuera (desde el 9). En programación, eso es un pliegue (fold) de los cambios, en orden de tiempo. from bar 9 to 16: es una regla con principio y fin: fuera del tramo no entra en el pliegue, y vuelve a valer lo que venía antes.

El every, en cambio, es lo más parecido a un if con el número del compás:

tempo: 110
pattern groove { hh = cc cc cc cc; bd = b - b -; sd = - s - s }
pattern fill { sd = ss ss SS SS }
play groove
every 4 bars: play fill

every 4 bars: play fill quiere decir, compás a compás, "si este es el último de cada cuatro, toca el redoble en su lugar": if (compas % 4 == 0). Y every 4 bars, first: es if (compas % 4 == 1).