9.1 Bazele programarii live

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