Current Courses

Misc

 
HomeCourses

CTIN 544
Experiments in Interactivity II

Experimental studio course in application of technology to interactive experience. Open to Interactive Media M.F.A. students only.
Prerequisite: CTIN 534; corequisite: CTIN 542


Class Aggregator

xml

CTIN544 Final Project - Swinging Leak -

leakswing1_capture.jpg

This is part of my assignment of CTIN544.

From here

I removed Arduino stuff and ARToolkit stuff.
Because it's difficult to execute these stuff on the browser.

But I can give source code including these stuff.
Please contact me.


Digital Puppet and Physical Controller

I created a glove controller using three bend sensors, and hooked it up to a digital Processing puppet via Arduino.

Example Code for Communicating From Arduino to Processing

This is some example code for communicating between Arduino and processing. It just reads a digital input pin, then changes a Processing window background color to match the input. You can use this with a switch, for instance.

-Bill

CTIN 544 | Phrases

//I Think It Is Superb!
//by Emily Duff - CTIN 544
//March 26, 2009
//
//This app is a visualization of the phrase 'I think it is superb'
//Click and drag on the man's head to pull out his thoughts. When
//you reach the end, a button appears to move on to the next phrase
//
//Uses Minim & original code
//Art Credit: http://cvydesign.wordpress.com/2009/03/06/933/

Note: Feel free to suggest additional words to add to his mind.
Download file

CTIN544 Story Assignment

I was a little at a loss as to what to do for this assignment. I came up with half an idea for something recombinant based on Jane Austen Unscripted, but I didn't have time to develop it. So I opted for lots of particles. Particles make everything better.

Processing: Briar Stories

Here is a representation of Robert Coover's Briar Rose, using some artificially intelligent typography. Download this all-inclusive zip to check it out.

BriarStories.zip

-B

CTIN544 assignment4: narrative - your own Luffy

//in order to understand this play, watch this clip:
//http://www.youtube.com/watch?v=cQGi1hXNcMM
//See? Luffy is a rubber man, rubber man, happy rubber man~~
import traer.physics.*;
import traer.animation.*;

final float NODE_SIZE = 20;
final float EDGE_LENGTH = 1;
final float EDGE_STRENGTH = 0.2;
final float SPACER_STRENGTH = 2000;

boolean token = true;
int tag = 0;

ParticleSystem physics;
Smoother3D centroid;

Particle head, body, rShoulder, rArm, rHand, lShoulder, lArm,
lHand, waist, rKnee, rLeg, lKnee, lLeg;

//float space = 10000;
//float space2 = 200;


void setup()
{
size( 800, 600 );
smooth();
frameRate( 24 );
strokeWeight( 2 );
ellipseMode( CENTER );
cursor(CROSS);

physics = new ParticleSystem( 0, 1 );
centroid = new Smoother3D( 0.8 );
centroid.setValue( 0, 0, 1.0 );
makeChar();
//addSpacersToNode();
}

void draw()
{
physics.tick( 1.0 );
if (mousePressed)
{
if (token == true)
{
tag = checkPoint();
}
move(tag);
}

if ( physics.numberOfParticles() > 1 )
updateCentroid();
background( 255 );
//translate( width/2 , height/2 );
scale( centroid.z() );
//translate( -centroid.x(), -centroid.y() );

drawNetwork();

}

void drawNetwork()
{
// draw edges
stroke( 0 );
beginShape( LINES );
for ( int i = 0; i < physics.numberOfSprings(); ++i )
{
Spring e = physics.getSpring( i );
Particle a = e.getOneEnd();
Particle b = e.getTheOtherEnd();
vertex( a.position().x(), a.position().y() );
vertex( b.position().x(), b.position().y() );
}
endShape();

// draw vertices
fill( 160 );
noStroke();
/*for ( int i = 1; i < physics.numberOfParticles(); ++i )
{
Particle v = physics.getParticle( i );
ellipse( v.position().x(), v.position().y(), NODE_SIZE, NODE_SIZE );
}*/
ellipse( body.position().x(), body.position().y(), 1.5*NODE_SIZE, 1.5*NODE_SIZE );
ellipse( waist.position().x(), waist.position().y(), NODE_SIZE, NODE_SIZE );

fill(100);
ellipse( rArm.position().x(), rArm.position().y(), NODE_SIZE, NODE_SIZE );
ellipse( lArm.position().x(), lArm.position().y(), NODE_SIZE, NODE_SIZE );

fill(0);
ellipse( rLeg.position().x(), rLeg.position().y(), NODE_SIZE, NODE_SIZE );
ellipse( lLeg.position().x(), lLeg.position().y(), NODE_SIZE, NODE_SIZE );
ellipse( rShoulder.position().x(), rShoulder.position().y(), NODE_SIZE/3, NODE_SIZE/3 );
ellipse( lShoulder.position().x(), lShoulder.position().y(), NODE_SIZE/3, NODE_SIZE/3 );
ellipse( rKnee.position().x(), rKnee.position().y(), NODE_SIZE/3, NODE_SIZE/3 );
ellipse( lKnee.position().x(), lKnee.position().y(), NODE_SIZE/3, NODE_SIZE/3 );

fill(255);
stroke(0);
ellipse(head.position().x(), head.position().y(),2*NODE_SIZE, 2*NODE_SIZE);
//ellipse(head.position().x(), head.position().y(), NODE_SIZE, NODE_SIZE);
}


