# Sesión 6. Comunicación (II) MIDI to Blender
La sesión 6 aborda **cómo conectar Pure Data con Blender** mediante protocolos **MIDI y OSC** utilizando el addon AddRoutes, que permite enviar y recibir datos en tiempo real. Se detalla su instalación y configuración. La configuración MIDI incluye la selección de puertos de entrada/salida y mapear valores MIDI (0-127) a parámetros de Blender, como escalas o sliders. Además, se explican procedimientos para crear rutas y controlar en tiempo real propiedades de objetos en Blender desde Pure Data y viceversa, usando los objetos **[ctlout]** y **[ctlin]**.
## Contenidos
:::info
|Objetivos|Detalle|
|---|---|
|Conexión de PureData con Blender mediante el uso de los protocolos MIDI y OSC| **AddRoutes**
Diseño del patch de envío | **[ctlout]** **[ctlin]**
:::
## AddRoutes
AddRoutes es un *addon* de Blender diseñado por [JPefP](http://www.jpfep.net/) que sirve para poder comunicar Blender con otros softwares, siendo capaz de enviar y/o recibir datos en tiempo real. La comunicación que admite AdRoutes es a través de MIDI o OSC, lo que hace que sea un *addon* bastante accesible a todos los públicos.
## Instalación
A continuación se presentan los enlaces para consultar la documentación oficial del *addon* y descargar su última versión:
[Documentación](http://www.jpfep.net/pages/addroutes/)
[Soporte](http://www.jpfep.net/addroutes-v034-support-for-blender-31/) para versiones de Blender superiores a la 3.1 (probado en Blender 3.2). Se espera que también sea compatible con Blender 3.6. Una vez descargado el complemento, debe abrirse Blender e instalarlo desde el menú correspondiente (Edit → Preferences → Add-ons → Install).
:::danger
## OJO
AddRoutes es un *addon* antiguo, así que no cubre la nueva versión de Blender (Blender 4.2, la que hay en los ordenadores del campus). Para que el *addon* funcione, hay que instalar alguna versión antigua de Blender.
:::
<br>
## Configuración MIDI
Para desplegar el menú del *addon* se debe pulsar la tecla “N”.
En primer lugar, es necesario ir a **AddR Config** y abrir el menú que más interese (en el ejemplo se usará MIDI). Una vez abierto, hay que seleccionar un puerto de entrada y/o uno de salida. En caso de querer recibir en Blender datos enviados desde Pure Data, se deberá definir el puerto de entrada (System In). En cambio, si se quiere enviar información desde Blender a cualquier otro software, se deberá usar el puerto de salida (System Out).
<div style="text-align: center;">

</div>
Para ello hay que crear un puerto MIDI, idealmente con [LoopMidi](https://www.tobias-erichsen.de/software/loopmidi.html) (Windows) o desde la configuración de puertos de Mac.
</br>
## Crear una ruta
Para crear una ruta, se debe abrir el menú de rutas (**Routes**), y desplegar el menú de rutas del proyecto (**Project routes**). Pulsando sobre “Add route”, se despliega la siguiente ventana:
<div style="text-align: center;">

</div>
<br>
Es necesario cambiar algunos parámetros para conseguir que el addon funcione correctamente. Es aconsejable utilizar controladores (*CC*) por encima de notas (*note*) para manejar AddRoutes. De tal modo, en **event type** habrá que elegir la opción **Continous Controller 7bit**.
A continuación, el parámetro **Rescale** debe estar siempre en el modo Wrap. **Esto nos permite mapear los valores que recibamos** desde pure data:
<div style="text-align: center;">

</div>
<br>
:::info
## FYI
Mapear valores significa transformar un rango de números de un intervalo original a otro intervalo diferente, manteniendo la proporción entre los valores. Es una operación común cuando se quiere traducir datos de una escala a otra, como convertir valores de MIDI (que van de 0 a 127) en unidades que tengan sentido en otro sistema, como la distancia en Blender (de 0 a 500, por ejemplo).
:::
<br>
En **channel**, habrá que indicar cuál es el canal que recibe o envía datos y, por último, se deberá seleccionar la operación que se quiere llevar a cabo. Así pues, si se quiere recibir información desde Pure Data por el canal 3, el panel se vería así (lo que está en rojo son parámetros que no están definidos todavía):
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/Hy7jc79GJx.png" width="324">
</div>
<br>
Una vez preparada la ruta, es necesario definir qué parámetros se quieren modificar con los datos recibidos desde Pure Data. Para, por ejemplo, cambiar la escala en el eje Z de un cubo, se debe seleccionar el cubo, ir en **object properties** y hacer click derecho en **Scale Z**. Normalmente, todos los parámetros que AddRoutes nos permite modificar son aquellos que funcionan con sliders (o con valores continuos, en general). A continuación, se debe seleccionar la opción **Create a realtime route**:
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/HJ5sqXqzyg.png" width="324">
</div>
<br>
Con este procedimiento, se habrá creado una nueva ruta con las siguientes propiedades ya definidas:
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/Sk825Qcfye.png" width="324">
</div>
<br>
Debajo del **event type** hay una opción llamada **select**, que sirve para definir el número del controlador que se está usando. Además, en las propiedades aparece un **index**. Esta opción sirve para elegir qué parámetro concreto se está controlando. En el caso de la escala, y si se quiere modificar el eje z como se proponía anteriormente, es el tercero que aparece en el menú de **object properties**. Será, por lo tanto, **index** 2, debido a que Blender cuenta desde 0 (**x = 0, y = 1, z = 2**). Debería verse así:
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/rkNT9Q9z1x.png" width="324">
</div>
## MIDI control hacia blender
Una vez realizada la conexión, es necesiario crear el patch específico desde Pure Data:
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/S19p5Xczkg.png" width="324">
</div>
<br>
Siempre que se quieran enviar datos desde Pure Data a Blender se deberá realizar con el objeto **[ctlout]**. Por comodidad, es mejor incorporar el argumento en el mismo nodo del objeto.
:::warning
## HEY
Es importante recordar que se debe seleccionar el puerto MIDI creado de salida para que esto funcione. Para ello es interesante asignar un nombre al puerto que sea claro; por ejemplo, se podría llamar "Pure Data" al puerto encargado de la salida de datos de Pure Data y a la entrada de datos de Blender.
:::
El slider tiene el rango de valores de salida MIDI por defecto (0-127) y, cada vez que se mueve, modifica la escala del cubo a tiempo real:
<div style="text-align: center;">

</div>
Si, en cambio, se quieren enviar los valores de la escala de este cubo de Blender a Pure Data, solamente es necesario cambiar de **receive** a **send** la ruta creada (o duplicar la ruta y cambiar el ajuste en la copia). El patch que se debe crear para recibir información es el mismo, pero invertido, con el objeto **[ctlin]**:
<div style="text-align: center;">

</div>
:::danger
## OJO
En caso de que estés enviando y recibiendo datos entre Pure Data y Blender a la vez, es importante que te asegures de **no utilizar el mismo puerto** para evitar crashes y disgustos innecesarios!
:::
<br>
## Tutorial
**Tutorial super sencillo!** Cómo conectar una tabla MIDI a Blender con AddRoutes:
<iframe width="560" height="404" src="https://www.youtube.com/embed/YLfoUGAxl5M?si=CUYxdc6tcrqHB6bQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<br>
<br>
---
<br>
<div style="text-align: center;">
Anterior: [**4. Comunicación I: MIDI**](https://hackmd.io/pjc8A_sIQdOd4T2tV775nA)
Siguiente: [**7 (?)**](https://)