Programação ao vivo

Agora nós já aprendemos o suficiente para realmente começar a ter alguma diversão. Nesta seção nós iremos buscar itens de todas as seções anteriores e te mostrar como você pode começar a criar suas composições musicais ao vivo e transformá-las em uma performance. Para isso precisamos de 3 ingredientes principais:

Tudo bem, vamos começar. Vamos programar ao vivo nossos primeiros sons. Primeiro precisamos de uma função contendo o código que desejamos tocar. Vamos começar de forma simples. Nós também queremos chamar esta função em Loop, dentro de uma thread:

define :my_loop do #função
  play 50
  sleep 1
end
in_thread(name: :looper) do #thread
  loop do
    my_loop
  end
end

Se isto está parecendo muito complicado para você, volte e releia as seções sobre funções e threads. Não será complicado se você já tiver estudado estes itens.

O que temos aqui é uma definição de função que apenas toca a nota 50 e descansa por um beat. Em seguida, definimos uma thread chamada :looper que, em loop, chama my_looprepetidamente.

Se você executar este código, você ouvirá a nota 50 repetindo e repetindo e repetindo…

Modificando

Agora é que a diversão começa. Com o código ainda executando, modifique o 50 para um outro número, 55 por exemplo, e então pressione o botão Run outra vez. WOW! Mudou! Ao vivo!

Isso não adicionou uma nova camada porque estamos usando threads nomeadas, que permitem apenas uma thread com cada nome. Também, o som mudou porque nós redefinimos a função. Nós demos uma nova definição para :my_loop. Quando a thread :looper se repetiu ela simplesmente chamou a nova definição.

Tente modificar novamente, mude a nota, mude o tempo de descanso. Que tal adicionar um comando use_synth? Por exemplo, mude-o para:

define :my_loop do
  use_synth :tb303  # novo sintetizador
  play 50, release: 0.3
  sleep 0.25
end

Agora isso soa bem interessante, mas nós podemos apimentar um pouco mais as coisas. Em vez de tocar sempre a mesma nota, tente tocar um acorde:

define :my_loop do
  use_synth :tb303
  play chord(:e3, :minor), release: 0.3 # Mi menor
  sleep 0.5
end

Que tal tocar notas aleatórias do acorde:

define :my_loop do
  use_synth :tb303
  play choose(chord(:e3, :minor)), release: 0.3
  sleep 0.25
end
#

Ou usar um valor aleatório para cutoff:

define :my_loop do
  use_synth :tb303
  play choose(chord(:e3, :minor)), release: 0.2, cutoff: rrand(60, 130)
  sleep 0.25
end
#

Finalmente, adicione alguma bateria:

define :my_loop do
  use_synth :tb303
  sample :drum_bass_hard, rate: rrand(0.5, 2)
  play choose(chord(:e3, :minor)), release: 0.2, cutoff: rrand(60, 130)
  sleep 0.25
end
#

Agora as coisas estão ficando excitantes!

Entretanto, antes de pular e começar a programar ao vivo com funções e threads, pare o que você está fazendo e leia a próxima seção sobre live_loop que irá mudar a forma como programa no Sonic Pi para sempre…