2.4 Durata folosind anvelope

# Durata folosind anvelope

Intr-o sectiune anterioara am vazut cum putem folosi comanda 'sleep' pentru a controla cand incep sunetele. Dar nu am reusit inca sa controlam durata sunetelor.

Pentru a ne oferi un mod simplu dar puternic pentru *controlul duratei* sunetelor, Sonic Pi foloseste notiunea de *anvelopa de amplitudine ADSR* (vom vorbi mai tarziu in aceasta sesiune despre ce inseamna ADSR). O anvelopa de amplitudine ofera doua posibilitati de control foarte utile:

* controlul asupra duratei unui sunet
* controlul asupra amplitudinii unui sunet

## Durata

Durata reprezinta lungimea perioadei in care se aude sunetul. O durata mai mare inseamna ca vei auzi sunetul pentru mai mult timp. Toate sunetele din Sonic Pi au o anvelopa de amplitudine controlabila, iar durata totala a anvelopei reprezinta durata sunetului. Ca urmare, controland anvelopa, controlezi durata.

## Amplitudinea

Anvelopa ADSR nu controleaza doar durata, iti ofera si un *control fin asupra amplitudinii sunetului*. Toate sunetele audibile incep si se termina silentios si contin perioade audibile intre aceste limite. Anvelopele iti permit sa determini cum evolueaza amplitudinea partilor nesilentioase. Este ca si cum ai da cuiva instructiuni cum sa regleze in sus si in jos volumul amplificatorului de chitara. De exemplu, ai putea cere cuiva "sa inceapa in liniste, sa dea usor volumul mai tare, sa il mentina un timp, apoi sa-l coboare rapid". Sonic Pi iti permite sa programezi precis acest comportament folosind anvelopele.

Ca o scurta recapitulare: asa cum am vazut mai devreme, amplitudinea 0 reprezinta lipsa sunetului, iar 1 este volumul normal.

Acum, sa luam pe rand fiecare parte a anvelopei.

## Faza Release

Singura parte a anvelopei care este folosita implicit este cea de release. Aceasta reprezinta timpul necesar sunetului sintetizatorului sa se stinga. Toate sintetizatoarele au un timp de release 1 care inseamna ca implicit durata este de 1 bataie (la ritmul de 60 BPM - batai pe minut - asta inseamna o secunda):

```
play 70
```

Nota se va auzi timp de 1 secunda. Incearca sa cronometrezi :) Aceasta reprezinta o prescurtare a versiunii mai lungi si mai explicite:

```
play 70, release: 1
```

Observi ca suna exact la fel (sunetul dureaza o secunda). Totusi, acum este foarte usor sa schimbi durata modificand valoarea pentru parametrul 'release:':

```
play 60, release: 2
```

Putem face sintetizatorul sa scoata un sunet foarte scurt folosind o valoare foarte mica pentru timpul de release:

```
play 60, release: 0.2
```

Durata stingerii sunetului se numeste *faza de release* si implicit presupune o tranzitie liniara (adica in linie dreapta). Diagrama urmatoare ilustreaza aceasta tranzitie:

![release envelope](../../../etc/doc/images/tutorial/env-release.png)

Linia verticala din extremitatea stanga a diagramei arata ca sunetul incepe la amplitudine 0, dar urca la amplitudinea maxima imediat (acesta este faza de atac, pe care o vom prezenta in continuare). Odata ajuns la amplitudine maxima, va cobori in linie dreapta pana la zero, intr-un interval de timp dat de 'release:'. *Timpi de release mai lungi produc o stingere mai lenta a sunetului.*

Vei putea deci schimba durata sunetului schimband timpul de release. Joaca-te adaugand valori pentru timpul de release la melodia ta.

## Faza de atac

Implicit, *faza de atac* este 0 pentru toate sintetizatoarele, ceea ce inseamna ca ele trec de la amplitudine 0 la 1 instantaneu, ceea ce da sintetizatorului un sunet intial percutant. Totusi, ai putea sa-ti doresti ca sunetul sa intre progresiv (fade in). Acest lucru se poate obtine folosind optiunea 'attack:'. Incearca sa introduci progresiv niste sunete:

```
play 60, attack: 2
sleep 3
play 65, attack: 0.5
```

Poti folosi mai multe optiuni in acelasi timp. De exemplu, pentru un atac scurt si un release lung, incearca:

```
play 60, attack: 0.7, release: 4
```

Acest atac scurt urmat de release lung este ilustrat in diagrama urmatoare:

