Flying Ulysses

An experiment in palimpsetic visualisation

Back to Home

About

This is an experiment in visualising James Joyce's Ulysses as a scluptural object and as a palimpsetic text.

Prompted by the intertextual and layered construct of Joyce's writing, the fluid manner in which meaning is created, this experiment created an interface that lifted the text off the page and into a space that the user could freely navigate.

Stately, Plump

One Moment

Technical Description

The project was coded in the Processing language and used peasycam to allow the user to fly around the generated text. Videos captured in OBS.

ulysses.pde

    let cam;
    let myText = [];
    let textcounter = 0;
    let wordsperline = 13;
    let linesperpage = 40;
    let pages = 450;
    let linegap = 6;
    let pagegap = 100;
    let movetoend = 0;
    let newcharwidth = 0;
    let font;
    
    function preload() {
      font = loadFont('Serif-48.vlw');
      myText = loadStrings('ulysses.txt');
    }

    function setup() {
      let canvas = createCanvas(640, 960, WEBGL);
      canvas.parent('processing-canvas');
      cam = new PeasyCam(this, 80, 100, 50, 50);
      cam.setMinimumDistance(0);
      cam.setMaximumDistance(200000);
    }

    function draw() {
      background(255);
      textFont(font, 4);
      textAlign(LEFT);
      fill(0);
      lights();
      
      let textcounter = 0;
      for (let pagecount = 0; pagecount <= pages; pagecount++) {
        push();
        translate(0, 0, pagecount * pagegap);
        for (let linecount = 0; linecount <= linesperpage; linecount++) {
          push();
          translate(0, linecount * linegap, 0);
          movetoend = 0;
          newcharwidth = 0;
          for (let wordcount = 0; wordcount <= wordsperline; wordcount++) {
            let currentChar = myText[textcounter % myText.length];
            newcharwidth = textWidth(currentChar);
            text(myText[textcounter % myText.length], movetoend, 10);
            textcounter++;
            movetoend += newcharwidth + 2;
          }
          pop();
        }
        pop();
      }
    }