# Programare live

Acum stim deja suficient pentru a incepe cu adevarat sa facem ceva interesant. In aceasta sectiune vom construi pe baza a ceea ce am invatat in sectiunile precedente si iti voi arata cum poti incepe sa compui muzica live si sa o transformi in interpretare pe scena. Pentru asta avem nevoie de 3 lucruri:

- Priceperea de a scrie cod care produce sunete - PREZENTA!
- Priceperea de a scrie functii - PREZENTA!
- Priceperea de a folosi thread-uri (cu nume) - PREZENTA!

In regula, sa-i dam bataie! Sa programam live primele noastre sunete. Mai intai avem nevoie de o functie care contine codul pe care vrem sa-l executam. Sa incepem cu ceva simplu. Vrem de asemenea sa reluam in bucla apelurile catre aceasta functie intr-un thread:

    define :my_loop do
      play 50
      sleep 1
    end
    in_thread(name: :looper) do
      loop do
        my_loop
      end
    end

Daca ti se pare putin complicat, te poti intoarce sa recitesti sectiunile despre functii si thread-uri. Nu este prea complicat daca deja ai studiat aceste lucruri.

Avem aici definitia unei functii care doar reda nota 50 si face pauza pe durata unei batai. Apoi definim un thread denumit ‘:looper’ care doar reia in bucla apelul ‘my_loop’.

Daca rulezi acest cod, vei auzi nota 50 repetata iar si iar…

## Sa schimbam putin

Acum incepe partea distractiva. In timp ce codul inca ruleaza schimba 50 cu alt numar, sa zicem 55, apoi apasa pe butonul Run din nou. S-a schimbat! In direct!

Nu s-a adaugat un nou strat deoarece folosim un thread-uri cu denumire, ceea ce permite sa se execute un singur thread pentru fiecare nume. De asemenea, sunetul s-a schimbat pentru ca am redefinit functia. Am dat o noua definitie pentru ‘:my_loop’. Cand thread-ul ‘:looper’ a reluat bucla, a apelat noua definitie.

Incearca sa-l schimbi din nou, schimba nota, schimba timpul pentru pauza. Ce-ar fi sa adaugi o instructiune ‘use_synth’? De exemplu, schimba cu:

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

Acum suna destul de interesant, dar putem sa-l facem si mai colorat. In loc sa redam aceeasi nota iar si iar, incerca sa redai un acord:

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

Ce-ar fi sa redam aleator notele dintr-un acord:

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

Sau sa alegem o valoare aleatoare pentru cutoff:

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

La final, sa adaugam niste tobe:

    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

Acum lucrurile devin incitante!

Totusi, inainte sa incepi sa programezi live folosind functii si thread-uri, opreste-te putin si citeste sectiunea urmatoare despre ‘live_loop’ care va schimba pentru totdeauna modul in care programezi cu Sonic Pi…