Pitch Shifter

Uno de los usos posibles para los retardos es la implementación de un pitch shifter, esto es, un proceso que permite transponer un sonido a otra altura diferente. Si cambiamos el tiempo de retraso en un delay se puede escuchar un aumento o una disminución  en la frecuencia del mismo, dependiendo de la dirección del cambio de tiempo. Comencemos por esa operación.

Por ahora vamos a usar como fuente sonora una onda diente de sierra a la cual le vamos a imponer una envolvente percusiva, es decir, un ataque corto y rápido, poco sostenimiento del sonido y decaimiento casi inmediato. Posteriormente vamos a usar un objeto line~ para generar el cambio de altura a través de la modificación del tiempo de retardo. En el siguiente gráfico vamos a observar que la fuente sonora va a ser conectada a la salida del canal izquierdo y al objeto delwrite~ el cual almacenará por un periodo determinado el sonido, para ser leído posteriormente por otro objeto con el retardo que se le asigne.

Al pulsar el bang rojo, por el canal izquierdo se escucha el sonido original y por la salida derecha se escucha su versión transpuesta, más grave que la original. En el caso del bang verde, se escucha por la salida derecha una versión transpuesta más aguda que la original. Al realizar esto, el cambio de altura va a ser realizado por un periodo de tiempo que dure el cambio del retraso. En este caso, al tratarse de un sonido corto y con un rápido decaimiento, el momento en el cual el sonido es más intenso coincide con el momento en el cual ocurre el proceso.

En los mensajes que van a line~ es posible cambiar parámetros para experimentar y comprender el fenómeno que ocurre. Por ejemplo, si se altera el rango de cambio, la altura se ve afectada, de la misma manera ocurre si dejamos el rango igual y cambiamos el tiempo en el cual ocurre.

Si se quiere garantizar que el cambio va a ocurrir todo el tiempo, entonces se necesita la constante repetición de la operación de cambio. Eso sería equivalente a tener un line~ que repita su comportamiento apenas termine. Pero como tal vez necesitemos tiempos menores a los que son posibles con line~ vamos a usar un objeto phasor~ para crear esas líneas de cambio y una multiplicación para establecer el rango de cambio en el retraso.

El primer problema que surge de la repetición del proceso, suponiendo que lo hacemos sobre una señal continua en este caso, es que el regreso a cero en el objeto phasor~ provocará una discontinuidad, pues el momento de retraso al regresar a cero contiene una información diferente a la que se usaría para reconstituir la forma de onda o una versión comprimida de ella. Veamos a continuación dos imágenes que ilustran la situación.


























La primera imagen nos muestra la discontinuidad producida. Adicional a esto también resulta interesante ver cómo el proceso repetitivo, añade información que se traducirá en la sensación de incremento de la frecuencia, como lo ilustra mejor la segunda imagen.



La solución a esta discontinuidad es usar dos lectores que estén desfasados la mitad de un ciclo (180° de diferencia) y de suavizar los momentos de discontinuidad con una envolvente.

En la siguiente imagen se puede observar la implementación. Para la envolvente usaremos la función coseno reducida en su rango, girada respecto al eje y desplazada verticalmente. Para una mayor comprensión de esto, recomiendo leer ESTE POST. Por otro lado, para tener dos lectores desfasados 180° se hace necesario sumar 0.5 a la salida de phasor~ y usar el objeto wrap~, el cual al detectar valores superiores a 1 los convierte en sólo su parte fraccionaria, por ejemplo, si el valor entrante es 1.1, el valor de salida es 0.1, para mayor información y un ejemplo de la utilidad del mismo recomiendo leer ESTE OTRO POST.


Una vez solucionado el problema de la discontinuidad, podemos intentar controlar la transposición del sonido a algún tipo de temperamento de nuestro interés. En el primer intento lo que haremos es replicar las transposiciones en un sistema de 12 divisiones por octava con igual sensación de distancia, como el que se ha usado desde hace ya bastante tiempo en la música de occidente. Luego exploraremos otros temperamentos.

El primer paso se trata de resolver la frecuencia que debe entrar a phasor~. Dicha frecuencia debe ser un factor del tiempo que se tenga como rango para el retraso, pero en este caso, como vamos a necesitar ese tiempo como frecuencia es posible hacer dos operaciones que cumplen con el mismo propósito. El tiempo también puede ser expresado como una frecuencia, simplemente realizando la operación 1/tiempo, por ejemplo, 50ms que son 0.05 segundos al realizar esta operación son 20Hz. La segunda posibilidad que tenemos es usar el tiempo en segundos como divisor de la operación en la cual se tiene un número resultado de la distancia entre semitonos. En este caso usaremos para mayor claridad de la explicación la primera manera.

Antes que nada, para obtener los factores por los cuales multiplicaremos la frecuencia que mencioné anteriormente, necesitamos recurrir a la operación 2^transposición/temperamento, que en nuestro caso es 2^(x/12). Si pensamos en los números que reemplazan la incógnita vemos que los resultados comienzan cuando intentamos un unísono, el resultado es un número 1, pero si multiplicamos una frecuencia por ese número será la misma y en caso de unísono necesitamos que no exista frecuencia alguna, pues el sonido que se repite debe ser exactamente el mismo, sin retraso.

Para complementar la operación vamos a restar 1 a la operación. Adicionalmente, como ya observamos previamente, se necesita de una dirección descendente de los valores numéricos que se generan para cambiar el retraso. Por esa razón vamos a multiplicar por -1 para completar nuestra operación. Vamos a usar el objeto expr~.


Como ya obtuvimos la frecuencia, sólo debemos añadir esto a la implementación anterior. En esta ocasión haremos uso del objeto send~, abreviado s~ para que los tiempos de rangos sean los mismos en las multiplicaciones de phasor~ que entran a cada delay. La pareja receptora de información de ese objeto ese receive~, abreviado r~.

Ya está listo el pitch shifter, como ejercicio, impleméntelo como un objeto que permita cambiar el temperamento entre tercios, cuartos y quintos de tono.

Para un poco de información sobre la implementación que da origen a esta idea, es posible ver: Manning, Peter. Electronic and Computer Music. Oxford University Press. 2004. Páginas 68-73.



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