Pure data para Teletubbies
De Puredata Wiki
Pure Data (o Pd) es un lenguaje de programación gráfica desarrollado por Miller Puckette durante los años 90 para la creación de música computarizada interactiva y obras de multimedia. Aunque Puckette es el principal autor del software, Pd es un proyecto de código abierto y tiene una gran base de desarrolladores trabajando en nuevas extensiones al programa. [Definición de la wikipedia] ¿Te puede servir pure data para algo?. Hay varios perfiles de usuarios que podrían estar interesados. Esto es una clasificación posible:
- Interesados en DSP. Personas que estudian el procesamiento de señales digitales tienen en PD un laboratorio para experimentar el tiempo real, y programar señales digitales.
- Interesados en síntesis sonora. Pd es un ambiente de trabajo muy bueno para experimentar y estudiar síntesis.
- Músico interesados en el cajón de sastre llamado 'Música electrónica'. Usando las herramientas que proporcionan las librerías (externals) de pure data así como los trabajos de personas que trabajan en síntesis, pd es un entorno bueno para componer. La interacción con otros softwares u otros ordenadores o redes es sencilla.
- Artistas multimedia. Las características de proceso en tiempo real, así como las librerías gráficas como GEM, GridFlow, pdp, etc, hacen de pd un entorno potente para crear instalaciones multimedia.
- Creación de presentaciones pedagógicas con gráficos y sonido interactivo
- Streaming en tiempo real, emisión y colaboración multimedia en redes.
- Vj. Por las características nombradas anteriormente, se puede usar como controlador para emisiones, y proyecciones de vídeo sincronizados en tiempo real con sonido.
- Programadores. La licencia open source de pd, permite inspeccionar el código, y por supuesto añadir nuevas características y objetos.
- Curiosos y turistas del software
[editar] Cómo instalarlo
Si no lo tienes ya instalado, abre el terminal de tu GNU/linux y escribe
sudo apt-get install puredata
(en debian usas generalmente su). Ya lo tienes. Para lanzarlo, pulsa alt+F2 y escribe "pd". Como estás en GNU/linux tal vez quieras usar el sistema de sonido alsa. Todo eso y más puedes configurarlo en el menú 'media', sin embargo es fácil hacerlo desde el comando que carga pd, en vez de "pd", usa
"pd -alsa -alsamidi"
[editar] Primer contacto
Trans lanzarlo verás una ventana gris con menús y pocas opciones más. Esta es la ventana base que sirve para configurar cuestiones básicas así como de terminal para imprimir mensajes desde tus programas, u observar mensajes de error. Es fea pero útil. En el menú file, opción new, abrirás una ventana nueva en blanco, que a partir de ahora puedes llamar patch. En un patch dibujas los diagramas de pd. Una forma de abrir rápidamete un patch es pulsando control+n. Cada patch se puede guardar como un archivo con la extensión pd. Para hacerlo se siguen las convenciones típicas de otros programas: "save", "save as...". E igual para cargar uno que tengas guardado.
PARA SEGUIR LO QUE SIGUE, TEN ABIERTO PURE DATA Y VES CONSTRUYENDO LOS EJEMPLOS QUE SE PONEN. ASÍ SERÁ MÁS FÁCIL
[editar] Cosas que se dibujan
PureData es un entorno de programación gráfica, eso significa que dibujando cosas que se conectan entre sí construimos el código de los patch. La ventaja respecto a los lenguajes de código textual es que nosotros solemos pensar en esquemas visuales, y con puredata los tendrás a la vista mientras construyes. Pero si el esquema es muy complicado, y nunca se te dio muy bien ordenar tu escritorio, puede haber problemas. Esta es una tabla de algunos objetos gráficos que puedes dibujar. Los encontrarás en el menú Put.
Aunque siempre puedes usar el menú put, está bien acostumbrarse a usar las teclas porque te permite escribir más rápido sin perder la concentración. Pero como puredata no es un programa de dibujo, vamos a ver algo más sobre el significado de cada objeto básico.
[editar] Escribir y enviar un mensaje
El objeto de mensajes (teclas control+2) está pensado para enviar un dato a otro objeto de puredata. Lo envía si haces click con el ratón sobre él. Pero hay que avisar de algo importante. En un patch hay dos modos de uso, el modo de edición y el modo interactivo.
El modo de edición sirve para crear objetos, cambiarlos de sitio, interconectarlos o editarlos. El modo interactivo es para interactuar con los objetos, cliquear y hacerlos funcionar.
Cambias entre un modo u otro pulsando control+e, o bien en el menú edit abajo del todo. Al crear una caja de mensajes con esta:
Estás por defecto en el modo edición, por lo que ves el objeto recien creado azul. Puedes escribir un mensaje dentro del él. Al pulsar control+e estarás en el modo interactivo, y podrás usar el mensaje de la única manera posible: haciendo click del ratón sobre él.
Un mensaje envía su contenido cuando lo pulsas pero ¿a dónde?
[editar] Imprimir un mensaje en algún sitio
La colección de objetos de pd es muy amplia. Existe una versión de puredata extendido que aumenta muchísimo más lo que puedes hacer. En cualquier caso, la forma general para escribir un objeto es pulsando control+1 (o en el menú put). Un objeto vacío tiene una línea discontinua alrededor
Si escribes una palabra que pertecezca a la colección de objetos de pd, se creará una línea continua. Crea uno y escribe dentro print, añadiendo también un mensaje hola encima de él.
Conectaremos el mensaje hola con el objeto print, de la siguiente forma. Estando en el modo edición, lleva el ratón a la pequeña línea negra en la parte inferior del mensaje. Cuando el cursor de ratón cambie, pulsa y arrastra el ratón hasta la pequeña línea oscura en la parte superior del objeto print. Debe quedar así:
Ahora en el modo interactivo puedes pulsar el mensaje 'hola' y print se encargará de imprimirlo en la ventana principal gris de pd. Verás escrito algo como 'print: Hola', cada vez pulsas el mensaje.
[editar] Entradas y Salidas
Crea un objeto nuevo (control+1) y en su interior escribe +. El nuevo objeto suma creado, tiene esta estructura:
Tiene dos entradas (inlets) y una salida (outlets). Como imaginarás realiza la suma de los mensajes de entrada, sacando un mensaje con el resultado por la salida. Pero puredata es perculiar en este asunto. Monta esto:
Al pulsar en el mensaje conectado a la entrada izquierda, se imprime el mensaje resultado, pero si pulsas el mensaje de la entrada derecha parece que no pasa nada. Esto es una peculiaridad de puredata que hace que sólo el el inlet o entrada más a la izquierda tiene la propiedad de desencadenar una salida, los demás son como parámetros de configuración. Si parece raro al principio es una idea genial para organizar patchs. Puedes verlo como que el objeto suma se configura con su segundo inlet, y se ejecuta con el primero. Será más claro después. Frecuentemente puedes escuchar que el inlet o entrada activa se puede llamar “entrada caliente” o “inlet caliente”, mientras que el resto de entradas que configuran el objetos, son “entradas frías” que no desencadenan la salida. El proceso de crecimiento de un patch es, como ves, conectando unos objetos con otros, que se envían mensajes entre sí. Este patch es una prolongación del anterior.
En este caso hay dos sumas encadenadas. En el primer objeto de suma, puedes elegir entre 2 o 4 para el inlet frio. Lo más importante es que veas que el proceso de suma sólo se produce si pulsas el mensaje conectado a la primera entrada. Piensa que los mensajes de la derecha configuran las sumas, mientras que las de la izquierda disparan el proceso.
[editar] Mensages numéricos con gestos de ratón
Los mensajes vistos antes te permiten hacer un envío por click, a modo de botón disparador. Pero ya que pd es un entorno de desarrollo multimedia, necesitamos poder enviar listas de datos. Para eso utilizaremos la caja de números (control+3). Crea el siguiente montaje:
Ahora observa cómo cambia el número al pulsar sobre la caja de números y arrastrar el ratón. En la pantalla principal de pd se irán imprimiendo todos los números que pasen por la caja de números. Son números enteros, pero si quieres acceder a los números con decimales pulsa la tecla mayúsculas y sin soltar arrastra igual que antes. Además pulsando control y haciendo un click sobre la caja, se pone a 0. La caja de números puede recibir valores por su entrada:
Al pulsar el mensaje '3' podremos la caja de números en valor 3, pero evidentemente 'buagh' dará un aviso en la ventana principal de pd sobre que no se puede hacer. Si volvemos al objeto suma, pero ahora usando cajas de números verás en funcionamiento la diferencia entre entrada fría y caliente, o dicho de otra manera, entradas que configuran un objeto y entradas que disparan el proceso.
En este caso, cuando mueves la caja de números de la entrada derecha no se ve efecto por la salida, pero sí cuando envías datos por la entrada o inlet caliente. De todas formas es común que se puedan añadir los parámetros de configuración de un objeto justo después de su nombre. En el caso anterior, después del '+'
Y por supuesto, la suma no es la única operación posible, la lista es bastante larga y conviene que las aprendas según las necesites:
[editar] ¿Qué es un bang?
Un bang es un mensaje especial que pone en marcha procesos de computación en pd. A lo que responderás, “sí sí, ¿pero qué es?”. Prueba el siguiente patch
El mensaje bang de la izquierda, hace que el objeto suma vuelva a sacar el resultado. Así se comportan muchos objetos en pd, bang dispara el proceso de nuevo. En realidad cuando se recibe en el ejemplo anterior el mensaje 4, internamente se recibe el valor 4, y un bang pone en marcha el proceso. Si sólo enviamos bang, se pone igualmente en marcha el proceso con los valores que tenga el objeto. En el bang de la derecha no hay ningún efecto, o eso parece. Si conectas el mensaje hola a una caja print, verás como si que lo hay. Cada vez que pulsas el mensaje bang se imprime hola en la pantalla principal. Existe un objeto gráfico especial para bang, se consigue en el menú put, o bien pulsando control+mayúscula+b. Pruébalo con el siguiente patch:
El patch multiplica lo que venga de la caja de números por 2, además imprime los datos en la forma “resultado: valor”. Pero lo que nos interesa ahora es el objeto bang. Cuando lo pulsas envía un bang. Al ser un objeto gráfico en forma de botón da un aspecto más amigable a tus patch, además de que con el botón derecho sobre él y propiedades, puedes cambiar el tamaño, color, etc. Por último decir de bang que cualquier cosa que reciba por su entrada se convierte en un bang:
[editar] Contador de Bangs
Una aplicación sencilla, pero que se repite mucho en pd es hacer un contador. Lo que pretendemos hacer es que cada vez que se envíe un bang a un determinado montaje, se añada 1 a un número, de esa manera vamos contando bangs. Para eso presentamos el objeto [float]. float almacena el número que recibe por la segunda entrada, y cuando recibe un bang por la entrada caliente, lo envía. Es algo así como una celda de memoria que permite guardar un número. El montaje más sencillo que se me ocurre con [float] es algo así:
Cuando float recibe alguno de los mensajes numéricos por su derecha, guarda el último recibido. Al pulsar el bang sobre su entrada izquierda, escupe el valor. A float se le puede dar un valor inicial [float 1492] u otro valor cualquiera. Ahora observa el siguiente artilugio:
La primera vez debe ser algo como un trabalenguas en el mundo puredata, pero lo cierto es que es muy usual verlo. Sigamos la vía del bang. Float por defecto guardará cero. Al pulsar el bang, hacemos que float devuelva su valor, que es enviado a la caja de números. ¡Pero también es enviado al objeto suma, que realiza la suma. La salida de la suma se guarda en float. El efecto es que cada vez que se pulsa el bang se incrementa en 1 el valor de la caja de números. ¿Y qué hacer para poner de nuevo a cero el contador?
Un mensaje 0 a float lo arreglará. Evidentemente si en vez de [+ 1] ponemos [+ 4], el contador irá de cuatro en cuatro. Podría ser intuitivo que existiera un objeto que se llamara counter, y de hecho existe, pero lo anterior demuestra que con pocos objetos y con cierto ingenio siempre puedes hacer muchas cosas.
[editar] Contador de compases y tiempos
En música el tiempo se divide en pulsaciones, y un grupos de un número de pulsaciones es un compás. Por ejemplo en 4x4, la sucesión pulsos iguales que ocurren en el tiempo, se dividen en grupos de cuatro
1 2 3 4| 1 2 3 4|1 2 3 4|...
Podríamos aprovechar el contador de bang para hacer eso mismo, contar pulsos y compases. Para ello partiremos de un contador de bang tal y como se hizo en la sección anterior. Pero ahora usaremos dos operaciones muy útiles en puredata: [mod] y [div] [mod] hace la operación matemática mod. El resto de dividir un número entre otro. Tiene la propiedad de que “n módulo m” (el resto de dividir n entre m) es siempre otro número de 0 a n-1. Por ejemplo, 4 módulo 4, es 0. Sin embargo 5 módulo 4 es 1. Si ponemos en orden todos los números que van saliendo al hacer x módulo 4, sale
0 1 2 3|0 1 2 3|0 1 2 3|...
justo lo que buscamos. Pruébalo con algo como:
Por otra parte [div] da el divisor entero de una división. 5 div 4 es 1...Esto puede servir para decir cuantas veces cabe 4 en el número que llevamos, o dicho de otra manera, “¿cuántos compases llevamos?” Un resultado posible de un patch que cuenta compases y pulsos podría ser el siguiente:
Da otros valores a [mod] y [div] para ver cómo funciona.
[editar] Metrónomo de Bangs
Hay un objeto en pd que genera bangs ordenados en el tiempo. En el anterior patch un click de ratón es el responsable de ejecutar el programa. Podríamos querer que este proceso fuera automático, y se ejecutase cada cierto tiempo. [metro] hace eso, es un metrónomo.
Metro se pondrá en marcha cuando reciba un 1 por su entrada caliente, y se parará cuando reciba un 0. Su cometido es enviar un bang cada 1000 milisegundos en este caso. Dicho de otra forma cada segundo. Una versión similar a la anterior pero que hace uso del objeto toggle (control + mayúscula + t ) es esta:
El objeto toggle, es un interruptor que envía 1 o 0. Se podría aprovechar las capacidades de bang para unirlas la contador que vimos más arriba, construyendo así un metrónomo contador.
[editar] Disparar varios procesos a la vez
Una situación muy común es que un metrónomo, un bang, o un mensaje, dispara varios procesos a la vez. La manera más sencilla de hacerlo es sacar varios cables de la salida de [metro] o el bang, y conectarlos a los distintos procesos, pero cuando el patch es complicado, o bien cuando hay que seguir un orden en cómo disparar los distintos procesos, viene bien conocer el objeto disparador [trigger].
El bang activa el trigger que enviará dos bangs de derecha a izquierda, por tanto, verás aparecer primero “a: otra cosa” y luego “b: una cosa”. Igual que pasaba con [float] y [f], puede abreviarse el trigger anterior con [t b b] Trigger también puede enviar datos y muchas más cosas, este es un ejemplo:
El bang hace enviar el mensaje '28', que en trigger se separa en dos líneas. la de la derecha envía el dato recibido, mientras que la de la izquierda envía un bang. Como hemos dicho, se envía ejecuta primero 'print a' y luego 'print b'. Mezclando trigger con el metrónomo anterior, un patch sencillo posible, es calcular de los número naturales (1,2,3,4,...) los valores doble, triple y cuádruple.
En la parte superior hay un contador. Cada número del contador se separa en en tres procesos mediante trigger. De derecha a izquierda se calculan el doble, el triple y el cuádruple.
[editar] Lo que va por los cables
En esta filosofía conexionista, el ojo mira a los objetos que se conectan entre sí, pero es importante pararse un poco sobre los propios cables de conexión. En lo que hemos visto hasta ahora, los cables hacen de conectores de objetos. Podríamos decir que por ellos viajan datos numéricos, simbólicos, bangs, etc. Sin embargo hay que decir que, ya que pd se creó inicialmente pensando en deñales digitales de audio. Hay que distinguir dos tipos de cables.
A la izquierda una conexión entre un mensaje y una caja de números. El cable es el que hemos visto hasta ahora. Pero a la derecha hay otro tipo de objetos que manipulan señales de audio (los cuales se distinguen porque tras el nombre hay un símbolo ~). El cable que conecta [osc~] con [dac~] es más grueso, aunque no demasiado. Esa pequeña distinción visual es importante, ya que se distingue cuando estamos conectando señales de audio, y cuando flujo de datos discretos. En ambos casos hay un flujo de información, pero en el cable fino hay datos del tipo que se guarda en la memoria de un ordenador: números, cadenas de texto, listas de estos, etc. El cable grueso representa señales digitales de audio, por ejemplo una señal muestreada a 44100 Hz y 16 bit. Por tanto, como imaginarás, no se puede conectar la salida de [osc~] con la entrada de la caja de números. La caja de números no puede procesar streams de sonido digital.
[editar] Un ruidito con pd
El patch más simple que puedes hacer en pd, que use señales de audio podría ser este.
[osc~] genera una onda digital seno, de 100 Hz de frecuencia en este caso. Del oscilador salen cables de señal de audio, y van hasta la salida de sonido que tengas configurada. Para escucharlo, ve al menú 'media' y pulsa audio on. Lo paras con audio off :). Un oscilador con control más fino sería algo así:
Se trata de una versión ampliada de lo anterior. [osc~] admite mensajes en su entrada izquierda para indicar la frecuencia. Aparece también una caja de números tipo 2 (control+mayúscula+n), que tienes más opciones de configuración. La salida del oscilador se multiplica por un número, pero atención!! usa el símbolo de operaciones con señales y no con datos [*~]. Se ve que trabajamos con señales por el grosor del cable. El número que multiplicamos se indica con un deslizador (slider) horizontal que puedes encontrar en el menú put. Pulsando botón derecho y propiedades sobre el deslizador podrás configurar el valor izquierdo y derecho. En este caso va de 0 a 1. ¿por qué?, Al multiplicar por 1 una señal la dejamos como está, al multiplicar por 0 la convertimos en silencio. Todos los niveles intermedios son distintas amplitudes. El máximo valor de señal permitido en dac~ es 1, si vas más allá la onda se cortará con la consiguiente distorsión. Esto a veces puede ser interesante tambien.
[editar] Varios procesos a la vez II
Mezclando el patch del oscilador con lo visto anteriormente, se podría construir un montaje que disparara una nota mediante un solo bang. Pero esta vez dejaremos al azar la frecuencia de la nota. Para eso usaremos random:
El random de la izquierda genera números enteros entre 0 y 9, mientras que el de la derecha, ya que le sumamos 10 genera números entre 10 y 19. No son números perfectamente aleatorios pero siguen una función tan compleja que a efectos prácticos funcionan como tal. Añadiendo entonces esta posibilidad a un patch con sonido se podría hacer:
Vamos por partes. Hay un nuevo objeto [line~]. Por el símbolo ~ entenderás que genera señales de audio, aunque hay otra versión para flujo de datos. Line genera líneas entre dos valores. Por ejemplo si enviamos el mensaje [1 1000( a [line] generará un flujo de datos que va desde el valor donde esté (por defecto 0) hasta 1 en 1000 milisegundos. La versión [line~] produce una señal de audio que hace eso exactamente. En el patch anterior [0.6, 0 700( son dos mensajes enviados separados por comas. Indica, a line~ que se ponga en el valor 0.6 en 0 ms, y que vaya hasta 0 tardando 700 milisegundos. El resultado en este caso es una señal de audio lineal que va de 0.6 a 0, tardando 700 ms.
La salida de line~ ya es una señal de audio que multiplicaremos por la salida del oscilador. El resultado es que la amplitud comienza en 0.6 y desciende a 0 en 700 ms.
¿Y el trigger? [t b b] es una forma abreviada de escribir [trigger bang bang]. Separa lo que reciba en dos bangs, primero envía el de la derecha y luego el de la izquierda. En otras palabras, primero procesamos la amplitud y luego la frecuencia. Pero la diferencia a nosotros, en este caso, ¡es imperceptible! El bang que activa random, hará que este envíe un número de 0 a 999, y al sumarle 50, ajustamos el rango de 50 a 1049. Ese número se interpretará como la frecuencia de osc. Prueba a poner otros valores. Por último añadiendo un objeto ya visto, y alterando un detalle se puede tener un patch que dispara una nota, de la que controlamos su duración.
Hay dos cosas nuevas. Un objeto [float] se interpone entre el trigger y line~, lo que hace es guardar el valor que seleccionamos en la caja de números. Cuando recibe el bang desde trigger, entrega su valor. ¿A dónde lo entrega?. A donde pone $1. Ese símbolo significa el primer valor del mensaje que entre. Si por algún motivo enviasemos un mensaje compuesto de muchos valores [1 2 3 4...( podríamos ajustar qué valor queremos leer.
[editar] Seguir adelante
Generlamente al pulsar sobre los objetos dibujados con el botón derecho del ratón y pulsando 'help', obtienes una pequeña descripción o ejemplo de dicho objeto. Lo siguiente, si quieres dejar de ser un PDT (pd-teletubbie) es que visites la sección Documentación sobre Pure Data para seguir adelante. Que los bangs te acompañen!



































