processing的优势在于数据可视化,那么利用它来做音频可视化想必也是许多学习processing小伙伴的一种目标,在processing中并没有提供自带的库文件来实现,都是通过第三方的库文件来实现的。最常见的有Sound \Beads\Minim三种,具体用法要参见他们的库文件说明(这些都在官网上有,我不一一列出来)。
这里,我们以 为例来实现一个简单的音乐可视化界面。我们大体分为以下几步来实现:
1、播放一个音乐文件(MP3);
2、获取其音频取值
3、通过图形显示音频值的变化
4、分类音频中的(中高低三种音频)并在图形中分别动态显示
好了,任务明确了,我们来开始第一步:
一、播放一个音乐文件(MP3)
1、sound方式
最简单的方式就是用sound库文件来实现,代码如下:
import processing.sound.*;
SoundFile file;
void setup()
{
size(500,200);
background(255);
file=new SoundFile(this,"super star.mp3");
file.play();
}
void draw()
{
}
非常简单,就只是初始化一个SoundFile对象即可。
2、Minim方式
import ddf.minim.*;
Minim minim;
AudioPlayer player;
void setup() {
size(500,200);
minim = new Minim(this);
player = minim.loadFile("2005010623271461.mp3");
player.play();
}
void draw() {
}
实际调用我们发现,第二种方式的调用速度更快。
二、获取音值
上面的步骤完成为我们这步奠定必要的基础,否则我们就没有信号源了。
import processing.sound.*;
SoundFile file;
Amplitude amp;
AudioIn in;
void setup()
{
size(640,360);
background(255);
file=new SoundFile(this,"super star.mp3");
amp = new Amplitude(this);
in = new AudioIn(this);
in.start();
amp.input(in);
file.play();
}
void draw()
{
println(amp.analyze());
}
我们在最上面的代码基础上增加了两个对象 Amplitude 和AudioIn,这样,我们就可以通过Amplitude的analyze方法获取音值并输出。如下:
其中AudioIn负责从声卡获取声音流,然后通过Amplitude.input来接过声音流,最后用Amplitude .analyze分析出单个的音值点数据。
三、可视化图像的绘制
有了上面两步的基础,其实稍有processing基础的就可以完成图形输出了(不了解基础的可以参看前面的processing博文)。
下面是绘图的代码:
import processing.sound.*;
SoundFile file;
Amplitude amp;
AudioIn in;
float mval;
void setup()
{
size(640,360);
background(255);
file=new SoundFile(this,"super star.mp3");
amp = new Amplitude(this);
in = new AudioIn(this);
in.start();
amp.input(in);
file.play();
}
void draw()
{
fill(255,255,255);
noStroke();
rect(0,70,10,160);
for(int i=0;i<this.width/10;i++)
{
delay(1);
mval=amp.analyze();
noStroke();
fill(255,255,255);
rect((i+1)*10,70,10,160);
stroke(255,255,255);
fill(255,0,0);
rect(i*10,250-mval*100000,10,50+mval*100000);
println(mval);
}
}
大致效果如下:
看起来使用analyze方法基本实现了目标,当然,我们如果感兴趣可以继续将上述代码进一步精细化,时间更精细的效果。我们知道,声音包含振幅和频率两个基本因素,而在录制信号的时候还涉及到采样率。实际上,上面的图形仅仅对振幅(也就是声音强度)进行了显示。完整的声音波表,应该是有频率及对应的声音强度组成的图形。我们后面继续探索声音波表的完整图形绘制,请感兴趣的童鞋继续关注后续的processing摸索前行的博客。