![anvelopa atac release](../../../etc/doc/images/tutorial/env-attack-release.png)

Desigur, poti incerca si invers - un atac lung si un release scurt:

```
play 60, attack: 4, release: 0.7
```

![anvelopa atac lung release scurt](../../../etc/doc/images/tutorial/env-long-attack-short-release.png)

In fine, poti avea atat atac scurt, cat si release scurt, pentru sunete de scurta durata.

```
play 60, attack: 0.5, release: 0.5
```

![anvelopa atac scurt release scurt](../../../etc/doc/images/tutorial/env-short-attack-short-release.png)

## Faza Sustain (mentinere)

Pe langa specificarea timpilor de atac si release, poti specifica si timpul cat sunetul este sustinut, pentru a controla *faza sustain*. Aceasta reprezinta perioada de timp in care sunetul este mentinut la amplitudine maxima intre fazele de atac si release.

```
play 60, attack: 0.3, sustain: 1, release: 1
```

![anvelopa ASR]images/tutorial/env-attack-sustain-release.png)

Timpul de mentinere este util pentru sunetele importante a caror prezenta in mix vreti sa fie remarcata inainte de a intra in faza optionala de release. Desigur, este corect si sa specificati atat pentru 'attack:' cat si pentru 'release:' valoarea 0 si sa folositi doar faza de sustain fara a avea intrarea si iesirea progresiva a sunetului. Totusi, trebuie sa stiti ca folosind valoarea 0 pentru release puteti avea pacanituri in sunet si este mai bine in general sa folositi o valoare foarte mica, cum ar fi 0.2.

## Faza Decay (declin)

Pentru si mai mult control puteti specifica si un timp de declin (Decay). Aceasta este o faza a anvelopei care este incadrata de fazele de atac si mentinere si specifica timpul in care amplitudinea coboara de la nivelul de atac - 'attack level:' la nivelul de declin - 'decay_level:' (care va fi setat automat la nivelul de mentinere - 'sustain_level:' daca nu ii dati o valoare explicita). Implicit, valoarea pentru 'decay:' este 0 si atat nivelul de atac cat si cel de mentinere au valoarea 1, deci va trebui sa le dati valori explicite pentru ca timpul de declin sa aiba efect:

```
play 60, attack: 0.1, attack_level: 1, decay: 0.2, sustain_level: 0.4, sustain: 1, release: 0.5
```

![anvelopa ADSR](../../../etc/doc/images/tutorial/env-attack-decay-sustain-release.png)

## Nivelul de declin

Inca un truc: desi 'decay_level:' are implicit aceeasi valoare cu 'sustain_level:', poti sa le atribui valori diferite pentru a avea un control mai bun asupra anvelopei. Acest lucru iti permite sa creezi anvelope precum cea care urmeaza:

```
play 60, attack: 0.1, attack_level: 1, decay: 0.2, decay_level: 0.3, sustain: 1, sustain_level: 0.4, release: 0.5
```

![anvelopa ASR](../../../etc/doc/images/tutorial/env-decay-level.png)

Poti de asemenea sa alegi pentru 'decay_level:' o valoare mai mare decat cea pentru 'sustain_level:':

```
play 60, attack: 0.1, attack_level: 0.1, decay: 0.2, decay_level: 1, sustain: 0.5, sustain_level: 0.8, release: 1.5
```

![anvelopa ASR](../../../etc/doc/images/tutorial/env-decay-level-2.png)

## Anvelope ADSR

In concluzie, in Sonic Pi anvelopele ADSR au urmatoarele faze:

1. *attack (atac)* - timpul de la amplitudine 0 la 'attack_level' (nivelul de atac),
2. *decay (declin)* - timpul de trecere de la amplitudinea nivelului de atac la cea a nivelului de declin - 'decay_level',
3. *sustain (sustinut)* - timpul de trecere de la amplitudinea nivelului de declin la cea a nivelului sustinut - 'sustain_level',
4. *release (eliberare)* - timpul de trecere de la amplitudinea nivelului sustinut la 0

Este important de retinut ca durata sunetului este suma timpilor pentru toate aceste faze. Ca urmare, urmatorul sunet va avea o durata de 0.5 + 1 + 2 + 0.5 = 4 batai:

```
play 60, attack: 0.5, attack_level: 1, decay: 1, sustain_level: 0.4, sustain: 2, release: 0.5
```

Acum joaca-te adaugand anvelope sunetelor tale...
