click image for full size
example generation

example pdf


For this piece, I wanted to create a written language that accurately represented words but was unreadable in a practical sense.  I then looked toward sound waves and how they are a literal translation of sounds into a physical form in a “Taking a Line for a Walk” sort of way.  It can depict moments of loudness or silence, but in a way that humans can only approximately translate by reading.  In the end, my code takes pieces of the inputted audio based on the buffer size and translates them into a waveform “word”.  This also gives it the capabilities to work with live audio.  For my printed plot, I used a voicemail left from my mother.

One thing that I enjoyed about using the plotter, is being able to enhance my design based on the materials I use.  I really enjoyed the look of the fluorescent orange on different shades of blue.  I actually found myself unable to capture it accurately with a camera, making it something that can only exist physically despite being constructed digitally.  In upcoming audio-based projects, I think it would be better to work with a tool like Max with more audio capabilities to generate something more complex than just a wave form and then export this to be used with processing.  I also did not capture video footage of the plotter generating my writing and will be sure to double check the documentation requirements in the future.

// see https://processing.org/reference/libraries/pdf/index.html
//reference taken from minim library
import processing.pdf.*;
import ddf.minim.*;
boolean bRecordingPDF;
int pdfOutputCount = 0; 
Minim minim;
AudioPlayer groove;
float col = 10;
int row = 0;
float count = 0;
void setup() {
  size(850, 1100);
  bRecordingPDF = true;
  minim = new Minim(this);
  groove = minim.loadFile("voicemail-105.mp3", 154);
  beginRecord(PDF, "bnl-smallBuffer.pdf");
void keyPressed() {
  // When you press a key, it will initiate a PDF export
void draw() {
  float[] left = groove.left.toArray();
  float oldcol = col + random(8) + 5;
  col = col + random(50) + 20;
  for ( int i = 0; i < left.length - 1; i++ )
    float x1 = map(i, 0, groove.bufferSize(), oldcol, col);
    float x2 = map(i+1, 0, groove.bufferSize(), oldcol, col);
    line(x1, (height/14)*(row) - left[i]*100 + 50, x2, (height/14)*(row) - left[i+1]*100 + 50);
   if (col + 70 > width)
     col = 10;
     row ++;
   if (row == 13)