---
# System prepended metadata

title: 'Sesión 5: Variables y expresiones'

---

# 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>