# 2. Circuitos básicos Una vez se conocen los aspectos básicos de Pure Data, es posible empezar a realizar algunas operaciones algo más complejas. Durante esta segunda sesión, se revisarán algunas de las funciones más utilizadas en la creación de algoritmos en Pure Data. En esta sesión se revisan algunas de las funciones más utilizadas en la creación de algoritmos en Pure Data. Se introducen algunas funciones temporales como **[metro]**, funciones de selección como **[random] [sel] [spigot]** y funciones de reproducción de archivos de sonido como **[readsf] [~dac]**. <br> ## Contenidos :::info |Objetivos|Detalle| |---|---| |Crear valores al azar dentro de un rango determinado (argumento)| **[random]** |Selección y separación de valores | **[sel] [spigot]** |Control temporal de envío de señales (I)| **[metro] [delay] [pipe]** |Leer archivos de sonido a través de funciones simples|**[readsf~] [dac~]** ::: <br> ## Secuenciar el tiempo Un concepto básico de Pure Data es la **actualización de valores**. Cada **[bang]** envía una señal que es replicada y procesada automáticamente en cada uno de los **Hot Inlets** de los objetos por los que pasa, actualizando los valores de los nodos que atraviesa. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/S1QA5mpRR.png) </div> En este ejemplo, podemos ver cómo la actualización del número produce una señal que se envía automáticamente al objeto **[bang]**. Con Pure Data es necesario aprender a gestionar el envío de señales, con el objetivo de controlar y regular el _timing_ con el que se activan diferentes objetos. Así, la actualización de los objetos no solo nos permite controlar los envíos de señales, sino también encadenar o automatizar envíos. </br> ## Envío constante de señales [metro] El objeto [**[metro]**](https://pd.iem.sh/objects/metro/) emula un metrónomo,, que sirve para enviar **bangs** de manera constante con un intervalo de tiempo regular. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/Bk5UneWJyg.png) </div> **Funcionamiento:** La función **[metro]** debe incorporar un **argumento** (por defecto en milisegundos) con el que se le asigna el intervalo de tiempo con el que envía las señales. **[metro 1000]** es un objeto que envía un **bang** por cada segundo. **Activación** El objeto **[metro]** se activa recibiendo por el **Hot Inlet** un **bang** o **un número que no sea 0**. Se desactiva recibiendo un **0**. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/S1T0LrfJkg.png) </div> </br> ## Creación de valores aleatorios [random] El objeto **[[random]](https://pd.iem.sh/objects/random/)** sirve para crear valores enteros _aleatorios_ en un rango entre 0 y N. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/SysYuHzJJx.png) </div> **Funcionamiento:** La función **[random]** debe incorporar un **argumento** (cualquier número entero) que sirve como rango. El objeto **[random 10]** dará como resultado un valor aleatorio **del 0 al 9**. un objeto que envía un **bang** por cada segundo. **Activación** El objeto **[random]** se activa recibiendo por el **Hot Inlet** un **bang**. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/Sks-FSMJkx.png) </div> </br> :::spoiler Ejemplo 2-1 ![image](https://hackmd.io/_uploads/r1o-oBz1Jx.png) ::: </br> ## Selección y separación de valores A la hora de trabajar con Pure Data, es necesario poder separar correctamente los datos de interés de aquellos que no son importantes. Con la separación y selección de datos, se pueden empezar a crear pequeños algoritmos simples, con los que crear patches algo más complejos de los que hemos visto hasta ahora. La creación de **condiciones** y la **verifiación** de estas condiciones (verdadero/falso, +/-, valores coincidentes...) es el primer paso para la producción de algoritmos con Pure Data. <br> ## Puertas lógicas con [spigot] El objeto [[spigot]](https://pd.iem.sh/objects/spigot/) imita una puerta lógica electrónica. El objeto bloquea o deja pasar un dato según el valor que recibe en su Cold Inlet (0 cerrado, 1 abierto). <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/HymHf8G1Je.png) </div> **Funcionamiento/Activación:** El objeto **[spigot]** debe recibir dos datos. En su **Hot Inlet**, debe recibir **el mensaje o dato a enviar + un bang**. Ese mensaje se enviará siempre y cuando en su **Cold Inlet** haya recibido previamente, o a su misma vez, un valor numérico **distinto a 0**. Así, el objeto **[spigot]** actúa como una puerta que enviará datos siempre que su condición sea positiva (asignando un valor **distinto a 0** en su **Cold Inlet**). Para desactivar el objeto, debe recibir un **0** en su **Cold Inlet**. </br> ## Selección y descarte de valores con [sel] El objeto [[select]](https://pd.iem.sh/objects/select/) abreviado como **[sel]** sirve para seleccionar un valor recibido. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/HJnRULGyJg.png) </div> **Funcionamiento:** La función **[sel]** debe incorporar uno o varios **argumentos** (cualquier número entero o símbolo). Por cada argumento, se crea un nuevo **Outlet**, el cual envía un **bang** cuando recibe el número o símbolo asignado por el **Hot Inlet**. El objeto **[sel 0 1 2]** enviará tres **bangs** diferentes dependiendo si recibe 0, 1 o 2. **Activación** El objeto **[sel]** se activa recibiendo un **valor actualizado** por su **Hot Inlet**. Devuelve un **bang**. </br> ## Leer archivos de sonido con [readsf~] Una de las funcionalidades para las que se ha diseñado Pure Data es para leer y modificar archivos de sonido. El **objeto** fundamental para leer y trabajar con sonido en Pure Data es **[[readsf~]](https://pd.iem.sh/objects/readsf~/)** (readSoundFile). <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/S1WYU2MJ1g.png) </div> Para leer un archivo de sonido desde Pure Data, tenemos que tener ambos archivos guardados en **la misma carpeta**, o indicar, dentro del patch (mediante un mensaje) **la ruta** en la que se encuentra el archivo. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/B1t8U3fk1e.png) </div> <br> Para que el archivo pueda sonar, se debe utilizar el objeto **[[dac~]](https://pd.iem.sh/objects/dac~/) (Digital-to-Analog Converter)**. De lo contrario, si se quisiera utilizar un micrófono para registrar o procesar sonido en tiempo real, se debería utilizar el **[[adc~]](https://pd.iem.sh/objects/adc~/) (Analog-to-Digital Converter)**. <br> <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/BkIo2IMyke.png) </div> :::danger ## OJO Solo funciona con archivos .wav ::: <br> **Funcionamiento:** El funcionamiento de **[readsf~]** es algo peculiar, ya que el objeto escucha la ruta del archivo reproducido. Eso quiere decir que, para reproducir un sonido, el objeto debe, además de recibir un **bang**, recibir una ruta y el nombre del archivo del archivo. En el ejemplo anterior, ambos archivos se alojan en la misma carpeta, por lo que solamente se debe incluir _1.wav_ para llamar al archivo mediante un **mensaje**. El mensaje debe argumentarse con 1 o 0 para que el archivo se reproduzca o deje de reproducirse. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/SJlQE3G1yg.png) </div> **Activación:** El objeto **readsf~** se activa con un **bang** o haciendo click encima del mensaje que contiene la ruta del archivo. En caso de recibir un **0**, el objeto deja de enviar datos al **[dac~]**. </br> ## Ejercicio 2 **Parte1:** Crea un circuito que sume (**+1**) de manera **infinita**. Lo tiene que hacer **automáticamente**, haciendo que sea visible el resultado de la suma. El usuario puede seleccionar que vaya **de 100 a 200 veces por minuto** con un **slider**. **Parte2:** De la parte anterior del circuito, extrae un grupo que vaya del 0 al 15, que sea visible con un **selector horizontal**. De ese grupo, seleccionar **0, 4, 8 y 12** y hacer que suene un archivo de audio. De ese mismo grupo, selecionar los números **1 3 5 7 9 11 13 y 15** y hacer que suene otro archivo de audio. **Parte3:** Hacer un segundo reproductor, que funcione conectado al anterior pero al doble de velocidad. Se activan a la vez y van sincronizados. Selecciona **2 6 10 y 14** y reproduce un tercer archivo de audio. **Parte4 (extra):** Crea un tercer reproductor que seleccione y reproduzca **un sonido al azar**. </br> :::spoiler **Solución** ::: <br> --- <br> <div style="text-align: center;"> Anterior: [**1. Introducción a Pure Data**](https://hackmd.io/hePUOkplTqGtl5u4OEs6-Q) Siguiente: [**Sesión 3: Conexiones y GUI**](https://hackmd.io/@FvMTRdPQSeqhA0pGgMQEWg/B1bnld5kJe) </div> <br>