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

發佈了120 篇原創文章 · 獲贊 93 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章