Una envolvente dinámica es una curva que une los picos de amplitud de una forma de onda y describe la variación
de la amplitud de esa señal de audio a lo largo del tiempo.
Las señales que produjimos hasta ahora son invariantes en el tiempo. Esto significa que a medida que el tiempo
transcurre la amplitud de sus componentes se mantiene constante. Los sonidos producidos mecánicamente no se
comportan de ese modo, sino que la amplitud de cada componente cambia con el paso del tiempo.
Si deseamos producir electrónicamente un sonido que resulte interesante a la audición, deberemos prestar especial
atención a la generación de envolventes dinámicas para el sonido en su conjunto, o para cada uno de los armónicos
o parciales que lo conforman.
La figura G.3.5. muestra un patch donde controlamos el ataque y la desaparición del sonido mediante envolventes.
Al presionar el mensaje superior, ingresa una lista de dos números al objeto line, cuyos valores representan el punto
de llegada y el tiempo en milisegundos para alcanzarlo, respectivamente. Este objeto calcula los valores intermedios
entre el punto de partida y el de llegada, en el tiempo establecido.
Los valores producidos por line multiplican a la señal del oscilador, cambiándole la amplitud paulatinamente. Para volver
a cero, simplemente presionamos el mensaje inferior, y la amplitud del sonido decrece linealmente durante un segundo.
En el ejemplo anterior, si quisiéramos que el decaimiento de la amplitud comenzara inmediatamente después de
finalizado el ataque, deberíamos presionar rápidamente el segundo mensaje. Una forma de automatizar esta operación
es empleando el objeto delay, que retrasa la salida de un bang entrante, durante un tiempo especificado en
milisegundos. La figura G.3.6. lo ilustra.
Nótese, además, que el objeto line es reemplazado por su versión de audio line~. Se trata de un objeto que funciona de
igual modo, pero que produce la envolvente con una resolución mucho mayor, equivalente a la frecuencia de muestreo.
Según observamos en el ejemplo anterior, parece necesario crear un mensaje con un retardo inicial para cada paso de
la envolvente a generar. Sin embargo, esta tarea se simplifica si recurrimos al objeto vline~, para el cual todos los pasos
de la envolvente pueden estar definidos dentro de un único mensaje, sin que se requiera el uso de objetos de retardo.
La sintaxis de los mensajes enviados a vline~ consta de dos valores iniciales, seguidos por tríos de datos, separados por
comas. Los dos primeros números expresan “a dónde voy” y “en cuánto tiempo”, respectivamente. Luego siguen ternas
de números que indican “a dónde voy”, “en cuánto tiempo” y “cuánto debo esperar para realizar este paso”. Este último valor cumple la misma función que el argumento del objeto delay visto anteriormente: esperar el tiempo
que duran los pasos anteriores de la envolvente antes de disparar el paso actual (ver ejemplo en G.3.7.).
El patch “20-envolventes.pd” implementa los tres ejemplos recién analizados. Intente generar variantes, o diseñar distintas envolventes y llevarlas a la práctica.
A partir de los ejemplos vistos podríamos pensar que la utilización de envolventes dinámicas en nuestros programas
puede resultar tediosa, y estaríamos en lo cierto. Afortunadamente, existen objetos gráficos en las librerías externas
que pueden facilitarnos esta tarea. Entre estos objetos contamos con envgen, de la librería Ggee, y breakpoints, de la
librería Tof. Para utilizar el objeto envgen creamos un objeto vacío y escribimos el nombre del objeto. A continuación
podemos agregar una serie de argumentos, que establecen sus dimensiones, los valores máximos de los ejes x e y, y
las etiquetas para recibir y enviar datos de forma remota. Si no declaramos ningún argumento, el objeto se construirá
con un valor máximo de x de 1000 milisegundos, y un rango de y comprendido entre 0 y 1. La sintaxis es la siguiente:
envgen tamañoX tamañoY Xmáx Ymáx símbolo_enviar símbolo_recibir
Una vez creado, conectamos el outlet izquierdo del objeto a un objeto line~, que recibirá los datos de la envolvente
gráfica y realizará las rampas necesarias para producir la envolvente.
En el ejemplo siguiente observamos dos envolventes gráficas, una destinada a controlar la amplitud de un oscilador (rango
entre 0 y 1), y otra empleada para controlar su frecuencia (rango entre 0 y 1, pero escalado luego entre 200 y 1000).
Nótese que la duración (valor máximo del eje x) se establece mediante un mensaje con la palabra clave duration y el tiempo en milisegundos. Sin embargo, el tiempo no está establecido como una constante dentro del mensaje, sino como una variable, que toma el valor del objeto Number conectado por encima. En PD, según vemos, los nombres de variables están formados por el signo “$” seguido de un número. En el ejemplo inicialmente la variable “$1” adopta el valor 4000.
El patch “21-envolventes gráficas.pd” incluye la programación de G.3.8. Aquí puede practicar fácilmente el diseño de envolventes de amplitud y de frecuencia, y percibir inmediatamente los resultados.