Timing and Pacing
Category: Blog, Coding for Emotional Impact, Spring 2014Tags: analyze. music. observation. processing.
For this week’s subject Timing and Pacing, I chose “No Safe-House” in the soundtrack of The Grand Budapest Hotel to decode.
effect I intend to achieve
–> emotion accumulation, cheerful and narrative.
notes
- library I used for camera in 3D –> http://mrfeinberg.com/peasycam/#about
- using PShape to store the tetrahedron I made and set their movements with trigonometry functions, noise, hsl, and hard-coding frameCount!!!(see how long and tedious my codes are :P)
- issues to work on, since I used frameCount, it’s different all the time, depending how fast my computer run. need to use millis() next time!
- next step will be using library Minim to generate the patterns directly from the analysis of sound file.
codes
import peasy.test.*;
import peasy.org.apache.commons.math.*;
import peasy.*;
import peasy.org.apache.commons.math.geometry.*;
import ddf.minim.*;
Minim minim;
AudioPlayer player;
PeasyCam cam;
float spin = 0.0;
SinWave sinW1;
SinWave sinW2; //time=0
CosWave cosW1;
CosWave cosW2; //time=0;
TanWave tanW1;
TanWave tanW2; //time=0;
//SinWave sw1;
//SinWave sw2;
//first circle
ArrayList<SinWave> sw1;
ArrayList<SinWave> sw2;
ArrayList<TanWave> tw;
ArrayList<CosWave> cw1;
//second circle
ArrayList<SinWave> sw1b;
ArrayList<SinWave> sw2b;
ArrayList<TanWave> twb;
ArrayList<CosWave> cw1b;
//3rd circle
ArrayList<SinWave> sw1c;
ArrayList<SinWave> sw2c;
ArrayList<TanWave> twc;
ArrayList<CosWave> cw1c;
float frequency = 0.01;
float time1 = PI/2;
float time2 = 0;
float amplitude = 5;
float offset = 0;
float increaseAmp = 0.01;
float increaseBri = 0.01;
float increaseBri2 = 0.01;
float increaseTime = 0.01;
float radiusCircle = 0.0;
float ang;
float posX;
float posY;
float posZ;
float posX2;
float posY2;
float posZ2;
float posCX;
float posCY;
ArrayList<Tetrahedron> triS;
ArrayList<Tetrahedron> triCircleS;
ArrayList<Tetrahedron> triCircle2S;
ArrayList<Tetrahedron> triCircle3S;
float noiseVal;
float noiseScale=0.02;
int octaves;
float falloff;
float time;
boolean increase = true;
int circleNum = 60;
float size;
//Camera
float xmag, ymag = 0;
float newXmag, newYmag = 0;
float averagePosX = 0;
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
////////////////////// SET_UP ////////////////////////
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
void setup() {
noCursor();
noFill();
//stroke(255);
size(1000, 800, P3D);
colorMode(HSB,100);
//Camera-------------------------------------------------
//-------------------------------------------------------
cam = new PeasyCam(this, 0, 0, 0, 1000);
// cam.setActive(false);
// cam.setYawRotationMode();
//audio
minim = new Minim(this);
player = minim.loadFile("No Safe-House.mp3");
player.play();
sinW1 = new SinWave(time1, frequency, amplitude, offset);
sinW2 = new SinWave(time2, frequency, amplitude, offset);
cosW1 = new CosWave(time1, frequency, amplitude, offset);
cosW2 = new CosWave(time2, frequency, amplitude, offset);
tanW1 = new TanWave(time1, frequency, amplitude, offset);
tanW2 = new TanWave(time2, frequency, amplitude, offset);
triS = new ArrayList<Tetrahedron>();
triCircleS = new ArrayList<Tetrahedron>();
triCircle2S = new ArrayList<Tetrahedron>();
triCircle3S = new ArrayList<Tetrahedron>();
sw1 = new ArrayList<SinWave>();
sw2 = new ArrayList<SinWave>();
tw = new ArrayList<TanWave>();
cw1 = new ArrayList<CosWave>();
sw1b = new ArrayList<SinWave>();
sw2b = new ArrayList<SinWave>();
twb = new ArrayList<TanWave>();
cw1b = new ArrayList<CosWave>();
sw1c = new ArrayList<SinWave>();
sw2c = new ArrayList<SinWave>();
twc = new ArrayList<TanWave>();
cw1c = new ArrayList<CosWave>();
//first circle
for(int i=0; i<circleNum; i++){
Tetrahedron t = new Tetrahedron(color((i)*(100/circleNum), 100, 100));
SinWave x = new SinWave(radians(360/circleNum*i), frequency, amplitude, offset);
sw1.add(x);
SinWave y = new SinWave(PI/2+radians(360/circleNum*i), frequency, amplitude, offset);
sw2.add(y);
TanWave tt = new TanWave(radians(360/(circleNum*2)*i), frequency, amplitude, offset);
tw.add(tt);
CosWave v = new CosWave(radians(180/2*i), 0.1, 0.2, offset);
cw1.add(v);
t.update(x.run()*100, v.run()*50, y.run()*100, tt.run()*0.05);
triCircleS.add(t);
}
//spread circle
int amount = 30;
for(int j=0; j<amount; j++){
Tetrahedron tet = new Tetrahedron();
Tetrahedron t = new Tetrahedron();
SinWave x2 = new SinWave(radians(360/amount*j), frequency, amplitude, offset);
sw1b.add(x2);
SinWave y2 = new SinWave(PI/2+radians(360/amount*j), frequency, amplitude, offset);
sw2b.add(y2);
TanWave tt2 = new TanWave(radians(360/(amount*2)*j), frequency, amplitude, offset);
twb.add(tt2);
CosWave v2 = new CosWave(radians(180/2*j), 0.1, 0.2, offset);
cw1b.add(v2);
SinWave x3 = new SinWave(radians(360/amount*j), frequency, amplitude, offset);
sw1c.add(x3);
SinWave y3 = new SinWave(PI/2+radians(360/amount*j), frequency, amplitude, offset);
sw2c.add(y3);
TanWave tt3 = new TanWave(radians(360/(amount*2)*j), frequency, amplitude, offset);
twc.add(tt3);
CosWave v3 = new CosWave(PI/2+radians(180/2*j), frequency, amplitude, 0);
cw1c.add(v3);
tet.update(x2.run()*100, v2.run()*50, y2.run()*100, tt2.run()*0.05);
t.update(x3.run()*100, v3.run()*50, v3.run()*100, tt3.run()*0.05);
triCircle2S.add(tet);
triCircle3S.add(t);
}
size=2;
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
/////////////////////// DRAW /////////////////////////
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
void draw() {
rotateX(-.2);
//rotateY(-.2);
background(255/23);
//lights();
noFill();
//stroke(255);
//strokeWeight(3);
//Camera-------------------------------------------------
//-------------------------------------------------------
// if(frameCount < 60*20)
// cam.setYawRotationMode();
//rotateX(-PI/2);
noiseDetail(octaves, falloff);
posX = sinW1.run();
posY = cosW2.run();
posZ = cosW1.run();
posX2 = cosW1.run();
posY2 = sinW2.run();
posZ2 = cosW2.run();
spin = 0.05*tanW1.run();
//inner circle---------------------------------------------------
//0:00~0:32------------------------------------------------------
if(triCircleS.size()>0){
//circle
for(int i=0; i<triCircleS.size(); i++){
Tetrahedron t = triCircleS.get(i);
SinWave x = sw1.get(i);
SinWave y = sw2.get(i);
TanWave tt = tw.get(i);
CosWave v = cw1.get(i);
t.update(x.run()*(70+radiusCircle), v.run()*50, y.run()*(70+radiusCircle), tt.run()*0.05);
if(frameCount > 3500) {
if(frameCount < 3720)
radiusCircle += 0.002;
else if(frameCount < 3720+60*2)
radiusCircle -= 0.002;
}
//sizing---------------------------------------------------------
//0:00~0:32------------------------------------------------------
if(frameCount < 900) {
size += 0.00007;
}
else if(frameCount < 960) {
size -= 0.00105;
}
else if(frameCount < 1860) {
size += 0.0001;
}
else if(frameCount < 1920) {
size -= 0.0015;
}
if(frameCount < 60*3.5)
radiusCircle += 0.003;
else if(frameCount < 60*8)
radiusCircle -= 0.003;
else if(frameCount < 60*11)
radiusCircle += 0.002;
else if(frameCount < 60*12)
radiusCircle -= 0.003;
else if(frameCount < 60*16)
radiusCircle += 0.002;
else if(frameCount < 60*20)
radiusCircle -= 0.003;
else if(frameCount < 60*24)
radiusCircle += 0.002;
else if(frameCount < 60*27)
radiusCircle -= 0.003;
else if(frameCount < 60*28)
radiusCircle += 0.003;
else if(frameCount < 60*32.5)
radiusCircle -= 0.002;
else if(frameCount < 60*36)
radiusCircle += 0.003;
else if(frameCount < 60*40)
radiusCircle -= 0.003;
else if(frameCount < 60*42)
radiusCircle += 0.003;
else if(frameCount < 60*44)
radiusCircle -= 0.003;
else if(frameCount < 60*48)
radiusCircle += 0.003;
//Up & Down------------------------------------------------------
//0:46~------------------------------------------------------
if(frameCount > 2800 && frameCount < 2900){ // && frameCount < 3900
if(size>0)
size -= 0.0005;
}
if(frameCount > 2900 && frameCount < 3000)
size += 0.0005;
if (frameCount == 2900)
v.setTime(radians(180*i));
if (frameCount > 2850 && frameCount < 3300) {
if(v.frequency>0.06)
v.frequency -= 0.001;
}
//Up & Down_speedUp----------------------------------------------
//0:58~0:70------------------------------------------------------
else if (frameCount > 3500 && frameCount < 4200) {
v.frequency += 0.0005;
}
println(v.frequency);
t.setSize(size);
t.display();
}
}
//spread---------------------------------------------------------
//0:32~0:47------------------------------------------------------
if(frameCount > 1920){
pushStyle();
if(frameCount < 4530)
stroke(100*53/359, 100, increaseBri);
else {
if(frameCount % 60 < 30)
stroke(100*184/359, 89, 100);
else
stroke(100*331/359, 100, 100);
}
for(int i=0; i<triCircle2S.size(); i++){
Tetrahedron tet = triCircle2S.get(i);
SinWave x2 = sw1b.get(i);
SinWave y2 = sw2b.get(i);
TanWave tt2 = twb.get(i);
CosWave v2 = cw1b.get(i);
x2.setAmp(amplitude+increaseAmp);
y2.setAmp(amplitude+increaseAmp);
if(frameCount < 1920+60)
increaseAmp +=0.0005;
else if(frameCount < 1920+60*2)
increaseAmp -=0.0005;
else if(frameCount < 1920+60*3)
increaseAmp +=0.0005;
else if(frameCount < 1920+60*4)
increaseAmp -=0.0005;
else if(frameCount < 1920+60*5)
increaseAmp +=0.0005;
else if(frameCount < 1920+60*6)
increaseAmp -=0.0005;
else if(frameCount < 1920+60*7)
increaseAmp +=0.0005;
else if(frameCount < 1920+60*8)
increaseAmp -=0.0005;
else if(frameCount < 1920+60*9)
increaseAmp +=0.0005;
else if(frameCount < 1920+60*10)
increaseAmp -=0.0005;
else if(frameCount < 1920+60*11)
increaseAmp +=0.0005;
else if(frameCount < 1920+60*12)
increaseAmp -=0.0005;
else if(frameCount < 1920+60*13)
increaseAmp +=0.0005;
else if(frameCount < 1920+60*14)
increaseAmp -=0.0005;
if(frameCount > 60*75.5 && frameCount < 60*77.1) // && frameCount < 3900
v2.amplitude -= 0.05;
tet.update(x2.run()*100, v2.run()*(50+increaseAmp)+50, y2.run()*100, tt2.run()*0.05);
tet.display();
}
popStyle();
increaseBri += 0.8;
}
//another spread-------------------------------------------------
//------------------------------------------------------
if(frameCount > 60*61){
pushStyle();
stroke((int)random(100)*100/359,100,100);
for(int i=0; i<triCircle3S.size(); i++){
Tetrahedron ttt = triCircle3S.get(i);
ttt.setSize(1);
if(frameCount < 60*70) {
if(frameCount % 30 == 0){
ttt.setSize(random(2));
strokeWeight(random(1,5));
}
} else if(frameCount < 60*77) {
if(frameCount % 30 == 0){
ttt.setSize(random(2,5));
strokeWeight(random(3,7));
}
}
SinWave x3 = sw1c.get(i);
SinWave y3 = sw2c.get(i);
TanWave tt3 = twc.get(i);
CosWave v3 = cw1c.get(i);
ttt.update(x3.run()*100, y3.run()*50, v3.run()*100, tt3.run()*0.05);
ttt.display();
}
popStyle();
}
//auto create flying ones
if(frameCount > 60*16 && frameCount < 60*46){
if(frameCount % (60*4) < (60*1)) {
if(frameCount % 10 ==0)
newTri();
}
}
if(frameCount > 60*55 && frameCount < 60*60) {
octaves += 0.1;
falloff += 0.007;
}
if(triS.size()>0){
pushStyle();
//flying around
color triC = color(50, 70, increaseBri2);
int direction = 1;
//appear
if(frameCount > 60*10) {
if(increaseBri2 < 50) {
increaseBri2 += 0.1*direction;
}
} else if (frameCount > 60*77) {
if(increaseBri2 < 100) {
increaseBri2 += 0.1*direction;
}
}
for(int i=0; i<triS.size(); i++){
Tetrahedron t = triS.get(i);
if(frameCount < 60*61)
t.setSize(size/2);
else if(frameCount < 60*70) {
if(frameCount % 30 == 15){
t.setSize(random(2));
strokeWeight(random(1,5));
}
} else if(frameCount < 60*77) {
if(frameCount % 30 == 15){
t.setSize(random(2,5));
strokeWeight(random(3,7));
}
triC = color(random(1,100), 70, increaseBri2);
} else if(frameCount < 60*86) {
t.setSize(random(2));
triC = color(random(1,100), 70, increaseBri2);
} else {
t.setSize(random(100,500));
triC = color(random(1,100), 70, 100);
}
t.setAngle(radians(i*10));
if(i%2 == 0)
t.update(t.x+posX, t.y+posY, t.z+(noise(time)*posZ), spin);
else
t.update(t.x+posX2, t.y+posY2, t.z+(noise(time)*posZ2), spin);
t.display( triC );
}
popStyle();
}
}
void newTri(){
Tetrahedron t = new Tetrahedron();
triS.add(t);
}
void mousePressed(){
newTri();
}
void keyPressed() {
switch(keyCode) {
case UP:
octaves++;
break;
case DOWN:
octaves--;
break;
case RIGHT:
falloff+=.1;
break;
case LEFT:
falloff-=.1;
break;
}
octaves = constrain(octaves, 0, 25);
falloff = constrain(falloff, 0.0, 1.1);
}
class Tetrahedron {
PShape t;
PShape t1, t2, t3, t4;
float x, y, z;
float scale = 5;
float angleY;
color c;
Tetrahedron() {
//c = color(0,0,100);
t = createShape(GROUP);
t1 = createShape();
t1.beginShape();
t1.stroke(c);
t1.vertex(-3, 0, 0);
t1.vertex(3, 0, 0);
t1.vertex(0, 0, -4);
t1.endShape(CLOSE);
t2 = createShape();
t2.beginShape();
t2.stroke(c);
t2.vertex(-3, 0, 0);
t2.vertex(0, 4, -1.7);
t2.vertex(3, 0, 0);
t2.endShape(CLOSE);
t3 = createShape();
t3.beginShape();
t3.stroke(c);
t3.vertex(3, 0, 0);
t3.vertex(0, 4, -1.7);
t3.vertex(0, 0, -4);
t3.endShape(CLOSE);
t4 = createShape();
t4.beginShape();
t4.stroke(c);
t4.vertex(-3, 0, 0);
t4.vertex(0, 0, -4);
t4.vertex(0, 4, -1.7);
t4.endShape(CLOSE);
t.addChild(t1);
t.addChild(t2);
t.addChild(t3);
t.addChild(t4);
x = random(-200, 200);
y = random(-200, 200);
z = random(-200,200);
t.disableStyle();
t1.disableStyle();
t2.disableStyle();
t3.disableStyle();
t4.disableStyle();
}
Tetrahedron(color _c) {
c = _c;
t = createShape(GROUP);
t1 = createShape();
t1.beginShape();
t1.stroke(c);
t1.vertex(-3, 0, 0);
t1.vertex(3, 0, 0);
t1.vertex(0, 0, -4);
t1.endShape(CLOSE);
t2 = createShape();
t2.beginShape();
t2.stroke(c);
t2.vertex(-3, 0, 0);
t2.vertex(0, 4, -1.7);
t2.vertex(3, 0, 0);
t2.endShape(CLOSE);
t3 = createShape();
t3.beginShape();
t3.stroke(c);
t3.vertex(3, 0, 0);
t3.vertex(0, 4, -1.7);
t3.vertex(0, 0, -4);
t3.endShape(CLOSE);
t4 = createShape();
t4.beginShape();
t4.stroke(c);
t4.vertex(-3, 0, 0);
t4.vertex(0, 0, -4);
t4.vertex(0, 4, -1.7);
t4.endShape(CLOSE);
t.addChild(t1);
t.addChild(t2);
t.addChild(t3);
t.addChild(t4);
x = random(-200, 200);
y = random(-200, 200);
z = random(-200,200);
}
void update(float _x, float _y, float _z) {
x = _x;
y = _y;
z = _z;
}
void update(float _x, float _y, float _z, float _angleY) {
x = _x;
y = _y;
z = _z;
angleY = _angleY;
}
void update(float _x, float _y, float _z, color _c) {
x = _x;
y = _y;
z = _z;
c = _c;
}
void update(float _x, float _y, float _z, color _c, float _angleY) {
x = _x;
y = _y;
z = _z;
c = _c;
angleY = _angleY;
}
void setZ(float _z) {
z = _z;
}
void setAngle(float _angleY) {
angleY = _angleY;
}
void setSize(float _scale) {
scale = _scale;
}
void display() {
pushMatrix();
translate(x, y, z);
rotateY(angleY);
rotateZ(angleY);
scale(scale);
shape(t);
popMatrix();
}
void display(color _color) {
pushMatrix();
pushStyle();
fill(_color);
noStroke();
translate(x, y, z);
rotateY(angleY);
rotateZ(angleY);
scale(scale);
shape(t);
popStyle();
popMatrix();
}
}
class Wave{
float time, frequency, amplitude, offset;
Wave(float _time, float _frequency, float _amplitude, float _offset){
time = _time;
frequency = _frequency;
amplitude = _amplitude;
offset = _offset;
}
float run(){
time += frequency;
return sin( time ) * amplitude + offset;
}
void setAmp(float _amp){
amplitude = _amp;
}
void setTime(float _ti){
time = _ti;
}
}
class SinWave {
float time, frequency, amplitude, offset;
SinWave(float _time, float _frequency, float _amplitude, float _offset){
time = _time;
frequency = _frequency;
amplitude = _amplitude;
offset = _offset;
}
float run() {
time += frequency;
return sin( time ) * amplitude + offset;
}
void setAmp(float _amp){
amplitude = _amp;
}
void setTime(float _ti){
time = _ti;
}
}
class CosWave{
float time, frequency, amplitude, offset;
CosWave(float _time, float _frequency, float _amplitude, float _offset){
time = _time;
frequency = _frequency;
amplitude = _amplitude;
offset = _offset;
}
float run() {
time += frequency;
return cos( time ) * amplitude + offset;
}
void setAmp(float _amp){
amplitude = _amp;
}
void setTime(float _ti){
time = _ti;
}
}
class TanWave {
float time, frequency, amplitude, offset;
TanWave(float _time, float _frequency, float _amplitude, float _offset){
time = _time;
frequency = _frequency;
amplitude = _amplitude;
offset = _offset;
}
float run() {
time += frequency;
return tan( time ) * amplitude + offset;
}
void setAmp(float _amp){
amplitude = _amp;
}
void setTime(float _ti){
time = _ti;
}
}
