ICM Final: Post-Modern Poster Child (Musical Typeface Reinvention)


Post-Modern Poster Child (Musical Typewriter Mix) from lee-sean on Vimeo.

[Blip.tv] [YouTube] [Vimeo]

I presented my final project for Intro to Computational Media today.  Building on the work I did with the Musical Typewriter, I ended up making some last minute tweaks to my “musical typeface,” which consists of audio samples corresponding to each letter of the alphabet.  Originally I had used all single-hit percussion sounds, but I reworked the alphabet to include short musical phrases or gestures, and brought in wind and string instrument samples for greater musicality and richness.  The final version of my Processing program reads a text file and “translates” the text into music by playing back the samples corresponding to the letters of the words as musical phrase “cluster.”

While playing back a text as a song, the Processing sketch also simultaneously displays the word corresponding to the musical sample cluster being played and visualizes the frequency waves of the music on the screen.  Refer to the screenshot above.

For my in-class performance, I used the lyrics to the HEPNOVA track Post-Modern Poster Child and reinterpreted words through the Musical Typewriter.  [MP3] [AIFF]

During my presentation, I also Rick Rolled the class with Rick Astley’s immortal lyrics played through my program.

Source code after the jump.

My source code for my ICM final project, a self-playing version of the Musical Typewriter [2] [3].

import ddf.minim.signals.*;
import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import processing.video.*;

// Declare MovieMaker object
//MovieMaker mm;
Minim minim;
WaveformRenderer waveform;
//AudioSample objects for each letter of the alphabet
AudioSample play_a;
AudioSample play_b;
AudioSample play_c;
AudioSample play_d;
AudioSample play_e;
AudioSample play_f;
AudioSample play_g;
AudioSample play_h;
AudioSample play_i;
AudioSample play_j;
AudioSample play_k;
AudioSample play_l;
AudioSample play_m;
AudioSample play_n;
AudioSample play_o;
AudioSample play_p;
AudioSample play_q;
AudioSample play_r;
AudioSample play_s;
AudioSample play_t;
AudioSample play_u;
AudioSample play_v;
AudioSample play_w;
AudioSample play_x;
AudioSample play_y;
AudioSample play_z;

// Variable to store text currently being typed
//String typing = “”;
String[] lyrics;
// Variable to store saved text when return is hit
String saved = “”;
int i;
int counter = 0;  //frame counter for vibration
int play = 0;

void setup()
{
minim = new Minim(this);
size(1440,800);
//mm = new MovieMaker(this, width, height, “pomo.mov” , 30, MovieMaker.H263,
//MovieMaker.HIGH);
background(0);
textFont(createFont(“Courier”, 60));
textAlign(CENTER);

play_a = minim.loadSample(“A.mp3”, 1440);
play_b = minim.loadSample(“B.mp3”, 1440);
play_c = minim.loadSample(“C.mp3”, 1440);
play_d = minim.loadSample(“D.mp3”, 1440);
play_e = minim.loadSample(“E.mp3”, 1440);
play_f = minim.loadSample(“F.mp3”, 1440);
play_g = minim.loadSample(“G.mp3”, 1440);
play_h = minim.loadSample(“H.mp3”, 1440);
play_i = minim.loadSample(“I.mp3”, 1440);

play_j = minim.loadSample(“J.mp3”, 1440);
play_k = minim.loadSample(“K.mp3”, 1440);
play_l = minim.loadSample(“L.mp3”, 1440);
play_m = minim.loadSample(“M.mp3”, 1440);
play_n = minim.loadSample(“N.mp3”, 1440);
play_o = minim.loadSample(“O.mp3”, 1440);
play_p = minim.loadSample(“P.mp3”, 1440);
play_q = minim.loadSample(“Q.mp3”, 1440);
play_r = minim.loadSample(“R.mp3”, 1440);
play_s = minim.loadSample(“S.mp3”, 1440);
play_t = minim.loadSample(“T.mp3”, 1440);
play_u = minim.loadSample(“U.mp3”, 1440);
play_v = minim.loadSample(“V.mp3”, 1440);
play_w = minim.loadSample(“W.mp3”, 1440);
play_x = minim.loadSample(“X.mp3”, 1440);
play_y = minim.loadSample(“Y.mp3”, 1440);
play_z = minim.loadSample(“Z.mp3”, 1440);

waveform = new WaveformRenderer();
play_a.addListener(waveform);
play_b.addListener(waveform);
play_c.addListener(waveform);
play_d.addListener(waveform);
play_e.addListener(waveform);
play_f.addListener(waveform);
play_g.addListener(waveform);
play_h.addListener(waveform);
play_i.addListener(waveform);
play_j.addListener(waveform);
play_k.addListener(waveform);
play_l.addListener(waveform);
play_m.addListener(waveform);
play_n.addListener(waveform);
play_o.addListener(waveform);
play_p.addListener(waveform);
play_q.addListener(waveform);
play_r.addListener(waveform);
play_s.addListener(waveform);
play_t.addListener(waveform);
play_u.addListener(waveform);
play_v.addListener(waveform);
play_w.addListener(waveform);
play_x.addListener(waveform);
play_y.addListener(waveform);
play_z.addListener(waveform);

noStroke();
lyrics = loadStrings(“lyrics.txt”);
i = 0;
background(0);
}

