Processing 「ライブの音と同期させる」
Processingで作ったやつを音に合わせて動かしたいなーということでやってみました。
まずProcessingは標準で音は扱えないのでどこかのすごい人が作ったライブラリを使用。
今回はProcessingのサイトにも紹介されている「Minim」を使ってます。
サンプルもついてくるので、その中の「getLineIn」を参考に(てかコピペ)ラインに入力したサウンドを取得します。
安物のオーディオインターフェイスもどきにiPodから音楽を入力させて、それをUSBでPCにつないでます。
できたものをプロジェクタで映してみました。
(音汚いけど気にしない・・・)
色は今はランダムなので、音域で変わるようにしたいなあ。
これをMotionDiveとかの映像にビデオミキサーで重ねて使います。
ちなみに今年の忘年会はこんな感じでいこうと思ってます。(本気)
DJをやるT島が流す音に合わせたり、社長とかのスピーチに合わせて動くのだ。
これにGainerも絡める予定。
ソースはこちら。
import processing.opengl.*;
import javax.media.opengl.*;
import ddf.minim.*;
PGraphicsOpenGL pgl;
GL gl;
PImage light01;
ArrayList aLight01;
int[] cl,dcl;
AudioInput in;
void setup() {
size(800,600,OPENGL);
background(0);
pgl = (PGraphicsOpenGL) g;
gl = pgl.gl;
light01 = loadImage("light.jpg");
aLight01 = new ArrayList();
for (int i=0;i<=10;i++) {
aLight01.add(new Light01());
}
cl = new int[3];
cl[0] = 0;
cl[1] = 0;
cl[2] = 0;
dcl = new int[3];
dcl[0] = ceil(random(1,4));
dcl[1] = ceil(random(1,4));
dcl[2] = ceil(random(1,4));
//
Minim.start(this);
in = Minim.getLineIn(Minim.STEREO, 512);
}
void draw() {
translate(width/2,height/2);
fill(0, 15);
rect(-width/2, -height/2, width, height);
pgl.beginGL();
gl.glDisable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_ONE,GL.GL_ONE);
pgl.endGL();
noTint();
//Sound
float left = 0;
float right = 0;
for(int i = 0; i < in.left.size()-1; i++) {
left += abs(in.left.get(i));
right += abs(in.right.get(i));
}
//
//Particle
pushMatrix();
translate(0,0,100);
for (int i=0;i<aLight01.size();i++) {
Light01 lt = (Light01) aLight01.get(i);
lt.update(left+right);
tint(cl[0], cl[1], cl[2]);
image(light01,lt.getX(),lt.getY(),lt.getR(),lt.getR());
}
popMatrix();
for (int i=0;i<3;i++) {
cl[i]+=dcl[i];
if (dcl[i]>0&&cl[i]>255) {
cl[i] = 255;
dcl[i] = -ceil(random(1,4));
} else if (dcl[i]<0&&cl[i]<0) {
cl[i] = 0;
dcl[i] = ceil(random(1,4));
}
}
}
class Light01 {
int xx,yy,zz;
float ssx,ssy;
float dssx,dssy;
float rr,dd,minD,maxD,endD;
Light01() {
xx = 0;
yy = 0;
zz = 0;
ssx = random(-PI*2,PI*2);
ssy = random(-PI*2,PI*2);
dssx = PI/72;
dssy = PI/72;
minD = random(10,20);
maxD = random(100,200);
endD = maxD;
dd = 0;
rr = 50;
}
void update(float d) {
xx = int(dd*cos(ssy)*cos(ssx));
yy = int(dd*sin(ssy));
zz = int(dd*cos(ssy)*sin(ssx));
ssx += dssx;
ssy += dssy;
endD = d*0.6;
dd += (endD-dd)/2;
}
int getX() {
return xx-ceil(rr/2);
}
int getY() {
return yy-ceil(rr/2);
}
int getZ() {
return zz;
}
float getR() {
return rr;
}
}
| 固定リンク
この記事へのコメントは終了しました。

コメント