En el episodio 3 de esta serie sobre Sonic Pi vimos como hace loop, alargar y filtrar uno de los más famosos ritmos de batería de todos los tiempos - el ritmo Amen. En este tutorial vamos a llevar esto un paso más allá y aprenderemos como cortarlo en trozos, reordenar los trozos, y pegarlos juntos de nuevo en un orden completamente diferente. Si esto te suena un poco a locura, no te preocupes, pronto será más claro y tu controlarás una nueva y potente herramienta para manejar tus sesiones de live coding.
Antes de que empecemos detengámonos un momento para entender como trabajar con samples. Hasta ahora, hemos jugado con el potente sampler de Sonic Pi. Y si no, probémoslo ahora! Enciende tu Raspberry Pi, inicia Sonic Pi desde el menú Programación, escribe lo que viene a continuación en un buffer nuevo y pulsa el boton Run para poder escuchar un sonido de bateria pre-grabado:
sample :loop_amen
La grabación de un sonido es simplemente representada como datos - mogollón de números entre -1 y 1 que representan los picos y valles de la onda de sonido. Si reproducimos esos números en orden, oiremos el sonido original. Sin embargo, ¿qué nos impide reproducirlo en un orden diferentes para crear un sonido nuevo?
¿Cómo se graban los samples? En realidad es bastante sencillo, una vez entiendes la física básica del sonido. Cuando haces un sonido (por ejemplo, tocando un tambor), el ruido viaja por el aire, como la superficie de un lago forma ondas cuando lanzas un guijarro al agua. Cuando esas ondas llegan a tus oídos, tu tímpano se mueve y convierte esos movimientos en el sonido que escuchas. Por tanto, si queremos grabar y reproducir un sonido, necesitamos una forma de capturar, guardar y reproducir dichas ondas. Una forma de hacer esto es usando un micrófono, que funciona como un tímpano y se mueve de un lado para otro a medida que las ondas lo golpean. El micrófono convierte su posición en una pequeña señal eléctrica, que se mide varias veces por segundo. Estas mediciones se representan como una serie de números entre -1 y 1.
Si fuéramos a visualizar en un gráfico el sonido sería un simple gráfico con información temporal en el eje x y con la posición del micrófono/altavoz como un valor entre -1 y 1 en el eje y. Puedes ver un ejemplo de un gráfico similar en la parte superior del diagrama.
Y, ¿cómo hacemos en Sonic Pi para tocar un sample en un orden diferente? Para responder a esta pregunta, debemos echarle un vistazo a las opciones start:
y finish:
de sample
. Estas opciones nos permiten controlar las posiciones de inicio y fin de reproducción de las mediciones que mencionamos antes. Los valores para estas opciones se representan como un número entre 0
y 1
, donde 0
representa el inicio del sample, y 1
es el final del sample. Entones, para tocar la primera mitad del Amen Break, sólo tenemos que especificar un finish:
de 0.5
:
sample :loop_amen, finish: 0.5
Podemos añadir en el valor `start: para que toque incluso una sección más pequeña del sample
sample :loop_amen, start: 0.25, finish: 0.5
Para probar, puedes incluso poner el valor de la opción finish:
antes del start:
y así tocará la sección macha atrás:
sample :loop_amen, start: 0.5, finish: 0.25
Ahora que sabemos que un sample es simplemente una lista de números que puede ser leída en cualquier orden y también cómo tocar una parte específica de un sample podemos empezar a pasarlo bien tocando un sample en el orden ‘equivocado’.
Vamos a coger el Amen Break y a cortarlo en 8 trozos iguales, y después vamos a cambiar el orden de las piezas. Mira el diagrama: en la parte superior, A) representa el gráfico con los datos del sample original. Al cortarlo en 8 trozos obtenemos B) (fíjate en que le hemos dado un color distinto a cada sample, para que sea fácil distinguirlos). Puedes ver los valores de inicio y fin de cada sample arriba. Finalmente, C) es un posible ordenamiento nuevo de los trozos que tenemos. Ahora podemos reproducir el sample resultante, para crear un beat nuevo. Mira el código para ver cómo hacerlo:
live_loop :beat_slicer do
slice_idx = rand_i(8)
slice_size = 0.125
s = slice_idx * slice_size
f = s + slice_size
sample :loop_amen, start: s, finish: f
sleep sample_duration :loop_amen, start: s, finish: f
end
rand_i(8)
. Entonces guardamos el índice aleatorio del trozo en la variable slice_idx
.slice_size
que es 1/8 o 0.125. El slice_size
es necesario apara nosotros para convertir slice_idx
en un valor entre 0 y 1 para que podamos usarlo en nuestra opcion start:
.s
multiplicando slice_idx
por slice_size
.f
añadiendo el slice_size
a la posición de inicio s
.s
y f
en las opciones start:
y finish:
de sample
.sleep
). Esto debería de ser la duración del trozo del sample. Por suerte Sonic Pi nos ayuda con sample_duration
que acepta las mismas opciones que sample
y simplemente nos devuelve la duración. Así pues, pasando a sample_duration
nuestras opciones start:
y finish:
, podemos saber la duración de un solo trozo.Combinemos ahora todo lo que hemos visto hasta ahora en un ejemplo final donde demostraremos cómo podemos tomar una estrategia similar para combinar aleatoriamente ritmos cortados con un ritmo de bajo para crear el inicio de un tema interesante. Ahora es tu turno - usa el código que hay aquí abajo como punto de inicio e intenta ver si puedes llevarlo en tu propia dirección para crear algo nuevo…
live_loop :sliced_amen do
n = 8
s = line(0, 1, steps: n).choose
f = s + (1.0 / n)
sample :loop_amen, beat_stretch: 2, start: s, finish: f
sleep 2.0 / n
end
live_loop :acid_bass do
with_fx :reverb, room: 1, reps: 32, amp: 0.6 do
tick
n = (octs :e0, 3).look - (knit 0, 3 * 8, -4, 3 * 8).look
co = rrand(70, 110)
synth :beep, note: n + 36, release: 0.1, wave: 0, cutoff: co
synth :tb303, note: n, release: 0.2, wave: 0, cutoff: co
sleep (ring 0.125, 0.25).look
end
end