---
# System prepended metadata

title: 'Sesión 4. Comunicación I: MIDI'

---

# Sesión 4. Comunicación (I) MIDI

Uno de los principales motivos por los que se utiliza Pure Data es para gestionar y procesar datos que comuniquen diferentes softwares. A lo largo de esta sesión, se introduce la comunicación vía **MIDI** a través de interfaces físicas (**AKAI LPD8 MKII**) y digitales (**LoopMIDI**). Se introducirá al protocolo MIDI a través de las notas y los controladores, aprendiendo a separar y recibir los distintos datos MIDI en Pure Data con los objetos **[notein]** y **[ctlin]**. A su vez, se investigarán las funciones [delay] y [pipe] y se implementará su funcionalidad en un ejercicio colectivo. 

</br>

## Contenidos

:::info

|Objetivos|Detalle|
|---|---|
|Introducción a las interfaces de control MIDI | **LPD8 MKII**
|Comprender la comunicación MIDI | **MIDI, LoopMIDI**
|Crear una interfaz que comunique la controladora MIDI (*input*) con Pure Data |**[notein] [ctlin]**
|Control temporal de envío de señales (II)| **[delay] [pipe]**

:::

</br>

## MIDI

MIDI (*Musical Instrument Digital Interface*) es un **protocolo de comunicación** que permite la conexión y el control entre diferentes dispositivos electrónicos (principalmente musicales). **MIDI no es un formato de audio en sí mismo** (como por ejemplo .wav o .mp3), sino de **un lenguaje digital** que transporta información **en forma de bytes**. Esa información pueden ser notas musicales, su duración, la velocidad (intensidad con la que se tocan las notas), cambios de instrumentos y otros parámetros de interpretación musical. Sin embargo, al ser un estándar flexible, su uso se extiende más allá del control de audio, y también se puede utilizar para controlar cualquier otro software que se comunique con este protocolo.

Los datos MIDI se expresan siempre en un rango de 128 (de 0 a 127). Para utilizar el protocolo MIDI, normalmente lo haremos a través de dos tipos de dato:

* **Notas**: Un mensaje de nota en MIDI se utiliza como un [toggle]. Indica cuándo se toca una nota y cuándo debe dejar de tocarse. Estos mensajes *encienden* (1) y *apagan* (0) una nota concreta. 
* **Controlador** (**CC**): Un Control Change (CC) es un tipo de mensaje MIDI que controla parámetros continuos, como el volumen, la modulación, la panorámica (posición estéreo), o cualquier otro aspecto que pueda variar de manera continua (~~0/1~~) y va de 0 a 127.

Cualquier nota MIDI se descompone en tres valores: 

