# Pure data

Pure Data (o Pd) es un lenguaje de programación visual desarrollado por Miller Puckette durante los años 90 para la creación de música por ordenador interactiva y obras 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. Está publicado bajo una licencia similar a la licencia BSD.
Pd es muy similar en alcance y diseño al programa original de Puckette, Max(desarrollado cuando él estaba en IRCAM), y es hasta cierto grado interoperable con Max/MSP, el sucesor comercial del lenguaje Max. Ambos Pd y Max son ejemplos discutibles de lenguajes de programación de "flujo de datos". En este tipo de lenguajes, funciones u "objetos" son conectados o "parcheados" unos con otros en un ambiente gráfico que modela el flujo del control y el audio. A diferencia de la versión original de Max, sin embargo, Pd siempre fue diseñado para hacer procesado de señales y tasas de control en la CPU nativa, en vez de descargar la síntesis y el proceso de señales a un tablero de PDS (como el Ariel ISPW que era usado para Max/FTS). El código de Pd es la base de las extensiones MSP de David Zicarelli al lenguaje Max para hacer proceso de audio en software.
Como Max, Pd tiene una base modular de código con externos u objetos que son utilizados como bloques de construcción para programas escritos en el software. Esto hace el programa arbitrariamente extensible a través de una API pública, y alienta a los desarrolladores a añadir sus propias rutinas de audio y control, ya sea en el lenguaje de programación C o, con la ayuda de otros externos, en Python, Javascript, Ruby, y potencialmente otros lenguajes también. Sin embargo, Pd es un lenguaje de programación en sí mismo. Unidades de código modulares y reusables, escritas nativamente en Pd, llamadas "parches" o "abstracciones", son usadas como programas independientes y compartidas libremente entre la comunidad de usuarios de Pd, y ninguna otra habilidad de programación es requerida para usar Pd pero ayuda.
Con la adición del externo "Entorno Gráfico para Multimedia" (GEM, por su nombre en inglés), y otros externos diseñados para trabajar con él (como Pure Data Packet, PiDiP para Linux, framestein para Windows, GridFlow para proceso de matrices n-dimensionales que integra Pure Data con el lenguaje de programación Ruby, etc.), es posible crear y manipular vídeo, gráficos OpenGL, imágenes, etc, en tiempo real con aparentemente infinitas posibilidades de interactividad con audio, sensores externos, etc.
Adicionalmente, Pd está diseñado nativamente para permitir colaboración en vivo a través de redes o de Internet, permitiendo a músicos conectados vía LAN, o incluso en distintas partes del mundo, hacer música juntos en tiempo real.
Las unidades donde se programa el código se llaman “patch” o abstracciones, son utilizadas como programas independientes y compartidos libremente entre la comunidad de usuarios de Pd. Los patchs constan de diferentes objetos interconectados entre ellos. En su parte superior encontraremos las entradas, donde se les enviaran valores numéricos u otros tipos de datos, y en la inferior la salida de estos.
También existe la posibilidad de crear patchs secundarios conocidos como subpatchs. Están dentro del patch principal. Se crean escribiendo en un objeto las letras “pd” seguidas de un espacio y el nombre que se le quiera dar a ese subpatch, como se muestra en la figura. Clicando encima se nos abre la ventana donde encontramos el código de nuestro subpatch.
El programa tiene dos estados en los que se puede encontrar el usuario. En modo de edición o en modo de ejecución. Para cambiar de un estado a otro teclearemos Ctrl+E. Cuando estamos en el modo edición, podemos modificar el contenido de las cajas, o la conexión entre ellas. En el modo de ejecución tenemos la posibilidad de poner en marcha todo el patch, e ir modificando valores durante su reproducción o cuando este, esté parado. Podemos enviar bangs, modificar valor de variables dentro de los objetos “números”, o activar y desactivar sectores del código con el objeto [toggle], activado cuando tiene una cruz y desactivado cuando no.

## Tipos de objetos

