Sonic Pi - Sequenciador / Bateria Eletrônica

O conceito de sequenciador / bateria eletrônica se baseia em variar parâmetros sonoros (volume, nota, instrumento, efeitos) em determinada ordem.
Para programar sequenciadores utilizaremos a função ring, que cria uma lista de valores. Este valores podem ser lidos e utilizados com o parâmetro tick ou com uma variárel, indicando um endereço na lista.

Neste exemplo a variável x funciona como endereço dos parâmetros na lista. A cada rodada do loop, o valor da variável x é acrescentado de 1:

x = 0
loop do
  use_synth :piano
  play ring(:C,:D,:C,:F).x
  sleep 0.5
  x = x + 1
end
x = 0
loop do
  use_synth :piano
  play 60, release: ring(0.9,0.1,0.9,0.2)[x]
  sleep 0.5
  x = x + 1
end
loop do
  use_synth :gnoise
  play 60, release: ring(0.1,0.3,0.1,0.5)[x]
  sleep 0.5
end
loop do
  use_synth :piano
  play ring(60,62,60,65).tick
  sleep 0.5
end

O próximo exemplo mosra sequencias de notas e outros parâmetros de um sintetizador. Observe que as listas têm tamanhos diferentes (entre dois e sete valores), criando combinações inusitadas entre os parâmetros.

use_bpm 36
x = 0
128.times do
  use_synth ring(:dsaw,:dpulse,:dtri)[x]
  play (ring(60,62,65,60)[x])- ring(12,4,8,4,6,4)[x],
    attack: ring(2,4,2,8)[x],
    sustain: ring(2,4)[x],
    release: ring(2,4,2,8,8)[x],
    detune: ring(1,0.25,4,2,8,0.1,2,0.5)[x*7],
    detune_slide: ring(2,8,2,4,2,6,2,8)[x],
    cutoff: ring(40,60,20,40,60)[x*3],
    cutoff_slide: [4,2,8][(x/2.0).to_i],
    pan: ring(-0.5,0.5)[x],
    pan_slide: ring(8,16,8)[x],
    amp: ring(0.8,1.2)[x],
    amp_slide: ring(3,6,3)[x]
  sleep ring(2,3,6,3,3,6)[x]
  x = x + 1
end