Untitled
2010
Audiovisual code

An experimental video of abstract images and sounds. “Untitled” was created solely from a computer programming code without any reference to the real world. From the variation of three-dimensional geometric shapes and wave modulations. The code becomes as important as the result, not only to know how they were made but also to generate variations and primarily as an alternative form of distribution, more efficient compared to the usual digital circulation of audiovisual material.

Cubo virtual en tres dimensiones de color gris con fondo blanco

void setup(){ size(1280, 720, P3D); frameRate (24); } void draw(){ lights(); background(255); translate(width/2, height/2, -100); rotateX(frameCount*PI/100); rotateY(frameCount*PI/100); rotateZ(frameCount*PI/100); noStroke(); fill(150); box(200); // save ("image.png"); }


K02 Untitled2010C200dpi copy

Sin Título
2010
Código audiovisual

El proyecto consiste en imágenes y sonidos abstractos creados únicamente a partir de código de programación informático sin ninguna referencia del mundo real. A partir de la variación de figuras geométricas básicas en tres dimensiones y modulaciones de onda se produce un audiovisual experimental open source.
El código que los genera se vuelve tan importante como el resultado, no sólo para saber cómo fueron realizados sino también para generar variaciones, y principalmente como una forma alternativa de distribución de material audiovisual más eficiente y acorde al medio.

Objetivos

  • Explorar las posibilidades específicas de las imágenes sintéticas.
  • Cuestionar la distribución audiovisual de films hechos por computadora.
  • Promover el acceso al código para conocimiento y nuevas obras derivadas.
  • Reflexionar sobre la percepción temporal a partir de la posibilidad de modificar el punto de vista para los mismos sucesos, y la utilización no convencional de la aleatoriedad computacional.

Código como obra

Si gran parte de la producción audiovisual actual se genera por computadora, su forma de distribución y exhibición sigue siendo la misma que para cualquier material producido a partir de un registro del mundo “natural”. La intención del proyecto es hacer notar algunas características específicas de un material audiovisual de síntesis a partir de imágenes imposibles de conseguir con una cámara y su posible distribución como código, en lugar de hacerlo con el resultado del proceso de cálculo en los soportes habituales de video. El primer punto se observa en la utilización de formas geométricas básicas que no se encuentran en la naturaleza, en un espacio deliberadamente “virtual”, y con deformaciones algorítmicas imposibles de conseguir fuera de la computadora por su nivel de complejidad.
El segundo punto tiene que ver con la distribución del código que atraviesa el concepto “open source” y la eficiencia de “peso” o “tamaño” en bits. Un archivo de unos cuantos Gb en algún soporte tipo Blu-Ray o DVD (incluso en un archivo .avi comprimido que podríamos bajar de internet por torrent, ed2k, rapidshare, etc., o un .flv o .mp4 en “streaming”) no se puede comparar con el peso en bytes de las instrucciones del programa. Por otro lado, las políticas de copyright al estilo DMCA impulsadas por la MPAA y la RIAA insisten con la defensa de la industria musical y cinematográfica difíciles de sostener en las actuales condiciones tecnológicas de producción, distribución, y exhibición audiovisual. Esta propuesta alternativa de distribución se podría relacionar con el DeCSS de DVD Jon distribuido en forma de Haiku y en remeras, o lo que sucedió más recientemente con el código hexadecimal 09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 que permite saltar la protección DRM en los HD-DVD y algunos Blu-Ray. Esto denota que conocer la secuencia del código se convierte en algo tan importante como el resultado obtenido. La propuesta es trasladar esta lógica al ámbito estético digital.
Al tener acceso al código se puede conocer cómo surgen las imágenes y sonidos, se pueden modificar valores para generar nuevas versiones del programa/film, o se puede distribuir de una forma más eficiente el programa/film para su visualización.

Aleatoriedad Previsible

Desde las primeras obras producidas por computadora la posibilidad de obtener valores aleatorios ha fascinado a los artistas. El hecho de lograr variaciones permanentes de los elementos puestos en juego permite que la obra se desarrolle en el tiempo sin tener que definir cada uno de estos instantes. Estableciendo los parámetros generales (los límites de las variaciones) podremos confiar en que la computadora genere concretamente algunas (o todas) de sus posibilidades. En el presente proyecto la aleatoriedad se utiliza para poder reducir la extensión del código, pero no para generar variaciones imprevisibles. Las variaciones en el tiempo son imprevisibles en cuanto a su nivel de complejidad, pero cada vez que se ejecute el programa la aleatoriedad será la misma. A través de una función del Processing (randomSeed) se puede ejecutar una función aleatoria (pseudo-aleatoria para ser estrictos) que de siempre los mismos resultados ‘imprevisibles’. Esto permite que el resultado audiovisual sea semejante a un proceso cinematográfico o de video en donde las imágenes se repiten exactamente igual en cada una de sus exhibiciones y así confrontar el hecho de una distribución alternativa para un mismo resultado audiovisual.

Temporalidad en la obra

La temporalidad en la obra interviene en tres aspectos: el código, el film predeterminado, y la modificación del punto de vista.
En el código desde la propia estructura y lógica del programa. La utilización de la función “FrameCount()” que contabiliza la cantidad de cuadros producidos como base de su estructura, y la secuencia de condicionales “if” para lograr (o más bien forzar) una secuencia de procesos consecutivos (aunque no se correspondan con el funcionamiento no-lineal de la ejecución del programa). Por otro lado la utilización de la función “RandomSeed()” produce el mismo resultado aleatorio en cada una de sus ejecuciones, restringiendo el devenir temporal indeterminado.
En el resultado audiovisual de la ejecución del programa/film la temporalidad está dada por el montaje por código de diferentes condicionales. A partir de sucesivas instancias la yuxtaposición de diferentes procesos algorítmicos construirá un desarrollo exactamente igual en cada una de sus ejecuciones, generando las imágenes y sonidos en “tiempo real”.
Por último, con la posibilidad de modificar el punto de vista la temporalidad se desdobla y tenemos por un lado el tiempo inalterable de los sucesos, y por otro, el tiempo construido en base a las modificaciones del punto de vista según la intervención del espectador/usuario.

Distribución

La distribución se propone con dos alternativas: bajar el código de la web para ejecutarlo con Processing (la principal), o verlo como un video convencional (sea on-line, por sistemas p2p, torrent, DVD o en una sala de exhibición).

Concepto

La representación digital de una imagen o un sonido se construye a partir de un algoritmo basado, a su vez, en un código numérico. Si el ‘artista digital’ debe expresar con algoritmos lo que quiere hacer, la realización del código resulta en la realización de la obra. Las referencias de Michael Noll, o la obra telefónica de Lazlo Moholy-Nagy son obligadas para entender esta necesidad de ‘codificar’ la obra cuando se utilizan nuevos medios. El Lissitzky planteaba que el teléfono había aliviado la cantidad de papel escrito, de la misma forma se podría considerar que el código digital conseguiría aliviar la cantidad de material fílmico o de video producido.
Por otro lado, si la imagen siempre se entendió como el doble de un referente, la imagen sintética obliga a reconsiderar los términos de realidad y referencia a partir de los cuales las propuestas estéticas de Kasimir Malevich y Hans Richter podrían actualizarse.

Justificación técnica

La utilización de Processing como base tecnológica refuerza la propuesta “open source” del proyecto, siendo accesible el código fuente del mismo podemos entender su funcionamiento y cualquiera puede bajarlo gratuitamente a su computadora para ejecutar el “programa/film”. Además, cuenta con versiones para Windows, Mac, y Linux.

Estado del proyecto

/* Sin Titulo (2010) Audiovisual experimental digital "open source". Autor: Alejandro Schianchi Licencia: GNU GPL / CC-BY-NC */ import processing.opengl.*; import wblut.hemesh.*; import wblut.geom.*; import processing.video.*; import fullscreen.*; SoftFullScreen fs; import ddf.minim.*; import ddf.minim.signals.*; import ddf.minim.ugens.*; Minim minim; AudioOutput out; AudioRecorder recorder; SineWave sine; SineWave sine2; WhiteNoise wn; import peasy.*; PeasyCam cam; Particle[] parts = new Particle[300]; PVector O = new PVector(); float a=0; float freq=0; float freq2=0; float pan=0; float amp=0; float rythm = 0; float tam = 1; int x =0; int x2 =0; int y =0; int y2 =0; float posx=0; float posy=0; float tam2=200; float c=150; HE_Mesh box; MovieMaker mm; float roty = 0; float rotx = 0; float rotz = 0; void setup(){ size(screen.width, screen.height, OPENGL); smooth(); frameRate (24); randomSeed (1); fs = new SoftFullScreen(this); fs.enter(); cam = new PeasyCam(this,500); minim = new Minim(this); out = minim.getLineOut(Minim.STEREO); sine = new SineWave(freq, 0.5, out.sampleRate()); sine.portamento(200); out.addSignal(sine); wn= new WhiteNoise (0.2); sine2 = new SineWave(freq2, 0.4, out.sampleRate()); sine.portamento(200); out.addSignal(sine2); /* Based on: ADSRExample de Anderson Mills */ out.pauseNotes(); for( int i = 0; i < 5; i++ ) { out.playNote( 1.25 + i*2.0, 1, new ToneInstrument( 60, 0.6, out ) ); out.playNote( 2.50 + i*2.0, 1, new ToneInstrument( 60, 0.6, out ) ); out.playNote( 1.75 + i*2.0, 1, new ToneInstrument( 150, 0.4, out ) ); out.playNote( 2.75 + i*2.0, 3, new ToneInstrument( 90, 0.4, out ) ); out.playNote( 1.25 + i*2.0, 3, new ToneInstrument( 2850, 0.05, out ) ); out.playNote( 2.0 + i*2.0, 0.3, new ToneInstrument( 1640, 0.08, out ) ); out.playNote( 2.25 + i*2.0, 0.3, new ToneInstrument( 3620, 0.2, out ) ); out.playNote( 2.5 + i*2.0, 0.3, new ToneInstrument( 5250, 0.1, out ) ); } HEC_Box boxCreator=new HEC_Box(this).setWidth(250).setWidthSegments(7) .setHeight(250).setHeightSegments(7) .setDepth(250).setDepthSegments(7); box=new HE_Mesh(boxCreator); HEM_Noise nm=new HEM_Noise().setAmplitude(0); box.modify(nm); for( int i = 0; i < parts.length; i++ ) { parts[i] = new Particle(); } noStroke(); smooth(); // mm = new MovieMaker(this, width, height, "sintitulo2010.mov", // 24, MovieMaker.ANIMATION, MovieMaker.HIGH); // recorder = minim.createRecorder(out, "sintitulo2010.wav", true); } void draw(){ noCursor(); background(255); lights(); camera(); noStroke(); fill(150); translate(width/2,height/2); if (frameCount<100){ intro(); } else if (tam<250){ richter(); } else if (frameCount<800){ malevich(); } else if (frameCount<1300){ richter3d(); } else if (frameCount<1800){ noisecube(); } else if (frameCount<2200){ noisecubestill(); } else if (frameCount<2500){ noisecubestillflick(); } else if (frameCount<2800){ noisecubestillwire(); } else if (frameCount<3300){ noisecubenoisewire(); } else if (frameCount<3700){ noisewireandsphere(); } else if (frameCount<4000){ cubes2(); } else if (frameCount<4200){ cubes4(); } else if (frameCount<4500){ particles(); // mm.addFrame(); } else if (frameCount<4800){ ending2001(); } else if (frameCount<5300){ fadeout(); } else if (frameCount>5300){ fin(); } } void stop(){ // recorder.endRecord(); // recorder.save(); minim.stop(); out.close(); super.stop(); } void intro(){ /* Gracias a Laurence Bender, Marcelo Terreni y Frederik Vanhoutte */ // recorder.beginRecord(); // mm.addFrame(); } void richter(){ cam.rotateZ(0); box(tam); tam=tam+0.5; // mm.addFrame(); } void malevich(){ cam.rotateZ(0); box(tam); // mm.addFrame(); } void richter3d(){ cam.rotateX(0.02); cam.rotateY(0.015); cam.rotateZ(0.01); box(tam); // mm.addFrame(); } void noisecube(){ cam.rotateX(0.015); cam.rotateY(0.01); cam.rotateZ(0.02); freq++; sine.setFreq(freq); pan= 0; sine.setPan(pan); amp= 0.5; sine.setAmp(amp); HEM_Noise nm=new HEM_Noise().setAmplitude(a); box.modify(nm); noStroke(); box.drawFaces(); a=a+0.02; // mm.addFrame(); } void noisecubestill(){ cam.rotateX(0.01); cam.rotateY(0.02); cam.rotateZ(0.015); sine.setFreq(100); pan= 0; sine.setPan(pan); amp= 0.4; sine.setAmp(amp); noStroke(); box.drawFaces(); // mm.addFrame(); } void noisecubestillflick(){ cam.rotateX(0.01); cam.rotateY(0.02); cam.rotateZ(0.015); amp= 0.05; wn.setAmp(amp); float flick= random(0,1); if (flick > 0.8){ stroke(0); noFill(); out.addSignal(wn); } else { fill(150); out.disableSignal(wn); } box.drawFaces(); // mm.addFrame(); } void noisecubestillwire(){ if (rythm<10){ sine.setFreq(440); rythm++; } else if (rythm<20){ rythm++; sine.setFreq(50); } else { rythm=1; } cam.rotateX(0.01); cam.rotateY(0.02); cam.rotateZ(0.015); stroke(0); noFill(); box.drawFaces(); // mm.addFrame(); } void noisecubenoisewire(){ sine.setFreq(80); cam.rotateX(0.015); cam.rotateY(0.01); cam.rotateZ(0.02); stroke(0); noFill(); box.drawFaces(); HEM_Noise nm=new HEM_Noise().setAmplitude(a); box.modify(nm); tam=500; // mm.addFrame(); } void noisewireandsphere(){ if (rythm<5){ sine.setFreq(80); rythm++; } else if (rythm<10){ rythm++; sine.setFreq(120); } else { rythm=1; } cam.rotateX(0.015); cam.rotateY(0.01); cam.rotateZ(0.02); stroke(0); noFill(); box.drawFaces(); HEM_Noise nm=new HEM_Noise().setAmplitude(a); box.modify(nm); sphere(tam); tam=tam-0.5; // mm.addFrame(); } void cubes2(){ cam.rotateZ(0.0); noStroke(); fill(150); if (rythm<50){ sine.setFreq(200); rythm++; translate(x,0,0); box(75); x++; } else if (rythm<100){ rythm++; sine.setFreq(120); translate(x2,0,0); x2--; box(75); } else { rythm=1; } // mm.addFrame(); } void cubes4(){ cam.rotateZ(0.0); noStroke(); fill(150); if (rythm<50){ sine.setFreq(200); rythm++; translate(x,0,0); box(75); x++; } else if (rythm<100){ rythm++; sine.setFreq(120); translate(x2,0,0); x2--; box(75); } if (rythm<30){ sine.setFreq(300); rythm++; translate(-50,y,0); box(75); y++; } else if (rythm<60){ rythm++; sine.setFreq(150); translate(-50,y2,0); y2--; box(75); } else { rythm=1; } // mm.addFrame(); } void particles(){ // Based on: 2009 Daniel Winkler http://www.phyloa.com amp= 0; sine.setAmp(amp); out.resumeNotes(); cam.rotateX(0.008); cam.rotateY(0.008); cam.rotateZ(0.008); noStroke(); fill(150); O.set(400, 500, 0 ); for( int i = 0; i < parts.length; i++ ) { parts[i].update(); } } int size = 12; public class Particle { PVector loc = new PVector( random( 0, width ), random( 0, height ), random( -300, -700 ) ); PVector speed = new PVector(); public Particle() { } public void update() { PVector dir = new PVector(200, 200, 0 ); dir.sub( loc ); dir.normalize(); speed.add( dir ); loc.add( speed ); pushMatrix(); translate( loc.x, loc.y, loc.z ); rotateToFace( loc ); beginShape( QUADS ); vertex( -size, -size, 0 ); vertex( size, -size, 0 ); vertex( size, size, 0 ); vertex( -size, size, 0 ); endShape(); popMatrix(); } } PVector U = new PVector( 0, 1, 0 ); void rotateToFace( PVector P ) { PVector D = new PVector( ); D.set( O ); D.sub( P ); PVector Right = U.cross( D ); Right.normalize(); PVector Backwards = Right.cross( U ); Backwards.normalize(); PVector Up = Backwards.cross( Right ); applyMatrix(Right.x, Right.y, Right.z, 0, Up.x, Up.y, Up.z, 0, Backwards.x, Backwards.y, Backwards.z, 0, 0, 0, 0, 1); } void ending2001(){ amp= 0.5; sine.setAmp(amp); sine.setFreq(100); cam.rotateZ(0); box(tam2); tam2=tam2-0.2; // mm.addFrame(); } void fadeout(){ sine.setFreq(freq); freq--; cam.rotateZ(0.0); noLights(); fill(c); c=c+0.3; box(tam2); tam2=tam2-0.2; // mm.addFrame(); } void fin(){ // mm.finish(); exit(); }

Ejecutar programa/film on-line

Versión 1.0

Mientras se ejecuta el programa/film se puede interactuar con el gesto drag & drop del mouse o mediante touchscreen sobre los objetos para ver la animación desde distintos puntos de vista.

Es necesario contar con Java e incluir el dominio http://schianchi.com.ar en la lista de excepciones de sitios en la configuración de seguridad de Java.

Bajar programa/film

Versión 1.0

Licencia: GNU GPL / CC-BY-NC

Se requiere Processing con las librerias HemeshPeasycamFullscreen, y la versión Beta de Minim para ejecutar el programa/film.
Una vez instalado Processing con sus librerías, bajar el archivo (.zip), descomprimirlo, abrir el archivo “SinTitulo2010.pde” en Processing y ejecutarlo (Ctrl+R).
Para modificar con el mouse el punto de vista predeterminado : left-drag (rotar), mouse-wheel o right-drag (zoom), middle-drag o cmd-left-drag en mac (pan), y doble-click (reset).