Objeto: Su comportamiento dependerá del texto que tenga introducido en él mismo. El programa tiene unos objetos predefinidos, programados por terceras personas en diferentes lenguajes como puede ser C. El Pd reconoce el tipo de objeto y esa caja ya se comporta como tal.
Números: Su utilidad puede ser diversa, desde la de controlar el valor que tiene la señal en diferentes puntos del patch, hasta la de inicializar valores que se pasan a objetos que controlan, por ejemplo, un nivel de opacidad de una imagen.
Mensajes: Están provistos de información que se pasa a los objetos.
Símbolo: Este objeto guarda un símbolo hasta que recibe un [bang] u otro símbolo. Es entonces cuando este símbolo sale del objeto, por la parte inferior de la caja. Estos objetos se ofrecen solo en Pd si tienes descargada y correctamente instalada la biblioteca apropiada. No tienen porqué existir en las bibliotecas sencillas, aunque acostumbran a estar incluidas en los archivos de instalación.
Comentario: lo utilizaremos para incluir aclaraciones dentro de los diferentes pasos que sigue nuestro código.

## Objetos más importantes

El objeto [osc~] nos genera una señal sinusoidal. La frecuencia de oscilación dependerá del valor que se introduzca en la entrada que tiene el objeto en la parte superior izquierda. Siempre que coloquemos un oscilador, tenemos que colocar también un multiplicador y un convertidor digital analógico(dac~). Esto se hace porque el “osc~” por defecto posee la amplitud máxima en 1, por eso la multiplicamos por 0.1 para reducir su amplitud y luego enviarla al “dac~”. El objeto “dac~” tiene dos entradas que hacen referencia a los dos canales de salida de la tarjeta de sonido de tu máquina.
Un [bang] tiene como función la activación de la acción que tiene inmediatamente conectada después.
Metro: Envía series de [bang] periódicamente. Lo crearemos escribiendo la palabra “metro” dentro de un objeto. Este objeto tiene dos entradas, la de la izquierda acepta [bangs]. Hace que el metro empiece a funcionar; asimismo acepta mensajes con el texto “stops”, deteniendo el funcionamiento del metro. También podemos enviarle cualquier número diferente de cero para activarlo. Si se le envía un cero el metro deja de enviar [bangs]. En la entrada de la derecha le introducimos el número que rige la periodicidad del envío de bangs, la unidad de este valor son los milisegundos. Dentro de la misma caja de [metro], después de la palabra metro y seguido de un espacio se introduce un número que el objeto ya lo entiende como el periodo.
Start: Ejecuta los objetos del patch que tiene conectado a él mismo. El objeto [start] lo crearemos escribiendo la palabra “start” dentro de un mensaje.
Stop: Detiene la ejecución del patch que está en funcionamiento. Lo crearemos escribiendo la palabra “stop” dentro de un mensaje.
Select: Nos actúa de selector según una condición numérica dada inicialmente. Lo creamos introduciendo la palabra “select (espacio)condición”. De esta manera cuando el valor de entrada sea igual a la condición, por la salida de la izquierda se enviará un bang. Si no coinciden el bang será enviado por la salida de la derecha. Se pueden introducir varias condiciones simultáneas separadas por espacios. Se crearan tantas salidas como condiciones más una final. Cuando el valor coincida con una de las condiciones, el bang será enviado por la salida que corresponda con dicho valor. Si no coincide, el [bang] siempre será enviado por la última salida, la de más a la derecha.
Moses: Escribiremos la palabra “moses” dentro de un objeto para poder tenerlo operativo. Contiene dos entradas y dos salidas. En la entrada de la izquierda conectamos el valor que está en el proceso y en la derecha el valor que queremos que actúe de frontera. Si el valor del proceso es inferior a la frontera, nos saca el valor de entrada por la salida de la izquierda. En cambio, si el valor es igual o superior al valor que actúa de frontera, nos sacará el número por la salida de la derecha. Podríamos asemejar el [moses] a un filtro paso bajo y paso alto simultáneo.

## Instalación en GNU posibles problemas y soluciones

Para instalar Pd en GNU deberemos descomprimir el paquete descargado con el programa y ejecutar el archivo con extensión “.deb”. El primer posible problema con el que nos podemos encontrar, es que la distribución Ubuntu Studio ya lleva un Pure Data instalado de serie. Debido a que es recomendable utilizar la versión Pd_extended (aunque esto es algo que varía muy a menudo) tendremos que desinstalar el Pure Data de GNU/linux Ubuntu, para que, al instalar el nuevo, no tengamos problemas con el hecho de compartir de carpetas. Otro factor muy común e importante cuando instalemos programas en GNU son las dependencias de bibliotecas secundarias que puedan existir. Es necesario instalarlas para el buen funcionamiento del programa. En el caso de Pure Data y de algunas bibliotecas externas (externals), se tienen que instalar algunas dependencias mediante el gestor de paquetes llamado Synaptic. Ahí podemos buscar cuales son las que necesitamos.
Una vez probado el correcto funcionamiento del Pd, para optimizar los recursos del programa, cargamos, en el start up, las bibliotecas más comunes que se usaran, para evitar tener que importarlas cada vez que se quieran usar. De este modo al arrancar Pd en tu máquina ya se cargan automáticamente.
Linux

