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: outPara 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 fillevery 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).