Un poco sobre Modulación de Frecuencia

Sin duda, la síntesis FM o de modulación de frecuencia es una herramienta muy versátil. En la siguiente implementación vamos a armar una abstracción que nos permitirá realizar diferentes tipos de sonidos y posteriormente implementaremos su control para interpretar en vivo haciendo uso del teclado del computador.

Primero, vamos a definir los parámetros que deseamos controlar, para de esa manera tener claridad sobre los objetos y conexiones que vamos a usar. Partiendo de los tres datos básicos necesarios para realizar este tipo de síntesis (frecuencia portadora, frecuencia moduladora e índice de modulación) es posible asociarlos a los tipos de resultados sonoros que se deseen. En este caso, voy a correlacionar la frecuencia moduladora a la frecuencia portadora a través de un factor o proporción.

Adicionalmente, también es posible la construcción con un poco de vibrato, lo cual nos puede hacer pensar en un oscilador de baja frecuencia y un ámbito en el cual este cambiará levemente la frecuencia portadora. También es posible que esa segunda modulación que es a la larga este vibrato, se pueda convertir en una segunda modulación, lo cual quedará a disposición de cada persona.

La amplitud del vibrato es posible que sea controlada como una proporción respecto al temperamento que se use, es decir, si se utiliza una división de la octava de 12 semitonos es posible hacer vibratos que fluctúen entre ± 1/2 tono, lo cual sería amplio, pero que si conservamos la proporción de la percepción de división será igual para cualquier octava.

Un caso contrario es cuando se establece una cantidad que se ve reflejada en la variación de la frecuencia en hercios, por ejemplo, si el vibrato es de ± 5Hz en 440Hz la fluctuación  no altera gravemente la percepción de la altura central, en este caso el A4, pues la distancia promedio entre semitonos para esa octava es de unos 26Hz. Si observamos esa misma fluctuación en una octava grave, por ejemplo la del A1, 55Hz, sí va a incidir fuertemente, pues se percibiría un cambio superior al semitono, pues en esa octava la distancia es de unos 3Hz.

Por lo anterior, es mejor tomarlo proporcional a la altura que se fije como frecuencia portadora, no sólo porque quitamos uno de los datos, sino porque garantizamos un vibrato parejo perceptualmente, sin importar el rango de frecuencia que manejemos como portadora. Esto se resuelve fácilmente con el temperamento igual a usar, el cual puede ser definido dentro de la abstracción o puede ser manipulado. Asumamos que lo vamos a dejar fijo y que deseamos un vibrato de 1/8  de tono. Cualquier temperamento igual es posible construirlo como una variación de la siguiente ecuación:

Frecuencia_Transposición = Frecuencia_Referencia * 2 ^ (Transposición/Div_en_Temperamento)

Un ejemplo: si quiero hallar un octavo de tono significa que cada tono ha sido dividido en 8 partes y que la octava tiene 48 divisiones, este último número es el que ocupará el lugar de Div_en_Temperamento.  La Frecuencia_Referencia, será una frecuencia cualquiera que servirá de punto de partida para calcular las demás, como La4, que es una referencia, pero puede tener en realidad cualquier otra afinación diferente a 440Hz. En el caso propuesto de 1/8 de tono tomando como frecuencia de referencia 440Hz  la ecuación queda:

Frecuencia_Transposición = 440Hz * 2 ^ (1/48)

Una vez obtenida esa frecuencia, se realiza una resta respecto de la frecuencia de referencia para obtener la distancia en Hz del vibrato. La implementación de esto en Pd es muy sencilla, haciendo uso del objeto |expr|.

En este objeto $f1 y $f2 señalan la entrada de variables correspondientes a lo que entre por la izquierda y derecha respectivamente. Si se tuviesen más variables las nombraríamos como $f3, $f4... $fn.

Ahora, procedamos a implementar la modulación de frecuencia como una abstracción de lo que ya se ha mencionado hasta este punto. La única variación del esquema o de la ecuación de la modulación será en este caso que no introduciremos una frecuencia moduladora, en su lugar usaremos la frecuencia portadora y un factor en operación de multiplicación. Lo mismo es posible con el índice, es posible subordinarlo a otro comportamiento. En este caso lo haremos dependiente de la envolvente, para que el sonido tenga también esa sensación de simplificación del timbre a medida que se baja la intensidad, esto corresponde en el siguiente gráfico a "variación del índice".

Es tiempo de agregar el vibrato. Como es a la larga otra modulación, pero más simple, sólo necesitamos de un oscilador, una multiplicación y la operación que ya hemos implementado. Nótese que asociado a |expr| también tenemos un objeto |loadbang| y un mensaje con el número 1, los cuales sirven para que cuando se cargue la abstracción se dispare a la entrada derecha de |expr| el número 1.

 
Sólo nos falta agregar la envolvente y la entrada de la información. Como es posible que se quiera controlar la información tímbrica con cierta independencia de la dinámica, vamos a contar con dos entradas, una para la información relacionada a la modulación y la otra para que entre la información de la dinámica.

Se usó en este caso un |unpack f f f f| para señalar que vamos a tener un mensaje entrante con cuatro números, los cuales son respectivamente: tasa de vibrato (la velocidad del vibrato), frecuencia portadora, factor para frecuencia moduladora e índice. Por otro lado, la entrada que controlará el comportamiento de la envolvente se ha conectado directamente a |line~|, pues todo mensaje para la intensidad (y la variación del índice) se manejará externamente. Obsérvese adicionalmente, que la salida de |line~| va a una multiplicación, lo que se está haciendo con esto es elevar al cuadrado, para obtener una mejor respuesta del comportamiento de intensidad, de alguna manera, más cercano a lo que percibimos acústicamente.

Ya hemos terminado de implementar la abstracción. Sólo falta guardarla para usarla en un patch. Adicionalmente, si queremos diseñar un timbre con diversas frecuencias portadoras y comportamientos dinámicos, podemos usar esa abstracción ampliamente.

En el próximo post de este blog, la usaremos para implementar un control con el teclado del computador.

Comentarios

Entradas populares de este blog

Conociendo lo básico de Pure Data

Pure data - Vanilla, lo básico, añadir externos

Síntesis aditiva