Ralph-LookingOutwards-2

rubegoldberg_totale_exhibition_grey_web

The Product – “Rube-Goldberg Processor”
This is a set piece in which numerous different machines are arranged to receive input from one machine and translate it into another state. It is much like the Rube-Golberg machine, for which it is named, as both transform a fundamental unit (data or energy) into different forms, leading to a highly impractical result. It first came about as a teaching tool to show how data is unified, even if it comes in the form of light, sound, or electrical signals.
I especially enjoy the playfulness of this piece. It derives a very simple sense of fun — the same kind of fun I had when watching physical RGMs, but recontextualized in a manner more meaningful to me and modern culture. It also reminded me of Jim Campbell’s “Formula for Computer Art”; this piece took that formula to the extreme and made a point of outputting useless data. I’m interested in what input was initially fed into the machine, and wonder whether the meaning behind that input could add another layer to the piece.

fragmented-memory_02

Phillip Stearns – “Fragmented Memory”

In truth, I did not find the physical manifestation of this piece or the general concept behind it particularly intriguing. I did, however, find interest in the vast connections that this piece made. The idea behind this piece is to visually represent raw data input from the computer processor (or from a closed-circuit camera like with a previous iteration of a similar piece), and print out this repurposed data in the form of textile pattern. There are connections being made among between modern computers and archetypical art forms, acting as a quaint bridge between the old and the new. It’s a project whose process is very involved, but the product is just as important. It involves algorithms, but also randomness. I find the artist’s vision to be ambitious, and the textile pattern from a distance makes a visually striking pattern, like a damaged VCR tape. Yet, at the same time, the fabric itself seems pretty tacky, and I can’t derive actual meaning from the pattern. I’m left wondering cynically what was so important about the data input that Stearns used.

ElectricDeluxe_SpeedyJ_Installation_3

Studio Hands – “Ultra Deluxe Merchandise”

I love the idea behind this one. Studio Hands created a process by which a digital image is transmitted via sounds, and another computer picks up the input with a microphone and generates the image on the computer, as well as printing it out as a merchandise piece. It’s so artfully fitting that a promotion for a musical artist should occur via soundwaves. On top of that, the actual quality of transmission is also surprisingly good, even though I expected a garbled image. There’s also a poetic quality to the fact that merchandise production would happen this way – sound is spread rather than directed, and it can be infinitely duplicated.  I only want to see this piece expanded even further, to become more than merchandising just one image between just two computers.

Chloe – Schotter

Screen Shot 2013-09-12 at 3.24.19 AM (2)

int sqsize = 38;
int cols = 12, rows = 20;

void setup() {
  size(540,844);
  noLoop();
}

void draw()
{
  for (float i = 1.0 ; i <= rows; i++)
  {
    for (float j = 1.0 ; j <= cols; j++)
    {
      noFill();
      stroke(0);
      float angle = radians((i/rows)*random(-45, 45));

      pushMatrix();
        translate(j*sqsize, i*sqsize);
        rotate(angle);
        rect(0,0,sqsize,sqsize);
      popMatrix();
    }
  }
}

Nipple Congress

dropcompressed

Dwelling the unique constraints and opportunities presented by the .gif format, I had the idea to generate a pattern, and to then use that pattern as a seed for a particle system. As it turned out, this pattern-as-seed plan was pretty convoluted. My pattern held its own aesthetically, and there was no need to abstract it further. At this point, the difficulty was to animate the pattern in a seamless fashion. Golan helped me formulate a solution, which entailed gradually shifting initial velocities according to trigonometric relationships.

I think the .gif succeeds in its playful treatment of stability and instability: the nipples are effectively stationary, where the arm-tentacles twitch and/or undulate erratically. Generally speaking, the experience of the .gif changes dramatically from region-to-region. Maybe this lack of focus is a drawback, and if so, I could improve the piece by unifying it visually. It might also benefit a clarified kinetic gestalt, or put in other words: buttery, logical motion. (Or its charm could lie in the jerky crudeness.)

(As a side note, the edicts of my Nipple Congress have strong ties to those of Jared Tarbell’s Substrate, since a nearly identical branching rule governs the spatial aspect of the forms generated onscreen. )

