taller-hydra icon indicating copy to clipboard operation
taller-hydra copied to clipboard

Breve taller de hydra

Taller de hydra

¿Qué es hydra?

Hydra es una plataforma para hacer live coding de visuales, creada por Olivia Jack e inspirada en los sintetizadores analógicos modulares. Cada fuente de video (cámaras, formas geometricas, osciladores, etc) pueden ser transformados, modulados y compuestos a través de una combinación de funciones.

Instalación y Uso

Hydra puede usarse directamente desde un navegador web.
Allí se puede cargar un sketch aleatorio clickando en el botón y comenzar a modificar los parámetros para ver los resultados que produce presionando ctrl + Enter.

También es posible instalar hydra en el editor de textos atom

Instalar atom

Descargar e instalar el editor de textos atom

Instalar hydra

Ir a las preferencias de atom ( ctrl + , ) y buscar e instalar el package atom-hydra

Uso

  • Activar hydra ( Packages -> atom-hydra -> Toggle )
  • Crear un archivo de extensión .js para usar con hydra.
  • Escribir osc().out()
  • Ejecutar ( ctrl + Enter)

¿Cómo funciona?

Hydra se inspira en la síntesis modular en dónde cada módulo realiza una operación específica y se interconectan las entradas y salidas de varios módulos para producir resultados más complejos de los que puede realizar un módulo por separado.

Los módulos de sintetizadores modulares suelen estar categorizados en generadores o modificadores. Por ejemplo, un VCO (oscilador controlado por voltaje) es un generador, mientras que un VCF (filtro controlado por voltaje) es un modificador.

En hydra se sigue esta lógica y cada función puede ser vista como un módulo de síntesis de video.

Primeros pasos

Si ejecutamos en hydra osc().rotate().out() veremos lo siguiente

Aquí hay tres funciones encadenadas por puntos: osc() , rotate() y out(), y podemos pensar estos puntos como cables que conectan los módulos entre sí (osc--->rotate--->out)

En el ejemplo, osc es un generador (un oscilador) cuya salida está conectada a la entrada de rotate, que es un modificador (gira el video), cuya salida está conectada a la entrada de out, que es el módulo que finalmente muestra la señal de video en pantalla.

En este otro ejemplo, como generador utilizamos la webcam, luego de iniciarla con s0.initCam(). La salida de src(s0) (la webcam) está conectada a la entrada del modificador kaleid indicandole la cantidad de caras por parámetro (6), y su salida finalmente a out.

// iniciar webcam en buffer s0
s0.initCam()
//  webcam --> kaleid --> out
src(s0).kaleid(6).out()

Utilizando listas como parámetros

En lugar de un parámetro fijo ( como el número de caras de kaleid) podemos pasar una lista del siguiente modo:

// iniciar webcam en buffer s0
s0.initCam()
//  webcam --> kaleid --> out
src(s0).kaleid([4,6,20,50]).out()

De este modo, la cantidad de caras de kaleid irá variando con el tiempo. Si queremos variar su velocidad, reemplazamos [4,6,20,50] por [4,6,20,50].fast(10) o [4,6,20,50].fast(0.01)

// kaleid cambiando a 0.2 de velocidad
voronoi()
  .kaleid([8,12,100].fast(0.2))
  .color(2,0,0)
  .out()

Y esto es válido para cualquier parámetro de cualquier función.

voronoi([1,10,100].fast(0.01))
  .kaleid([8,12,4].fast(0.02))
  .color([0.2,0.5],[0.1,0.3],1)
  .colorama([1,0.2,30,0.5].fast(0.01))
  .rotate([0,10,90])
  .out()

Utilizando audio

Al iniciarse, hydra nos pide acceso al micrófono, ya que puede utilizarse para modular parámetros.

En la esquina inferior izquierda podemos ver el movimeinto de los niveles de 4 bandas de frecuencias ejecutando

  a.show()

Estos valores, normalizados (entre 0 y 1) están disponibles en las variables a.fft[0],a.fft[1],a.fft[2] y a.fft[3].

Así podemos, por ejemplo, escalar un rectangulo según lo que reciba el micrófono:

  shape(4).color(1,0,1).scale( () => a.fft[0] *2 ).out()

Un ejemplo mas completo utilizando las cuatro bandas, y cuatro salidas de video diferentes:

  shape(4).color(0,0,1).scale( () => a.fft[0] *2 ).out(o0)
  shape(5).color(1,0,1).scale( () => a.fft[1] *2 ).out(o1)
  shape(6).color(0,1,1).scale( () => a.fft[2] *2 ).out(o2)
  shape(7).color(0.5,0,1).scale( () => a.fft[3] *2 ).out(o3)
  render()

Otra variante:

  voronoi(10).color(0,() => a.fft[0] *2,1).out(o0)
  noise(() => a.fft[1] *200).rotate(1,1).color(1,0,0.5).out(o1)
  osc(40).color(0,1,1).scale( () => a.fft[2] *2 ).out(o2)
  shape(7).color(0.5,0,1).scale( () => a.fft[3] *2 ).out(o3)
  render()

Mezclando señales

...

...continuará...

Aquí está el listado de las funciones disponibles en hydra.