Pure Data: Metronomo Variable

28/07/2011 por Ardot Adot

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: 

Photobucket

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

Photobucket

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].

Photobucket

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.

Photobucket

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]

Photobucket

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...

Photobucket

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.

Photobucket

¿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.

Photobucket

Photobucket

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.

Photobucket

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.

Photobucket

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.

Photobucket

A continuación conectamos ambas cajas de mensaje, al inlet derecho de un multiplicador de audio [*~]

Photobucket

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.

Photobucket

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.

Photobucket

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!!!

0
Comentarios
  • #1 por Aerolus el 28/07/2011
    Gracias Ardot! ya lo voy a leer con tiempo y a jugar un rato. Saludos!
  • avatar
    #2 por --145306-- el 29/07/2011
    Que grande eres Ardot. :)
  • #3 por Aerolus el 29/07/2011
    Se me ocurrio una pregunta, como se podria hacer un boton de Tap tempo? para poder elegir el tempo con alguna tecla, por ej.
  • #4 por Ardot Adot el 30/07/2011
    muy buena pregunta!!
    hare un post al respecto justo ahora Aerolus :)
  • #5 por Aerolus el 30/07/2011
    you are my idol!!! jajaja :ook:
  • #6 por Ardot Adot el 30/07/2011
    ahahaha ya esta el post listo! ;)
  • #7 por lorem-ipsum el 31/07/2011
    Magnífico trabajo.
    Gracias y enhorabuena
  • #8 por obijuan el 31/07/2011
    Gracias Ardot.
  • #9 por veguita el 01/08/2011
    Muy bueno el metrónomo.

    Algunas cosas, no me gusta cambiar la amplitud de cero a 1 abruptamente, prefiero hacer cambios graduales (como un ADSR), con algo como esto se puede:

    [1 10, 0 90 100 (
    |
    - - -
    [vline~]

    me tomé la libertad de hacer dos patches basados en el de Ardot :)

    El primero es un metrónomo que marca los acentos naturales en 4/4, o sea, tic toc toc toc tic toc toc toc, etc...

    http://www.megaupload.com/?d=PCRLJT8K

    El segundo es una modificación de uno de los primeros patches que hice, usa un metrónomo variable para hacer una secuencia de clave de rumba (usada en estilos como la salsa, el son montuno, el mambo, etc). Mantuve el algoritmo original y agregué el de ArdotArdot para demostrar que por ambos se llega al mismo resultado.

    http://www.megaupload.com/?d=I3PODSS0

    Espero sea útil para alguien.
  • #10 por Ardot Adot el 02/08/2011
    Hola veguita, gracias por los patches y los comentarios.
    Estoy de acuerdo con usar [vline~] asi evitas clicks en el audio por los cambios abruptos de 0 a 1.
    El uso de [moses] tambien es mas practico y mas elegante.

    Tu segundo patch me gusto mucho, el manejo de los milisegundos para crear la clave y el uso de [vline~] para la envolvente del pitch. Muy buenos.
    Gracias!!