void updateCentroid()
{
float
xMax = Float.NEGATIVE_INFINITY,
xMin = Float.POSITIVE_INFINITY,
yMin = Float.POSITIVE_INFINITY,
yMax = Float.NEGATIVE_INFINITY;

for ( int i = 0; i < physics.numberOfParticles(); ++i )
{
Particle p = physics.getParticle( i );
xMax = max( xMax, p.position().x() );
xMin = min( xMin, p.position().x() );
yMin = min( yMin, p.position().y() );
yMax = max( yMax, p.position().y() );
}
float deltaX = xMax-xMin;
float deltaY = yMax-yMin;
if ( deltaY > deltaX )
centroid.setTarget( xMin + 0.5*deltaX, yMin +0.5*deltaY, height/(deltaY+50) );
else
centroid.setTarget( xMin + 0.5*deltaX, yMin +0.5*deltaY, width/(deltaX+50) );
}

void addSpacersToNode()
{
for ( int i = 0; i < physics.numberOfParticles()-1; ++i )
{
for (int j=i;j {
Particle q = physics.getParticle( i );
Particle p = physics.getParticle( j );
physics.makeAttraction( p, q, -1.5*SPACER_STRENGTH, 2 );
}
}
}

void makeChar()
{
head = physics.makeParticle(1,width/2,height/2,0);
//head.makeFixed();

//make the other parts of the body
body = physics.makeParticle(1,width/2,height/2,0);
rShoulder = physics.makeParticle(1,width/2,height/2,0);
rArm = physics.makeParticle(1,width/2,height/2,0);
//rHand = physics.makeParticle();
lShoulder = physics.makeParticle(1,width/2,height/2,0);
lArm = physics.makeParticle(1,width/2,height/2,0);
//lHand = physics.makeParticle();
waist = physics.makeParticle(1,width/2,height/2,0);
rKnee = physics.makeParticle(1,width/2,height/2,0);
rLeg = physics.makeParticle(1,width/2,height/2,0);
lKnee = physics.makeParticle(1,width/2,height/2,0);
lLeg = physics.makeParticle(1,width/2,height/2,0);

addSpacersToNode();

//make connections between parts
physics.makeSpring(head, body, 1.2*EDGE_STRENGTH, 1.2*EDGE_STRENGTH, EDGE_LENGTH);
physics.makeSpring(body, rShoulder, EDGE_STRENGTH, EDGE_STRENGTH, EDGE_LENGTH/3);
physics.makeSpring(body, lShoulder, EDGE_STRENGTH, EDGE_STRENGTH, EDGE_LENGTH/3);
physics.makeSpring(rShoulder, rArm, EDGE_STRENGTH, EDGE_STRENGTH/10, EDGE_LENGTH);
//physics.makeSpring(rArm, rHand, EDGE_STRENGTH, EDGE_STRENGTH, EDGE_LENGTH);
physics.makeSpring(lShoulder, lArm, EDGE_STRENGTH, EDGE_STRENGTH/10, EDGE_LENGTH);
//physics.makeSpring(lArm, lHand, EDGE_STRENGTH, EDGE_STRENGTH, EDGE_LENGTH);
physics.makeSpring(body, waist, 2*EDGE_STRENGTH, 2*EDGE_STRENGTH, EDGE_LENGTH);
physics.makeSpring(waist, rKnee, EDGE_STRENGTH, EDGE_STRENGTH, EDGE_LENGTH);
physics.makeSpring(rKnee, rLeg, EDGE_STRENGTH, EDGE_STRENGTH, EDGE_LENGTH);
physics.makeSpring(waist, lKnee, EDGE_STRENGTH, EDGE_STRENGTH, EDGE_LENGTH);
physics.makeSpring(lKnee, lLeg, EDGE_STRENGTH, EDGE_STRENGTH, EDGE_LENGTH);

//move parts
body.moveTo(head.position().x()+random(-1,1), head.position().y()+random(-1,1),0);
rShoulder.moveTo(body.position().x()+random(-1,1), body.position().y()+random(-1,1),0);
rArm.moveTo(rShoulder.position().x()+random(-1,1), rShoulder.position().y()+random(-1,1),0);
//rHand.moveTo(rArm.position().x()+random(-1,1), rArm.position().y()+random(-1,1),0);
lShoulder.moveTo(body.position().x()+random(-1,1), body.position().y()+random(-1,1),0);
lArm.moveTo(lShoulder.position().x()+random(-1,1), lShoulder.position().y()+random(-1,1),0);
//lHand.moveTo(lArm.position().x()+random(-1,1), lArm.position().y()+random(-1,1),0);
waist.moveTo(body.position().x()+random(-1,1), body.position().y()+random(-1,1),0);
rKnee.moveTo(waist.position().x()+random(-1,1), waist.position().y()+random(-1,1),0);
rLeg.moveTo(rKnee.position().x()+random(-1,1), rKnee.position().y()+random(-1,1),0);
lKnee.moveTo(waist.position().x()+random(-1,1), waist.position().y()+random(-1,1),0);
lLeg.moveTo(lKnee.position().x()+random(-1,1), lKnee.position().y()+random(-1,1),0);

}

//collisiton detection on border
void handleBoundaryCollisions( Particle p )
{
if ( p.position().x() < 0 || p.position().x() > width )
p.setVelocity( -2*p.velocity().x(), p.velocity().y(), 0 );
if ( p.position().y() < 0 || p.position().y() > height )
p.setVelocity( p.velocity().x(), -2*p.velocity().y(), 0 );
p.moveTo( constrain( p.position().x(), 0, width ), constrain( p.position().y(), 0, height ), 0 );
}

//check the body part
int checkPoint(){
//float N2 = NODE_SIZE * NODE_SIZE;


//println(NODE_SIZE+"+"+distance+",");

for ( int i = 0; i < physics.numberOfParticles(); ++i )
{
Particle p = physics.getParticle( i);
float distance = sqrt(sq(p.position().x()-mouseX)+sq(p.position().y()-mouseY));
if (distance < NODE_SIZE){
token = false;
return i;
//print(i);
}

//float c = p.position().x();
//print(c);
}
return 3;
//rArm.moveTo(mouseX-400, mouseY-200, 0);
//
}

//drag the char
void move(int tag)
{
Particle p = physics.getParticle(tag);
p.moveTo(mouseX, mouseY, 0);
//println(NODE_SIZE+"+"+distance+",");
//rArm.velocity().clear();
}

//reset the tag
void mouseReleased()
{
Particle p = physics.getParticle(tag);
p.setVelocity((mouseX - pmouseX), (mouseY - pmouseY), 0 );
token = true;
}


void keyPressed()
{
switch (key)
{
case ' ':
physics.setGravity(0);
case '=':
physics.setGravity(1);
case '-':
physics.setGravity(-1);
}
}

CTIN544 assignment3: economy

import traer.physics.*;
//import processing.video.*;

//Movie myMovie;

Particle mouse, b, c;
Particle[] others;
ParticleSystem physics;

int counter = 0;//count the number of dollar signs acquired
int number = 500;//the number of particles
int maxDistance = 30;
Attraction[] attr;
int timer = 0;
int maxTime = 300;

PImage img;
PImage img2;
PImage bg;
int pwidth = 114;
int pheight = 114;

boolean handsome = true;

void setup()
{
size(640, 480);
frameRate(24);
//cursor( CROSS );
noCursor();

/* myMovie = new Movie(this, "P1040237.mov");
// Prints the duration of the movie
println(myMovie.duration());
myMovie.play();
myMovie.loop();*/

img = new PImage( 32, 32 );
img = loadImage("dollar.gif");
imageMode(CENTER);
tint( 255, 50 );
img2 = loadImage("bushhandsome.gif");
bg = loadImage("George_Bush_Economic_Recession.jpg");

physics = new ParticleSystem( 0, 0.1 );
mouse = physics.makeParticle();
mouse.makeFixed();
attr = new Attraction [number];

others = new Particle[number];
for ( int i = 0; i < others.length; i++ )
{
others[i] = physics.makeParticle( 1.0, random( 0, width ), random( 0, height ), 0 );
attr[i] = physics.makeAttraction( mouse, others[i], 5000, 50 );
}
}

void draw()
{
mouse.moveTo( mouseX, mouseY, 0 );
physics.tick();

//background( 0 );

//play movie
/*if(myMovie.available()) {
myMovie.read();
}
image(myMovie, 0, 0);*/
image(bg, 320,240);
blend(img2, 0, 0, pwidth, pheight, mouseX-pwidth/2, mouseY-pheight+32, pwidth, pheight, SOFT_LIGHT);
//image(img2, mouseX, mouseY);
for ( int i = 0; i < others.length; i++ )
{
Particle p = others[i];
handleBoundaryCollisions(p);
if (timer==0){
//img2 = loadImage("bushhandsome.gif");
distance(p);
}
image(img,p.position().x(),p.position().y());
}

checkTime();
counter = 0;
}

//bounce back at sides
void handleBoundaryCollisions( Particle p )
{
if ( p.position().x() < 0 || p.position().x() > width )
p.setVelocity( -0.9*p.velocity().x(), p.velocity().y(), 0 );
if ( p.position().y() < 0 || p.position().y() > height )
p.setVelocity( p.velocity().x(), -0.9*p.velocity().y(), 0 );
p.moveTo( constrain( p.position().x(), 0, width ), constrain( p.position().y(), 0, height ), 0 );
}

//calculate distance between p and mouse
void distance(Particle p)
{
float distance = (p.position().x()-mouseX)*(p.position().x()-mouseX) + (p.position().y()-mouseY)*(p.position().y()-mouseY);
if (distance <= maxDistance*0.9){
counter++;
}
if(counter >= number){
for ( int i = 0; i < others.length; i++ )
{
attr[i].setStrength(-5000);
}

img2 = loadImage("bushfinger.gif");
bg = loadImage("homeless.jpg");
handsome = false;
timer = maxTime;
}
}

void checkTime (){
if (timer>0){
timer--;
}
else if (handsome == false){
for ( int i = 0; i < others.length; i++ )
{
attr[i].setStrength(5000);
}
img2 = loadImage("bushhandsome.gif");
bg = loadImage("George_Bush_Economic_Recession.jpg");
handsome = true;
}
}










CTIN 544 | Narrative

// EatPrayLove Simulator
// by Emily Duff 2.19.09 for CTIN 544
//
// This small app uses the light sensor input to create two sides to the screen
// by balancing the lights (eat and pray) you can find love. This is the main
// objective in Elizabeth Gilbert's Eat Pray Love.
//
// It uses the AmbientLightSensor library
// http://projects.formatlos.de/ambientlightsensor/
//
// Download file

CTIN 544 | External Assets and the Economy


stockton_4.jpg



I have three versions of my homework for this week. The version breakdown is as follows:


Foreclosure V1 - Pulls in data from the foreclosures rss feed for Los Angeles and determines the address font size based on property value. Uses Rome and JDOM, convoluted code and subpar functionality. This is what I showed in class. Download file


Foreclosure V2 - Still pulls the same data, but using the built-in Processing XML library. Cut the code down by about 100 lines, much easier to understand and implement. Download file


Foreclosure V3 - Pulls dynamic data from the foreclosures feed, when new items are added to the list, they will print to the screen. To see any real changes, you'd have to leave the app open for a day or hit it right at the 3 - 4pm mark, which seems to be when they update the site. Download file

Economy Sketch: It's Raining Men

Here is the Processing source and data for my Economy Sketch.

Download It!

Bill

Project 3 (in-class Collaboration)


I thought this was worth posting. Sean Plott and I combined our library research to create this sandy, colorful little number. I like it. It's very mesmerizing. When you're done with your drawing, try clicking to "shake the etch-a-sketch". Note that the color is changing to the beat of the music.

Download file

Requires traer physics library and minim library:

http://www.cs.princeton.edu/~traer/physics/

http://code.compartmental.net/tools/minim/

"Also, you'll need to put an mp3 file in the same directory as the processing project and replace "missyou.mp3" with the appropriate song filename. I can't upload missyou.mp3 due to copyright purposes."

Thank you.
-jim





Project 2

This is my second project using a particle physics library. I really like the feel of this one. It feels sandy. Sometimes I think of the lines as pathways, or a strange landscape leading to a dark gothic castle.

It's very relaxing.

Download file

You have download the traerphysics library here: http://www.cs.princeton.edu/~traer/physics/

Project 1

This was my first project. Try clicking.

Download file

Wii Controller + Processing

You need Darwiin remote and a wii remote and a bluetooth adapter. This reads a text file from the Darwiin and then utilizes it in processing and it shows up as movement.



PImage wiimote_top, wiimote_front;
int accX, accY, accZ, orientation;

void setup()
{
size(600, 400);
frameRate(60 );

smooth();






//wiimote_top = loadImage("shake.jpg");
//wiimote_front = loadImage("turn.jpg");
}

void draw()
{
background(0);
fill(255);
ellipse(400.0,300.0, 50, 50);

// load the textfile generated from DarwiinRemote and converts it into strings
String [] wiimote_file = loadStrings("/wiimote.txt");

if (wiimote_file.length == 1)//this if statement reads the TXT file and converts
//it into movement.
{
String [] wiimote_values = wiimote_file[0].split(";");

accX = Integer.parseInt(wiimote_values[0]);
accY = Integer.parseInt(wiimote_values[1]);
accZ = Integer.parseInt(wiimote_values[2]);

orientation = Integer.parseInt(wiimote_values[3]);
}

ellipse(132-accX/2.0, 190-accY/2.0, 300,400);

translate(width/2, 70);
if(orientation == 1)
rotate(-PI/2);
else if(orientation == 2)
rotate(PI);
else if(orientation == 3)
rotate(PI/2);
//rect(wiimote_front, -wiimote_front.width/2, -wiimote_front.height/2);
}

CTIN544 Assignment #2 3D model Viewer

Assignment #2 using external liblary

This week I tried to use OpenGL libraly.

One of them is photo viewer. here

But, pde file isn't accepted by my server. I change extention to txt


Second one is something challange for me.

In Japan, there is one of major free 3d modeling software.
/It's called "Metasequoia". http://www.metaseq.net/english/index.html

Using this toolo, Japanese creater uploaded models on the web.

Processing offical liblary has some kind of importer.
one of 3D model loader is avilable. 'OBJLoader'

But "Metasequoia" loader isn't avilable.
Metasequoia loader of C++ version, Flash version and JAVA version are avilable.
I try to transrate it for Processing.
and I built up some sample code following.

I uploaded my web site . here
But cannot execute, I cannot figure out.

So I upload ZIP file with my lib. Modeling data can access with Internet.
In this version, I confirmed to execute on the local computer.

Download file

This version, you can watch "Dokuro" model.

mpqview_screenshot.JPG

I'm now thinking, I upload this libraly with GPL licence to somewhere. I'mlooking for.
And ,now, I'm contacting with original code author. (Java version)

Processing: Library assignment and in-class work

Note that these require an attached video camera and quicktime. (I'm pretty sure that) they'll use the last camera which was used by quicktime. They are in pde format, so you'll have to open them in Processing.

Luminator3.pde

Life_Live.pde

-Bill

CTIN 544 | Apple SMS Library

The library that I worked with is the Apple SMS library. I also used the MovingLetters library for a few visual touches. The Apple SMS library only works with MacBooks and PowerBooks built after 2005, as it utilizes the internal Sudden Motion Sensor. Sorry to the PC folks who want to try this out.


My first homework was an exploration of the SMS library. Download file


For the homework extension, I built a simple game where you try to roll a ball into a goal using your laptop as the controller. Download file

CTIN544 - processing script 2

//download the image to the data folder, and choose a movieclip for viewing
kid.png


import processing.video.*;
Movie myMovie;
PImage img;
int pwidth = 194;
int pheight = 246;

void setup() {
size(640, 480);
frameRate(30);

//choose a movieclip, replace the string below with its name
myMovie = new Movie(this, "P1040237.mov");
// Prints the duration of the movie
println(myMovie.duration());
myMovie.play();
myMovie.loop();

img = loadImage("kid.png");
}

void draw() {
if(myMovie.available()) {
myMovie.read();
}
image(myMovie, 0, 0);
blend(img, 0, 0, pwidth, pheight, mouseX-pwidth/2, mouseY-pheight/2, pwidth, pheight, EXCLUSION);
//stroke(255);
//fill(255);
//ellipse(mouseX,mouseY,150,150);
}


CTIN544 - processing script 1

class Cell {
float x,y; // x,y location
float w,h; // 2 parameters for the ellipse
float angle; // angle for oscillating brightness

// Cell Constructor
Cell(float tempX, float tempY, float tempW, float tempH, float tempAngle) {
x = tempX;
y = tempY;
w = tempW;
h = tempH;
angle = tempAngle;
}

void oscillate() {
if (count >= da){
count = 0;
angle = 90;
}
else if ((count > xiao) && (count < da)){
angle += 0.05;
}
count++;
}

void display() {
stroke(255);
// Color calculated using sine wave
fill(127+127*tan(angle));
ellipse(x+w/2,y+w/2,w,h);
}
}

// 2D Array of objects
Cell[][] grid;

// Number of columns and rows in the grid
int cols = 10;
int rows = 10;
int count = 0;
int xiao= 1000;
int da = 1100;

void setup() {
size(600,600);
grid = new Cell[cols][rows];
for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
// Initialize each object
grid[i][j] = new Cell(i*60,j*60,60,60,i+j);
}
}
}

