【小白篇】Processing 配合麦克风的实时声音可视化

时间:2024-03-17 15:50:02

欢迎来到声音的世界。
Processing如何实现声音可视化呢?

  • 必要条件:音频文件数字化;
  • 实现方式:逐点取出音频频率;
  • 呈现方式:基本形状,DIY……创意才是灵魂
    本教程主要介绍如何获取麦克风的立体声输入,并对其进行简单的可视化操作
    ##初识Minim
    Minim是一个使用JavaSound API、一丢丢Tritonus和Javazoom中的MP3SPI共同搭建的音频库。所有底层的工作都无须你操作,其尽可能简单地将音频整合到你的草图中,同时也为高级用户提供了合理的灵活性。

以下是Minim部分features:

  • AudioPlayer:WAV、AIFF、AU、SND和MP3文件的单声道和立体声道播放。
  • AudioMetaData:存有文件元数据的对象,如ID3标签。
  • AudioRecorder:录制单声道和立体声音频,缓冲或存入磁盘。
  • AudioInput:监控单声道和立体声输入,如,本文涉及到的麦克风。
  • AudioOutput:合成单声道和立体声。
  • FFT:对音频数据进行傅立叶变换后生成频谱。
  • BeatDetect:用于进行拍频检测的类。

##获取麦克风输入编码套路

① 导入音频库——Minim;

import ddf.minim.*;

② 声明Minim和AudioInput对象;

Minim minim;
AudioInput in;

③ Minim和AudioInput对象的实例化(创建)

  minim = new Minim(this);
  in = minim.getLineIn();

④ 最后,各种函数调用……
##声之形
声学工程师马克·菲舍尔痴迷于海洋之声,他将美妙的海豚声转化为可见的视觉图像(原文链接):

伪虎鲸的叫声
这里写图片描述

座头鲸的叫声
这里写图片描述
自己动手实现声音可视化的小程序,去捕捉更多生命的细节。具体代码下载

/*
 * The shape of voice
 * by Hewes.
 * 2017.10.28
 */
 
//第一步,导入音频库:Minim
import ddf.minim.*;

//第二步,声明Minim、AudioInput对象
Minim minim;
AudioInput in;  //AudioInput:单声道和立体声输入监控

void setup() {
  size(800, 600, P2D);
  background(0);
  stroke(255);

  //第三步,Minim、AudioInput对象的实例化
  minim = new Minim(this);
  in = minim.getLineIn();
}

//第四步,各种函数调用
void draw() {
  //saveFrame("声之形.png");  //保存最后一帧图片
  /**
   * 获取音频缓冲区的大小,
   * 接着按圆周平分,
   * 最后,对相邻缓冲区样本值进行连线操作。
   */
  float a = 0;
  float angle = (2*PI) /100;
  int step = in.bufferSize() / 100;
  for (int i=0; i < in.bufferSize()-step; i+=step) {
    //mix.get(i)邻返回的值在-1和1之间,放大且平移
    float x1 = width/2 + cos(a) * (1000 * in.mix.get(i) + 100);
    float y1 = height/2 + sin(a) * (1000 * in.mix.get(i) + 100);
    float x2 = width/2 + cos(a + angle) * (1000 * in.mix.get(i+step) + 100);
    float y2 = height/2 + sin(a + angle) * (1000 * in.mix.get(i+step) + 100);
    stroke(random(255), 100,100);
    line(x1, y1, x2, y2);
    a += angle;
  }
}

大致效果如下:

这里写图片描述

试试斑原海豚声:
这里写图片描述