Una manera de añadir interés a tu música es usando números aleatorios. Sonic Pi tiene gran funcionalidad añadiendo aleatoriedad a la música, pero antes de comenzar, debemos aprender una verdad chocante: en Sonic Pi no existe aleatoriedad real. ¿Qué significa eso?
Una función realmente útil es rrand
la cual te da un valor aleatorio entre dos números - un min y un max. (rrand
es la abreviatura para ranged random). Intentemos tocar una nota al azar:
play rrand(50, 95)
¡Ooh, tocó una nota al azar! Tocó la nota 83.7527
. Una nota entre 50 y 95 Woah, espera, predije el número correcto que obtuviste? ¡Algo raro sucede! Intenta con el código de nuevo. ¿qué? Otra vez 83.7527
? ¡Eso no es aleatorio!
La respuesta es que no es realmente aleatorio, es pseudo-aleatorio. Sonic Pi te dará números como al azar en una manera repetitiva, lo cual es muy útil para asegurar que la música que creas en tú máquina suene idéntica en cualquier otra máquina - aunque utilices números al azar en tú composición.
Claro que en una pieza musical donde quieras colocar notas al “azar” y siempre eliga 83.7527
no sería ni aleatorio ni interesante. Sin embargo, no es así. Intenta lo siguiente:
loop do
play rrand(50, 95)
sleep 0.5
end
¡Sí! Finalmente suena aleatorio. Dentro de una misma corrida las subsecuentes llamadas a funciones aleatorias dan valores..aleatorios. Sin embargo, la próxima corrida volverá a dar la misma secuencia de valores “aleatorios” y sonar exactamente igual. Es como si Sonic Pi volvió en el tiempo al mismo punto cuando se corrió run la primera vez. ¡Es el Groundhog Day de la síntesis musical!
Una buena ilustración de aleatoriedad en acción es el ejemplo haunted bells que buclee el sampleo de :perc_bell
con velocidad de Aleatoriedad y tiempo de pausa entre los sonidos:
loop do
sample :perc_bell, rate: (rrand 0.125, 1.5)
sleep rrand(0.2, 2)
end
Otro buen ejemplo de aleatoriedad es modificar el momento de corte de un sintetizador, en forma aleatoria. Un gran synth en el que hacerlo es el emulador :tb303
use_synth :tb303
loop do
play 50, release: 0.1, cutoff: rrand(60, 120)
sleep 0.125
end
¿Entonces qué, no te gusta la particular secuencia de números al azar que provee Sonic Pi? Bueno, es totalmente posible elegir un punto de comienzo via use_random_seed
. Predeterminado está a 0, así que: ¡elige una semilla diferente para una aleatoriedad diferente!
Considera lo siguiente:
5.times do
play rrand(50, 100)
sleep 0.5
end
Cada vez que corras ese código escucharás la misma secuencia de 5 notas. Para cambiar la secuencia, simplemente cambia el valor de seed_:
use_random_seed 40
5.times do
play rrand(50, 100)
sleep 0.5
end
Esto producirá una diferente secuencia de 5 notas. Al cambiar el valor de seed y escuchar los resultados, puedes encontrar algo que te guste y cuando lo compartas con otros, escucharán exactamente lo mismo.
Veamos otras útiles funciones de aleatoriedad.
Una cuestión común es elegir un ítem desde una lista de ítems conocidos Por ejemplo, quiero tocar una nota de entre las siguientes: 60, 65 or 72. Puedo lograr eso con choose
pues me deja elegir un ítem de esa lista. Primero necesito confeccionar mi listado entre paréntesis cuadrados y separándolos por comas: [60, 65, 72]
. Después sólo necesito pasarlos por choose
:
choose([60, 65, 72])
Escuchemos como suena:
loop do
play choose([60, 65, 72])
sleep 1
end
Ya hemos visto la función rrand
, pero adentrémonos más en ella. Nos proporciona un número aleatorio entre dos valores. Eso significa que nunca nos dará los números extremos del rango, sólo entre ellos. Ese número será un ‘flotante’, lo que significa que no es un número entero, sino una fracción de número. He aquí ejemplos de flotantes: rrand(20, 110)
:
Ocasionalmente querrás un número entero aleatorio, no un flotante. Es entonces que rrand_i
viene al rescate. Funcional similarmente a rrand
excepto que incluye los valores mínimo y máximo como potenciales aleatorios (lo que significa que es inclusiva y no excluyente de los valores extremos del rango). Ejemplos de números con rrand_i(20, 110)
son:
Esta función te regresará un número aleatorio flotante incluyendo los valores 0 y el máximo especificado. Predeterminado está el rango entre 0 y 1. Por ello es útil para elegir valores de amp:
aleatorios:
loop do
play 60, amp: rand
sleep 0.25
end
De maneara similar a rrand_i
y rrand
, rand_i
nos dará un número leatorio ENTERO entre 0 y el máximo especificado.
Alguna vez querrás emular el tiro de un dado. Para ello tenemos un caso especial de rrand_i
donde el valor inferior será siempre 1. El uso de dice
requiere que especifiques el número de lados del dado. Un dado estándard tiene 6 lados, así dice(6)
actuará similarmente, dando valores de1, 2, 3, 4, 5, or 6. Sin embargo, como en los juegos de role-play encontrarás necesidad de un dado de 4, 12, 20 o inclusive de 120 caras..
Finalmente cuando quieras emular tirar el máximo puntaje con un dado, como 6 en un dado estándard one_in
te dará eso con una posibilidad de uno en número de lados del dado. Por lo tanto, one_in(6)
nos dará verdad con una probabilidad de 1 en 6 o falso. Verdadero y falso son valores muy útiles para if
el cual cubriremos en la siguiente sección de este tutorial.
¡Ahora ve a jugar con códigos y algo de aleatoriedad!