20130912_122607 20130912_122618

GridParticle[] gP = new GridParticle[40];
int seed = 10;
PVector texture;

void setup() {
  size(600, 400); 
  randomSeed(seed);
  noiseSeed(seed);
  initGrid();
  smooth();

 background(0,4,118);
}

void initGrid() {
  for (int i= 0; i  < gP.length; i++) {
    gP[i] = new GridParticle(i);
  }
}

void draw() {  
  background(0,4,118);
  randomSeed(seed);
  noiseSeed(seed);
  initGrid();
  for (int n = 0; n < 1400; n++) {
    for (int i= 0; i  < gP.length; i++) {
      gP[i].update();
      gP[i].drawMe();
    }
  }
  filter(INVERT);
  saveFrame();
}

class GridParticle {
  PVector pos; 
  PVector vel = new PVector(0, 1);
  float strokeW;
  int changedThresh;
  int stroke = 235;
  int blinkOffset;

  GridParticle(int _blinkOffset) {
    blinkOffset = _blinkOffset;
    strokeW = 5;
    changedThresh = int(random(0, 10));
    pos = new PVector(random(width*.2, width*.8), random(height*.2, height*.8));
    float randomRadiusX = random(-1,1);
    float randomRadiusY = random(-.5,.5);
    float randomAngle = random(HALF_PI);
    float frameBasedAngle = map(frameCount % 10000, 0, 9999, 0, TWO_PI);
    vel.x = randomRadiusX * cos(randomAngle + frameBasedAngle);
    vel.y = randomRadiusY * sin(randomAngle + frameBasedAngle);
  }

  void update() {

    stroke*=.87;

    float yNoise = map(noise(vel.y/100.0), 0,1, -.002, .002);
    vel.y += yNoise;

    loadPixels();
    if (pixels[floor(width*int((pos.y + 5) % height) + int(pos.x))] != color(0,4,118) || 
       pixels[floor(width*int((pos.y) % height) + (int(pos.x + 5) % width))] != color(0,4,118)) {
      strokeW *= .985;

      vel.x *= -1; 
    }

    pos.x = abs((pos.x + vel.x)) % width;
    pos.y = abs(pos.y + vel.y) % height;
  }

  void drawMe() {
    float vary = noise(pos.x/10.0, pos.y/10.0)*4;
    strokeWeight(strokeW * vary);

    float blink = map((frameCount + blinkOffset) % 10, 0, 9, 0, 1);

    stroke((stroke + 20)*blink, 0, 0);
    point(pos.x, pos.y);
    stroke(0,100);
    point(pos.x-(strokeW * vary),pos.y); point(pos.x+(strokeW * vary),pos.y);
  }
}

Flow – GIF

Flow - Sakura Version

My mind process for this project: gif -> looping -> continuity -> time? -> something smooth -> curves? -> water -> flow
In the beginning, in my mind there were two paths for me to take – make something cool-looking/trippy that’s very math oriented, or make something nice to look at/aesthetically appealing. I was a bit lost on the former, so I went with the latter. I wanted something I wouldn’t mind staring at for a few minutes straight, so I ended up with this. I incorporated a lot of random factors so I wouldn’t mind staring at it for a few minutes straight multiple times. I think I invested too much time into trying to make it look pretty when I should have been using that time to try to figure out some cool mathy thing I could incorporate. Oh well, at least I’m happy with the outcome. Enjoyed this project. Will probably want to make another one soon/later.

This was a really quick idea sketch. The lines are really light…

2013-09-11 23.10.12

Anyway, here’s the program. There is a lot of randomness involved, so each time you load it, you’re going to get something noticeably different. Enjoy!

 int     nFramesInLoop = 300;
int     nElapsedFrames;
boolean bRecording; 

ArrayList allPaths = new ArrayList();
PImage object;
PImage noncomformity;

