Processing摸索前行(9)-音频可视化

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摸索前行的博客。

发布了116 篇原创文章 · 获赞 79 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/haigear/article/details/85060279