# 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:

- Habilidade para escrever código que gere som - CHECK!
- Habilidade para escrever funções - CHECK!
- Habilidade para usar threads (nomeados) - CHECK!

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_loop`repetidamente.

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…