//===================================================
void setup() {
  size (300, 150); 
  bRecording = false;
  nElapsedFrames = 0; 
  noFill();

  int which = int(random(3));
  boolean frog = false;
  
  //Randomly choose 1 out of 3 available themes
  //and load image accordingly
  if (which==0) {
    object = loadImage("sakura_flower.png");
  }
  else if (which==1) {
    object = loadImage("maple_leaf.png");
  } 
  else {
    object = loadImage("lily_pad.png");
    int temp = int(random(2));
    if (temp==1) {
      frog = true;
      noncomformity = loadImage("lily_pad_frog.png");
    }
  }

  //Create individual Path objects and append to global ArrayList
  for (int i=0; i<9; i++) {
    Path p = new Path();
    allPaths.add(p);
    //Last object has chance to be a frog
    if (i==8 && frog==true){
      p.changeLook(noncomformity);
    }
  }
}

//===================================================
void keyPressed() {
  bRecording = true;
  nElapsedFrames = 0; 
}

//===================================================
void draw() {
 
  // Compute a percentage (0...1) representing where we are in the loop.
  float percentCompleteFraction = 0; 
  if (bRecording) {
    percentCompleteFraction = (float) nElapsedFrames / (float)nFramesInLoop;
  } else {
    percentCompleteFraction = (float) (frameCount % nFramesInLoop) / (float)nFramesInLoop;
  }
 
  // Render the design, based on that percentage. 
  renderMyDesign (percentCompleteFraction);
 
  // If we're recording the output, save the frame to a file. 
  if (bRecording) {
    saveFrame("output/myname-loop-" + nf(nElapsedFrames,4) + ".png");
    nElapsedFrames++; 
    if (nElapsedFrames > (nFramesInLoop+1)) {
      bRecording = false;
    }
  }
}

void renderMyDesign(float percent) {
  background(255);
  fill(160, 200, 255, 80);
  noStroke();
  rect(0, 0, width, height);

  int n = allPaths.size();

  //Draw background bezier curves first
  noFill();
  for (int i=0; i1) t-=1;
    float thickPercent = sin(2.0*t*TWO_PI);
    float thickness = map(thickPercent,-1,1,thickness1,thickness2);
    stroke(160, 200, 255, 80);
    strokeWeight(thickness);
    bezier(x1, y1, cpx1, cpy1, cpx2, cpy2, x2, y2);
  }

  //Draw moving object
  void drawObject(float percent) {
    //Make sure object is correct size before drawing
    ownLook.resize(int(size)*2, int(size)*2);
    
    //Object starts at random point on curve w/ random rotation
    float t = startT+percent;
    if (t>1) t-=1;
    float x = map(t*width,0,width,x1,x2);
    float y = bezierPoint(y1, cpy1, cpy2, y2, t);

    float cx = x+(size/2);
    float cy = y+(size/2);

    //Draw the object
    pushMatrix();
    translate(cx, cy);
    float angle = (t)*TWO_PI*rotation;
    rotate(angle);
    image(ownLook, -size, -size);    
    popMatrix();
  }
  
  //Change the images of moving object
  void changeLook(PImage change){
    ownLook = change;
  }
}
 

Madeleine-LookingOutwards-2

Paper Note – Created by Andrew Spitz and Andrew Nip at the Copenhagen Institut of Interaction Design, Paper Note generates a stack of paper disks that represent a sound wave. I’m enchanted by the creation of physical objects through code, and thought it was a clever way to create appealing mementos. I thought that having to string the disks by hand was super inefficient–I think that a different physical method, such as 3D printing, would be more efficient in terms of rapid production. Andrew Spitz, one of the co-creators of the project, specializes in sound design, so the interest in waveforms makes sense!

The Generative Gatsby – Vladimir V. Kuchinov, a typography designer who focuses on contextual narrative, created The Generative Gatsby: Jazzed Up Typography, a book whose words are used to represent big band arrangements from the Prohibition-era. The lovely computationally stitched cover originally caught my eye–I was somewhat disappointed that this wasn’t a sewing project! I enjoyed that this used the text itself to provide a context for its generative aspect.

The Feltron Reports – For several years Nicholas  Felton has compiled huge datasets of information about himself into annual reports. The reports are beautifully designed, conveying vast amounts of information with simplicity and strong color choices. They provide a compelling argument for the quantified self movement, in fact, Felton has founded Daytum, a site that allows users to collect and compile large datasets into graphs for public display. While incredibly visually appealing, in some cases I think that some of his design choices (especially light text on light backgrounds) make the understanding of the data more difficult.