* **Canal**: Un valor entero que va de 1 a 16. Podemos enviar datos simultáneamente por hasta 16 canales. Cada canal se ocupa de un asunto distinto -- Por ejemplo, cada canal podría manejar un instrumento distinto de una orquesta de 16 instrumentos. 
* **Valor contínuo**: Un valor contínuo que va de 0 a 127. En el caso de las notas, se asigna a la velocidad (*% intensidad de la nota*) y en el caso de los **CC** se asigna al valor del controlador (*% de paneo, modulación, etc*).
* **Valor "fijo"**: Un valor entero que va de 0 a 127 que asigna en qué se va a trabajar. En el caso de las notas, asigna la altura de la nota (C3, C3#, D3...) y en el caso de los controladores, elige qué controlador se varía (por ejemplo, CC7 suele relacionarse con el volumen general). 

<div style="text-align: center;">

![image](https://hackmd.io/_uploads/SJxwxHre1g.png)

</div>


</br>

## Interfaz MIDI

Una interfaz MIDI es un aparato que genera señales MIDI y que se puede comunicar directamente con otro ordenador o instrumento. A diferencia de un instrumento musical, una interfaz MIDI no genera sonidos, sino que produce una serie de **paquetes de datos** que son interpretados por el ordenador para generar sonidos. 

<br>

<div style="text-align: center;">

![image](https://hackmd.io/_uploads/BJiy-Ereyl.png)

</div>

En el LPD8 de AKAI, se utilizan los 8 botones para enviar **notas**, y las 8 perillas para enviar los **Control Change**. Para utilizar este dispositivo como **input** en Pure Data, hay que conectarlo al ordenador vía USB y descargar sus [drivers](https://www.akaipro.com/downloads#lpd8mk2).

<br>

## Interfaz MIDI Digital

Pure Data es capaz de generar y enviar datos MIDI a otro software. Para ello necesitamos una Interfaz MIDI Digital, que interprete los bytes que genera Pure Data como datos MIDI. Para ello necesitamos un software como [LoopMIDI](https://www.tobias-erichsen.de/software/loopmidi.html), una aplicación para Windows que crea puertos MIDI virtuales, permitiendo el envío y recepción de datos MIDI entre diferentes aplicaciones en el mismo ordenador sin necesidad de cables o dispositivos físicos MIDI. Esto es especialmente útil cuando se desean conectar distintas aplicaciones que no tienen integración directa entre sí (por ejemplo Pure Data y Blender).

LoopMIDI tiene una interfaz muy simple: 

<div style="text-align: center;">

![image](https://hackmd.io/_uploads/BkzHrVrxJe.png)

</div>
    
Para crear un nuevo puerto solamente hará falta hacer click en el botón [+] y se creará un nuevo puerto MIDI, que permitirá comunicar dos aplicaciones entre sí. 

<div style="text-align: center;">
    
![image](https://hackmd.io/_uploads/rkODSVHgyx.png)

</div>
    
Una vez creado el nuevo puerto, se podrá seleccionar desde cualquier aplicación, como por ejemplo, en Pure Data. En este caso, se selecciona el puerto de LoopMIDI como un puerto de salida o *output* (es decir, Pure Data enviará datos al software que se conecte a ese mismo puerto desde la entrada o *input*). 

<div style="text-align: center;">
    
![image](https://hackmd.io/_uploads/ByTaSEBxkx.png)

</div>
    
Una vez creado el puerto y habilitada la salida, se puede trackear el envío de datos a través de la interfaz de LoopMIDI, donde se pueden observar el total de datos enviados y el flujo de datos que se están enviando por segundo. 

<div style="text-align: center;">
    
![image](https://hackmd.io/_uploads/BJhwDErl1l.png)

</div>

<br>

## MIDI Input

Para utilizar la interfaz MIDI como **input** es necesario utilizar la función [**[notein]**](https://pd.iem.sh/objects/notein/) para operar con notas y la función [**[ctlin]**](https://pd.iem.sh/objects/ctlin/) para operar con controladores. En ambos casos, tanto **[notein]** como **[ctlin]** disponen de **tres outlets**. Uno de ellos será el canal (1-16), otro será el valor fijo (0-127) y el valor contínuo (0-127).

<div style="text-align: center;">

![image](https://hackmd.io/_uploads/r1Qs3ESx1e.png)

</div>

## NoteIn

El objeto **[notein]** importa **Nota** (valor "fijo" de la nota), **Velocidad** (intensidad con la que se toca la nota) y **Canal** (de qué instrumento), en ese mismo orden. De estos tres valores, solamente el canal puede incluirse como un argumento en el objeto. 

<div style="text-align: center;">

![image](https://hackmd.io/_uploads/Hkw_3VBlkg.png)

</div>
    
La diferencia en ambos casos es que podemos utilizar el argumento dentro del objeto **[notein]** para filtrar y separar los datos que se quieran recibir. Con **[notein]** se procesarán todos los datos recibidos (**OMNI**), mientras que con **[notein 1]** solamente se procesarán los datos recibidos por el **canal 1**. 

<br>

## CtlIn

El objeto **[ctlin]** importa **Value** (% de modulación), **Controller** (qué modulador se toca) y **Canal** (de qué instrumento), en ese mismo orden. De estos tres valores, todos pueden incluirse como un argumento en el objeto a excepción del Value, que corresponde al valor continuo que se usa como expresión. 

![image](https://hackmd.io/_uploads/rJNVkrBeye.png)

La diferencia, al igual que en **[notein]**, es que los argumentos servirán para filtrar y separar los datos recibidos. **[ctlin]** recibirá los datos **OMNI** (de cualquier controlador), mientras que **[ctlin 4]** solamente recibirá los datos del controlador 4.

## Retrasar envíos con [delay]

<div style="text-align: center;">

![Screenshot 2024-10-22 193547](https://hackmd.io/_uploads/r175zPrxyg.png)


</div>

**Funcionamiento:**
==???== 

**Activación**
==???==

</br>

## Retrasar envíos con [pipe]

<div style="text-align: center;">

![screenshot](https://hackmd.io/_uploads/HJkJfwSl1e.png)
 

</div>
    

**Funcionamiento:**
==???==

**Activación**
==???==

<br>

## Ejercicio 4 

**Parte1:**
Se deben crear dos grupos. El grupo 1 investigará el funcionamiento de [pipe] y el grupo 2 investigará el funcionamiento de [delay]. Cada grupo debe redactar una descripción, el funcionamiento y la activación de su objeto. Se pondrá en común. 

**Parte2:**
Se debe crear un patch que lea un **botón y dos controladores** de la Interfaz MIDI. 

**Parte3:**
Se debe crear un ==**oscilador**== que produzca una onda de sonido. El botón creado anteriormente debe hacer que la onda suene o deje de sonar. Uno de los controladores debe manejar el volumen de esa onda (0-1) y el otro controlador debe manejar el pitch (la altura) del oscilador (20-1000). 

**Parte4 (pipe y delay):**
El botón debe activar un sonido random que se active 1 segundo más tarde del click utilizando la función **delay**. El segundo controlador (el que maneja el pitch del oscilador) debe manejar el volumen (0-1) y el pitch (20-1000) de un ==**phasor**== con **1 segundo de retraso** respecto al anterior. 

**Parte5 (extra / ==research==):**
Leer un segundo botón que debe activar y desactivar **el sonido general de Pure Data**.

</br>

:::spoiler **Solución**

Parte 2: Se recibe el botón con **[notein]** y los dos sliders con **[ctlin]** con sus respectivas rutas. Para evitar conexiones innecesarias se conectan los sliders con el objeto **[send]**

<div style="text-align: center;">
    
![image](https://hackmd.io/_uploads/rkVQJ-6lke.png)

</div>

<br>

Parte 3: En la tercera parte del ejercicio, se crea un oscilador con **[osc~]**. Para controlar el volumen se utiliza un multiplicador en la amplitud de su onda con **[*~]**. El rango de 20 a 1000 se puede establecer multiplicando el valor inicial del slider (0-1) * 980 y sumando 20. El botón resetea el sistema pasando el volumen y el valor del oscilador a 0. 


<div style="text-align: center;">

![image](https://hackmd.io/_uploads/SyGYlW6ekl.png)

</div>

<br>

Parte 4: La última parte consiste en vincular el slider2 a un **[phasor~]** y manejar su señal retardada con **[pipe]**. También se debe reconvertir parte de la señal del rango 20-1000 al rango 0-1 dividiendo el valor por 980 y restándole el residuo de la división (0.02). El botón abre un archivo de sonido utilizando **[delay]** y **[readsf~]**

<div style="text-align: center;">

![image](https://hackmd.io/_uploads/SJCHQzaxJg.png)

</div>

<br>

Parte 5: Se puede encender y apagar el **DSP** (Digital Signal Processing) con la siguiente instrucción, o con el objeto **[switch]**. 

<div style="text-align: center;">

![image](https://hackmd.io/_uploads/Skr7NG6gJg.png)

</div>
    
:::

<br>

---

<br>
 
<div style="text-align: center;">

Anterior: [**3. Introducción a Pure Data**](https://hackmd.io/tE4WG9EfRBKAQnFiBzD0RA?both=)
Siguiente: [**Sesión 5: Operadores complejos y expresiones**](https://hackmd.io/@FvMTRdPQSeqhA0pGgMQEWg/HykjcvCgke)
 
</div>
<br>