void draw()
{
if (play == 1){
counter = (counter+1)%25;
noStroke();
fill(255);
//text (lyrics[i],width/2, height/2);
//mm.addFrame();
if (counter == 0) {
if (i < lyrics.length)
{
background(0);
text (lyrics[i],width/2, height/2);
int wordLength = lyrics[i].length();
for (int j=0; j < wordLength; j++)
{
for(int k=0; k < wordLength; k++)
{
char letter = lyrics[i].charAt(k);
playLetter(letter);
waveform.draw();
}
}
waveform.draw();
i++;
}
else {
background(0);
//mm.finish();
//noLoop();
}
}
}
}

void playLetter (char letter_)
{
if ((letter_ == ‘a’) || (letter_ == ‘A’))
{
play_a.trigger();
}

if ((letter_ == ‘b’) || (letter_ == ‘B’))
{
play_b.trigger();
}

if ((letter_ == ‘c’) || (letter_ == ‘C’))
{
play_c.trigger();
}

if ((letter_ == ‘d’) || (letter_ == ‘D’))
{
play_d.trigger();
}

if ((letter_ == ‘e’) || (letter_ == ‘E’))
{
play_e.trigger();
}

if ((letter_ == ‘f’) || (letter_ == ‘F’))
{
play_f.trigger();
}

if ((letter_ == ‘g’) || (letter_ == ‘G’))
{
play_g.trigger();
}

if ((letter_ == ‘h’) || (letter_ == ‘H’))
{
play_h.trigger();
}

if ((letter_ == ‘i’) || (letter_ == ‘I’))
{
play_i.trigger();
}

if ((letter_ == ‘j’) || (letter_ == ‘J’))
{
play_j.trigger();
}

if ((letter_ == ‘k’) || (letter_ == ‘K’))
{
play_k.trigger();
}

if ((letter_ == ‘l’) || (letter_ == ‘L’))
{
play_l.trigger();
}

if ((letter_ == ‘m’) || (letter_ == ‘M’))
{
play_m.trigger();
}

if ((letter_ == ‘n’) || (letter_ == ‘N’))
{
play_n.trigger();
}

if ((letter_ == ‘o’) || (letter_ == ‘O’))
{
play_o.trigger();
}

if ((letter_ == ‘p’) || (letter_ == ‘P’))
{
play_p.trigger();
}

if ((letter_ == ‘q’) || (letter_ == ‘Q’))
{
play_q.trigger();
}

if ((letter_ == ‘r’) || (letter_ == ‘R’))
{
play_r.trigger();
}

if ((letter_ == ‘s’) || (letter_ == ‘S’))
{
play_s.trigger();
}

if ((letter_ == ‘t’) || (letter_ == ‘T’))
{
play_t.trigger();
}

if ((letter_ == ‘u’) || (letter_ == ‘U’))
{
play_u.trigger();
}

if ((letter_ == ‘v’) || (letter_ == ‘V’))
{
play_v.trigger();
}

if ((letter_ == ‘w’) || (letter_ == ‘W’))
{
play_w.trigger();
}

if ((letter_ == ‘x’) || (letter_ == ‘X’))
{
play_x.trigger();
}

if ((letter_ == ‘y’) || (letter_ == ‘Y’))
{
play_y.trigger();
}

if ((letter_ == ‘z’) || (letter_ == ‘Z’))
{
play_z.trigger();
}
}

void stop()
{
play_a.close();
minim.stop();
super.stop();
}

class WaveformRenderer implements AudioListener
{
private float[] left;
private float[] right;

WaveformRenderer()
{
left = null;
right = null;
}

synchronized void samples(float[] samp)
{
left = samp;
}

synchronized void samples(float[] sampL, float[] sampR)
{
left = sampL;
right = sampR;
}

synchronized void draw()
{
// we’ve got a stereo signal if right or left are not null
if ( left != null && right != null )
{
noFill();
stroke(255);
beginShape();
for ( int i = 0; i < left.length; i++ )
{
vertex(i, height/4 + left[i]*120);
}
endShape();
beginShape();
for ( int i = 0; i < right.length; i++ )
{
vertex(i, 3*(height/4) + right[i]*120);
}
endShape();
}
else if ( left != null )
{
noFill();
stroke(255);
beginShape();
for ( int i = 0; i < left.length; i++ )
{
vertex(i, height/2 + left[i]*120);
}
endShape();
}
}
}

void keyPressed(){
play = 1;
}

Published by

leesean

Foossa Facts

  • if MF18M’s rhythmically-punctuated, industrial basso continuo is the urtext of post-Glassian minimalism, then yours will surely be a seminal work in some kind of emergent linguo-techno “process music” revolution

  • Thanks! I wanted it to sound like crashing waves of text.