Pure Data: Metronomo Variable
En este post veremos algunos objetos de pure data para construir un metronomo que toque 5 veces a 60 bpm y 5 veces a 100 bpm. Este es uno de los ejercicios extra que vienen en el Libro de Johannes Kreidler (donde no viene la respuesta) que me parecio muy interesante y para ser honesto me tarde un par de horas en descifrarlo ya que soy medio tarado para esto de los "word problems".
Para solucionarlo dividí el enunciado en partes, primero me enfoque sobre construir un metronomo.
Como sabemos pure data tiene un objeto llamado [metro] que se encarga de mandar bangs en milisegundos segun el argumento que reciba en el inlet izquierdo. Para hacer que [metro] pueda funcionar como un metronomo en bpm es necesario hacer una conversion usando el objeto [expr] para calcular los bpm en ms con una pequeña formula:
Aqui le estamos diciendo a [expr] que 1000 (los milisegundos) sea dividido entre una variable entrante ($f1, que sera el valor de los bpm) entre 60, escrito de manera diferente esto se vería asi
Asi cualquier valor que nosotros pongamos en bpm saldra en milisegundos listo para ser leìdo por el objeto [metro].
A continuación conectamos nuestro algoritmo para convertir bpm a ms al objeto [metro] en el inlet derecho y conectamos un toggle en el inlet izquierdo para prenderlo y apagarlo. Como ya sabemos que solo usaremos los valores de 60 y 100 como bpm, borramos la caja de número y usamos 2 cajas de mensaje con estos valores conectados al inlet del objeto [expr].
Ahora que ya tenemos nuestro metronomo listo pasamos a la segunda parte del enunciado que dice "que toque 5 veces a 60 bpm y 5 veces a 100 bpm". Lo primero que se me ocurrio fue construir un contador.
Necesito un objeto [float] para guardar los numeros entrantes y conectar al outlet de este, un objeto [+ 1] , el objeto [float] recibe los bangs de nuestro metronomo.
Esto no es suficiente para crear valores ascendentes. Para que funcione como queremos, necesitamos crear un loop conectando el outlet del objeto [+ 1] de regreso al inlet derecho del objeto [f]
Asi [f] al recibir su primer bang, manda su valor por default que es cero al objeto [+ 1]. El objeto [+ 1] se encarga de sumar mas uno al valor que recibio inicialmente y regresarlo al objeto [f] por el inlet derecho. Al hacer esto se le asigna el resultado de la operacion como nuevo valor al objeto [f] ,entonces cuando ocurra un segundo bang ahora el objeto [f] con un valor de 1, manda su nuevo valor al objeto [+ 1] para repetir la operacion y asignar una vez mas el resultado de regreso al objeto [f] y asi sucesivamente...
Ahora que ya tenemos nuestro contador ascendente hay que asegurarse de que solo vaya de 0 a 9 en loop. Para esto conectamos un objeto [%] con un argumento de 10 a la salida del contador ascendente. Este objeto se encarga de dividir 2 números y producir un mismo cociente entre esos 2 números. En este caso lo que hace es crear "un techo" donde el contador solo va a llegar hasta 9 como valor maximo y regresar a 0.
¿Por qué de 0 a 9?
Pure Data empieza a contar de 0 para arriba, asi que de 0 a 9 son 10 valores.
¿Por qué 10 valores?
Porque queremos que los primeros 5 valores vayan a una velocidad de 60 bpm y los 5 restantes vayan a una velocidad de 100 bpm.
Para hacer que este cambio de bpm sea automatico usamos un par de objetos [sel]. Este objeto actua como compuerta, si el valor entrante no es igual al del argumento, [sel] no deja pasar nada. En este caso los argumentos son 0 y 5 en sus respectivos objetos. En el momento en que nuestro contador iguale estos argumentos, uno de los objetos [sel] mandara un bang por su outlet izquierdo.
Si han estado construyendo mientras leen pueden darse cuenta de que ahora el contador manda bangs cada 5 numeros a un lado y 5 bangs al otro. Del lado izq va de 0 a 4 y del lado derecho de 5 a 9. Estos bangs se conectan al inlet de las cajas de mensaje que marcan el bpm del metronomo. Uno a 60 y el otro a 100.
Ya tenemos el algoritmo completo que regula el comportamiento de nuestro metronomo. Ahora solo queda resolver el problema de como hacerlo sonar. Para esto usamos un objeto [osc~] conectado a un switch de prendido y apagado que construiremos para que escuchemos sonidos intermitentes y dentro de los bpm que queremos.
Conectamos un bang al outlet de la caja de numeros que recibe todos los bangs del contador. Este bang ira conectado a un objeto [pipe] y a su vez a una caja de mensaje con el numero 1.
El objeto [pipe] funciona como un retardo de señal que puede recibir bangs, símbolos y numeros ya sea independientes o en lista. En este caso le damos un argumento de 50 para retardar el bang entrante 50 ms. Este bang retardado estara conectado a una caja de mensaje con el numero 0.
A continuación conectamos ambas cajas de mensaje, al inlet derecho de un multiplicador de audio [*~]
Este es nuestro switch. El bang que esta conectado a la caja de mensaje con el número 1 deja pasar el sonido del multiplicador de audio [*~]. Gracias al objeto [pipe], 50 ms despues, ese mismo bang manda un mensaje a la caja de numero con el número 0 para cerrar la salida de audio.
Finalmente conectamos un oscilador [osc~] con una frecuencia de 440Hz al inlet izquierdo del multiplicador de audio [*~] y agregamos un [dac~] (digital to analog converter) para que el sonido salga a las bocinas de nuestra computadora.
Y listo!!!
Metronomo Variable by ardotadot
Eso es todo por hoy, vaya que si me extendi para explicar este patch que aunque es pequeño, es importante para entender cada objeto que hemos utilizado. Pudimos haber utilizado un objeto [ead~] (exponential attack decay) en lugar de construir un "switch" pero nos perderiamos de la diversion de construir todo desde cero hehehe.
Nos vemos en el proximo post.
EXPERIMENTEN!!!