---
weight: 4
title: "Apuntes de Arte Generativo"
date: 2023-02-01T11:00:40+0100
draft: false
summary: "Pues eso, apuntes sueltos de arte generado por ordenador"
categories:
- notes
tags:
- python
- processing
- py5
- openFrameworks
- generative art
---

<!--
https://www.instructables.com/Exploring-Generative-Art-How-to-Create-Stunning-Ar/
https://www.freecodecamp.org/news/how-to-create-generative-art-in-less-than-100-lines-of-code-d37f379859f/
https://blog.prototypr.io/the-short-guide-to-generative-art-creative-coding-fc36ff163708
https://aiartists.org/ai-generated-art-tools
-->

{{< admonition type=warning title="EN CONSTRUCCION" open=true >}}

Esta página está muy lejos de estar completa, solo son apuntes sueltos para uso personal.

{{< /admonition >}}


{{< admonition type=info title="Referencias" open=true >}}
- [Processing](https://processing.org/)
- [py5](http://py5coding.org/) un port de Processing para Python
- [py5 source](https://github.com/py5coding/py5)
- [Install py5](https://py5coding.org/content/install.html)
- [Generative Design Landing Page](http://www.generative-gestaltung.de/ "A landing page for the book") Un libro de arte generativo con muchos ejemplos de ___Processing___
- [The Nature of Code](https://natureofcode.com/ "The book from Daniel Shiffman") Un libro de Daniel Shiffman que se puede leer on-line. Simulaciones de procesos físicos con ___Processing___
- [Portando todos los ejemplos de Processing a py5 por Alexandre Villares](https://github.com/villares/py5examples/tree/processing-python-mode-examples/examples-from-Processing-Python-mode)
- [Structure Synth](https://structuresynth.sourceforge.net/)
- [Design for Complexity with Structure Synth](https://www.shapeways.com/blog/archives/32934-tutorial-tuesday-27-design-complexity-structure-synth.html)
- [Scripting in Structure Synth](http://blog.hvidtfeldts.net/index.php/2010/11/scripting-in-structure-synth/)
- [Context Free Art](https://www.contextfreeart.org/)
- [Generative Design](https://github.com/generative-design) The book on Github
- [Generative Arts Links](http://blog.hvidtfeldts.net/index.php/generative-art-links/)
{{< /admonition >}}


## py5, un port de Processing a Python

### Requisitos

Para que todo funcione correctamente necesitamos:

- Python 3.8
- Java 17
- La biblioteca de gráficos _Cairo_ (esta es opcional, y yo ya la tenía instalada con `apt install libcairo2-dev`)

### Instalación

1. Instalamos la última versión de Python 3.8 (por precaución no instalo en la última versión de Python pero puedes probar)

```bash
pyenv install --list |grep 3.8.
pyenv install 3.8.15
```

2. Creamos un entorno virtual

```bash
pyenv virtualenv 3.8.15 ve_py5
```

3. Activamos el entorno e instalamos py5

```bash
pyenv ve_py5 activate
myve
pip install 'py5[jupyter]'
pip install cairosvg
```

4. Instalamos java mediante python (asegúrate de que sigues en el mismo virtualenv)

```bash
pip install install-jdk
python -c "import jdk; print('Java installed to', jdk.install('17'))"
```

Con esto ya tenemos todo instalado. Podemos probar `py5` con un programa sencillo:

```python3
import py5

def setup():
    py5.size(200, 200)
    py5.rect_mode(py5.CENTER)

def draw():
    py5.rect(py5.mouse_x, py5.mouse_y, 10, 10)

py5.run_sketch()

```

### Java 17

Yo uso Openjdk en mi linux:

```bash
java -version

openjdk version "11.0.17" 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)
```

El Java 17 que hemos instalado se queda en `~/.jdk`.

`py5` no necesita configuración adicional para usar el Java 17, sabe donde tiene que buscarlo. Si por alguna razón quieres usar esa versión de Java para otras historias puedes añadir un alias, como el siguiente, al fichero de alias (`~/.zalias.zsh`)

```zsh
# Java 17 installed in ~/.jdk
java17() {
    export JAVA_HOME="$HOME/.jdk"
    export PATH="$HOME/.jdk/jdk-17.0.6+10/bin:$PATH"
    java -version
}
```

Con ese alias podremos activar el Java 17 en nuestra sesión de terminal sin más que ejecutar `java17`


### Modos de funcionamiento de _py5_

#### Modo _module_

Este se parece bastante al modo clásico de _Processing_. En este modo podemos crear las funciones `settings`, `setup` y `draw`. Ninguna es obligatoria pero en la práctica es raro que no necesites `setup` y si quieres algo dinámico te hará falta `draw`.

Un ejemplo típico de programa en modo _module_:

```python3
import py5

def setup():
    py5.size(300, 200)
    py5.rect_mode(py5.CENTER)

def draw():
    py5.rect(py5.mouse_x, py5.mouse_y, 10, 10)

py5.run_sketch()
```

En `setup` podemos invocar funciones de `settings` y ahorrarnos escribir esa función, pero todo lo que pertenezca a `settings` tiene que ir al principio de la función `setup`.

{{< admonition type=danger title="import py5" open=true >}}
Ni se te ocurra hacer `from py5 import *` tendrás problemas con varias cosas. __py5__ no está programado para soportar este tipo de _import_ que, en todo caso, siempre es poco aconsejable.
{{< /admonition >}}

#### Modo _Class_

Nos permite crear Clases que heredan del objeto "_Sketch_" de __py5__.

#### Modo _Imported_

Imita el funcionamiento de __Processing__, sin imports ni prefijos en las funciones de __py5__. Sólo podemos usar este modo desde __Jupyter__ tras instalar el _kernel_ de __py5__

#### Modo _Static_

Para crear imágenes estáticas



## openFrameworks

Nos bajamos los fuentes para linux 64bits desde [la página web del proyecto](https://openframeworks.cc), y las descomprimimos en un directorio para proceder a compilarlas.

No hay más que seguir [las instrucciones de instalación para linux](https://openframeworks.cc/setup/linux-install/).

La instalación no es demasiado intrusiva si tienes Ubuntu 18 o mayor y una versión reciente del gcc.

Al instalar las dependencias añadimos los siguientes paquetes a nuestro sistema:

~~~~bash
installing OF dependencies
OF needs to install the following packages using apt-get:
curl libjack-jackd2-0 libjack-jackd2-dev freeglut3-dev libasound2-dev libxmu-dev libxxf86vm-dev g++ libgl1-mesa-dev libglu1-mesa-dev libraw1394-dev libudev-dev libdrm-dev libglew-dev libopenal-dev libsndfile-dev libfreeimage-dev libcairo2-dev libfreetype6-dev libssl-dev libpulse-dev libusb-1.0-0-dev libgtk-3-dev libopencv-dev libassimp-dev librtaudio-dev libboost-filesystem-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-libav gstreamer1.0-pulseaudio gstreamer1.0-x gstreamer1.0-plugins-bad gstreamer1.0-alsa gstreamer1.0-plugins-base gstreamer1.0-plugins-good gdb libglfw3-dev liburiparser-dev libcurl4-openssl-dev libpugixml-dev libgconf-2-4 libgtk2.0-0 libpoco-dev
~~~~

No te olvides de compilar también el _Project Generator_.



## Structure Synth

Instalamos con `sudo apt install structure-synth sunflow`

## Context Free Art
