My Asemic language was inspired by the writings in Paul Klee’s Pedagogical Sketchbook (1925). In it he writes that a line is created by a “dot that went for a walk.” Fascinated by this idea, I decided to export the step data from my phone’s health app and use my daily step counts to generate writing. The first date that is recorded is March 29, 2015. I used the distance walked each day since then to determine the length of the lines between two data points. Longer lines equate to more steps. The writing moves from left to right and top to bottom. The vertical lines that connect the horizontal step data lines create a gradient pattern going down the page. On the physical paper, this gradient turned out well using a silver pen. The piece is reflective and what is seen depends on how you look at the paper. From the side, the horizontal lines stand out more so than the vertical lines. It was lovely to see the plotter build line breadth as it traced previously drawn lines, giving the piece a hand drawn quality.

Here’s a sketch:






This is a sample of the spreadsheet my data was stored in:











Here’s what the PDF version if the program looks like:

Here’s a GIF of the Axidraw2 in action:

Here are some more photos of the final physical drawing:

Here’s the code:

//Zaport 2018
// CMU 60-212
Table table;
int totalRows = 0;
int totalSteps = 1054;
float[] stepList = new float[totalSteps]; //yikes - change this
int writingBarrier = 15;
// see
import processing.pdf.*;
boolean bRecordingPDF;
int pdfOutputCount = 0; 
void setup() {
  size(450, 600);
  bRecordingPDF = true;
  // CSV file to Porcessing:
  int index = 0;
  table = loadTable("StepData.csv", "header");
  for (TableRow row : table.rows()) {
    float step = row.getFloat("steps");
    stepList[index] = step;
    totalRows += 1;
    index += 1;
void keyPressed() {
  // When you press a key, it will initiate a PDF export
  bRecordingPDF = true;
void makeLineList() {
  float x = writingBarrier;
  float startY = writingBarrier;
  float newStartY;
  float spacer = 5;
  float prevX = writingBarrier;
  float prevY1 = writingBarrier;
  float prevY2 = writingBarrier;
  for  (int i = 0; i < totalRows; i = i+1) {
    float currStep = stepList[i];
    float stepLength = currStep/1000;
    if (x < width-writingBarrier){
      newStartY = startY + stepLength;
      if (i%2 == 0){
      line(prevX, prevY1, x, newStartY);
      }else if (i%2 == 1){
      line(prevX, prevY2, x, newStartY);
      startY = startY + writingBarrier*3;
      newStartY = startY + stepLength + writingBarrier;
      x = writingBarrier;
    if (i%7 == 0 && i !=0){
      //line(x-2, startY-2, x+2, startY-2);
    if (i%12 == 0 && i !=0){
      //line(x-4, startY-4, x+4, startY-4);
    if (i%365 == 0 && i !=0){
      //line(x-6, startY-8, x+6, startY-8);
    //line(x, startY, x, newStartY);
    prevX = x;
    //prevY1 = startY;
    prevY1 = newStartY;
    x = x + spacer;
void draw() {
  //PDF generator by Golan Levin
  if (bRecordingPDF) {
    background(255); // this should come BEFORE beginRecord()
    beginRecord(PDF, "Zaport_" + pdfOutputCount + ".pdf");
    // This draws
    bRecordingPDF = false;