void draw() {
background(0);
// The counter variables i and j are also the column and row numbers and
// are used as arguments to the constructor for each object in the grid.
for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
// Oscillate and display each object
grid[i][j].oscillate();
grid[i][j].display();
}
}
}

CTIN 544 Library Assignment

sketch.jpg

Here is the code for my second sketch:

import JMyron.*;

JMyron theMov;
int[] currFrame;
int[] prevFrame;
int[] fadeFrame;
int tolerance;
int modNum;
boolean revealing;

void setup() {
size(640, 480);

theMov = new JMyron();
theMov.start(width, height);
theMov.findGlobs(0);

// initialize the pixel arrays to avoid a NullPointerException
loadPixels();
currFrame = prevFrame = fadeFrame = pixels;

tolerance = 53;
modNum = 1;
revealing = true;
}

void draw() {
// erase the previous image


theMov.update();
// save the last frame before updating it
prevFrame = currFrame;
currFrame = theMov.image();

// draw each pixel to the screen only if its change factor is
// higher than the tolerance value
loadPixels();
for (int i=0; i < width*height; i++) {
if(brightness(pixels[i])<255)
{
fadeFrame[i] = int(brightness(pixels[i]+modNum));
if(brightness(pixels[i])>255)
{
fadeFrame[i] = color(255,255,255);
}
}
}
background(255);

for (int i=0; i < width*height; i++) {
pixels[i] = color(fadeFrame[i]);
if (comparePixels(i)) {
pixels[i] = color(0);
fadeFrame[i] = color(0);
}

}
updatePixels();
}

