Live Coding (Programación en vivo)

El rayo láser atravesaba las nubes de humo; el subwoofer bombeaba las notas graves muy profundamente, en los cuerpos del público. El ambiente estaba cargado con una embriagadora mezcla de sintetizadores y baile. Sin embargo, algo no llegaba a encajar del todo en esta discoteca. Proyectado en colores brillantes, encima de la cabina de DJ, había un texto moviéndose, bailando, relampagueante. No eran efectos visuales, sino una simple proyección de Sonic Pi ejecutándose en una Raspberri Pi. La persona que estaba en la cabina de DJ no estaba tocando discos; estaba escribiendo, editando y evaluando código. En vivo. Esto es Live Coding.

Sam Aaron Live Coding

Esto puede sonar como la disparatada historia de una discoteca futurista, pero escribie música en código como en esta historia es una tendencia cada vez más extendida, y se suele llamar por el nombre de Live Coding (http://toplap.org). Una de las direcciones más recientes que este estilo ha tomado es el Algorave (http://algorave.com) - eventos en los que l@s artistas como yo programamos música para que la gente baile. No obstante, no tienes por qué estar en una discoteca para hacer Live Coding - con Sonic Pi versión 2.6 (y posteriores), puedes hacerlo siempre que tengas a mano tu Raspberry Pi y un par de auriculares o unos altavoces. Una vez llegues al final de este artículo, programarás tus propios beats y sabrás modificarlos en vivo y en directo. A dónde llegues después de esto está en el poder de tu imaginación.

Bucle en Vivo

La clave para hacer live coding con Sonic Pi está en manejar el live_loop (bucle en vivo). Vamos a ver uno:

live_loop :beats do
  sample :bd_haus
  sleep 0.5
end

Un live_loop tiene 4 ingredientes fundamentales. El primero es su nombre. Nuestro live_loop de arriba se llama :beats. Eres libre de llamar a tu live_loop como quieras. Haz una locura. Sé creativ@. Yo suelo usar nombres que comuniquen algo sobre la música que va a sonar, pensando en el público. El segundo ingrediente es la palabra do que marca dónde empieza el live_loop. El tercer ingrediente es la palabra end que marca dónde el live_loop acaba, y finalmente está el cuerpo del live_loop que describe qué es lo que va a repetir el bucle (ésta es la parte entre el do y el end). En este caso estamos tocando de forma repetida un bombo de batería y luego esperamos durante medio pulso. Esto produce un pulso grave regular perfecto. Adelante, cópialo en un búfer vacío de Sonic Pi y dale a Ejecutar. ¡Boom, Boom, Boom!.

Redefiniendo al vuelo

Vale, entonces, ¿qué hace al live_loop tan especial? ¡Hasta ahora parecía un loop glorificado! Pues bien, la belleza de los live_loops está en que puedes redefinirlos sobre la marcha, al vuelo. Esto significa que mientras que éstos se ejecutan, puedes cambiar lo que hacen. Éste es el secreto de hacer live coding con Sonic Pi. Vamos a tocar un poco:

live_loop :choral_drone do
  sample :ambi_choir, rate: 0.4
  sleep 1
end

Ahora pulsa el botón de Ejecutar o presiona las teclas alt-r. Ahora mismo estás escuchando unos coros preciosos. Ahora, mientras suenan, cambia el rate de 0.4 a 0.38. Dale a Ejecutar de nuevo. ¡Guau! ¿Notas cómo ha cambiado la nota del coro? Cámbialo de nuevo a 0.4 para volver a cómo era antes. Ahora bájalo a 0.2, luego a 0.19 y después vuelve a 0.4. ¿Ves cómo el cambiar un sólo parámetro sobre la marcha, te puede dar control de verdad sobre la música? Ahora trastea con el rate tú mism@ - escoge tus propios valores. Prueba con números neativos, números muy pequeños y números muy grandes. ¡Que te diviertas!

Dormir es importante

Una de las lecciones más importantes sobre el live_loop es que necesitan descansar. Mira el siguiente live_loop:

live_loop :infinite_impossibilities do
  sample :ambi_choir
end

Si intentas ejecutar este código, verás de inmediato a Sonic Pi quejándose de que el live_loop no durmió. ¡Esto es el sistema de seguridad haciendo efecto! Tómate un segundo para pensar en lo que este código le está pidiendo al ordenador que haga. Efectivamente, le está pidiendo al ordenador que toque un número infinito de samples de coro en cero segundos. De no ser por el sistema de seguridad, el pobre ordenador intentará hacerlo y se colgará y arderá en el proceso. Así que recuerda, tu live_loop debe contener un sleep.

Combinando Sonidos

La música está llena de cosas pasando a la vez. La batería a la vez que el bajo a la vez que las voces a la vez que las guitarras… En informática llamamos a esto concurrencia, y Sonic Pi nos ofrece una forma increíblemente fácil de tocar varias cosas a la vez. Sencillamente, ¡usa más de un live_loop!

live_loop :beats do
  sample :bd_tek
  with_fx :echo, phase: 0.125, mix: 0.4 do
    sample  :drum_cymbal_soft, sustain: 0, release: 0.1
    sleep 0.5
  end
end
live_loop :bass do
  use_synth :tb303
  synth :tb303, note: :e1, release: 4, cutoff: 120, cutoff_attack: 1
  sleep 4
end

Aquí tenemos dos live_loops, uno dando la vuelta rápido marcando el pulso, y otro dando la vuelta lentamente y tocando un sonido de bajo muy loco.

Una de las cosas interesantes que tiene el usar varios live_loops es que cada uno gestiona su propio tiempo. Esto significa que es muy fácil crear estructuras polirrítimicas interesantes, e incluso tocar con fases al estilo de Steve Reich. Échale un ojo a esto:

# Steve Reich's Piano Phase
notes = (ring :E4, :Fs4, :B4, :Cs5, :D5, :Fs4, :E4, :Cs5, :B4, :Fs4, :D5, :Cs5)
live_loop :slow do
  play notes.tick, release: 0.1
  sleep 0.3
end
live_loop :faster do
  play notes.tick, release: 0.1
  sleep 0.295
end

Juntándolo todo

En cada uno de estos tutoriales, vamos a acabar con un ejemplo final en forma de una pieza de música, que coge un poco de todas las ideas que hemos ido introduciendo. Lee este código y mira si puedes imaginarte lo que está haciendo. Después, cópialo en un búfer vacío en Sonic Pi, dale a Ejecutar y escucha cómo suena. Finalmente, cambia uno de los números o comenta y descomenta cosas. Mira si puedes utilizar esto como un punto de partida para una nueva actuación, y sobre todo, ¡para pasártelo bien! Hasta la próxima…

with_fx :reverb, room: 1 do
  live_loop :time do
    synth :prophet, release: 8, note: :e1, cutoff: 90, amp: 3
    sleep 8
  end
end
live_loop :machine do
  sample :loop_garzul, rate: 0.5, finish: 0.25
  sample :loop_industrial, beat_stretch: 4, amp: 1
  sleep 4
end
live_loop :kik do
  sample :bd_haus, amp: 2
  sleep 0.5
end
with_fx :echo do
  live_loop :vortex do
    # use_random_seed 800
    notes = (scale :e3, :minor_pentatonic, num_octaves: 3)
    16.times do
      play notes.choose, release: 0.1, amp: 1.5
      sleep 0.125
    end
  end
end