## Introducción rápida

Una vez ya tenemos el Pd estable en nuestra máquina se procede a hacer un primer test del programa para comprobar que la conexión con nuestra tarjeta de sonido es correcta. Este lo encontraremos en Media>test audio and MIDI. Ahí podemos generar una señal de test (un tono, ruido rosa,…) escuchándola por nuestros altavoces, comprobando así que todo funciona correctamente.
Para empezar a conocer el entorno de Pd, podemos empezar abriendo ejemplos que encontraremos en los archivos de documentación que hay dentro de la carpeta de Pd. Allí hay patchs de audio y de vídeo que sirven para familiarizarse con el programa. Cuando queramos crear nuestro propio patch, en la ventana de Pd vamos a File>New y se nos abre la ventana donde introduciremos nuestros objetos que conectaremos entre ellos creando así nuestra aplicación.

## Bibliotecas pdp, pidip y opencv

La biblioteca PDP es una colección de objetos que se utiliza para procesar numerosos datos. Funciona en Linux y la mayoría de objetos también trabajan en Mac OSX. Una vez descargado, la instalación en Linux se hace a través del terminal, compilando y ejecutando el archivo de instalación que viene adjuntado, de la siguiente manera:
./configure
sudo make
sudo make install
Cuando los datos ya están representados como un paquete dentro de Pd, es posible empezar a manipularlos. La biblioteca PiDiP son objetos de video que completan la colección de objetos de PDP. La instalación es idéntica a la de PDP, desde el terminal ejecutamos los mismos comandos, quedando así lista para su uso.
También existe otra biblioteca referente al videollamada OpenCV. Es una biblioteca abierta desarrollada por Intel. Esta biblioteca proporciona un alto nivel de funciones de procesado de imágenes. Permite al programador crear aplicaciones en el dominio de la visión digital. OpenCV es Open Source permitiendo así poder funcionar en muchas plataformas. Esta biblioteca nos permite hacer operaciones básicas, procesado de imágenes, análisis de reconocimiento del modelo, análisis estructural, reconstrucción 3D, calibración de la cámara, análisis de movimiento, interfaz gráfica y adquisición, etc. Implementa una gran variedad de herramientas para la interpretación de la imagen, como por ejemplo, detección de facciones o análisis de la forma (geometría, contorno que procesa en ese instante), entre otras.

## Patch patrones

Una buena primera toma de contacto con Pd puede ser la generación de un tono sinusoidal. Para esto utilizaremos el objeto [osc~]. En la entrada izquierda le conectaremos un mensaje con un número dentro que actuará de frecuencia de oscilación. Su salida la enviaremos a un multiplicador que nos convertirá esta frecuencia en audible y finalmente esto lo enviamos a un convertidor digital analógico [dac~] para poder reproducirlo por los altavoces de nuestra máquina. Una vez ya hemos creado este patch, podemos modificar la frecuencia clicando y manteniendo pulsado el ratón encima del mensaje del número y desplazando el cursor arriba abajo, aumentando y disminuyendo así el valor de la frecuencia.
Para abrir un dispositivo externo, como por ejemplo una cámara web, deberemos escribir en un mensaje la palabra “open” seguido de un espacio y la ruta de donde se encuentra este dispositivo. Este, lo conectaremos al objeto que nos permite visualizar la imagen según nuestro sistema operativo, en Linux sería pdp_v4l (video for Linux). A este objeto también le conectamos otro mensaje donde le indicamos el canal por el que queremos enviar la información. Finalmente le conectaremos a [pdp_v4l] un [metro] dándole la información de la periodicidad con la que queremos que nos muestre las imágenes que la cámara está captando. Para tener continuidad de movimiento le daremos un valor estándar de 100ms. A gusto del usuario también podemos girar la imagen en sentido horizontal para que el efecto generado al ver la imagen sea de espejo. Para conseguir esto conectaremos la salida de [pdp_v4l] al objeto [pdp_flip_lr]. Con esto ya tenemos, en una ventana aparte, la imagen que la cámara está captando.