# 1. Introducción a Pure Data La primera sesión del curso trata de comprender los aspectos básicos de Pure Data. Se revisarán las principales herramientas que contiene, la dinámica básica del software y algunas de sus funciones para realizar operaciones. Introducción a la **GUI (Graphic User Interface)**, los **[objetos]**, así como sus **Inlets** (**Hot** & **Cold**) y **Outlets**. <br> ## Contenidos :::info |Objetivos|Detalle| |---|---| |Introducir el software|- |Conocer la GUI básica de Pure Data | **[bang] [toggle] [slider] [switch] [number]** |Comprender la interfaz y la dinámica básica de Pure Data |**Inlet**, **Outlet**, **Hot** Inlet & **Cold** Inlet… **Panel de ayuda** | |Introducir las funciones de interacción básica |Encender y apagar circuitos **[0]**| |Aprender a manejar los operadores básicos de Pure Data |**[+] [-] [*] [/] [i] [f] [%]** | |Realizar bucles| **i++**| ::: <br> ## Introducción Pure Data es un software de programación creativa, pensado para diseñar entornos interactivos. Al funcionar a través de un sistema de nodos, Pure Data permite realizar funciones avanzadas a través de códigos de corta extensión. La dinámica básica de Pure Data consiste en crear **patches**; archivos que contienen, a la vez, la parte programada y la parte usable. Uno de los objetivos de este curso es el de investigar la estética algorítmica de Pure Data a través de sus posibilidades a nivel creativo. <br> ## GUI Básica Esta es la ventana principal de Pure Data. Es una ventana que **no se puede cerrar mientras trabajamos con el software**. Su funcion, principalmente, es la de visualizar datos. La caja **[x]DSP** (Digital Sound Processing) **sirve para trabajar con ondas** --no solamente con sonido--. Activar el DSP permite también poder escuchar las ondas generadas. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/Sy3R5aP0R.png) </div> Haciendo Archivo>Nuevo creamos un nuevo **Patch**. Este Patch será el espacio de trabajo. Al crear un nuevo Patch, se muestra una ventana vacía en la que introduciremos objetos para realizar cálculos y funciones complejas. El tamaño de la ventana puede variar. ![image](https://hackmd.io/_uploads/r1iRiTPA0.png) Dentro de los aspectos esenciales de Pure Data, debemos conocer la **GUI** (Graphic User Interface), que nos permitirá diseñar e interactuar con los circuitos. Podemos encontrar los items de la **GUI** en el Menú>Poner: ![image](https://hackmd.io/_uploads/Syc9cTwAC.png) Los items más utilizados para diseñar la interacción dentro de los circuitos de Pure Data son los siguientes: | Item | Nombre |Descripción| | -------- | -------- | -------- | | ![image](https://hackmd.io/_uploads/B1586hPCC.png)|Bang| El **Bang** sirve para activar un circuito (se activa, manda una señal, y se desactiva).| | ![image](https://hackmd.io/_uploads/Syab0hDCC.png) |Toggle| El **Toggle** o **Interruptor** puede estar encendido **(1)** o apagado **(0)**. Cada vez que se enciende o se apaga, envía un **Bang**. | ![image](https://hackmd.io/_uploads/SyrmJaw00.png) |Slider| El **Slider** envía valores enteros en un rango determinado (por defecto 0-127). Cada cambio de valor envía un **Bang**. Está diseñado para trabajar con valores continuos. También existe la versión horizontal de este mismo objeto. |![image](https://hackmd.io/_uploads/rkxt16wCR.png)|Selector| El **Selector** es un sistema de celdas que permite enviar un valor entero, uno por cada celda (por defecto 0-7). Cada cambio de valor envía un **Bang**. Está diseñado para visualizar patterns. Existe la versión horizontal de este mismo objeto. |![image](https://hackmd.io/_uploads/HJQclaPRR.png)|Número| El **Número** nos deja visualizar el valor de una operación realizada. También se puede cambiar su valor haciendo click y arrastrando sobre el nodo. <BR> :::danger ## **BUG** Por último, es probable que cuando abras un patch guardado se esconda debajo de la barra inferior o que directamente no sea visible. Para poder visualizarlo correctamente, Deja el ratón encima del icono de pure data y, cuando se muestren las ventanas, haz botón derecho encima del patch y haz click en **maximizar**. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/rk7VyCv0R.png) </div> ::: <br> Para cambiar entre el modo **Edición** y el modo **Interacción** se puede hacer a través de **Menú>Editar>Modo Edición** o a través del comando **Ctrl+E**. Para interactuar con los distintos items de interacción durante el **Modo Edición** se puede hacer **Ctrl+Click**. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/HJz8s1dCA.png) </div> </br> ## Objetos, Inlets y Outlets En el sistema de nodos de Pure Data, los objetos son el nodo más importante. Un objeto puede tener muchos usos. Es una caja que actúa de una u otra manera dependiendo del contenido que tenga: pueden ser desde **operadores** (ej. sumar, restar, multiplicar, dividir) hasta **funciones complejas** (ej. separar, comparar, transformar valores). Cada objeto puede tener dos tipos de conexiones: el **inlet** está en la parte superior y sirve para recibir información y el **outlet** está en la parte inferior y sirve para enviar información. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/Hyiq22wCA.png) </div> Pese a ser diferentes, todos estos nodos son todos **objetos**, y sirven para realizar diferentes tipos de operaciones o funciones. El objeto **[17]** tiene almacenado el número 17. El objeto **[+]** sirve para sumar dos valores. El objeto **[- 3]** sirve para restar 3 al valor recibido. El objeto **[spigot]** sirve para enviar un mensaje dependiendo de un boleano (1/0, positivo/negativo). El objeto **[text define]** sirve para crear un nuevo archivo de texto. En la [documentación oficial](https://pd.iem.sh/) de Pure Data está el listado actualizado de [todos los objetos](https://pd.iem.sh/objects/), así como en la ventana de ayuda del propio software. <div style="text-align: center;"> ![objeto suma](https://hackmd.io/_uploads/SJ-_9-E0C.png) </div> Tomando como ejemplo el **objeto [+]**, podemos ver que tiene dos inlets y un outlet. Por cada uno de los inlets entran los dos valores que se suman, y por el outlet sale el valor resultado de la suma. Para que la operación se realice, los datos deben ser disparados (**[bang]**) o actualizados (un cambio en los valores numéricos conectados a los inlets) para enviar la señal del primer al último nodo. Sin embargo, en esta dinámica hay que comprender el concepto Hot/Cold Inlet. <br> |Inlets & Outlets| Descripción | | -------- | -------- | | ![HotInlet](https://hackmd.io/_uploads/ByOnrbN00.png) | El **Hot Inlet** es el pin de activación del objeto. Es decir, este objeto solo actúa si recibe una señal disparada por un **[bang]** que llega a esta entrada. El **Hot Inlet** siempre es el primero por la izquierda. | | ![ColdInlet](https://hackmd.io/_uploads/Hk7X7DVRC.png) | El **Cold Inlet** es un inlet que sirve para almacenar un valor. El objeto no actúa porque no tiene un dato disparado (o no tiene *corriente*). El Cold Inlet depende del Hot Inlet y no envía cambios al Outlet por sí mismo. El Outlet siempre se actualiza junto al el Hot Inlet. | ![image](https://hackmd.io/_uploads/BkUwIP40A.png) | El **Outlet** siempre envía la señal al siguiente nodo una vez el objeto ha realizado su operación o su función. <br> Por lo tanto --en términos generales--, cualquier señal recibida en el Hot Inlet será enviada directamente al Outlet; cualquier señal recibida en el Cold Inlet se almacenará en el objeto pero **no será enviada** al Outlet; una vez almacenada, la señal recibida por el Hot Inlet enviará al Outlet la operación sumando los dos valores recibidos. <br> | 1. Señal Hot Inlet | 2. Señal Cold Inlet | 3. Señal Hot Inlet| | -------- | -------- | -------- | | ![s-H_I](https://hackmd.io/_uploads/SyaZvtV0R.png)|![image](https://hackmd.io/_uploads/rJrEvt400.png)|![image](https://hackmd.io/_uploads/BJTcvKVC0.png) | Envía datos | Almacena datos | Calcula y envía datos | <br> :::spoiler **Ejemplo 1-1** Con este pequeño ejercicio puedes comprobar las distintas interacciones que ocurren entre los objetos, Inlets y Outlets: ![image](https://hackmd.io/_uploads/SJuCshPCA.png) ::: <br> ## Ayuda Pure Data incorpora un panel de ayuda que permite entender cómo funciona cada objeto. Este menú de ayuda se puede desplegar haciendo botón derecho sobre el Patch y haciendo click en Ayuda. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/HJN--Rw00.png) </div> Nos despliega el siguiente menú en el que nos muestra todas los objetos que podemos utilizar en Pure Data. Una vez en esa ventana, podemos abrir la ayuda de cualquiera de los objetos. En este caso, abro la ayuda del objeto **[bang]**: ![image](https://hackmd.io/_uploads/H1F9-RwC0.png) :::info ## **TIP** Haciendo **Ctrl+** podemos hacer más grande la interfaz de Pure Data ::: <br> ## Operadores Además de los operadores que ya conocemos **[+] [-] [/] [*]**, Pure Data nos ofrece otros como son **[i] Integer** (número entero), **[f] Float** (número con decimales) y **[%] Módulo** (agrupa enteros). Estos operadores suelen ser la base de cualquier Patch: <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/r1pk0e4RA.png) </div> Todos estos operadores son objetos que, como su nombre indica, sirven para realizar operaciones, y no tienen un valor por sí mismo; lo adquieren en base a los dígitos que reciben y procesan por sus Inlets. El siguiente circuito sirve para realizar un **bucle**: <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/Sk7KrCw00.png) </div> </br> * El valor inicial de **[i]** es 0, ya que no se ha asignado ningún valor previo. * La señal se lanza desde el **[Bang]** y entra al nodo por el **Inlet** * La señal sale a dos nodos: **[+1]** y **[número]**. El resultado es 0. * Al siguiente **[Bang]** la señal hará lo mismo, pero **[i] valdrá 1**, y el resultado será 1. ![image](https://hackmd.io/_uploads/Hy_oL0wCC.png) Si se añade el objeto **[%] Módulo**, se puede dividir el valor del Outlet en grupos. Para eso, se necesita asignarle un **argumento**, es decir, el tamaño del grupo que queremos hacer. Para eso tenemos dos opciones: <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/B15mYADCC.png) </div> La primera consiste en añadir el **[%] Módulo** vacío y asignarle el valor mediante su Cold Inlet (añadiendo primero el valor y después activando el bucle). La segunda consiste en añadir el propio **argumento** en el nodo del objeto, asignándole así el valor a la función. :::info ## **TIP** Algo importante a tener en cuenta es que ambas opciones pueden combinarse entre sí; es decir, aunque un nodo disponga de un **argumento**, este se puede cambiar enviándole otro valor a través del Cold Inlet (esto aplica a cualquier tipo de objeto y argumento). ::: El resultado de la aplicación del módulo es la siguiente: ![image](https://hackmd.io/_uploads/rksDORDAC.png) <br> ## Resetear un circuito Una vez hemos realizado una determinada operación, es probable que algunos de los nodos se hayan modificado y se necesiten resetear (por ejemplo, si se quiere que el bucle vuelva a 0). Para eso se necesita hacer **reset** de una parte del circuito; más concretamente, se debe resetear el valor de la caja **[i]**. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/BJjVyyuCC.png) </div> :::danger ## OJO Hay que tener cuidado con los valores que se resetean, ya que se puede **romper** el circuito. Por ejemplo, si reseteas el valor de la suma con un **[0]**, la suma pasará de valer **[+ 1]** a **[+ 0]**. Por lo tanto, el bucle dejará de funcionar hasta que reciba otro valor de suma. --- En caso de *romper* el circuito, es aconsejable cerrar y abrir el documento para que se reseteen los parámetros iniciales del patch. ::: <br> ## Ejercicio 1 **Parte1:** Crea un circuito que sume de manera infinita. Tiene que poder sumar +1, +2 o +3. Haz que sea visible el resultado de la suma. **Parte2:** De la parte anterior del circuito, extrae un grupo que vaya del 0 al 4, y otro grupo que vaya del 0 al 8. Estos dos números se tienen que **comparar** para saber cuál es más grande que el otro. **Parte3 (extra):** De la primera parte del circuito extrae un número aleatorio del 0 al 9. Compáralo con el dígito que extraes de la Parte2; si son iguales, enciende un interruptor, si son diferentes, apaga el interruptor. </br> :::spoiler **Solución** ![image](https://hackmd.io/_uploads/r14VA3GJ1g.png) ::: <br> --- <br> <div style="text-align: center;"> Anterior: [**Diseño de Medios Interactivos**](https://hackmd.io/oSM_ucLgSZGbfkpuSToIzQ?both) Siguiente: [**Sesión 2: Circuitos Básicos**](https://hackmd.io/Ep1H3wYsQ2OsAI0BGqFtBw) </div> <br>