# 5. Variables y expresiones Uno de los mayores problemas de Pure Data es, además del escalado de los patches --que crecen rápidamente a medida que se desarrollan funciones más complejas--, la gestión de la memoria. Como cualquier lenguaje de programación, la optimización de los recursos como el cálculo o la gestión de la memoria permitirá, a la larga, mejorar el rendimiento de los patches una vez se vuelvan algo más complejos. Durante esta sesión se introducen las **variables globales** con el objeto **[value]** (abreviado como **[v]**) y las **expresiones** con el objeto **[expr]**. </br> ## Contenidos :::info |Objetivos|Detalle| | -------- | -------- | |Creación de variables globales en Pure Data | **[value]** |Creación de expresiones que permitan realizar cálculos complejos con un solo objeto|**[expr]** ::: </br> ## Variables Las **variables** son valores que se almacenan con la finalidad de ser utilizados en varias partes del código a la vez. Se llaman variables porque, como su propio nombre indica, son valores que pueden variar mientras el código se ejecuta, cambiando, a su vez, el resultado de los cálculos en los que intervienen. El funcionamiento por conectores de Pure Data hace que las variables funcionen de manera parecida a como funciona un valor numérico conectado a un **[s]/[r]**. Sin embargo, como se podrá ver a continuación, las posibilidades de las variables globales son más amplias. El objeto en cuestión es **[[value]](https://pd.iem.sh/objects/value/)**, que puede ser abreviado como **[v]**: <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/S1S7qOCeye.png) </div> **Funcionamiento:** La función **[value]** debe incorporar un **valor** y un **argumento**. El valor que almacenará la variable debe ser actualizado (*bang!*) por el **Hot Inlet**. El argumento servirá para poder llamar a dicha variable desde cualquier parte del código, y puede estar incorporado en el objeto, o puede incluirse por el **Cold Inlet** mediante un **mensaje**. Al igual que cualquier otro objeto, una variable puede recibir cualquier nombre: <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/BkpVTdAl1x.png) </div> </br> **Activación** El objeto **[v]** requiere de dos activaciones: actualización de la variable y llamada de la variable. En primer lugar, el objeto debe ser actualizado: <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/BJrS1K0xyx.png) </div> <br> En segundo lugar, el objeto **[v]** debe ser actualizado desde otra parte del código enviando un **[bang]** por el **Hot Inlet**. <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/B1nk1YRxke.png) </div> ## Expresiones El potencial de las variables se encuentra a la hora de realizar cálculos complejos. Para ello, es necesario conocer las expresiones y revisar su sintaxis. Una **expresión** es una combinación de valores, variables, operadores y/o funciones que el código puede evaluar para producir un resultado. En Pure Data, las expresiones funcionan bajo el objeto **[[expr]](https://pd.iem.sh/objects/expr/)**, y permiten realizar una gran cantidad de operaciones matemáticas distintas: <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/r13wxtReJe.png) </div> :::info ## FYI Debido al gran número de operaciones que se pueden realizar, se recomienda revisar la documentación para ver las posibilidades del objeto. ::: El objeto **[expr]** **se debe** manipular desde su interior. La expresión siempre va acompañada de un paréntesis, en el que se establecen las condiciones y las operaciones que realizará el objeto. La sintáxis básica es la siguiente: <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/H185GYRgyx.png) </div> La expresión debe ir acompañada de un paréntesis y una operación. Esta operación puede ser más compleja: <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/HySPmtReJx.png) </div> En este caso, conocer sintaxis es fundamental para poder utilizar el objeto. El valor $f1 almacena un espacio a un valor (float) desconocido, que se actualizará. ==???== <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/rkpsVKAgJl.png) </div> :::info ## OJO El objeto **[expr]** mantiene las propiedades generales de cualquier objeto de Pure Data; para que el objeto realice cualquier cálculo y lo saque por el outlet, se necesita un **[bang]** por el **Hot Inlet** o que el último valor actualizado sea el del **Hot Inlet**. ::: Uno de los potenciales de la combinación de **variables** y **expresiones** es que las expresiones recogen de manera directa las variables, por lo que se pueden realizar cálculos complejos utilizando únicamente el nombre de la variable como el valor a comparar: <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/By4bUtRx1e.png) </div> <div style="text-align: center;"> ![image](https://hackmd.io/_uploads/ByKAUY0eJx.png) </div> </br> ## Ejercicio 5 **Parte1:** Crea tres variables con tres nombres distintos. Las variables tienen que ser un número aleatorio entre el 0 y el 9 **Parte2:** Crea una expresión que promedie el valor de las tres variables **Parte3:** Utiliza ese promedio para hacer una segunda expresión. Si el promedio es inferior a 20, el resultado será 0; si es superior, devolverá un valor aleatorio entre 0 y 99 <br> :::spoiler Solución ::: <br> --- <br> <div style="text-align: center;"> Anterior: [**4. Comunicación I: MIDI**](https://hackmd.io/pjc8A_sIQdOd4T2tV775nA) Siguiente: [**6. Comunicación (II) MIDI to Blender**](https://hackmd.io/@FvMTRdPQSeqhA0pGgMQEWg/SJAQIouzyg) </div> <br>