boolean comparePixels(int index) {
if (Math.abs(red(currFrame[index])-red(prevFrame[index])) < tolerance)
if (Math.abs(green(currFrame[index])-green(prevFrame[index])) < tolerance)
if (Math.abs(blue(currFrame[index])-blue(prevFrame[index])) < tolerance)
return !revealing;

return revealing;
}

void keyReleased() {
if (key == '.' || key == '>') {
// increase tolerance
tolerance += 2;
} else if (key == ',' || key == '<') {
// decrease tolerance
tolerance -= 2;
}
else if (key == '+' || key == '=') {
// decrease tolerance
modNum += 1;
println(modNum);
}
else if (key == '-' || key == '_') {
// decrease tolerance
if(modNum>0)
{
modNum -= 1;
}
println(modNum);
}
}

public void stop() {
theMov.stop();
super.stop();
}

CTIN 544 Library Assignment

Here is a link to my Processing Library project, using the ESS library to analyze and visualize music:

http://jenstein.net/coursework/processing/levanpolkka/applet/

CTIN544 Library Assignment (Updated)

For a CTIN544 assignment, this program demonstrates use of the networking library built into Processing.

UPDATED: Fixed a bug in the server and extensively commented the code. No longer including compiled builds, but leave a comment if you need one. You can compile it yourself on any system using Processing.

CTIN 544 | Billboard Design

ColorBar Test Pattern for Billboard assignment. This small app simulates a color bar test process. It scans twice and then fails, on purpose. Should it ever be actually displayed on a real billboard, the y value would be increased at a much smaller rate than 5 pixels. This is just to speed up the animation.

Includes applet and .pde - Download file