2.4 Duración con Envolventes

# Duración con Envolventes

En una sección anterior, vimos cómo utilizar el comando `sleep` para controlar cuándo disparar sonidos. Sin embargo, aún no hemos podido controlar la duración de nuestros sonidos.

Con el fin de darnos una simple pero poderosa manera de *controlar la duración* de nuestros sonidos, Sonic Pi proporciona el concepto de una *envolvente de amplitud ADSR* (más adelante en esta sección trataremos qué significa ADSR). Una envolvente de amplitud ofrece el control de dos aspectos muy útiles:

* control sobre la duración del sonido
* control sobre la amplitud del sonido

## Duración

La duración es la longitud del sonido. Una mayor duración significa que escucharás el sonido por más tiempo. Todos los sonidos de Sonic Pi tienen una envolvente de control de la amplitud, y la duración total de la envolvente es la duración del sonido. Por lo tanto, al controlar la envolvente controlas la duración.

## Amplitud

La envolvente ADSR no sólo controla la duración, también te permite control *fino de la amplitud del sonido*. Todos los sonidos audibles comienzan y terminan en silencio, conteniendo partes no-silentes en medio. Las envolventes permiten deslizar y mantener la amplitud de las partes no-silentes. Es como darle instrucciones a alguien sobre cómo subir y bajar el volumen del amplificador de una guitarra. Por ejemplo, puedes pedirle a alguien "comienza en silencio, lentamente llega a máximo volumen, manténlo por un momento y rápidamente vuelve a silencio". Sonic Pi te permite controlar exactamente esta conducta con los envolventes.

Recapitulando lo visto anteriormente, una amplitud de 0 es silencio y una amplitud de 1 es volumen normal.

Ahora, veamos cada una de las partes de las envolventes.

## Fase de Release (apagado del sonido)

La única parte de la envolvente que es utilizada predeterminadamente es el release, que es el tiempo que le toma al sintetizador para apagar el sonido completamente. Todos los sintetizadores tienen un tiempo de release de 1, lo que significa que tienen una duración de un pulso (el cual por defecto es 1 segundo, si el BPM es 60):

```
play 70
```

La nota será audible por 1 segundo. ¡Vamos, cronométralo! Esta es la manera abreviada de decir lo mismo que:

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

¡Observa que suenan exactamente igual los últimos dos comandos! Sin embargo, es ahora muy fácil cambiar la duración con tan sólo modificar el valor del `release:`:

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

Podemos hacer que el sintetizador suene por un periodo de tiempo muy corto al poner un valor de release muy pequeño:

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

La duración del apagado del sonido es lo que llamamos *fase de release* y por defecto es una transición lineal. El siguiente diagrama ilustra esta transición:

![Fase de liberación de la envolvente](../../../etc/doc/images/tutorial/env-release.png)

La línea vertical en la izquierda del diagrama muestra que el sonido comienza con amplitud 0, pero llega a amplitud completa (esto es el ataque, que cubriremos próximamente). Una vez que la amplitud es máxima, se mueve en línea recta hacia abajo hasta llegar a 0, tomando el tiempo que para ello se especificó en `release:`. * Cuanto más largos son los tiempos de liberación, más tiempo le toma al sintetizador desvanecerse.*

Puedes, por tanto, cambiar la duración de tu sonido, cambiando el tiempo de release. Prueba a añadir tiempos de release a tu música.

## Fase de Ataque

Por defecto, la *fase de ataque* es 0 para todos los sintetizadores, lo que significa que pasan inmediatamente de amplitud 0 a 1. Ésto le da al sintetizador un sonido inicial percutivo. Sin embargo, podrías desear que el sonido se inicie gradualmente. Esto se logra con el operador `attack:`. Prueba hacerlo con varios sonidos:

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

Puedes utilizar varios operadores al mismo tiempo. Por ejemplo para un ataque corto y un release largo, prueba:

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

Este ataque corto y largo release queda ilustrado en el siguiente diagrama:

![Fases de ataque y liberación de la envolvente](../images/tutorial/env-attack-release.png)

También puedes invertirlo, prueba ahora con un ataque largo y un release corto:

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

![envolvente con ataque largo y liberación corta](../../../etc/doc/images/tutorial/env-long-attack-short-release.png)

Finalmente, puedes poner el ataque y release cortos, para obtener sonidos cortos.

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

![envolvente con ataque corto y liberación corta](../../../etc/doc/images/tutorial/env-short-attack-short-release.png)

## Fase de Sustain

Adicionalmente a especificar los tiempos de ataque y release, también puedes especificar el tiempo de sustain para controlar la *fase de sustain*. Este es el tiempo en el cual el sonido está en su máxima amplitud entre las fases de ataque y release.

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

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

El sustain es útil para sonidos que quieras resaltar en la mezcla, antes de entrar a la fase opcional de release. Por supuesto, es totalmente válido poner las opciones `attack:` y `release:` a 0; de esta forma el sonido aparecerá y desaparecerá de golpe. Sin embargo, ten en cuenta que un release de 0 puede producir clicks en el audio, por lo que se recomienda usar un valor muy pequeño como 0.2.

## Fase de Decaimiento (Decay)

También puedes especificar el tiempo de decaimiento (decay) para tener un mayor control de tu sonido. Esta fase se encuentra entre el ataque y el sostenimiento (sustain), y simboliza el tiempo que tarda la amplitud en bajar dede el nivel de ataque (`attack_level:`) hasta el nivel de decay (`decay_level:`); el `decay_level:` tiene por defecto el mismo valor que el nivel de sostenimiento (`sustain_level:`), pero puedes ponerle el valor que tú quieras. Por defecto, la opción `decay:` vale 0 y los niveles de ataque y sustain valen 1, así que tendrás que cambiar dichos valores para que el tiempo de decaimiento haga efecto:

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

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

## Nivel de Decaimiento

Un último truco... aunque la opción `decay_level:` está predeterminada a tener el mismo valor que el `sustain_level:` puedes ser explícit@ y asignarles diferentes valores para tener un control total del envolvente. Esto te permitirá crear envolventes como el siguiente:

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

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

También es posible poner el `decay_level:` más alto que el `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
```

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

## Envolventes ADSR

Para resumir, las envolventes ADSR de Sonic Pi tienen las siguientes fases:

1. *ataque* - tiempo que tarda la amplitud en pasar de 0 al `attack_level`,
2. *decaimiento (decay)* - tiempo que tarda la amplitud en pasar del `attack_level` al `decay_level`,
3. *sostenimiento (sustain)* - tiempo que tarda la amplitud en pasar del `decay_level` al `sustain_level`,
4. *release* - tiempo que tarda la amplitud en pasar del `sustain_level` a 0

Es importante recalcar que la duración de un sonido es la sumatoria de los tiempos de todas las fases. Por tanto, el siguiente sonido tendrá una duración de 0.5 + 1 + 2 + 0.5 = 4 pulsos:

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

Ahora ve a jugar con envolventes en tus sonidos...
