# MÓDULO 4: PURE DATA

Veremos los elementos básicos, cómo configurar el programa, crearemos nuestro primer patch y experimentaremos con el micrófono

# Elementos básicos

#### ELEMENTOS

En Pure Data trabajaremos con 4 tipos/clase de elementos o cajitas: objetos, mensajes, GUI, y comentarios. Estas cajitas pueden tener 0 o más entradas y/o salidas (Pure Data, 2022). Estas cajitas van a ser contenedores de procesos o datos y las conectaremos unas a otras para crear la estructura que nos permita obtener el resultado deseado.

<table border="1" id="bkmrk-%C2%A0%3C----en-este-patch-" style="width: 100%;"><tbody><tr><td class="align-center" style="width: 28.801%;">![image-1661609279467.jpg](https://libros.catedu.es/uploads/images/gallery/2022-08/scaled-1680-/image-1661609279467.jpg)Figura 1. patch que imprime un numero</td><td style="width: 71.199%;"> &lt;--- en este patch hay cuatro cajitas de texto: una cajita de numero (que contiene un cero), una caja de objeto que contiene la palabra "print" y dos comentarios que indican la función de las otras dos cajas.</td></tr></tbody></table>

Un **clic derecho** sobre cualquier elemento nos abre un menu con tres opciones: **Propiedades, Abrir y Ayuda**.

[![image-1668182358911.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668182358911.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668182358911.PNG)

Figura 2. Ventana de opciones que aparece al hacer click derecho sobre cualquier elemento de Pure data.

**Ayuda** nos va a abrir un patch sobre ese elemento con una explicación sobre su funcionamiento y ejemplos. Esta explicación está en inglés, si no la entendéis podéis utilizar [deeple](https://www.deepl.com/translator) para traducirla:

![image-1668182268546.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668182268546.PNG)Figura 3. Patch de ayuda de la interfaz gráfica de cajita de numero variable

#### [![image-1661427544240.PNG](https://libros.catedu.es/uploads/images/gallery/2022-08/scaled-1680-/image-1661427544240.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-08/image-1661427544240.PNG)Mensaje

La cajita de Mensaje se representa por un polígono irregular, un rectángulo con dos piquitos en los vertices derechos. El contenido que introduzcamos en una cajita de mensaje en el modo edición no se puede cambiar mientras el programa está fuera del modo de edición, para modificar el contenido de un mensaje tenemos que hacerlo en el modo edición del patch y este contenido se conserva cuando guardamos, cerramos y volvemos a abrir el patch.

Los mensajes envían su contenido cuando son activados (generalmente utilizaremos un Bang para activar un mensaje, si queremos que un mensaje se envié dos veces tendremos que activar el bang dos veces). Tambien podemos enviarlo clicando sobre él, esto hace que el mensaje sea considerado también una interfaz gráfica de usuario (GUI). Conectaremos la salida de un mensaje con la entrada de un objeto que sera el destinatario del mensaje. Las salidas de cualquier elemento de pure data se encuentran en la parte inferior de la cajita, y las entradas en la parte superior.

Por defecto los caracteres numéricos, por ejemplo, el numero 5, en un mensaje serán considerados **float**. La palabra "perros" sera considerada **symbols**, y cuando un mensaje contenga varios elementos separados por un espacio tendremos una **lista**. Las listas pueden contener elementos de diferentes clases por ejemplo "5 perros"

Para colocar un mensaje en nuestro patch: **menu horizontal&gt;Poner&gt;Mensaje** o utilizando en comando **"Ctrl+2"**

#### [![image-1661427608752.PNG](https://libros.catedu.es/uploads/images/gallery/2022-08/scaled-1680-/image-1661427608752.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-08/image-1661427608752.PNG)Objeto 

Los objetos se crean escribiendo texto en una cajita de objeto, y es ese **texto** el que va a **crear un objeto** determinado con una función específica. Este texto se divide en ***atoms*** separados por un espacio. El primer *atom* indica que tipo de objeto sera creado, los *atoms* siguientes, llamados ***argumentos** de creación,* indican a Pd como inicializar el objeto, por ejemplo que valor/valores o en qué estado comienza el objeto (Pure Data, 2022). <span style="background-color: #2dc26b;">Hacerlo mas claro, añadir imagen con explicacion</span>

La cajita de objeto se representa por un rectángulo, en la parte superior del rectángulo se encuentran las **entradas**, también llamadas inputs o **inlets**, marcadas con una pequeña línea gruesa. En la parte inferior se encuentran las **salidas**, outputs o **outlets**, marcadas cada una de ellas también con una pequeña línea gruesa. Dependiendo del objeto el número de entradas y salidas variara, y hay objetos que no tienen salida, solo tienen entrada como el "print". Para referirnos a las entradas o salidas empezaremos a contar por la parte izquierda, por ejemplo, el objeto suma que veis a continuación tiene dos entradas, la primera entrada es la que se encuentra a la izquierda y la segunda entrada es la que se encuentra a la derecha.

![image-1661757829440.3.jpg](https://libros.catedu.es/uploads/images/gallery/2022-08/scaled-1680-/image-1661757829440-3.jpg) el "+" especifica el tipo de objeto que sera esta cajita, indica que es un objeto de suma y su función sera esa, sumar. Este objeto tiene un argumento que es el "13" indica que cantidad se va a sumar al número que llegue por la entrada izquierda del objeto (Pure Data, 2022):

Entrada/input izquierda + 13 = output/salida

La cantidad a sumar sera el argumento inicial del objeto ,13, a no ser que introduzcamos otro número por la entrada derecha del objeto. El numero introducido remplazara al 13 y quedara almacenado en el objeto suma. Aunque visualmente en el objeto sigamos viendo "+ 13", su contenido es "+ Ultima Entrada/inlet derecha"

Entrada/input izquierda + Ultima Entrada/input derecha = output/salida

![image-1668184645607.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668184645607.PNG)Figura 4. patch *Suma.pd*

¿Hay alguna diferencia entre la entrada izquierda del objeto suma y la entrada derecha?

Si las hay, y es importante que las conozcamos. Como regla general el primer inlet de un objeto sera un **"hot" inlet** o **entrada caliente** y el resto de inlets serán **"cold" inlets** o **entradas frías**. Un valor enviado a una entrada fría sera almacenado por el objeto, pero no activará el proceso de ejecución del objeto y este no emitirá ningún valor por su outlet hasta que la entrada caliente reciba un bang o un valor/mensaje.

Los atoms son números o símbolos. Todo aquello que no sea considerado un numero valido sera interpretado por el programa como símbolo. Los números validos pueden contener decimales (12, 15.6, -783) o estar escritos con notación exponencial (7.8e3 = quiere decir 78 multiplicado por 10 tres veces = 7800) (Pure Data, 2022). Los exponenciales negativos dividen entre 10 (69.3e-4= 0,00693) (Pure Data, 2022).

Entre números no validos que son leídos como símbolos podemos encontrar expresiones como "+5" "0..6" "casa" y el programa reconoce como símbolos diferentes "hola" , "Hola" y "HOLA" luego diferencia entre mayúsculas y minúsculas (Pure Data, 2022).

Los números validos pueden ser de dos tipos:

- Integer o int = números enteros, sin decimales. Como el numero 5 o el 22.
- Float = números con decimales. Como el numero 10,85 o el 22,6.

Para colocar un objeto en nuestro patch: **menu horizontal&gt;Poner&gt;Objeto** o utilizando en comando **"Ctrl+1"**

Utilizando un objeto podemos crear una variable que nos permita almacenar datos. ¿Os acordáis de lo que era una variable? Lo vimos en la página ["Elementos que debemos de conocer"](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/elementos-que-debemos-conocer)

Tendremos que saber qué tipo se variable queremos almacenar, ya que crearemos un objeto para ese tipo de variable. Si queremos almacenar un numero entero crearemos un objeto "int" o "i", son el mismo objeto, pero podemos escribirlo de estas dos maneras, una de ellas ocupa mucho menos espacio y nos va ser mucho más cómoda cuando tengamos muchos objetos en nuestro patch. Si queremos almacenar un numero decimal crearemos un objeto "float" o "f".

En la carpeta de *Elementos básicos* que os he dejado encontrareis el patch *Variables-Integer-Float.pd* donde podréis probar estos objetos:

![image-1668502749723.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668502749723.PNG)Figura 5. patch *Variables-Integer-Float.pd*

Los objetos de variables int y float funcionan siguiendo el esquema de entrada caliente y entrada fría que explicábamos antes. Los valores que lleguen al inlet derechos serán almacenados, pero no serán enviados hasta que el inlet izquierdo reciba un bang. Los valores recibidos en el inlet izquierdo serán almacenados y enviados inmediatamente al ser recibidos. Podéis comprobarlo en el patch *Variables-Integer-Float.pd.*

Para más información de cualquier elemento de Pure Data accederemos a el **patch de ayuda** que encontraremos clicando sobre el elemento con el botón derecho y seleccionando Ayuda. Este patch en ingles explica la funcionalidad y posibilidades del elemento.

Cuando trabajemos con **señales** de audio utilizaremos **objetos específicos de audio**. Estos objetos siempre contienen el símbolo de **virgulilla : "~"** y a diferencia de los objetos de control/Data flow que realizan su función únicamente cuando sucede un evento y los activa (ejemplo: un el clic sobre un mensaje, la llegada de un símbolo a un print), los objetos de audio procesan y envian señal constantemente sin necesidad de eventos que los activen. La señal de audio sera un flujo constante de datos y visualmente la podremos diferenciar como una **línea más gruesa** que une distintas cajitas.

![image-1668505658267.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668505658267.PNG)Figura 6. patch *Senial.pd*

Cada objeto dependiendo de su función va a esperar un tipo de inlets, y si intentamos conectar un envió con un inlet cuyo tipo no corresponde, la conexión no se hara, veremos que la línea no queda conectada, o veremos un error marcado en rojo en la zona de impresión de la ventanita de pd:

![image-1668506007701.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668506007701.PNG)Figura 7. Ventana principal de Pd con mensajes en la consola.

En la ventana superior el mensaje en rojo dice que no podemos conectar una salida de una señal de audio a una entrada que no es de señal. Este mensaje ha aparecido al intentar conectar la salida del objeto "osc~" con un bang.

Si no sabéis el tipo que inlets que espera un objeto podéis entrar en su patch de ayuda y ahi abrir el subpatch "pd reference":

![image-1668506331181.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668506331181.PNG)Figura 8. patch de ayuda y subpatch "pd reference" del objeto "osc~"

#####   


##### Lista de objetos:

Lista de objetos de Pure Data Vanilla + librerías externas: [https://puredata.info/docs/ListOfPdExternals/](https://puredata.info/docs/ListOfPdExternals/)

Aqui os dejo una lista con objetos de Pure Data y su función. Tambien podréis ver si pertenecen a Pure Data Vanilla, que es el programa base sobre el que trabajamos o si forman parte de alguna librería, si forman parte de alguna librería los llamaremos objetos extended y tendremos que instalar esa librería para poder utilizar esos objetos. A utilizar librerías aprenderemos más adelante.

#### GUI (Graphical User Interface/ Interfaz Gráfica de Usuario)

Las interfaces graficas de usuario (GUI) son elementos cuya apariencia puede variar cuando el programa está en funcionamiento, a diferencia de los objetos y mensajes que por lo general tienen una apariencia estática. Alguno de estos elementos es interactivo y nos van a permitir modificar parámetros desde el ratón y/o visualizar cambios o estados cuando el programa este en funcionando. Tienen diferentes formas y funciones. Estas son algunas de las más utilizadas:

##### [![image-1661427699753.PNG](https://libros.catedu.es/uploads/images/gallery/2022-08/scaled-1680-/image-1661427699753.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-08/image-1661427699753.PNG)Cajita de número

La cajita de número se representa por un rectángulo truncado en su esquina superior derecha. Este elemento nos permite almacenar y visualizar el número que llegue por el inlet a través de un mensaje u objeto. Podremos modificar el numero almacenado con el ratón clicando y arrastrando arriba o abajo cuando el programa este en ejecución. Este elemento enviara el número que contiene cuando este varíe o cuando reciba un evento ej. (bang). Si el número no varía y no recibe ningún bang, la cajita de número no envía nada y a diferencia del mensaje que con un clic hacemos que se envíe, sobre este, el click de ratón no hará que la cajita de numero envíe su contenido.

![image-1668184955887.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668184955887.PNG)Figura 9. patch *Suma.pd*

Clic derecho en el objeto&gt;**Propiedades** = nos permite modificar tamaño, **limites**, etiquetas ...

Para colocar una caja de numero en nuestro patch: **menu horizontal&gt;Poner&gt;Numero** o utilizando en comando **"Ctrl+3"**

<p class="callout success">Ejercicio 1: Realizar una suma de dos números contenidos en dos mensajes e imprimir el resultado en la ventana principal.</p>

<p class="callout success">Ejercicio 2: Realizar una suma utilizando dos cajitas de numero variable. Ves alguna diferencia entre el inlet derecho de la suma y el inlet izquierdo? Si la hubiere como afecta esta diferencia al output del objeto suma?</p>

##### [![image-1661427750318.PNG](https://libros.catedu.es/uploads/images/gallery/2022-08/scaled-1680-/image-1661427750318.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-08/image-1661427750318.PNG)Bang

Este elemento es un botón que nos permite enviar un **"impulso"** o "**mensaje de bang"** cuando es activado: bien clicando sobre él, o cuando recibe cualquier mensaje en su entrada, da igual el contenido del mensaje. Frecuentemente utilizaremos el bang para **activar otros elementos** y nos va permitir **visualizar cuando hay flujo** de datos entre otros objetos. El mensaje de bang le dice a otros objetos: actúa! para que realicen su función. Y a nosotros nos dice que algo ha llegado.

Su forma GUI se representa con un cuadrado con un circulo circunscrito, cuando el bang se activa el circulo cambia momentaneamente de color, nos indica que ha recibido cualquier mensaje y enviado un mensaje de bang. En la parte superior izquierda tiene una entrada y en la parte inferior izquierda una salida.

Clic derecho en el objeto&gt;**Propiedades** = nos permite modificar **tamaño, color, etiquetas** ...

Para colocar un bang en nuestro patch: **menu horizontal&gt;Poner&gt;Bang** o utilizando en comando **"Shift+Ctrl+B"**

El bang se puede crear también como objeto: "bang" o "b" y realiza la misma función que su version GUI pero no permite al usuario activarlo desde el ratón ni visualiza su actividad. Podremos encontrarlo también en forma de mensaje con el texto "bang"

![image-1663668739424.PNG](https://libros.catedu.es/uploads/images/gallery/2022-09/scaled-1680-/image-1663668739424.PNG)Figura 10. Posible formas que tiene el bang en Pd. (Interfaz grafica, Objetos y Mensaje)

<p class="callout success">Ejercicio 3: Abrir el patch de ayuda del objeto suma (binops-help.pd). Dentro del patch de ayuda del objeto suma, abrir el subpatch "pd reference" para obtener más información acerca del funcionamiento de los objetos "operadores aritméticos". Utiliza [deeple](https://www.deepl.com/translator) para traducir el texto en ingles del patch de ayuda que no comprendas. Responde las siguientes preguntas:</p>

<p class="callout success">3.1 - Que sale del output derecho del objeto trigger (\[t b f\]) en el primer ejemplo del patch? ¿Y del output izquierdo? Utiliza el objeto print para comprobarlo.</p>

![image-1663668296461.PNG](https://libros.catedu.es/uploads/images/gallery/2022-09/scaled-1680-/image-1663668296461.PNG)Figura 11. primer ejemplo del patch de ayuda del objeto "+"

<p class="callout success">3.2 - Que utilidad tiene el objeto trigger (\[t b f\])? Abre el patch de ayuda de este objeto para descubrilo.</p>

<p class="callout success">3.3 - Qué pasaría si prescindiéramos del objeto trigger en este ejemplo y conectáramos la cajita de numero variable del lado derecho directamente al inlet derecho de los operadores? </p>

<p class="callout success">Ejercicio 4: En el caso anterior sustituye el objeto trigger (\[t b f\]) por un bang y reconecta las cajitas para obtener la misma funcionalidad que con el objeto trigger (\[t b f\]).</p>

<p class="callout success">Ejercicio 5: ¡Reto! Construye un programa en Pd que imprima el resultado de la siguiente ecuación: (2X + 4) x (3Y -20). Pista: X e Y serán cajitas de numero variable.</p>

Cuando queramos que un bang se envíe automáticamente al abrir un patch utilizaremos el objeto "**loadbang**":

![image-1669294677951.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1669294677951.PNG)Figura 12. Objeto "loadbang"

##### [![image-1661427774284.PNG](https://libros.catedu.es/uploads/images/gallery/2022-08/scaled-1680-/image-1661427774284.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-08/image-1661427774284.PNG)Toggle

Este objeto GUI tiene **dos estados: apagado y encendido**. Podemos cambiar el estado del objeto clicando sobre él o enviando un valor o mensaje a su inlet.

Cuando recibe un valor igual a 0 en su entrada, el estado del toggle cambiara a apagado y emitira por su la salida el valor 0. Visualmente reconoceremos el estado de apagado como un cuadrado blanco vacío.

Al cambiar el estado a encendido, clicando sobre el o cuando recibe en su entrada un numero distinto de 0, la salida del toggle emitirá ese numero distinto de cero y reconoceremos este estado por una cruz dentro del cuadrado. Un toggle encendido, por defecto emitirá un 1, a no ser que reciba otro valor numérico.

Un clic de ratón sobre el objeto o un mensaje de bang cambian el estado del objeto, si este está encendido cambiara a apagado y emitirá un 0, y si esta apagado cambiara a encendido y emitirá un 1. Un input numérico distinto de zero posiciona siempre el toggle en estado de encendido y un input igual a cero lo cambia o mantiene en estado apagado. El toggle emite un valor por su salida cada vez que el valor de entrada cambie aunque este valor no haga que cambie su estado. Frecuentemente utilizaremos el toggle para **activar o cambiar de estado otros elementos** y nos va permitir **visualizar el estado** de esos elementos.

[![image-1668513215820.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668513215820.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668513215820.PNG)

Figura 13. patch *Toggle.pd.* Toggle apagado y su output, Toggle encendido y su output predeterminado.

Si el input del toggle es un numero distinto de 0 y distinto de 1, por ejemplo, el 5, el toggle estará en el estado de encendido y emitirá un 5 por su output, si después de ese 5 enviamos un 6 al input del toggle el estado de este no cambiará y permanecerá encendido, pero emitirá el numero 6.

[![image-1668513190827.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668513190827.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668513190827.PNG)

Figura 14. patch *Toggle.pd.* Estado de Toggle y que outlet proporciona en función de su inlet.

Para cambiar el estado del toggle sin que emita ningún valor a su salida se utiliza el mensaje "set 0" para apagarlo y "set (valor distinto de 0)" para encenderlo. (hacer un gif de esto)

[![image-1668513049109.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668513049109.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668513049109.PNG)

Figura 15. patch *Toggle.pd.* Mensaje "set" para cambiar el estado del toggle sin que emita ningún valor.

Para colocar un toggle en nuestro patch desde el menu horizontal en **Poner&gt;Toggle** o utilizando en comando **"Shift+Ctrl+T"**

Clic derecho en el objeto&gt;**Propiedades** = nos permite modificar **tamaño, color, etiquetas** ...

[![image-1663671812438.PNG](https://libros.catedu.es/uploads/images/gallery/2022-09/scaled-1680-/image-1663671812438.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-09/image-1663671812438.PNG)Figura 16. Ventana de propiedades de Toggle.

En el patch de Lista de objetos (help-intro.pd) que se encuentra en **menu horizontal&gt;Ayuda&gt;Lista de objetos** hay un sub-patch llamado **"all\_guis"** que nos muestra todas las interfaces graficas de Pd Vanilla.

#### [![image-1661427636895.PNG](https://libros.catedu.es/uploads/images/gallery/2022-08/scaled-1680-/image-1661427636895.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-08/image-1661427636895.PNG)Comentarios

Los comentarios visualmente no aparecen en ninguna cajita ni tienen entradas/inputs ni salidas/outputs. El texto introducido en los comentarios es información que no sera interpretada por la maquina como elementos transformadores del programa/patch que estamos construyendo. Estos comentarios contienen **información dirigida a las personas**, notas que tomareis para vosotros mismos relacionadas con el funcionamiento del patch que estéis construyendo o notas para facilitar a otras personas la comprensión del patch que habéis creado. Son muy útiles para escribir **recordatorios o explicaciones** durante el proceso de trabajo y para **etiquetar** las diferentes partes de las estructuras que hagáis.[![image-1668513767343.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668513767343.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668513767343.PNG)

Para colocar un comentario en nuestro patch desde el menu horizontal en **Poner&gt;Comentario** o utilizando en comando **"Ctrl+5"**. Para editar un comentario clicamos sobre el cuando estemos en el modo edición.

*Este capítulo ha sido redactado tomando como guía el Capitulo 2 del Manual de Pd.*

Referencias:

<div class="pointer-container" id="bkmrk-%C2%A0-7"><div class="pointer anim is-page-editable"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg><div class="input-group inline block"> <button class="button outline icon" data-clipboard-target="#pointer-url" title="Copiar Enlace" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div>Pure Data (2022). Pd Manual chapter 2: theory of operation. In *Pure Data* (Version 0.52.2). \[Computer software\]. Pure Data. [https://puredata.info/downloads/pure-data](https://puredata.info/downloads/pure-data)

[http://puredata.info/docs/manuals/pd/](http://puredata.info/docs/manuals/pd/)

Figuras:

Figura 1. patch que imprime un numero.

Figura 2. Ventana de opciones que aparece al hacer click derecho sobre cualquier elemento de Pure data.

Figura 3. Patch de ayuda de la interfaz gráfica de cajita de numero variable

Figura 4. patch *Suma.pd*

Figura 5. patch *Variables-Integer-Float.pd*

Figura 6. patch *Senial.pd*

Figura 7. Ventana principal de Pd con mensajes en la consola.

Figura 8. patch de ayuda y subpatch "pd reference" del objeto "osc~"


Figura 9. patch *Suma.pd*

Figura 10. Posible formas que tiene el bang en Pd. (Interfaz grafica, Objetos y Mensaje)

Figura 11. primer ejemplo del patch de ayuda del objeto "+"

Figura 12. Objeto "loadbang"

Figura 13. patch *Toggle.pd.* Toggle apagado y su output, Toggle encendido y su output predeterminado.

Figura 14. patch *Toggle.pd.* Estado de Toggle y que outlet proporciona en función de su inlet.

Figura 15. patch *Toggle.pd.* Mensaje "set" para cambiar el estado del toggle sin que emita ningún valor.

Figura 16. Ventana de propiedades de Toggle.

# Configuración de Audio en Pure Data y notación MIDI

<p class="callout warning">**RECOMENDACIÓN:** os aconsejo trabajar con altavoces, no con cascos. El sonido puede hacer daño a los oídos si no controláis el volumen.  
</p>

Cuando hablemos de sonido en el ámbito digital, por ejemplo, dentro de un programa, nos referimos a una representación del sonido dentro de este entorno. Se trata de una representación que podemos manipular. De esta manera, podemos diseñar sonidos desde un ordenador, pero sonido como tal solo sera lo que el altavoz produce. Para diferenciarlo llamaremos a esta representación señal de audio, ya que es una señal cuyo ultimo propósito será hacer vibrar la membrana de un altavoz para generar esa onda mecánica que conocemos como sonido.

##### ¿Qué es una tarjeta de sonido?

Es la parte del hardware de vuestro ordenador que se encarga de gestionar el procesamiento de audio y, sobre todo, de convertir datos en señales eléctricas que permitan controlar el movimiento de un altavoz, o de traducir a datos digitales las señales eléctricas generadas por un micrófono que registra el sonido de una voz.

Cuando hablamos de señal, nos estamos refiriendo a una onda, que en el programa se representa como una rápida secuencia de números. Digamos que estos valores indican la posición de un punto de la onda en el momento en que se generan.

Vuestros ordenadores tienen una tarjeta de audio integrada, pero existen también tarjetas de audio externas que se pueden conectar al ordenador.

<p class="callout info">Si no sabéis si tenéis una tarjeta de audio interna o externa, quiere decir que tenéis una tarjeta de audio interna, que está dentro del ordenador. </p>

#### Configuración del audio en Pure Data

Vamos a ver dónde está la configuración de Audio de Pure Data y si tenéis que cambiar algo.

La ventana de configuración de audio está en M**enu horizontal&gt;Archivo&gt;Preferencias&gt;Audio...**

##### Sample rate o frecuencia de sampleo

Es el número de valores por segundo que definen una onda. La mayoría de las tarjetas de sonido funcionan a **44.000 Hz**, que es la frecuencia que viene predeterminada en la configuración de Pure data, o a **48.000 Hz**. Tendréis que configurar este parámetro para que coincida con el de vuestra tarjeta de sonido. En mi caso utilizo una tarjeta de sonido externa que actualmente tengo configurada a 48 kHz, por lo que utilizaré la misma frecuencia en mi configuración de Pure Data.

![image-1668523996756.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668523996756.PNG)Figura 1. Configuración de audio de Pure Data (izquierda), configuración de tarjeta de sonido externa (derecha)

##### Latencia, Retardo o delay

Es el tiempo que tarda desde el momento en que se ejecuta una acción hasta que percibimos su resultado, por ejemplo; desde que apretamos el botón de play hasta que el sonido sale por los altavoces y podemos escucharlo. Las latencias cortas transmiten la sensación de mayor **responsive,** ya que el resultado de una acción es percibido inmediatamente. Sin embargo, una latencia demasiado corta puede provocar **interrupciones** o **errores** en el sonido (**clics, pums, craks ...**), ya que el ordenador no tiene tiempo suficiente para terminar de procesar los datos antes de enviarlos. Así que, si os encontráis con este problema, probad a **aumentar la latencia**.

En mi caso configuraré la latencia en **80 milisegundos**.

##### Tamaño de Bloque o Buffer Size.

Este parámetro está relacionado con la latencia y vamos a dejarlo en **64**.

##### Dispositivos de Entrada

Aquí, podemos configurar qué entradas y a través de qué tarjeta vamos a recibir señal de audio en Pure Data, por ejemplo, el micrófono interno de vuestro ordenador. En mi caso, es la entrada que aparece configurada en la Figura 2. Fijaros que la cajita de la izquierda este activada.

![image-1668530335189.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668530335189.PNG)Figura 2. Dispositivos de entrada y salida en la configuración de audio de Pure Data.

##### Dispositivos de Salida

Este apartado nos permitir configurar a través de qué salidas se enviará el audio que creemos en Pure Data. En mi caso como tengo una tarjeta de audio externa a la que tengo conectados mis altavoces, la salida que selecciono será la de mi tarjeta de sonido: OUT 1-2 (MOTU M Series)

Los dispositivos de salida y entrada en vuestros ordenadores van a tener diferentes nombres dependiendo del ordenador o tarjeta que tengáis, así que, no esperéis encontrar los mismos que aparecen en las imágenes que os pongo.

<p class="callout info">Cuando empecemos a trabajar con sonido, si algo no va bien, volveremos a esta página para revisar nuestra configuración de audio</p>

#### MIDI

" MIDI (siglas de Musical Instrument Digital Interface) es un estándar tecnológico que describe un protocolo, una interfaz digital y conectores que permiten que varios instrumentos musicales electrónicos, ordenadores y otros dispositivos relacionados se conecten y comuniquen entre sí.​" (Wikipedia)

"El sistema MIDI transporta mensajes de eventos que especifican notación musical, tono y velocidad (intensidad); señales de control para parámetros musicales como lo son la dinámica, el vibrato, panoramización en dos dimensiones, cues y señales de reloj que establecen y sincronizan el tempo entre varios dispositivos." (Wikipedia)

A nosotros, del MIDI nos interesa la codificación de la frecuencia que utiliza para las notas musicales, para trabajar con la escala musical diatónica (Do, Re, Mi ...).

En MIDI a cada nota de la escala musical se le asigna un número del 0 al 127. Siendo el 0 igual al DO de la octava -1, que a su vez es una onda de 8,175799 Hz. La nota MIDI 127 corresponde con un Sol de la octava 9, y la frecuencia de esta onda es de 12.543,853516 Hz.

##### Tabla de equivalencia MIDI:

![image-1663841295232.png](https://libros.catedu.es/uploads/images/gallery/2022-09/scaled-1680-/image-1663841295232.png)Figura 3. Tabla de equivalencia MIDI (Nota | Valor MIDI | Frecuencia en Hz)

Como habíamos visto en la página ["Las Ondas y el Sonido"](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/las-ondas-y-el-sonido), la frecuencia es lo que determina qué tan agudo o grave suena un sonido. Determina el tono, la nota.

Cuando trabajemos con osciladores en Pure Data tendremos que introducir la frecuencia de la onda que queramos generar en Hz, por lo que si queremos trabajar con la notación MIDI necesitaremos un objeto que traduzca de MIDI a Hz.

El objeto "**mtof**" (midi to frequency) convierte valores de MIDI a Hz. Y si queremos pasar de Hz a MIDI utilizaremos el objeto "**ftom**" que convierte valores de Hz a MIDI. Estos objetos **reciben valores numéricos y devuelven valores numéricos**. Inlet (float), outlet (float). Abrir el patch *MIDI-Hz-Tono-Frecuencia.pd* para probar estos objetos.

![image-1668533488324.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668533488324.PNG)Figura 4. patch *MIDI-Hz-Tono-Frecuencia.pd.*

<p class="callout info">Los que tengáis un controlador MIDI podéis conectarlo a Pure Data, pero en este curso no lo vamos a explicar. Podéis buscar información en internet de cómo hacerlo o preguntar en una tutoría.</p>

Figuras:

Figura 1. Configuración de audio de Pure Data (izquierda), configuración de tarjeta de sonido externa (derecha).

Figura 2. Dispositivos de entrada y salida en la configuración de audio de Pure Data.

Figura 3. Tabla de equivalencia MIDI (Nota | Valor MIDI | Frecuencia en Hz). [https://cmtext.indiana.edu/appendices/appendix\_B.php](https://cmtext.indiana.edu/appendices/appendix_B.php)

Figura 4. patch *MIDI-Hz-Tono-Frecuencia.pd.*

Referencias:

[https://es.wikipedia.org/wiki/MIDI](https://es.wikipedia.org/wiki/MIDI)

[https://archive.flossmanuals.net/pure-data/getting-started/configuring.html](https://archive.flossmanuals.net/pure-data/getting-started/configuring.html)

###   


###   

# Práctica 4: Nuestro primer patch sonoro

¿Qué elementos nuevos introduciremos en esta práctica?


<iframe allowfullscreen="allowfullscreen" frameborder="0" height="850.185" src="https://gifer.com/embed/AFH7" width="480"></iframe>

Figura 1. Gatos con un metrónomo.

#### metro 

Este objeto va a ser nuestro metrónomo en Pure Data y nos va a permitir **enviar** un **bang cada tantos milisegundos**. Por ejemplo, un metro con un argumento de 10.000 enviara un bang cada **10.000 milisegundos**, que es lo mismo que cada **10 segundos**. Este objeto nos va a permitir por ejemplo crear ritmos o secuenciar acciones.

[![image-1666188404924.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666188404924.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666188404924.PNG)

Para que el **metro** funcione y comience a enviar bangs, tendremos que configurar sus parámetros y **activarlo** con un número distinto de 0. Para activarlo podemos enviar al inlet izquierdo un **bang**, un **toggle encendido**, o un mensaje con un valor numérico. Si queremos que deje de enviar bangs, tendremos que **pararlo** con un mensaje de **stop** o un valor igual a 0. En este caso, el toggle estará apagado y el mensaje contendrá el numero 0.

  
El **primer argumento** del metro (float) indica el **tiempo entre bangs** que por defecto está en milisegundos. El **segundo argumento** (float) nos permite **modificar el tempo** de la velocidad que ha configurado el primer argumento. El **tercer argumento** (symbol) nos permite **configurar las unidades,** por ejemplo, en segundos con la palabra "second". También podremos modificar el tempo a través de un mensaje con los siguientes datos: la palabra "tempo", el valor del tempo y la unidad del tiempo.

![image-1666190135976.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666190135976.PNG) Figura 2. patch *metro-demo.pd.* Cuatro formas diferentes de configurar el objeto metro para que emita un bang por segundo.

A través del **inlet de la derecha** también podremos configurar el tiempo entre bangs una vez el metro esté corriendo. Para ello, utilizaremos una cajita de numero variable o un mensaje. Si en la figura x enviamos el mensaje "stop" al metro, la emisión de bangs se detendrá. Si enviamos 294 a traves del inlet derecho, en lugar de emir bangs cada 1000 milisegundos el metro, emitirá bangs cada 294 milisegundos.

![image-1666190771414.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666190771414.PNG)Figura 3. patch *metro-demo.pd. O*bjeto metro que emite bangs cada 294 milisegundos.

#### line~

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="359.564" src="https://gifer.com/embed/cih" width="480"></iframe>

Figura 4. Tortuga deslizándose por una rampa.

El objeto "**line~**" genera **rampas lineales** entre dos valores en un tiempo determinado. Su outlet está en formato de **señal**. (Tambien podremos encontrar el objeto "line" que hace lo mismo, pero emitiendo una sucesión de números en lugar de una señal.)

### ![image-1663753713136.PNG](https://libros.catedu.es/uploads/images/gallery/2022-09/scaled-1680-/image-1663753713136.PNG)

Los parámetros de la rampa se determinan en los argumentos del objeto o por los mensajes recibidos en los inlets de line. Por ejemplo, generar una secuencia de valores entre 2 y 5 en 100 milisegundos. Enviando un mensaje al **inlet izquierdo** podremos configurar los **valores de partida**, **destino** y el **tiempo de nuestra rampa**. Abre el patch *line-snapshot-demo.pd* para probar este objeto.

![image-1668596793524.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668596793524.PNG) Figura 5. patch *line-snapshot-demo.pd.*

Veamos cómo tenemos que construir los **mensajes** para controlar nuestra rampa:

El **tiempo** también podremos configurarlo con el **inlet derecho.** Un mensaje con único valor indicará el valor del destino. El line de la imagen ira al valor 5 en 64 milisegundos.

![image-1668596845588.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668596845588.PNG)Figura 6. patch *line-snapshot-demo.pd*. objeto line~ que recibe un mensaje con la configuración: destino=5. Y el tiempo de la rampa se configura a traves del inlet derecho.

Cuando enviemos un mensaje con dos valores separados por un espacio, el primer valor del mensaje indicara el valor del destino y el segundo valor el tiempo que se tomara en llegar a ese valor de destino. El line de la imagen siguiente ira al valor 5 en 100 milisegundos.

![image-1668596863495.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668596863495.PNG)Figura 7. patch *line-snapshot-demo.pd*. objeto line~ que recibe un mensaje con la configuración: destino=5, tiempo=100.

Enviamos un mensaje con tres valores, los dos primeros separados por "coma" "espacio" y el segundo y el tercero por un "espacio"; el primer valor indicara el valor de partida, el segundo el valor de destino y el tercero el tiempo requerido para ir desde el valor de partida al valor de destino. El **line** de la imagen siguiente ira desde el valor 2 al valor 5 en 100 milisegundos.

![image-1668596873513.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668596873513.PNG)Figura 8. patch *line-snapshot-demo.pd*. objeto line~ que recibe un mensaje con la configuración: Inicio=2, destino=5, tiempo=100.

<p class="callout info">Si no especificamos el tiempo, saltará directamente al valor de destino. Si queremos **detener la progresión** de la rampa enviaremos un mensaje con la palabra "**stop**". El ultimo valor generado antes de parar la progresión, o el valor de destino de la rampa en caso de que la progresión no se detenga y llegue al final, quedará almacenado.   
Cuando **no especifiquemos un valor de partida**, tomará como valor de partida ese valor almacenado en la **interacción anterior**. Cuando no haya habido una interacción anterior el **valor de partida por defecto sera 0.** </p>

<span style="background-color: #2dc26b;">  
</span>

El **line** de la imagen siguiente irá desde el valor 2 al valor 5 en 100 milisegundos. Si recibe el mensaje stop, detendrá la progresión.

[![image-1668597514788.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668597514788.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668597514788.PNG)

Figura 9. patch *line-snapshot-demo.pd*. objeto line~ que recibe un mensaje con la palabra "stop"

####   


#### snapshot~

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="262.080" src="https://gifer.com/embed/73QW" width="480"></iframe>

Figura 10. El "snapshot~" haciendo una foto de la señal cada vez que le llega un bang.

El **snapshot~** permite convertir una señal en valores numéricos. Esto nos será muy útil cuando queramos enviar valores procedentes de una señal de audio a un objeto que no sea de audio.

[![image-1666023347650.png](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666023347650.png)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666023347650.png)

<p class="callout info">Recordad que los objetos que no son de audio no tienen la "~" y no aceptan señales de audio como input.   
</p>

<span style="background-color: #2dc26b;">  
</span>Este objeto nos será útil para visualizar qué sucede con nuestras señales de audio. Cada vez que recibe un **bang** registra el valor que tiene la señal que llega la inlet en ese momento, sería el equivalente a la posición de una partícula afectada por una onda en un momento determinado.

![image-1666023066176.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666023066176.PNG)Figura 11. ejemplo del objeto "snapshot~"

<p class="callout success">Ejercicio 6: Abre los patches de ejemplo: *line-snapshot-demo.pd* y *metro-demo.pd* y prueba el funcionamiento de los objetos que acabamos de ver. Encontrarás los patches en el material de este apartado ¿Tienes alguna duda?</p>

####   


#### env~

Similar al "snapshot~", el envelope follower: "**env~**" recibe una señal y saca por su salida la amplitud de esta señal, pero en dB, con una equivalencia de 1 igual a 100 dB.

![image-1666191588505.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666191588505.PNG)Este objeto recibe una señal y devuelve valores numéricos. Nos será muy útil para **conocer el volumen** de nuestra señal en **dB** y también para visualizar ese volumen en el **VU meter** que vamos a presentar a continuación.

Recordad que en el apartado ["Las ondas y el sonido", ](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/las-ondas-y-el-sonido)habíamos visto que el volumen es la intensidad con la que percibimos un sonido. Es una magnitud que relaciona la amplitud de una onda sonora y la percepción humana de esta onda.

####   


#### VU meter

Podremos crear este objeto desde el **menu&gt;poner&gt;VU Meter** o escribiendo "vu" en un objeto.

[![image-1666191690235.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666191690235.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666191690235.PNG)

Este objeto es una **interfaz gráfica** que representa el **nivel de señal** como el que podemos encontrar en el **master de una mesa de mezclas**, o de un canal en programas como Ableton Live. Nos va a indicar el **volumen de la señal**.

![image-1666168172652.jpg](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666168172652.jpg)Figura 12. Representación de un VU meter.

El rango un VU meter va de valores negativos a valores positivos. Los valores mínimo y máximo varían en cada aparato o programa, sin embargo, el 0 sera el **valor de referencia** en todos ellos. Y un código de colores nos ayudara a leer esa escala. El <span style="color: #2dc26b;">**verde**</span> nos indica un **nivel de señal adecuado**, el <span style="color: #f1c40f;">**amarillo**</span> nos indica un **nivel de señal próximo al límite** entre un nivel adecuado y un nivel excesivo, y el <span style="color: #e03e2d;">**rojo**</span> nos indica un **nivel de señal excesivo** que debemos evitar y a partir del cual consideraremos que nuestra señal esta "**picando**" y se va a distorsionar.

En Pure data el **VU-meter** tiene un rango visible de -100 a 12, y el 0 va a ser nuestro límite de pico entre señal adecuada y señal excesiva.

Ya que el **envelope** nos proporcionará valores con una igualdad de 100 dB a 1 unidad de amplitud, tendremos que restar 100 a la salida del envelope para enviar un valor adecuado al VU meter.

![image-1666192239811.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666192239811.PNG)Figura 13. patch *Envelope-Vumeter-demo.pd*

####   


#### Slider

![image-1668601792175.gif](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668601792175.gif)Figura 14. Slider en funcionamiento. (no es Pure Data)

El **slider** es una **interfaz gráfica** que nos permite **enviar valores repartidos en un rango determinado**, colocando y moviendo un indicador en cualquier posición de la representación de ese rango.

[![image-1666192683265.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666192683265.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666192683265.PNG)

Para mover el indicador, clicaremos sobre el elemento y manteniendo el click pulsado moveremos el ratón. En caso de necesitar mas precisión a la hora de ajustar la posición del indicador, realizaremos la acción anteriormente mencionada mientras pulsamos la tecla **SHIFT** o **MAYUS**. Tambien podremos modificar la posición del indicador enviado un mensaje con el valor que queramos al inlet del slide.

Esta representación podrá ser vertical u horizontal y configuraremos los valores mínimo y máximo de su rango, haciendo **click derecho** sobre el **slider&gt;Propiedades&gt;Rango de Salida.**

En propiedades también podremos configurar los colores, etiqueta o tamaño del slider.

![image-1666193481513.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666193481513.PNG) Figura 15. patch *Slider-demo.pd.* Slider vertical a la izquierda y Slider horizontal a la derecha con sus ventanas de propiedades.

El **slider por defecto** tiene un rango de **0 a 127**, rango que tendremos que ajustar a nuestras necesidades. Este objeto nos va a ser extremadamente útil para regular el **volumen**. Ajustaremos su rango de **0 a 0.5** o, como máximo, de 0 a 1.

###   


#### Oscilador y \*~

![image-1668609634160.gif](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668609634160.gif)Figura 16. Personita generando una onda de 293.6 Hz.

El objeto **osc~** es un generador de ondas sinusoidales, también conocidas como ondas puras. Debe recibir en su **inlet izquierdo** la **frecuencia** de la onda que queramos generar en valores en **Hz.**

[![image-1666171882601.png](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666171882601.png)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666171882601.png)

Este objeto va a generar una onda con una amplitud de 1, lo que quiere decir que generara valores correspondientes a esa onda sinusoidal de -1 a 1.

[![image-1666172301620.jpg](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666172301620.jpg)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666172301620.jpg)

Figura 17. La onda Sinusoidal que genera el "osc~".

En **Pure Data** se parte de la equivalencia de **1 unidad de amplitud igual a 100 dB.**

<p class="callout info">Recordad que los **dB** median la **intensidad sonora percibida** y que esta tiene una **relación logarítmica** a la amplitud, no lineal. Por lo tanto, **aunque 1 unidad de amplitud equivalga a 100dB, 0,5 unidades de amplitud NO equivalen a 50 dB**, **0,5** unidades de amplitud **equivalen a unos 90 dB**.</p>

El objeto "**\*~**" nos va a permitir controlar/modular la **amplitud de una señal** multiplicándola por un valor numérico o por otra señal. En el ejemplo del patch *osc-demo.pd* la multiplicamos por un valor numérico del tipo **float**. Cuando multipliquemos por valores situados entre **0 y 1** estaremos **disminuyendo la amplitud de la señal**. Valores **mayores de 1** estarán **aumentando la amplitud** de la señal.

Para el **control de volumen** siempre multiplicaremos por **valores ente 0 y 1**. Más adelante también utilizaremos este objeto para mezclar señales. Sus inlets esperan una señal o un valor numérico, y su outlet es una señal.

Abrid el patch *osc-demo.pd* que encontraré deis en el material que os damos para la Practica 2. Vamos a ver esto con un ejemplo en el que utilizaremos algunos de los objetos que hemos visto anteriormente.

- el **snapshot~**: para ver el valor de la señal en un momento determinado
- el **env~**: para transformar la amplitud de la señal en dB.
- el **VU**: visualizar el volumen en dB.
- el **metro** para hacer la foto de la señal con el "snapshot~"
- la **slider** para controlar el volumen.

[![image-1666344518110.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666344518110.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666344518110.PNG)Figura 18. patch *osc-demo.pd*.

El "osc~" de la figura 17, genera una onda sinusoidal de 293,6 Hz de frecuencia. La amplitud de esa onda se reduce multiplicándola por 0,1333 en el objeto "\*~". El "env~" registra la amplitud de la señal que le llega y la convierte a dB, con una equivalencia de 100 dB a 1 unidad de amplitud. Restamos 100 al volumen que proporciona el "env~" para poder visualizar el volumen en el VU meter.

¿Alguna duda de cómo funciona el patch *osc-demo.pd?*

[![image-1668610996028.gif](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668610996028.gif)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668610996028.gif)

####   


#### MIDI to frequency: mtof

Esto ya lo hemos visto en ["Configuración de Audio en Pure Data y notación MIDI"](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/configuracion-de-audio-en-pure-data-y-notacion-midi). Como bien sabemos, el **oscilador** habla el idioma de los **Hz** y en este idioma interpretará los valores que reciba. El objeto "**mtof**" convierte **valores numéricos de MIDI a valores numéricos de Hz**. Nos será muy útil para trabajar con los valores de la escala musical diatónica (Do, Re, Mi ...). Este objeto **recibe valores numéricos y devuelve valores numéricos**. Inlet (float), outlet (float)

![image-1666340660781.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666340660781.PNG)Figura 19. patch *mtof-ftom-demo.pd.* Conversion de MIDI a Hz con el objeto mtof.

####   


<iframe allowfullscreen="allowfullscreen" frameborder="0" height="480.000" src="https://gifer.com/embed/8pIY" width="480"></iframe>

Figura 20. Transformer civil pasando de Hz a MIDI

#### Frequency to MIDI: ftom

El objeto "**ftom**" objeto realiza el **proceso inverso a** "**mtof**", convierte **valores numéricos de Hz a valores numéricos de MIDI**. Inlet (float), outlet (float).

[![image-1666340883231.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666340883231.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666340883231.PNG)Figura 21. patch *mtof-ftom-demo.pd.* Conversion de MIDI a Hz con el objeto mtof, y de Hz a MIDI con el objeto ftom.

#### Tabwrite~ y Array (GUI)

El objeto "**tabwrite~**" nos permite **almacenar los valores de una señal de manera secuencial** en un vector.

[![image-1666342810029.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666342810029.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666342810029.PNG)

Podremos visualizar este vector con la interfaz gráfica "**Array**", que es una especie de lienzo. Para colocar un array en nuestro patch: **menu horizontal&gt;Poner&gt;Array** o utilizando en comando **"Mayus/Shift+Ctrl+A"**

[![image-1666342823121.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666342823121.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666342823121.PNG)

¿Pero qué es un **vector** en programación? Es una **lista** de valores almacenados de manera secuencial.

![image-1666342947648.png](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666342947648.png)Figura 22. Diagrama de un vector.

El **argumento del "tabwrite~" indicará el nombre del vector** y para que empiece a registrar los valores que le llegan tendremos que enviar un **bang**.

Cuando el vector se llene dejará de registrar valores y si queremos que vuelva a registrar tendremos que enviar otro bang.   
El vector **almacenará** **100 valores por defecto.** Si queremos modificar su tamaño, haremos click derecho sobre **Lienzo&gt;Propiedades&gt;Propiedades del array&gt;Tamaño**. En propiedades del array también podremos ver la lista de valores almacenados clicando en "**Ver Lista ...**".

Para modificar parámetros del lienzo utilizaremos la ventana "**Propiedades de Canvas**" que se ha abierto justo con la ventana de "**Propiedades del array**" La **interfaz gráfica array** nos va a permitir **visualizar el valor almacenado en cada posición de un vector.** Tendremos que indicar en la configuración del array el nombre del vector que queramos visualizar. La posición en el vector, el **índice**, se representa en el **eje x** y el **valor almacenado**, el contenido, en el **eje y**. Podéis estos elementos en el patch *tabwrite-array-demo.pd* que encontrareis en el material de la Practica 2.

![image-1666342753472.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666342753472.PNG)Figura 23. patch *tabwrite-array-demo.pd*.

<span style="background-color: #2dc26b;">  
</span>

Todo esto puede parecer un poco complicado, así que, para entender mejor cómo funciona, utilizaremos la representación de este vector a lo largo del tiempo. Vamos a utilizar la metáfora de una **fotografía**:

![image-1668613294489.png](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668613294489.png)Figura 24. Una imagen de la animación en la figura 25.

Cada vez que el "**tabwrite~**" recibe un bang, toma una foto de los valores de la señal en un corto periodo de tiempo que medimos con un **cronómetro**. Cuando el cronómetro comienza a contar, el **primer valor registrado** ocupará la **primera posición del vector** y cuando el cronometro termina el **último valor registrado**, tomará la **última posición del vector**.   
Para ver cómo una señal evoluciona en el tiempo, tendremos que tomar muchas fotos. Es lo mismo que sucede con un video o una película de dibujos animados, en la que por lo general vemos 24 imagen por segundo. Para que tome todas estas fotos utilizaremos el objeto **metro** que hemos visto anteriormente.

[![image-1668613116633.gif](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668613116633.gif)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668613116633.gif)Figura 25. Animación que veremos en el array del patch *tabwrite-array-demo.pd* si activamos el metro.

#####   


##### Tamaño del array:

Cuando queráis visualizar una señal utilizando el array, cambiar el tamaño del array os va a ayudar a ajustar la escala de lo que queráis visualizar, de forma que esta visualización os proporcione información comprensible. Podéis cambiar el tamaño del array en propiedades. Os dejo dos imágenes para que veáis la diferencia representando la misma señal con un array de tamaño 100 y otro de tamaño 2000:

![image-1671528091158.png](https://libros.catedu.es/uploads/images/gallery/2022-12/scaled-1680-/image-1671528091158.png)Figura 26. Misma señal representada con un array de tamaño de 100 (izquierda) y con un array de tamaño de 2000 (derecha).

<div class="tenor-gif-embed" data-aspect-ratio="2.77" data-postid="12353118" data-share-method="host" data-width="100%" id="bkmrk--28">  
</div>
### send~ y receive~

Estos dos objetos nos van a permitir **enviar y recibir señales sin necesidad de unir cajitas con cables.** Son como un **emisor** y un **receptor** **inalámbricos** y nos van a ser muy útiles para mantener la claridad y comprensión de nuestros programas cuando tengamos muchos elementos y conexiones.

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="360.615" src="https://gifer.com/embed/HvQG" width="480"></iframe>

Figura 27. Criatura enviando datos.

Cuando queramos enviar datos que no tienen el formato de señal, utilizaremos los mismos objetos, pero sin la virgulilla "**~**". Esto nos va a permitir enviar mensajes (int, float y symbols) sin necesidad de conectar las cajitas con líneas.

![image-1666344679890.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666344679890.PNG)Figura 28. patch *send-receive-demo.pd*


### dac~

¡¡Finalmente vamos a **conectarnos a los altavoces!!**

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="327.000" src="https://gifer.com/embed/763H" width="480"></iframe>

Figura 29. Altavoces recibiendo sonido desde Pure Data cuando no controlamos el volumen.

**dac~ = "digital to analog converter"** Este objeto representa la puerta de **conversión** entre los **números** que componen señales de audio y el **movimiento** de la membrana del altavoz que va a generar el sonido. Nuestra **tarjeta de sonido** va a convertir estos datos en **variaciones de corriente eléctrica** que van a hacer que nuestro **altavoz se mueva**.

[![image-1666170022900.png](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666170022900.png)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666170022900.png)Vemos que el objeto tiene dos inlets, cada uno corresponde a un canal de estéreo: **derecha** e **izquierda**.

![image-1666345318553.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666345318553.PNG)Figura 30. patch *dac-demo.pd*.

Como veis en el ejemplo del patch *dac-demo.pd*, puedo tener varios receptores del mismo envío y ambos reciben la misma señal.

##   


## ¡Comencemos con la practica!

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="480.000" src="https://gifer.com/embed/2GU" width="480"></iframe>

Figura 31. Gato haciendo la Practica 2 de Pure Data.

Ahora vamos a crear un **patch** con los elementos que acabamos de ver. Podéis **copiar** y **pegar** elementos de un patch a otro, y recordad que tenéis acceso a todos los patches con todos los ejemplos que hemos visto en esta lección.

Para ello os voy a dar el algoritmo escrito de cómo ha de ser nuestro programa y vosotros lo construiréis en Pure Data. Recordad que hay diferentes formas de llegar al mismo resultado así que sentíos con libertad de combinar los objetos que acabamos de introducir de diferentes maneras para probar y conseguir resolver el problema de la manera que más cómoda os resulte.

<p class="callout success">Ejercicio 7: Crear un patch que nos permita **reproducir las notas de la escala de una octava con nuestros altavoces.** En mi caso he elegido la octava tercera. A parte de reproducir las notas, nos gustaría **elegir la nota de la octava que se reproduce a través del ratón**.</p>

Podéis consultar el numero MIDI de cada nota en la tabla que vimos en ["Configuración de Audio en Pure Data y notación MIDI"](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/configuracion-de-audio-en-pure-data-y-notacion-midi)

<p class="callout warning">Solo enviaremos sonido a los altavoces una vez estemos seguros de que el **nivel de volumen** es **adecuado**. </p>

##### Algoritmo:

1. Voy a crear un nuevo patch.
2. Necesito tener el **DSP encendido** para que el programa trabaje con señales.
3. Necesito **hacer llegar a un oscilador los valores en Hz** de las frecuencias correspondientes a la octava.
4. Necesito **controlar el volumen**. Voy a **regular la amplitud de la señal** que sale del oscilador y voy a utilizar un rango de **0 a 0.5** para modularla.
5. Me aseguro de que el **volumen es adecuado**. Voy a **visualizar el nivel de volumen con el VU-meter** antes de enviar la señal al dac~.
6. Una vez el **volumen en Pure Data está bajo control** y con el **volumen de mis altavoces bajado** enviare la **señal al dac~** y poco a poco **subo el volumen de los altavoces**. El volumen de mis altavoces esta fuera de Pure Data, por ejemplo, en mi caso es un knob, una rueda que giro en mi tarjeta de sonido. Si no tenéis tarjeta de sonido externa sera el volumen de vuestro ordenador.
7. Una vez **escucho una de las notas** de la octava **probare a reproducir el resto** de las notas.
8. **Subo y bajo el volumen desde Pure data**. ¿Escuchas algo raro? clics y pums? Utiliza el objeto **line~** para suavizar los cambios de volumen.
9. Si quiero **visualizar la señal** utilizaré un **vector y la interfaz gráfica** que me permite visualizarlo.

Si tras intentarlo no habéis logrado finalizar la práctica, podéis mirar la página de [pistas de la Practica 4](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/pistas-practica-4)

#### ¿Qué tenemos que entregar?

El ejercicio 7. Sube a la carpeta del Moodle de la Practica 4 una captura de pantalla det patch y el patch que habéis creado. El patch deberá llamarse: **practica4\_vuestronombre\_vuestroapellido.pd** y la imagen **practica4-imagen\_vuestronombre\_vuestroapellido**.

Figuras:

Figura 1. Gatos con un metrónomo. [https://gifer.com/en/AFH7](https://gifer.com/en/AFH7)

Figura 2. patch *metro-demo.pd.* Cuatro formas diferentes de configurar el objeto metro para que emita un bang por segundo.

Figura 3. patch *metro-demo.pd. O*bjeto metro que emite bangs cada 294 milisegundos.

Figura 4. Tortuga deslizándose por una rampa. [https://gifer.com/en/cih](https://gifer.com/en/cih)

Figura 5. patch *line-snapshot-demo.pd.*

Figura 6. patch *line-snapshot-demo.pd*. objeto line~ que recibe un mensaje con la configuración: destino=5. Y el tiempo de la rampa se configura a traves del inlet derecho.

Figura 7. patch *line-snapshot-demo.pd*. objeto line~ que recibe un mensaje con la configuración: destino=5, tiempo=100.

Figura 8. patch *line-snapshot-demo.pd*. objeto line~ que recibe un mensaje con la configuración: Inicio=2, destino=5, tiempo=100.

Figura 9. patch *line-snapshot-demo.pd*. objeto line~ que recibe un mensaje con la palabra "stop".

Figura 10. El "snapshot~" haciendo una foto de la señal cada vez que le llega un bang. [https://gifer.com/en/73QW](https://gifer.com/en/73QW)

Figura 11. ejemplo del objeto "snapshot~"

Figura 12. Representación de un VU [meter.https://www.freeimages.com/nl/photo/vu-meter-1242056](https://libros.catedu.es/meter.https:/www.freeimages.com/nl/photo/vu-meter-1242056)

Figura 13. patch *Envelope-Vumeter-demo.pd*

Figura 14. Slider en funcionamiento. (no es Pure Data). [https://www.pinterest.com.mx/pin/751186412851747700/](https://www.pinterest.com.mx/pin/751186412851747700/)

Figura 15. patch *Slider-demo.pd.* Slider vertical a la izquierda y Slider horizontal a la derecha con sus ventanas de propiedades.

Figura 16. Personita generando una onda de 293.6 Hz. [https://gfycat.com/concretebetterbilby](https://gfycat.com/concretebetterbilby)

Figura 17. La onda Sinusoidal que genera el "osc~". [https://www.hsa.org.uk/electricidad/onda-y-frecuencia](https://www.hsa.org.uk/electricidad/onda-y-frecuencia)

Figura 18. patch *osc-demo.pd*.

Figura 19. patch *mtof-ftom-demo.pd.* Conversion de MIDI a Hz con el objeto mtof.

Figura 20. Transformer civil pasando de Hz a MIDI. [https://gifer.com/en/8pIY](https://gifer.com/en/8pIY)

Figura 21. patch *mtof-ftom-demo.pd.* Conversion de MIDI a Hz con el objeto mtof, y de Hz a MIDI con el objeto ftom.

Figura 22. Diagrama de un vector. [https://montealegreluis.com/logica-programacion/docs/arreglos.html](https://montealegreluis.com/logica-programacion/docs/arreglos.html)

Figura 23. patch *tabwrite-array-demo.pd*.

Figura 24. Una imagen de la animación en la figura 25. [https://tenor.com/view/human-wave-formation-soliders-gif-12353118](https://tenor.com/view/human-wave-formation-soliders-gif-12353118)

Figura 25. Animación que veremos en el array del patch *tabwrite-array-demo.pd* si activamos el metro. [https://tenor.com/view/human-wave-formation-soliders-gif-12353118](https://tenor.com/view/human-wave-formation-soliders-gif-12353118)

Figura 26. Misma señal representada con un array de tamaño de 100 (izquierda) y con un array de tamaño de 2000 (derecha).

Figura 27. Criatura enviando datos. [https://gifer.com/en/HvQG](https://gifer.com/en/HvQG)

Figura 28. patch *send-receive-demo.pd*

Figura 29. Altavoces recibiendo sonido desde Pure Data cuando no controlamos el volumen. [https://gifer.com/en/763H](https://gifer.com/en/763H)

Figura 30. patch *dac-demo.pd*.

Figura 31. Gato haciendo la Practica 2 de Pure Data. [https://gifer.com/en/2GU](https://gifer.com/en/2GU)

# Clip y distorsion

En el capítulo anterior hemos hecho referencia a la importancia de tener el **volumen** bajo control. Vamos a ver un objeto de seguridad que nos va a permitir **limitarlo** y con el podríamos trabajar con cascos de manera segura en caso de necesidad. Es el objeto "clip~"

[![image-1668155677856.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668155677856.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668155677856.PNG)

Este objeto va a controlar la amplitud de la señal que entre por su inlet izquierdo y la **limitará en un rango** determinado. Indicaremos ese rango en los argumentos del objeto, siendo el primero el valor mínimo y el segundo el valor máximo.

[![image-1668155904025.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668155904025.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668155904025.PNG)

Por lo general el rango de nuestras señales no ha de salirse del intervalo **\[-1 ,1\]**. El valor mínimo en la configuración del clip nunca ha de ser menos que -1, ya que el objeto no estaría realizando su función, ni el máximo más que 1. También podremos configurar este intervalo a través de los inlets segundo(mínimo) y tercero(máximo).

Abre el patch *Clip-demo.pd.* Vamos a ver como limita la señal:

![image-1668156647719.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668156647719.PNG)Figura 1. patch *Clip-demo.pd.* Visualización de una onda limitada por el objeto clip~. Su amplitud se limita a la mitad de la onda que genera el osc~. La amplitud de esta onda es de 0.5.

Sin el clip la señal tendría la siguiente forma:

[![image-1668156768413.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668156768413.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1668156768413.PNG)Figura 2. patch *Clip-demo.pd.* Visualización de una onda NO limitada por el objeto clip~. Su amplitud es igual a 1.

Como podemos ver un "clip~ -0.5 0.5" corta todos los valores que superen en 0.5 por arriba y que sean menores de -0.5 por abajo. Esto disminuirá el volumen, pero también modifica la forma de la onda, la distorsiona y sonará diferente que si hubiéramos reducido la amplitud con un multiplicador:

![image-1668157060371.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668157060371.PNG)Figura 3. patch *Clip-demo.pd.* Visualización de una onda cuya amplitud se reduce multiplicando la onda que emite el osc~ por 0.5. La amplitud de esta onda es de 0.5.

Esa **distorsión** que crea el clip al cortar la onda la podemos utilizar como un **efecto estético** o como un **elemento semántico** en nuestras creaciones. Amplificaremos excesivamente y luego cortaremos. Veremos este otro uso del clip en el próximo capitulo, pero:

<p class="callout warning">el uso esencial del objeto "**clip~**" será de **seguridad** e irá justo antes del "dac~" con un rango de -1 a 1, nunca un rango más amplio. A partir de ahora lo colocareis **siempre** en los patches sonoros que creéis.</p>

Figuras:

Figura 1. patch *Clip-demo.pd.* Visualización de una onda limitada por el objeto clip~. Su amplitud se limita a la mitad de la onda que genera el osc~. La amplitud de esta onda es de 0.5.

Figura 2. patch *Clip-demo.pd.* Visualización de una onda NO limitada por el objeto clip~. Su amplitud es igual a 1.

Figura 3. patch *Clip-demo.pd.* Visualización de una onda cuya amplitud se reduce multiplicando la onda que emite el osc~ por 0.5. La amplitud de esta onda es de 0.5.

# Micrófono: Grabar y reproducir archivos

En este capítulo vamos a ver cómo utilizar entradas, podéis utilizar el micrófono del ordenador. Veremos como grabar el sonido que generamos en pd y como reproducir archivos de audio externos. Abrir la carpeta de material correspondiente a este capitulo. En ella encontrareis todo lo necesario para seguir la lección.

### Entrada/Micrófono. adc~

Una entrada de audio nos va a permitir meter sonidos en tiempo real al ordenador, como el sonido que capta un micrófono o el sonido que produce una guitarra eléctrica. Vamos a poder grabar, reproducir o transformar estos sonidos. Actualmente casi todos los ordenadores tienen un **micrófono integrado**, que es el que, por ejemplo, en una video llamada capta el sonido de vuestra voz. Para acceder a este micrófono o cualquier otra entrada que tengáis, en Pure Data utilizaremos el objeto "**adc~**" (analog digital converter). Las entradas en Pure Data las podéis configurar en la sección "Dispositivos de Entrada" que se encuentra en "Configuración de Audio", hemos visto cómo hacerlo en la lección ["Configuración de Audio en Pure Data y notación MIDI",](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/configuracion-de-audio-en-pure-data-y-notacion-midi) pero antes de tocar la configuración de audio vamos a probar si el micro funciona, ya que Pure Data configurara una de las entradas de vuestro ordenador por defecto, así que si recibimos señal del micrófono no tendremos que modificar la configuración.

<iframe allowfullscreen="allowfullscreen" class="giphy-embed" frameborder="0" height="270" src="https://giphy.com/embed/QWYFDsf7qOxlS7FrHn" width="480"></iframe>

Figura 1. Persona probando un micrófono.

Para comprobar si recibimos señal vamos a utilizar el VU meter y el objeto "\*~" para regular el nivel de la señal:

![image-1668762034127.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668762034127.PNG)Figura 2. patch *Micro-tengo-senial.pd*

<p class="callout info">Recordar que para que Pure Data procese señal de audio tenéis que tener **encendido el DSP** y que para visualizar correctamente el nivel de volumen en el VU meter, al outlet del objeto "env~" tenéis que restarle 100 antes de enviar ese valor al VU meter.</p>

Si vemos nivel verde en el VU meter y cambia cuando damos palmadas es que tenemos señal de nuestro micrófono. ¡¡¡Ya estamos listos para transformar esa señal!!!

##### Distorsión

La distorsión a parte de un fenómeno que en algunos casos intentamos evitar se utiliza comúnmente como un efecto sonoro por ejemplo en las guitarras eléctricas.

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="455" src="https://www.youtube.com/embed/EzFk0Pv4_Dc?start=134" style="width: 809px; height: 455px;" title="YouTube video player" width="809"></iframe>

¿Percibís la gran diferencia entre la guitarra distorsionada y la guitarra sin distorsionar?

Hemos visto en la [lección anterior](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/clip-y-distorsion) que el objeto "**clip~**" aparte de como **elemento de seguridad** nos va a servir para **distorsionar** señales de audio. Vamos a probar a distorsionar nuestra voz, para ello vamos a **aumentar excesivamente el volumen se la señal** que capta nuestro micrófono, para luego **cortarla** de forma brusca con el "clip~". Podremos regular el nivel de distorsión variando cuanto aumentamos la señal y cuanto cortamos con el "clip~". Cuanto más aumentemos y más cortemos, más distorsionada estará la señal. Vamos a probarlo:

![image-1668764166840.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668764166840.PNG)Figura 3. patch *Micro-distorsion.pd*

En la figura 3 podéis ver como el clip situado en la parte de arriba limita la señal de -0,5 a 0,5. Abrir el patch *Micro-distorsion.pd*, ¿podéis escuchar vuestra voz distorsionada?

<iframe allowfullscreen="allowfullscreen" class="giphy-embed" frameborder="0" height="270" src="https://giphy.com/embed/xT1R9A3BIIKIcjGSAg" width="480"></iframe>

Figura 4. Persona escuchando su voz distorsionada con Pure Data

##### Feedback loop

¿Habéis oído alguna vez ese sonido constante e intenso que aumenta de volumen rápidamente cuando alguien con un micrófono se acerca a los altavoces por los que sale el sonido que recoge ese micrófono? Es algo así:

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="450" src="https://www.youtube.com/embed/YKYHdobeuQ4?start=25" style="width: 800px; height: 450px;" title="YouTube video player" width="800"></iframe>

En este evento del cole diríamos que el micrófono se está **acoplando** con los altavoces. Esto quiere decir que la voz de los niños o cualquier sonido que capte el micrófono se amplifica y envía a los altavoces. Los altavoces devuelven ese sonido amplificado al espacio y el micrófono vuelve a captar ese sonido que ya ha sido amplificado, lo amplifica otra vez y lo envía a los altavoces que devuelven ese sonido cada vez más amplificado. Es un ciclo en el que cada vez se aumenta más el nivel de una señal hasta generar esos tonos constantes que podéis escuchar en el video y que tanto molestan a los niños. Si os sucede esto tendréis que **bajar el volumen** de los altavoces y/o **amplificar menos** la señal que captáis con el micro, alejar el micro de ellos o colocarlo en una posición donde no este afectado. Este fenómeno se conoce como "feedback loop" que en español sería algo así como **bucle de retroalimentación**.

Es un fenómeno que por lo general se intenta **evitar**, especialmente cuando el objetivo de utilizar un micrófono y unos altavoces es comunicar un mensaje a una gran audiencia, ya que la voz de quien habla tiene que entenderse y ser lo más clara posible. Al igual que la distorsión se puede, y se utiliza, como un elemento estético y creativo en la producción sonora, pero puede ser difícil de controlar.

Para este curso solo necesitamos saber lo que es y cómo evitarlo en caso de que vuestro micrófono se acople con vuestros altavoces.

### Grabar. writesf~

Este objeto nos va a permitir grabar señales de audio que se encuentren en Pure Data. De esa grabación vamos a obtener un archivo que podremos reproducir con casi cualquier lector de Audio. Va a ser un archivo como el de una cancion que descarguéis de internet.

¿Como funciona este objeto?

Para realizar una grabación con "**writest~**" vamos a utilizar **3 mensajes**. El primero que le enviaremos va a **crear el archivo** en el que se guardara la grabación y dentro escribiremos **"open" "espacio" "nombre-de-nuestro-archivo.wav"**. Sería como meter una cinta dentro de un caset.

<iframe allowfullscreen="allowfullscreen" class="giphy-embed" frameborder="0" height="358" src="https://giphy.com/embed/VHktKwkD9OEVaX4kq2" width="480"></iframe>

Figura 5. Meter la cinta = Abrir el archivo.

El archivo se creará en la misma carpeta en la que tengamos guardado el patch. Cuando creamos el archivo aun no estamos grabando, para **comenzar a grabar** enviaremos el mensaje "**start**". Si no habéis creado el archivo antes, el mensaje "start" no va a funcionar. Sería como poner a grabar un caset sin meter ninguna cinta.

![image-1668771753892.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668771753892.PNG)Figura 6. patch *Grabar-micro.pd*

Una vez hemos comenzado a grabar, **pararemos la grabación** enviando el mensaje "**stop**" Ya está, ¡¡ya tenemos nuestra primera grabación con hecha con Pure Data!! Ir a la carpeta donde está el patch guardado. ¿Veis el archivo? hacer doble click sobre el para abrirlo. ¿Escucháis vuestra voz?

<p class="callout info">Cuando queráis realizar una nueva grabación acordaros de cambiar en el mensaje open el nombre del archivo para no sobre escribir y perder grabaciones anteriores. Esto sería como sacar la cinta en la que ya habéis grabado del caset y preparar una nueva.</p>

En la carpeta de material de esta lección os dejado la grabación que he hecho yo con este patch.

### Reproducir. readsf~

Este objeto nos va a permitir introducir en Pure Data señales de audio que se encuentran en archivos externos. Por ejemplo, la grabación que acabamos de hacer, o la grabación del golpe de una baqueta en un tambor.

<iframe allowfullscreen="allowfullscreen" class="giphy-embed" frameborder="0" height="360" src="https://giphy.com/embed/XxHVJxuogNP32" width="480"></iframe>

Figura 7. Meter la cinta y apretar al play = Abrir el archivo y enviar un "1".

"**readsf~**" funciona de una manera muy similar a "writesf~". Tendremos primero que **abrir el archivo** que se encuentra alojado en la carpeta de nuestro patch utilizando el mensaje **"open nombre-del-archivo.wav"** (meter la cinta en el reproductor de casetes). Una vez el archivo está abierto **comenzamos la reproducción** enviando un "**1**" al objeto (apretar al botón play). Para **parar** la reproducción enviaremos un "0" (apretar al botón de parar).

<p class="callout info">Los archivos que grabemos y reproduzcamos en pure data van a esta en formato WAV</p>

![image-1668773387841.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668773387841.PNG)Figura 8. patch *Reproducir-Grabar-Micro.pd*

Hay que **volver a abrir** el archivo cada vez que queramos reproducirlo. Si queremos que un archivo que está siendo reproducido vuela a empezar, habrá que **pararlo, volver a abrirlo** y comenzar de nuevo su reproducción cada vez que queramos reproducirlo de nuevo.

<p class="callout info">Recordar que el orden en el que conectáis las cajitas va a influir en el orden en el que se realizan los envíos. Para controlar ese orden de manera más precisa y visible en caso de necesidad podéis utilizar un delay con un tiempo muy pequeño.</p>

Y como ya os podéis imaginar, para escucharlo por los altavoces tendréis que hacer llegar la señal que acabáis de introducir el Pure Data al "dac~"

En la carpeta de material de esta lección os dejado la carpeta "musicradar-drum-samples" con grabaciones de sonidos de percusión que podéis utilizar.

<p class="callout success">Ejercicio 8: Explicar la función que tiene el delay de la figura 8. Añadir otro delay para aseguraros que el orden de los mensajes permite volver a reproducir un archivo cada vez que activemos el bang, aunque este archivo se esté reproduciendo.</p>

Figuras:

Figura 1. Persona probando un micrófono. [https://giphy.com/gifs/polyvinylrecords-is-this-thing-on-anna-burch-tell-me-whats-true-QWYFDsf7qOxlS7FrHn](https://giphy.com/gifs/polyvinylrecords-is-this-thing-on-anna-burch-tell-me-whats-true-QWYFDsf7qOxlS7FrHn)

Figura 2. patch *Micro-tengo-senial.pd*

Figura 3. patch *Micro-distorsion.pd*

Figura 4. Persona escuchando su voz distorsionada con Pure Data.

Figura 5. Meter la cinta = Abrir el archivo. [https://giphy.com/gifs/vhs-vaporwave-retrowave-VHktKwkD9OEVaX4kq2](https://giphy.com/gifs/vhs-vaporwave-retrowave-VHktKwkD9OEVaX4kq2)

Figura 6. patch *Grabar-micro.pd*

Figura 7. Meter la cinta y apretar al play = Abrir el archivo y enviar un "1". [https://giphy.com/gifs/XxHVJxuogNP32](https://giphy.com/gifs/XxHVJxuogNP32)

Figura 8. patch *Reproducir-Grabar-Micro.pd*

# Osciladores, expr, if

En esta lección vamos a ver varios tipos de **ondas**, que, por ejemplo, se utilizan para generar sonido en sintetizadores. Tambien vamos a ver el objeto "**expr**" y el condicional "**if**". Encontrareis todos los patches de demostración en la carpeta de material correspondiente a esta lección.

#### Onda sinusoidal. osc~

<div class="align-center" id="bkmrk-figura-1.-persona-os" style="width: 480px;"><iframe frameborder="0" height="692" src="https://giphy.com/embed/pS8uMLP7sgXmK8d3Mr/video" width="480"></iframe>

Figura 1. Persona oscilando y generando un movimiento periódico.</div><div class="align-left" id="bkmrk-" style="width: 480px;"></div>El objeto "**osc~"** es un generador de ondas sinusoidales, también conocidas como ondas puras. Hemos visto este objeto en la [Practica 2: nuestro pr... | Librería CATEDU](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/practica-2-nuestro-primer-patch-sonoro), pero vamos a recordarlo un poco. Debe recibir en su **inlet izquierdo** la **frecuencia** de la onda que queramos generar en Hz. Este objeto va a generar una onda pura, esto quiere decir una onda sin armónicos, constituida por una sola frecuencia y con una **amplitud** de **1**, por lo que generara valores **de -1 a 1**.

![image-1667806665654.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1667806665654.PNG)Figura 2. patch *Onda-Sinusoidal.pd*

####   


#### Onda de sierra: phasor

Estas ondas suenan más agresivas y estridentes que las ondas sinusoidales. La forma de esta onda son una **sucesión de rampas** iguales que van **de 0 a 1** en un tiempo determinado. Estas rampas están generadas por el objeto "**phasor~**". Al llegar a 1 los valores caen inmediatamente a 0 desde donde comienza de nuevo la rampa. Cada rampa será una repetición y la frecuencia de esta onda vendrá determinada por el número de rampas sucedido en una unidad de tiempo. Tenemos una onda de sierra que va de 0 a 1, luego su **amplitud** sera de **0.5**, por lo que vamos a **normalizarla**, que quiere decir ajustar el centro del desplazamiento transversal de una partícula en 0 con una amplitud de 1. Para ello la multiplicaremos por dos para obtener una amplitud de 1 y para colocar su centro en 0 le restaremos 1.

![image-1667806673415.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1667806673415.PNG)Figura 3. patch *Onda-Sierra.pd*

Los **toggles verdes** activan y desactivan la **onda sin normalizar** y la **onda normalizada** para que podáis compararlas en el patch *Onda-Sierra.pd*. Si encendéis los dos a la vez tendréis una combinación de ambas ondas.

####   


#### Onda rectangular: phasor + filtro

Su forma se tiene que alternar entre -1 y 1, generando una **onda rectangular**. Para conseguir esta onda vamos a partir de una onda de sierra que vamos a transformar con el objeto "**expr**". Abre el patch Expr-explicacion.pd y vamos a ver un poco cómo funciona el objeto expr:

##### expr

Este objeto nos va a permitir **evaluar expresiones** o realizar operaciones utilizando operadores matemáticos (**&lt;**, **==**, **+**, ...) o **estructuras condicionales** (si esta condición se cumple, entonces envía en valor A, si esta condición no se cumple envía el valor B. En programación por defecto las situaciones ciertas se representan con un 1, y las falsas con un 0.

En las expresiones cuando utilicemos el **$** vamos a especificar el **tipo de variable** que es (int, float o symbol). Cuando sea un int colocaremos una **i entre el símbolo $ y el número** que representas la posición ocupa la variable en la expresión. ej <span style="background-color: #c2e0f4;">$</span><span style="background-color: #fbeeb8;">i<span style="background-color: #ced4d9;">2</span></span> Cuando sea un float colocaremos un f y para symbol una s.

##### <span style="background-color: #c2e0f4;">$</span><span style="background-color: #fbeeb8;">Tipo-de-variable</span><span style="background-color: #ced4d9;">Posicion-variable</span>

![image-1668419113775.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668419113775.PNG)Figura 4. patch *Expr-explicacion.pd*

\[**expr~**\] es el objeto expr que nos va a permitir tratar con **señales**, tiene una variable input específica para señales '**$v#**'. En este caso colocamos una **v** entre el símbolo $ y el valor que indica la posición. Abre el patch ***Expr-explicacion.pd*** para probar el objeto "expr"

![image-1668419106707.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668419106707.PNG)Figura 5. patch *Expr-explicacion.pd*

Como sabemos la onda de sierra es una rampa lineal que va de 0 a 1 en un tiempo determinado. Esta rampa pasa por valores intermedios entre 0 y 1, a la mitad de la rampa en concreto se encontrará en 0.5. La **onda rectangular** que queremos crear ahora no pasa por ningún valor intermedio, va **de 0 a 1 inmediatamente**. Para convertir esta rampa lineal en un salto vamos a decirle al objeto expr~ que la condición se cumple cuando los valores son superiores a 0.5. por lo tanto, todos los valores de 0 a 0.5 pasaran a ser un 0 y que todos los valores de 0.5 a 1 pasaran a ser un 1, ya que, verdadero es igual a 1 y falso es igual a 0:

![image-1668415526890.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668415526890.PNG)Figura 6. El objeto "phasor~" envía una señal que sera filtrada por el objeto "expr~ $v1 &gt; 0.5"

$v1 sera la señal que el "phasor~" en via al inlet de "expr~". Cuando los valores generados por el phasor sean mayores que 0.5 la expresión devolverá por su output un 1, cuando los valores sean menores que 0.5 devolverá por su output un 0.

![image-1668936493891.png](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668936493891.png)Figura 7. Representación de como el objeto "expr~ $v1 &gt; 0.5" transforma una onda de sierra en una onda cuadrada.

¿Os acordáis de la metáfora del rio Ebro que utilizábamos en la lección [Programación en genera... | Librería CATEDU](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/programacion-en-general-el-mundo-de-los-algoritmos)?

El objeto "expr" y el operador "&gt;" realizarían la acción de evaluar la altura del agua y cuando desciende por debajo de 50 abrirían la compuerta del embalse.

Ahora tenemos una **onda rectangular** que va **de 0 a 1**, luego su **amplitud** sera de **0.5**, por lo que vamos a **normalizarla** como hicimos anteriormente con la onda de sierra. La **multiplicaremos por 2** para obtener una amplitud de 1 y para colocar su centro en 0 le **restaremos 1**.

![image-1667806687308.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1667806687308.PNG)Figura 8. patch *Onda-Rectangular.pd*

####   


#### Onda triangular

Su forma se compone de **rampas ascendentes y descendentes** que van **de -1 a 1 y de 1 a -1**. Para construirla vamos a partir de nuevo de una onda de sierra. A mitad de la progresión de esta onda de sierra vamos a **invertir la pendiente** de la progresión, de manera que al llegar a **0.5** en lugar de seguir subiendo hasta 1, **comience a bajar** hasta 0 con la misma pendiente pero invertida. Para ello vamos a utilizar dentro del objeto **expr~** el condicional **if**, que nos va a permitir configurar los outputs en función de si la condición se cumple o no. su estructura es la siguiente: **if(<span style="background-color: #f8cac6;">condicion</span>, <span style="background-color: #eccafa;">verdadero</span>, <span style="background-color: #fbeeb8;">falso</span>)**. Nuestra condición va a se que la señal sea mayor que 0.5, cuando la condición se cumpla la expresión va a devolver la inversa de la señal (1-señal) y cuando la condición no se cumpla devolverá la señal que ha entrado sin ninguna modificación. La expresión sera la siguiente:

![image-1668419952209.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668419952209.PNG)Figura 9. El objeto "phasor~" envía una señal que sera filtrada por el objeto "expr~ if($v1 &gt; 0.5, 1 - $v1, $v1)".

$v1 sera la señal que el "phasor~" en via al inlet de "expr~". Cuando los valores generados por el phasor sean mayores que 0.5 la expresión devolverá la inversa de la señal (1-señal), cuando los valores sean menores que 0.5 devolverá la señal.

##### "expr~ if(<span style="background-color: #f8cac6;">$v1 &gt; 0.5</span>, <span style="background-color: #eccafa;">1 - $v1</span>, <span style="background-color: #fbeeb8;">$v1</span>)"

![image-1668938167312.png](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1668938167312.png)Figura 10. Representación de como el objeto "expr~ if($v1 &gt; 0.5, 1 - $v1, $v1)" transforma una onda de sierra en una onda cuadrada.

Ahora tenemos una **onda triangular** que va **de 0 a 0.5**, luego su **amplitud** sera de **0.25**, por lo que vamos a **normalizarla** como hicimos anteriormente con la onda de sierra y la onda rectangular. La **multiplicaremos por 4** para obtener una amplitud de 1 y para colocar su centro en 0 le **restaremos 1**.

[![image-1667806695557.PNG](https://libros.catedu.es/uploads/images/gallery/2022-11/scaled-1680-/image-1667806695557.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-11/image-1667806695557.PNG)

Figura 11. patch *Onda-Triangular.pd*

####   


##### ¿Alguna duda de las ondas que acabamos de ver? ¿Preparados para oscilar?

<iframe allowfullscreen="allowfullscreen" class="giphy-embed" frameborder="0" height="321" src="https://giphy.com/embed/bTJcxLULJMeZi" width="480"></iframe>

Figura 12. Perro oscilando.

En la **carpeta de material** de esta lección tenéis todos los patches que hemos visto y también un patch con todas las ondas (***Osciladores.pd***) para que comparéis y experimentéis un poco con ellas.

Figuras:

[https://giphy.com/clips/storyful-lady-gaga-poker-face-coach-beard-pS8uMLP7sgXmK8d3Mr](https://giphy.com/clips/storyful-lady-gaga-poker-face-coach-beard-pS8uMLP7sgXmK8d3Mr)

Figura 2. patch *Onda-Sinusoidal.pd*

Figura 3. patch *Onda-Sierra.pd*

Figura 4. patch *Expr-explicacion.pd*

Figura 5. patch *Expr-explicacion.pd*

Figura 6. El objeto "phasor~" envía una señal que sera filtrada por el objeto "expr~ $v1 &gt; 0.5"

Figura 7. Representación de como el objeto "expr~ $v1 &gt; 0.5" transforma una onda de sierra en una onda cuadrada.

Figura 8. patch *Onda-Rectangular.pd*

Figura 9. El objeto "phasor~" envía una señal que sera filtrada por el objeto "expr~ if($v1 &gt; 0.5, 1 - $v1, $v1)".

Figura 10. Representación de como el objeto "expr~ if($v1 &gt; 0.5, 1 - $v1, $v1)" transforma una onda de sierra en una onda cuadrada.

Figura 11. patch *Onda-Triangular.pd*

# Práctica 5: Contador y Secuenciador

Un secuenciador nos va a permitir repetir series de acciones de manera estructurada. Con esta estructura, por ejemplo, vamos a poder crear ritmos o melodías que se repiten.

### ¿Qué elementos de Pure data necesitaremos conocer?

### Variables int y float

En Pure data una variable numérica va a ser una **cajita** en la que podamos **almacenar un valor numérico**. Podremos enviar ese valor por su outlet y también podremos sustituir ese valor por otro, esto nos va a ayudar a crear una estructura que nos permita contar. Esta cajita puede ser de tipo integer, objeto"**int"** o **"i"**, o de tipo float, objeto "**float"** o **"f"**. Las variables de tipo int solo aceptan números enteros y si reciben un numero decimal ignoraran su parte decimal y solo almacenaran la entera. Sin embargo, las variables de tipo float aceptan números enteros y decimales. Ya habíamos visto los tipos de datos y de variables en las lecciones ["Programación en general: el mundo de los algoritmos"](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/programacion-en-general-el-mundo-de-los-algoritmos) y en ["Elementos que debemos conocer"](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/elementos-que-debemos-conocer).

![image-1666430463347.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666430463347.PNG) Figura 1. patch *variables-demo.pd*

### Contador

Una vez que conocemos la variable, vamos a utilizarla para realizar un contador.

<p class="callout info">Anteriormente, introdujimos este concepto si tienes alguna duda vuelve a la página ["Estructuras que debemos conocer"](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/estructuras-que-debemos-conocer).</p>

<iframe allowfullscreen="allowfullscreen" class="giphy-embed" frameborder="0" height="270" src="https://giphy.com/embed/Y3LuJcBQFsqQTglmJF" width="480"></iframe>

Figura 2. Epi contando hasta 6 y volviendo a empezar.

Un contador nos va a permitir contar el número de veces que sucede un evento y en función de ese número tomaremos decisiones, de momento vamos a dejar lo de tomar decisiones más adelante y ahora aprenderemos a contar con Pure data. En este caso, utilizaremos una **variable de tipo int**, al contenido de esa variable le **sumaremos 1** cada vez que llegue un evento.

[![image-1666440631993.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666440631993.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666440631993.PNG)

Figura 3. patch *contador-demo.pd*

Como podéis apreciar en el patch, el outlet de la cajita de la variable i se envía a la entrada de otra cajita cuya función es sumar una unidad al valor que entre y devolver el resultado por su salida.

El resultado de esta suma se envía al inlet derecho de la variable i que lo almacenara. Los valores que entran por el inlet derecho de la variable i sustituyen el valor que almacena la variable sin sacarlo de nuevo por el outlet de la cajita con la variable i.

El cofre rojo seria nuestra variable "i" y el pajarito el objeto "+ 1" que cada vez añade una moneda más al cofre.

<iframe allowfullscreen="allowfullscreen" class="giphy-embed" frameborder="0" height="480" src="https://giphy.com/embed/YNE2DIwH8K1aUirbwz" width="480"></iframe>

Figura 4. Pajarito contando.

En nuestro patch de Pure Data, para obtener el valor almacenado en la variable i a traves de su outlet utilizaremos un bang en su inlet izquierdo. Recordar lo que vimos en la lección ["Elementos básicos"](https://libros.catedu.es/books/arduino-y-pure-data-ondas-color-y-sonido/page/elementos-basicos) sobre la entra caliente de un objeto y las entradas frias. El mensaje con el valor 0 en el inlet derecho nos permitirá inicializar el contador a 0.

Tomaremos como **valor de cuenta el resultante de la suma**, luego el outlet del objeto "+1".

### módulo, %

El objeto **%** es un operador matemático conocido como **módulo**, que devuelve por su outlet el **resto de una division**. El argumento de objeto (en la figura 5, el argumento del objeto "%" seria 8), indica el divisor de la operación, que también se puede configurar a traves del inlet derecho. El dividendo es el valor introducido por el inlet izquierdo y el **resto** **de esta division** es el **outlet** del objeto %.

[![image-1666441728571.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666441728571.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666441728571.PNG)Figura 5. patch *variable-resto-demo.pd*

###   


### Radio

El Radio es una **interfaz gráfica** que nos permite enviar valores correspondientes con una secuencia de celdas, esos valores se envían activando las diferentes celdas desde el ratón o a traves del inlet.

![image-1666369104294.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666369104294.PNG)Figura 6. patch *radio.pd* y ventana de propiedades del Radio Horizontal

Para seleccionar cada celda, clicaremos sobre ella o enviaremos al inlet del radio un numero correspondiente a la posición de la celda. La numeración de las celdas **comienza en 0**, luego la primera celda corresponderá con el numero 0. Esta interfaz podrá ser vertical u horizontal y configuraremos el número de celdas, haciendo **click derecho** sobre el **radio&gt;Propiedades&gt;Número de Celdas.** En propiedades también podremos configurar los colores, etiqueta o tamaño del radio.

[![image-1666450963792.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666450963792.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666450963792.PNG) Figura 7. patch *radio-demo.pd*

El radio por defecto tiene 8 celdas que tendremos que ajustar a nuestras necesidades. Este objeto nos va a ser extremadamente útil para **visualizar secuencias** o **activar distintos eventos**.

### Contador cíclico

<iframe allowfullscreen="allowfullscreen" class="giphy-embed" data-mce-fragment="1" frameborder="0" height="270" src="https://giphy.com/embed/Y3LuJcBQFsqQTglmJF" width="480"></iframe>

Figura 8. Epi contando hasta 6 y volviendo a empezar.

Ahora vamos a crear un contador que llegue a un número determinado y **vuelva a empezar**, para ello vamos a utilizar el objeto **"%",** que nos proporciona el resto de una división. Dividiremos por el numero al que queremos que llegue la cuenta teniendo en cuenta que el primero de esos números sera 0. Por ejemplo, si queremos que cuente hasta 8, nuestro divisor será 8 y el argumento de % también sera 8. El resto de esta división tendrá valores entre 0-7. De esta forma obtendremos una cuenta cíclica de 8 pasos.

[![image-1666452935210.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666452935210.PNG)](https://libros.catedu.es/uploads/images/gallery/2022-10/image-1666452935210.PNG)

 Figura 9. patch *contador-ciclico-demo.pd*

### Select. sel

Este objeto nos va a permitir clasificar valores, **comparando** el valor que recibe en su **inlet izquierdo** **con** el o los **argumentos** que contiene. Si en esa comparación hay una **coincidencia emitirá un bang** por el outlet correspondiente a ese argumento, el primer argumento corresponderá con el primer outlet empezando a contar por la izquierda, el segundo argumento al segundo outlet, ... Cuando no haya una coincidencia emitirá el valor recibido y no coincidente por el outlet derecho, el ultimo outlet si empezamos a contar por la izquierda.

![image-1666519000092.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666519000092.PNG)Figura 10. *patch select-demo.pd*. Objeto select con 1 argumento.

Digamos que, si el objeto select tiene 5 argumentos, va a tener 6 puertas de salida. Para salir por cada una de las puertas hay que cumplir un requisito. En el caso de la figura 11, para salir por la primera puerta (primera-izquierda) el valor recibido tiene que ser un dos, para salir por la segunda puerta un 4, por la tercera un 6, por la cuarta puerta el valor deberá de ser igual a 8 y por la quinta igual a 10. Lo que sale por todas las puertas excepto por la última es un bang.

![image-1666519006995.PNG](https://libros.catedu.es/uploads/images/gallery/2022-10/scaled-1680-/image-1666519006995.PNG)Figura 11. *patch select-demo.pd*. Objeto select con 5 argumentos.

¿Y quién sale por la ultima puerta? Por la ultima puerta salen todos los valores que no puedan salir por las puertas anteriores y es la unica que enviara un valor número, el resto de las puertas envían un mensaje de bang.

<p class="callout success">Ejercicio 9: Utilizando el contador que acabamos de ver y el objeto selector crea una melodía de 8 tiempos. Pista: Utiliza el objeto select para enviar las diferentes notas en el momento deseado a un "osc~". Puedes hacer que la melodía vaya más rápido o más despacio? ¿Y hacer que vaya para atrás?</p>

### ¿Qué tenemos que entregar?

El ejercicio 9. Sube a la carpeta del Moodle de la Practica 5 una captura de pantalla del patch y el patch que has creado. El patch deberá llamarse: **practica5\_vuestronombre\_vuestroapellido.pd** y la imagen **practica5-imagen\_vuestronombre\_vuestroapellido**.

Figuras:

Figura 1. patch *variables-demo.pd*

Figura 2. Epi contando hasta 6 y volviendo a empezar. [https://giphy.com/gifs/APMTV3-apm-apmtv3-Y3LuJcBQFsqQTglmJF](https://giphy.com/gifs/APMTV3-apm-apmtv3-Y3LuJcBQFsqQTglmJF)

Figura 4. Pajarito contando. [https://giphy.com/gifs/bird-gold-saving-money-YNE2DIwH8K1aUirbwz](https://giphy.com/gifs/bird-gold-saving-money-YNE2DIwH8K1aUirbwz)

Figura 5. patch *variable-resto-demo.pd*

Figura 6. patch *radio.pd* y ventana de propiedades del Radio Horizontal

Figura 7. patch *radio-demo.pd*

Figura 8. Epi contando hasta 6 y volviendo a empezar. [https://giphy.com/gifs/APMTV3-apm-apmtv3-Y3LuJcBQFsqQTglmJF](https://giphy.com/gifs/APMTV3-apm-apmtv3-Y3LuJcBQFsqQTglmJF)

 Figura 9. patch *contador-ciclico-demo.pd*

Figura 10. *patch select-demo.pd*. Objeto select con 1 argumento.

Figura 11. *patch select-demo.pd*. Objeto select con 5 argumentos.

###   


###