Sound Effect #1 from smileblue on Vimeo.
후배가 Air Doom 이라는 사운드 비주얼라이제이션 작품을 나에게 보여 줬다~.
처음에는 여느 작업과 같이 에프터 이펙트와 프로세싱을 이용해서 제작된 영상이라 생각 했는데..
후배가 말하기를 프로세싱으로만 만들어 진거란다 ㅜㅜ 3D에 퀄리티가 상당히 높은 작품이었다.
(여기에 링크 걸면 비교되니 스스로 찾아 보시길~ ㅜㅜ)
아무튼.
사운드 비주얼라이제이션 다시 말해 소리 시각화는 소리의 값을 시각적으로 표현해주는 것이다.
그렇다고 소리만을 이용해서 영상을 만드는 것은 아니다.
기존적인 모션이 있는 영상에 소리의 여러 요소를 추출해 만들어진 영상에 적용시켜는 것이다.
프로세싱에는 기본적으로 minim 사운드 라이블러리가 제공되고 있다. 사운드의 레벨, 비트 , 스펙트럼등을
추출해서 사용할수 있게 되어 있다. 글아래 나올 소스도 기본적인 모션에 사운드 요소를 적용시켜
영상의 모션에 효과를 더했다.
import ddf.minim.analysis.*;
import ddf.minim.*;
Minim minim;
AudioPlayer jingle;
FFT fft;
float angle = 0;
int num = 300;
Effect[] myEffect = new Effect[num];
void setup()
{
size(500, 500);
for(int i =0 ; i < num; i++)
{
// myEffect[i] = new Effect(color(random(255),random(255),random(255)), random(0,3), random(0.003, 0.01));
myEffect[i] = new Effect(color(random(255)), random(0,3), random(0.003, 0.01));
}
minim = new Minim(this);
jingle = minim.loadFile("dying.mp3", 2048);
jingle.loop();
fft = new FFT(jingle.bufferSize(), jingle.sampleRate());
smooth();
noStroke();
background(255);
}
void draw()
{
background(0);
fft.forward(jingle.mix);
fft.window(FFT.HAMMING);
for(int i =0 ; i < num-1; i++)
{
myEffect[i].add_won_size = fft.getBand(i)/20+2;
myEffect[i].add_num = i;
myEffect[i].c_alpha = fft.getBand(i)*5;
myEffect[i].b = myEffect[i].b + fft.getBand(i)/200;
myEffect[i].mix_level = jingle.mix.level()*10;
myEffect[i].display();
myEffect[i].drive();
}
}
void stop()
{
// always close Minim audio classes when you finish with them
jingle.close();
minim.stop();
super.stop();
}
class Effect
{
float xpos, ypos;
float won_size;
float add_won_size;
float speed;
float speed_a = 0;
float b = 0;
float add_num;
float c_alpha;
color c;
float mix_level;
// Effect(color temp_c, float temp_won_size, float temp_add_num)
Effect(color temp_c, float temp_won_size, float temp_speed)
{
c = temp_c;
won_size = temp_won_size;
speed = temp_speed;
}
void display()
{
if(c_alpha > 10)
{
stroke(c, c_alpha/0.8);
line(width/2, height/2, xpos, ypos);
}
noStroke();
fill(c,40+c_alpha);
ellipse(xpos, ypos, won_size + add_won_size, won_size + add_won_size);
fill(c,40+c_alpha);
ellipse(xpos, ypos, won_size + add_won_size + mix_level*2, won_size + add_won_size + mix_level*2);
}
void drive()
{
xpos = width/2 + sin(speed_a+(add_num))*(add_num * sin(b));
ypos = height/2 + cos(speed_a+(add_num))*(add_num * sin(b));
speed_a+=speed; // 회전속도
}
}나중에 내용좀 보충할께요~
Copyright © Smileblue.co.kr ( Jaejoong Lee ). All Right Reserved.