# Duração com Envolventes

Numa secção anterior vimos como podemos usar o comando `sleep` para controlar quando tocar os nossos sons. Mas ainda não sabemos como controlar a duração dos nossos sons.

Para termos um meio simples, mas eficaz, de controlar a duração dos nossos sons, o Sonic Pi possibilita o control de uma curva de envolvente do tipo ADSR (vamos falar sobre o que ADSR significa mais à frente nesta secção). Uma curva de envolvente de amplitude oferece dois aspectos úteis de controlo:

- controlo sobre a duração de um som
- controlo sobre a amplitude de um som

## Duração

Duração é o tempo que durante o qual conseguimos ouvir o som. Uma duração mais longa faz com que ouçamos o som durante mais tempo. Todos os sons no Sonic Pi têm uma envolvente de amplitude controlável, e a duração total dessa envolvente é a duração do som. Portanto, controlando a envolvente, controlas não só a sua duração, como a curva de forma de onde do som

## Amplitude

Além de controlar a duração, a envolvente ADSR também oferece um controlo excelente sobre a amplitude do som. Todos os sons audíveis começam e acabam com silêncio e contêm uma parte não silenciosa no meio. Os envolventes permitem deslizar e manter a amplitude das partes não silenciosas do som. É como dar instruções de como aumentar e diminuir o volume de um amplificador de guitarra. Por exemplo, podes pedir a alguém para “começar com silêncio, aumentar o volume lentamente até ao máximo, manter durante um bocado e depois diminuir rapidamente até silêncio”. O Sonic Pi permite programar este comportamento com curvas de envolvente.

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

Agora, vamos ver cada uma das partes das curvas de envolvente.

## fase de extinção

A única parte a envolvente que é usada por defeito é o tempo de extinsão do som (ou relaxamento). Isto é o tempo que o som de um sintetizador leva até desaparecer completamente. Todos os synths têm, por defeito, um tempo de extinsão de 1, o que significa que duram uma batida (que é 1 segundo, para BPM de 60):

    play 70

Esta nota vai-se ouvir durante 1 segundo. Segue em frente e contabiliza a duração :-) Isto é a versão curta para a versão mais longa e explicita:

    play 70, release: 1

Nota como soam exactamente iguais (o som dura 1 segundo). No entanto, agora é muito fácil alterar a duração mudando o valor da opt `release:`:

    play 60, release: 2

Podemos fazer com que o som dure muito pouco tempo usando um valor mais baixo para `release:`:

    play 60, release: 0.2

A duração do repouso do som chama-se fase de extinsão (ou repouso) e por defeito é uma transição linear (isto é, uma linha recta). O diagrama seguinte ilustra esta transição:

Copiar →↵…«»“”-–—

A linha vertical à esquerda do diagrama mostra que o som começa com amplitude 0, mas vai até a um nível de amplitude máximo imediatamente (isto é a fase de ataque, tal como vamos analisar de seguir). Tendo em conta a amplitude máxima, esta volta a baixar numa linha recta até 0, levando o tempo especificado pela opt `release:`. Tempos de repouso mais longos produzem fade outs mais longos.

Podes então mudar a duração do teu som ao mudar o tempo de repouso. Experimenta mudar os tempos de repouso da tua música.

## Fase de Ataque

Por defeito, a fase de ataque é 0 para todos os synths, o que significa que a amplitude sobe de 0 para 1 imediatamente. Isto resulta num som inicialmente mais percursivo. No entanto, podes querer que o teu som tenha um fade in. Isto pode ser feito com a opt `attack:`. Experimenta usar fade in em alguns sons:

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

Pode querer usar váras opts ao mesmo tempo. Por exemplo, para um ataque curto e repouso longo, experimenta:

    play 60, attack: 0.7, release: 4

Esta ataque curto e repouso longo está ilustrado no diagrama seguinte:

Copiar →↵…«»“”-–—

Claro que podes é possível trocar. Tenta um ataque longo e repouso curto:

    play 60, attack: 4, release: 0.7

Copiar →↵…«»“”-–—

Finalmente, também é possível tirar proveito tanto um tempo de ataque como de extinção curtos para sons curtos.

    play 60, attack: 0.5, release: 0.5

Copiar →↵…«»“”-–—

## Fase de Sustentação

Além de especificar os tempos de ataque e repouso, também podes mudar o tempo de sustentação para controlar a fase de sustentação. Isto é o tempo a que a amplitude se vai manter no máximo, entre as fases de ataque e repouso.

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

Copiar →↵…«»“”-–—

O tempo de sustentação é útil quando se pretende criar sons com mais presença na mistura, antes de entrar na fase de decaimento e extinção. Claro, é válido dar o valor de `0` às opts `attack:` e `release:` e usar só a sustentação para o som não ter nenhum fade in ou fade out. No entanto, deixamos o aviso, um tempo de repouso de 0 pode produzir clicks no som sendo melhor usar um valor muito baixo como `0.2`.

## Fase de Decaimento

Para um nível extra de controlo, também é possível especificar um tempo de decaimento. Esta é a fase do envelope que fica entre as fases de ataque e sustentação e especifica o tempo em que a amplitude vai baixar do `attack_level:` para o `decay_level:` (que, a não ser que o mudes explicitamente, vai ser o mesmo que o `sustain_level:`). Por defeito, a opt `decay:` é 0 e tanto o ataque (`attack_leve:`) como a sustentação (`sustain_level:`) são 1, portanto precisas de especificá-los para o tempo de decaimento fazer efeito:

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

Copiar →↵…«»“”-–—

## Nível de Decaimento

Um último truque é que apesar da opt `decay_level:`, por defeito, ser igual ao `sustain_level:` podes dar-lhes valores diferentes para controlo total sobre o envelope. Isto permite-lhe criar envolventes como a 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

Copiar →↵…«»“”-–—

Também é possível contar um `decay_level:`, com um valor superior ao do `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

Copiar →↵…«»“”-–—

## Curvas de Envolvente ADSR

Em suma, curvas de envolvente do tipo ADSR no Sonic Pi têm as seguintes fases:

1. ataque - tempo de amplitude 0 até ao `attack_level:`
2. decaimento - tempo para mudar a amplitude de `attack_level:` até `sustain_level:`
3. sustentação - tempo para mudar a amplitude de `decay_level:` até `sustain_level:`
4. extinção - tempo para mudar a amplitude de `sustain_leve:` até 0

É importante notar que a duração de um som é a soma dos tempos de cada uma das fases. Portanto, o seguinte som vai durar 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 vamos experimentar usar curvos de envolventes com os teus sons…