2.4 Duração com Envelopes

# Duração com Envelopes

Em uma seção anterior, nós vimos como podemos usar o comando `sleep` para controlar quando o som será disparado. Entretato, ainda não fomos capazes de controlar a duração dos nossos sons.

Para nos dar um meio simples, mas ainda assim poderoso, de *controlar a duração* de nossos sons, o Sonic Pi fornece  a noção de um *envelope de amplitude ADSR* (vamos explicar o que ADSR significa mais à frente nesta seção). Um envelope de amplitude oferece dois aspectos úteis de controle:

* controle sobre a duração de um som
* controle sobre a amplitude de um som

## Duração

A duração é o tempo que o som permanece tocando. Uma duração mais longa significa que você ouve o som por mais tempo. Todos os sons do Sonic Pi possuem um envelope de amplitude controlável e a duração deste envelope é a duração do som. Portanto, controlando o envelope, você controla a duração.

## Amplitude

O envelope ADSR não só controla a duração, ele também te dá *controle fino sobre a amplitude do som*. Todos os sons começa e terminam no silêncio e contém algumas partes não silenciosas no meio. Envelope te permitem deslizar e manter a amplitude das partes não silenciosas do som. É como dar a alguém instruções de como aumentar e diminuir o volume de um amplificador de guitarra. Por exemplo: você pode pedir para alguém para "iniciar no silêncio, aumentar o volume devagar, mantê-lo por um pouco e então voltar rapidamente para o silêncio". O Sonic Pi te permite programar exatamente este comportamento através de envelopes.

Recapitulando, como vimos antes, uma amplitude de 0 é silêncio e uma amplitude de 1 é volume normal.

Agora, vamos ver em sequencia cada uma das partes das curvas de envelope.

## Fase de Release (extinção)

A única parte do envelope que é usada por padrão é o período de Release (extinção ou relaxamento). Este é o tempo que o som do sintetizador leva para desaparecer. Todos os sintetizadores possuem um tempo de extinção de 1, que significa que, por padrão, eles duram 1 batida (que no BPM padrão de 60 é 1 segundo):

```
play 70
```

A nota será audível por 1 segundo. Vá em frente e cronometre:-) Esta é a versão curta da versão mais longa e explícita:

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

Note como isso soa exatamente o mesmo (o som dura 1 segundo). Entretanto, agora é muito fácil modificar a duração modificando o valor da opção `release:`:

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

Podemos fazer com que o sintetizador soe por um período muito pequeno usando um valor bem pequeno para `release:`:

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

A duração deste esmaecimento do som é chamada de *fase de release* e por padrão é uma transição linear (isto é: uma reta). O diagrama a seguir ilustra esta transição:

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

A linha vertical bem a esquerda mostra que o som começa com amplitude 0, mas aumenta até a amplitude total imediatamente (esta é a fase de ataque, que cobriremos em seguida). Uma vez na amplitude total, em seguida se move em linha reta até zero, levando o tempo especificado por `release:`. *Fases de release mais longas produzem fade outs mais longos para o sintetizador.*

Você pode, portanto, mudar a duração do seu som mudando o tempo de release. Brinque adicionando tempos de release à sua música.

## Fase de Ataque

Por padrão, a *fase de ataque* é 0 para todos os sintetizadores, o que significa que eles vão da amplitude 0 para 1 imediatamente. Isso dá aos sintetizadores um som inicial percussivo. Entretanto, você pode querer um som com início gradual. Isso pode ser atingido com a opção `attack:`. Tente um início gradual (fade in) em alguns sons:

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

Você pode utilizar múltiplas opções ao mesmo tempo. Por exemplo, para um ataque curto e repouso longo, tente:

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

Este envelopamento (ataque curto e repouso longo) é ilustrado no seguinte diagrama:

![envelope de ataque e repouso](../../../etc/doc/images/tutorial/env-attack-release.png)

Claro que você pode inverter as coisas. Tente um ataque longo e repouso curto:

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

![envelope ataque longo repouso curto](../../../etc/doc/images/tutorial/env-long-attack-short-release.png)

Finalmente, você pode ter também os tempos, tanto de ataque quanto de release, curtos para obter sons mais curtos.

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

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

## Fase de Sustentação

Além de especificar os tempos de ataque e release, você também pode especificar um tempo para controlar a *fase de sustain* (sustentação). Este é o tempo durante o qual o som é mantido em sua amplitude total, entre as fase de ataque e release.

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

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

O tempo de sustentação é útil para quando você deseja aumentar a presença do som, antes de entrar na fase de release opcional. Claro, é completamente válido configurar as opções de `attack:` e `release:` com valor 0 e usar somente o sustain, ficando totalmente sem *fade in* ou *fade out* no som. Porém, fique avisado, um release igual a 0 pode produzir clicks no áudio e geralmente é preferível usar um valor pequeno, como 0.2.

## Fase de Decaimento (Decay)

Para um nível extra de controle, você também pode especificar um tempo de decaimento. Esta é a fase do envelope que se encaixa entre o ataque e o sustain e especifica um tempo para que a amplitude caia de `attack_level:` até`decay_level:` (que, a não ser que você configure explicitamente, será igual ao `sustain_level:`). Por padrão, a opção `decay:` é 0 e ambos os níveis de ataque e de sustain são 1. Desta forma, você precisa especificá-los para que o tempo de decaimento faça algum efeito:

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

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

## Nível de Decaimento

Um último truque é que apesar do valor padrão da opção `decay_level:` ser o mesmo valor de `sustain_level:`, você pode configurá-los explicitamente com valores diferentes para ter controle total sobre o envelope. Isto te permite criar envolventes como o seguinte:

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

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

Também é possível configurar `decay_level:` para ser maior que o `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
```

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

## Curvas de Envelope ADSR

Para resumir, os envelopes ASDR do Sonic Pi possuem as seguintes fases:

1. *ataque* - tempo para a amplitude ir 0 até o `attack_level:`
2. *decaimento (decay)* - tempo para a amplitude ir de `attack_level:` até `decay_level:`
3. *sustentação (sustain)* - tempo para a amplitude ir de `decay_level:` até `sustain_level:`
4. *extinção (release)* - tempo para a amplitude ir de `sustain_level:` até 0 (extinção do som)

É importante notar que a duração de um som é a somatória dos tempos de cada uma destas fases. Portanto, o seguinte som terá uma duração de 0.5 + 1 + 2 + 0.5 = 4 tempos:

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

Agora vá e se divirta adicionando curvas de envelope aos seus sons...
