Introducción al Live Coding

Cómo hacer música en tu ordenador con Sonic Pi

algorave

¿Qué es el livecoding?

Expresión artística en la que se crea música y/o visuales en directo, normalmente de forma improvisada, escribiendo código con diferentes lenguajes de programación.

  • TOPLAP ~> Manifesto!

  • “Show us your screens!!”

  • Composiciones efímeras y improvisadas ~> Algorave.

  • Filosofía open source.

  • No tiene un género musical concreto: EDM, Jazz, Música Clásica, noise …

Ejemplos

Benoît and the Mandelbrots @ Stadtgeburtstag Karlsruhe (2013)

Yaxu (TidalCycles) + Rituals (visual) (2016)

Qirky (FoxDot) (Algosix Live Stream Performance - 2018)

Sam Aaron - Sonic Pi + Guitarra (2014)

Sonic Pi

Sonic Pi

  • Dr. Sam Aaron.

  • Universidad de Cambridge.

  • SuperCollider + Ruby

  • Primera versión fue en 2012.

  • Pedagogía de programación.

  • Disponible para Mac, Windows, GNU/Linux y Raspberry Pi.

Descarga Sonic Pi

http://sonic-pi.net/

Interface Sonic Pi

interface

Taller

Primeros pasos

play 50
play :D3

50 es la nota midi que se corresponde al Re de la 3ª octava

Samples

sample :bd_haus

Sintetizadores

synth :chipbass
use_synth :chiplead
play :e1

Play

play 60
play 67
play 69

¿Suenan todas las notas?

Sleep

play 60
sleep 1
play 67
sleep 1
play 69

sleep 1, significa que Sonic Pi espera 1 beat (=1 segundo) para ejecutar el siguiente sonido.

Las diferentes notas en SP …

notas

notas

y octavas …

octavas

BPM

Beats por minuto -> cantidad de notas por minuto

use_bpm 120

play 60
sleep 1
play 67
sleep 1
play 69

Bucles

Bucle finito

4.times do
sample :bd_haus
sleep 1
end

Bucle infinito

loop do
sample :bd_haus
sleep 1
end

¿sonarán a la vez?

4.times do
sample :bd_haus
sleep 1
end

8.times do
sample :sn_dolf
sleep 1
end

¿y ahora?

loop do
sample :bd_haus
sleep 1
end

loop do
sample :sn_dolf
sleep 1
end
¿y ahora?
in_thread do
sample :bd_haus
sleep 1
end

loop do
sample :sn_dolf
sleep 1
end

¡así sí!

el super bucle

live_loop :nombre do
sample :bd_haus
sleep 1
end
live_loop :drum do
sample :bd_haus
sleep 1
end

live_loop :sna do
sample :sn_dolf
sleep 1
end

➔ tiene que llevar nombre

➔ puedes poner cuantos quieras, suenan a la vez!!

➔ se pueden modificar en directo

Azar

rrand() ~> número aleatorio entre un minimo y un maximo (no inclusives)

play rrand (60, 90)

rrand_i() ~> número natural aleatorio entre minimo y maximo (inclusives)

play rrand_i (50, 100)

rand() ~> número entre 0 y un máximo (por defecto es 1)

play 60, amp: rand

rand_i() ~> número natural entre 0 y un máximo (por defecto es 1)

play 60, amp: rand_i(4)

  • Choose ~> escoge un valor al azar

play choose([60, 65, 72])

  • one_in ~> verdadero o falso

puts one_in(6)

  • Shuffle ~> mezcla aleatoria

puts ([:e2,:e4,:e1]).shuffle

  • dice ~> dado

dice(6)

¿Existe de verdad el azar?

use_random_seed 34553

Condicionales

loop do
play 50, amp: 0.3, release: 2
play 53, amp: 0.3, release: 2 if one_in(2)
play 57, amp: 0.3, release: 2 if one_in(3)
play 60, amp: 0.3, release: 2 if one_in(4)
sleep 1.5
end
loop do
if one_in(2)
sample :drum_heavy_kick
else
sample :drum_cymbal_closed
end
sleep 0.5
end

