# Envelope ### ¿Qué conceptos nuevos necesitaremos conocer? #### ¿Qué es un envelope o envolvente? El **envelope** va a determinar la variación de los niveles de una señal a lo largo del tiempo. Para nosotros, va a ser una herramienta que nos permitirá **dar forma/esculpir el sonido** con el que estemos trabajando, desde su volumen a su frecuencia. En lo que a síntesis de sonido se refiere, el envelope es una curva que nos va a permitir controlar algún parámetro de una señal (Wilczek, 2022). Ya lo hemos utilizado anteriormente, pero de una manera muy sencilla cuando utilizamos el "**line~**" para suavizar los cambios de volumen en la ["Practica 2: nuestro primer patch sonoro"](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/practica-2-nuestro-primer-patch-sonoro). En este caso utilizamos una sola rampa. ¿Os acordáis?
Ejercicio 1: ¿Cuál es la duración total del envelope en el ejemplo anterior?
Ejercicio 2: crea un patch que genere un envelope con un ataque que vaya de 0.5 a 1 en 300 milisegundos, un decay que baje a 0.7 en 900 milisegundos. Un sustain de 2000 milisegundos y un decay que baje a 0 en 1100 milisegundos. ¿Cuál es la duración total del envelope que acabáis de construir?
Como habéis visto en el video de arriba, el tiempo que dura cada segmento es un parámetro clave para darle forma al sonido. Ahora, vamos a modificar el patch anterior para poder **controlar el tiempo de cada segmento**, y para ello vamos a introducir una utilidad de Pure data que nos va a permitir modificar el valor o los valores de un mensaje u objeto. Es el símbolo del dólar **$**. #### #### $ Utilizaremos el símbolo **$** para remplazar un valor numérico o un símbolo en un mensaje u objeto. Es una forma de crear una **variable** que podamos modificar dentro de un mensaje u objeto. Acompañaremos $ con el número que indica la posición del valor en el mensaje u objeto, en ente caso comenzamos a contar en el 1. Si tenemos un mensaje con dos valores, el **primero** será **$1** y el **segundo $2**. El $1 y el $2 van a ser remplazados por los valores recibidos. Vamos a ver un ejemplo en el patch "variable-dollar-demo.pd": ![image-1667387074236.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1667387074236.PNG)Figura 7. patch *variable-dollar-demo.pd* Si os acordáis habíamos visto que en programación se empieza a contar en el 0, entonces, ¿porque el primer valor variable cuando utilizamos $ lo nombramos con 1? Es poque el **$0** tiene otra función, y lo utilizaremos para indicar que un **objeto** al cual le asignamos nosotros un nombre, como por ejemplo "tabwrite~", array, "send", "receive", ... **funcionan e interaccionan solo con objetos del patch en el que se encuentra**, es decir tiene un **alcance local**. Esto que quiere decir y por qué nos va a ser util? Por ejemplo, teniendo dos patches abiertos con objetos "send" y "receive" nombrados con la misma etiqueta, "send go" y "receive go", lo que envíe el send del patch 1 va a llegar también al receive del patch 2, para evitar esto, colocaremos el $0 al comenzar el nombre de nuestra etiqueta: "send $0-go" y "receive $0-go", así, lo que envíe el "send $0-go" del patch 1 solo llegara al "receive $0-go"del patch 1. Como os podéis imaginar utilizaremos esto para objetos que no están conectados a traves de líneas, como el "tabwrite~" y la interfaz grafica array. En el siguiente capitulo veréis como esta utilizado en los patches. Ahora que ya sabemos cómo introducir valores variables en mensaje, vamos a modificar el patch anterior para poder controlar el tiempo que dura el attack, el decay, el sustain y el release: - La duración del **primer delay** va a ser la misma que la duración de la **primera rampa (Attack)**. - La duración del **Decay** sera la duración de la **segunda rampa**. - La duración del **segundo delay** sera la suma de la duración del **Attack más** la duración del **Decay más** el tiempo de duración del **Sustain**. - La duración del **Release** sera la duración de la **tercera rampa** Recordar que en el objeto suma el inlet derecho actualiza el valor de uno de los sumandos, pero al actualizar ese valor no se emite el resultado por la salida. El objeto + va a enviar el resultado solo cuando reciba un valor o bang en el inlet izquierdo, por eso cuando actualizamos el valor del inlet derecho enviamos también un bang en el inlet izquierdo. ![image-1667316243853.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1667316243853.PNG)Figura 8. patch *line-ADSR-tiempos-variables.pd* Vamos a ver ahora otra manera de construir estos envelopes en pure data utilizando el objeto "vline~". #### vline~ Este objeto nos va a permitir construir envelopes **combinando rampas** de la misma forma que la combinación de delay y line~. De momento utilizaremos solo el **inlet izquierdo** para configurar los parámetros del vline~, que espera un **mensaje** con la información de las rampas que ha de realizar y cuando. La información de **cada rampa** estará **separada por una coma**, detrás de cada coma indicaremos el **valor de destino**, el **tiempo** que tardará en llegar al valor de destino y el **tiempo** que tardará esa rampa en comenzar **desde que empieza el envelope**. Si queremos configurar un valor inicial pondremos dicho valor al principio separado de una coma. El mensaje tendría la siguiente forma: valor-inicial, valordestino-rampa1 tiempo-rampa1 delay-rampa1, valordestino-rampa-2 tiempo-rampa2 delay-rampa2 0, 1 500, 0.8 700 500 Rampa 1, Rampa 2 Para la primera rampa generalmente no pondremos delay porque al ser la primera comienza a la vez que se inicia el envelope. Y el delay de cada rampa es el tiempo desde que empieza el envelope hasta el momento en que queremos que commence esa rampa. Vamos a ver ahora en el patch xxx como construir el mismo envelope que hicimos en el ejemplo de la figura 5*,* pero utilizando el objeto "**vline~**". ![image-1667391717463.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1667391717463.PNG)Figura 9. patch *line-vline-ADSR.pd*Ejercicio 3: Construye el mismo envelope que hiciste en el ejercicio 1 utilizando el objeto vline~
Ejercicio 4: Modifica el patch en la [Práctica 2](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/practica-2-nuestro-primer-patch-sonoro), para ello, utiliza un **envelope ADSR** con el tiempo de decay variable que **regule el volumen** cada vez que se reproduzca una nota.
Figuras: Figura 1. Tortuga deslizándose por una rampa. [https://gifer.com/en/cih](https://gifer.com/en/cih) Figura 2. ADSR envelope. [https://thewolfsound.com/envelopes/](https://thewolfsound.com/envelopes/) Figura 3. patch *delay-demo.pd* Figura 4. Tortuga deslizándose por una rampa. [https://gifer.com/en/cih](https://gifer.com/en/cih) Figura 5. Combinación de varias rampas. [https://giphy.com/gifs/southparkgifs-l0HluCIeReFkeWAQ8](https://giphy.com/gifs/southparkgifs-l0HluCIeReFkeWAQ8) Figura 5. patch *line-ADSR.pd* Figura 6. patch *variable-dollar-demo.pd* Figura 7. patch *line-ADSR-tiempos-variables.pd* Figura 8. patch *line-vline-ADSR.pd* Referencias: Wilczek, J. (2022, Julio 3) *Envelopes in Sound Synthesis: The Ultimate Guide*. WolfSound. [https://thewolfsound.com/envelopes/](https://thewolfsound.com/envelopes/)