Miles Peyton – Schotter

int border = 50;
float jitter = .03;
float side;
int numPerRow = 12;
int space;

void setup() {
  size(400, 800);  
  background(193);
  noFill();
  smooth();
  side = ((width-(border*2))/float(numPerRow));  
  noFill();
  randomSeed(2);
}

void draw() {
  translate(width/2,height/2);
  scale(.86,.9);
  for(int y = border; y < height-border; y+=side) {
    for(int x = border; x < width-border; x+=side) {
      pushMatrix();
        float center = random(side);
        translate(x-width/2 + center,y-height/2 + center);
        rotate(random(-jitter, jitter));
        rect(-center,-center,side,side);
      popMatrix();
    }
    jitter*=1.28;
  }
  saveFrame();
  noLoop();
}

Ralph-Assignment-04-GIF

20130912_115506tits

This was an interesting piece for me, as its concept developed further as I felt more comfortable with animating through Processing and programming with Java. As shown in my sketch, I originally intended to create a very simply pattern of movement among lines and dots to keep the work manageable, but as I wrote the code, I started playing for a stronger visual effect. Algorithmic animation always mystified me, but sinking my teeth into the basics gave me a new perspective on this particular art form — both a de-mystification and a new-found respect.

float dx = 20;
float dy = 20;
boolean reverse;

void setup() {
  size(600, 600);
}

void draw() {
  background(0);
  dots();
  if (dx == 91) { //line direction change
    reverse = true;
  }
  if (dx == -11) {
    reverse = false;
  }
  if (reverse) { //animate
    dx--;
    dy--;
  }
  else {
    dx++;
    dy++;
  }
}

void dots() { //draw dots in a matrix
  for (int row = 0; row < 7; row++) {
    for (int col = 0; col < 7; col++) {
      stroke(255);
      strokeWeight(10);
      point(col*100, row*100);
      cardLines(row, col); 
      diagLines(row, col);
      print(row);
    }
  }
}

void cardLines(int row, int col) { //draw lines in cardinal direction
  for (int line = 0; line < 4; line++) {
    pushMatrix();
    cardColor(line);
    translate(col*100, row*100);
    rotate(PI*line/2);
    line(dx, 0, dx+20, 0);
    popMatrix();
  }
}

void diagLines(int row, int col) { //draw lines in diagonals
  for (int line = 0; line < 4; line++) {
    pushMatrix();
    diagColor(line);
    translate(col*100, row*100);
    rotate(PI*line/2);
    line(dx, dy, dx+20, dy+20);
    popMatrix();
  }
}

void cardColor(int line) {
  if (line == 0) {
    stroke(255,0,0,122);
  }
  else if (line == 1) {
    stroke(0,255,0,122);
  }
  else if (line == 2) {
    stroke(255,0,0,123);
  }
  else if (line == 3) {
    stroke(0,255,0,123);
  }
}

void diagColor(int line) {
  if (line == 0) {
    stroke(0,0,255,122);
  }
  else if (line == 1) {
    stroke(255,255,0,122);
  }
  else if (line == 2) {
    stroke(0,0,255,123);
  }
  else if (line == 3) {
    stroke(255,255,0,123);
  }
}

Adam-Assignment-04-Schotter

;

 


 // George Nee's "Schotter" (1968) 
 // http://www.medienkunstnetz.de/works/schotter/
 // Adam Ben-Dror, 09/09/2013

void setup() {
  size (500, 750);
  smooth();
  noFill();
//  rectMode(CENTER);
  noLoop(); 
}


void draw() {
 
  background (180); 
  
  float schotterSquareSize = width/24.0;
  int   nAcross = 12; 
  int   nDown   = 22;

  float xStart = 6*schotterSquareSize; 
  float xEnd = xStart + (nAcross-1)* schotterSquareSize; 

  float yStart = width/18*3;
  float yEnd = yStart + (nDown-1)* schotterSquareSize; 


  for (int i=0; i

Screen Shot 2013-09-11 at 11.59.52 PM