Efectos

live_loop :efecto do
  with_fx :reverb do
    play 50
    sleep 0.5
    sample :elec_plip
    sleep 0.5
    play 62
  end
end

prueba echo, wobble, distorsion, slicer, …

Variables

Variables del sonido

variables

play :e3, amp: 0.5, pan: 0, attack: 0.1, decay: 0.1,
sustain: 0.2, release: 2
synth :chipbass, note: :e4, amp: 0.5, pan: 0,
attack: 0.1, decay: 0.1, sustain: 0.2, release: 2
synth :chipbass, note: :e4, amp: 0.5,
pan: 0, attack: 0.1, decay: 0.1, sustain: 0.2, release: 2

rate (solo para samples): el tiempo que tarda en ejecutar el sample.

sample :drum_bass_hard, rate: 1

por defecto es 1. Con rate 2 el sonido se ejecuta en la mitad de tiempo.

sample :loop_amen, start: 0.5, finish: 0.8, 
cutoff: 80, rate: 1

Estructura de datos

Vectores

Lista finita de valores…

[1,-1,2,-2] posición 0= [1,-1,2,-2][0] = 1 posición 1= [1,-1,2,-2][1] = -1 posición 2= [1,-1,2,-2][2] = 2 …

Volvemos con las melodías…

play 48
sleep 0.5
play 50
sleep 0.5
play 52
sleep 0.5
play 53
sleep 0.5
play 55
sleep 0.5
play 57
sleep 0.5
play 59
sleep 0.5

¿A qué es largo escribir?

Anillos

Lista infinita de valores …

(ring 1,2,3,4)= 1,2,3,4,1,2,3,4… posición 0= (ring 1,2,3,4)[0] = 1 posición 1= (ring 1,2,3,4)[1] = -1 …

Se puede simplificar…

play_pattern_timed [48,50,52,53,55,57,59],0,5
play_pattern_timed
[48,50,52,53,55,57,59],[0.5,0.5,0.5,0.5,0.5,0.5,0.5]

Acordes

Acorde mayor de MI (e3):

(chord :e3, :major)

~> Es el anillo (ring 52,56,59) que a su vez es la secuencia 52,56,59,52,56,59,52,56,59, …

Escalas

Escala mayor de MI (e3), con 3 octavas:

(scale :e3, :major, num_octaves: 3)

~> es el anillo (ring 52,54,56,57,59,61,63,64) que a su vez es la secuencia 52,54,56,57,59,61,63,64,52,54,56,57,5…

Las notas hacen referencia a frecuencias…

use_synth :fm
print "Escala normal"
escala = [:c,:cs,:d,:ds,:e,:f,:fs,:g,:gs,:a,:as,:b,:c5]
escala.each do |nota|
  play nota
  print midi_to_hz(nota)
  sleep 0.5
end

Variables

Cajones para guardar cosas…

vol=1
play :e4, amp: vol
n=(ring :e1,:e2)
4.times do
  play n.choose
  sleep 0.4
end

tick y look

tick es un índice …

live_loop :tick do
  play (ring 60, 55, 50).tick
  sleep 1
end

##… que se incrementa en uno cada ciclo

live_loop :random do
  use_synth :tb303
  use_random_seed 30
  notas = (scale :e3, :minor_pentatonic).shuffle
  16.times do
    play notas.tick, release: 0.125, cutoff: rrand(60,90)
    sleep 0.25
  end
end

look señala el valor del tick en cada momento…

live_loop :look do
  tick
  play (ring 60, 55, 50).look
  sleep 1
end

Funciones

define :melodia do
  play 50
  sleep 1
  play 55
  sleep 0.5
end

Para usarlo, escribimos el nombre de la función, en este caso:

melodia

Gracias!!

Enlaces de interés

Presentación realizada con Github y Jekyll con el tema web-presentation de deepidea