音频可视化(以processing及minim库为例,附文档)

功能有

1.“n”一键切歌;

2.根据音乐变换不同的图像

3.“s”保存截图

4.“m”改变模式

5.空格变换形式

效果截图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
源码如下:

  
import ddf.minim.*;

Minim minim=new Minim(this);;
AudioPlayer song;
AudioInput in;

boolean lerping = true;

int linesX = 40; 
int linesY = 26; 

boolean repel = true;
boolean autopilot = false;
boolean controls = true;
boolean voice = false;
int coef = 1;
int mode = 0;
float magnitude = 0;
float maxMagnitude = 848.5281374;

color c;
PVector distance;
PFont sourcecode;
float stepsX, stepsY, radius, intensity, movement, last_sum, scale, factor, wave, sum;

class Node {
  float xpos, ypos, speed, anchorx, anchory;
  Node (float x, float y, float s) {
    anchorx = x;
    anchory = y;
    ypos = y;
    xpos = x;
    speed = s;
  }
}

Node[][] Nodes = new Node[linesX][linesY]; 

class Fish {
  float xpos, ypos, speed;
  Fish () {
    ypos = random(800*0.25, 800*0.75);
    xpos = random(1000*0.25, 1000*0.75);
  }
  void update() {
    if (lerping) {
      xpos = lerp(xpos + random(sum/20) - sum/40, xpos, 0.5);
      ypos = lerp(ypos + random(sum/20) - sum/40, ypos, 0.5);
    } else {
      xpos = xpos + random(sum/20) - sum/40;
      ypos = ypos + random(sum/20) - sum/40;
    }
    if (ypos > height*0.75) {
      ypos = height*0.75;
    } else if (xpos > width*0.75) {
      xpos = width*0.75;
    } else if (xpos < width*0.25) {
      xpos = width*0.25;
    } else if (ypos < height*0.25) {
      ypos = height*0.25;
    }
  }
}

Fish jimmy = new Fish(); 
String music[]={"Move Along","Joyce Jonathan - Ça Ira","Joy Williams - Doesn't Get Better Than This","Elen Levon - Kingdom","Bean - Rollercoaster"};
int index=0;
void playmusic(){
  minim.stop();
  song = minim.loadFile("D:\\Ftp/"+music[index]+".mp3");
  in = minim.getLineIn(Minim.MONO, 1024);
  song.play(0);
  factor = float(width)/song.bufferSize();
  textAlign(LEFT);
  sourcecode = createFont("D:\\Ftp/ebrima.ttf", 100);
  
}
void setup() {
  fullScreen();
  noSmooth();
  colorMode(HSB, 255);
  stepsX = (width) / linesX;
  stepsY = (height) / linesY;
  // initialize nodes
  for (int i = 0; i < linesX; i++) {
    for (int j = 0; j < linesY; j++) {
      Nodes[i][j] = new Node((i+0.5)*stepsX, (j+0.5)*stepsY, 2);
    }
  }
  playmusic();
}



void keyPressed() {
  switch(key) {
  case ' ':
    repel = !repel;
    break;
  case 'm':
    mode += 1;
    if (mode > 1) {
      mode = 0;
    }
    break;
  case 'a':
    autopilot = !autopilot;
    break;
  case 's':
    saveFrame("wavepttrn-####.jpg");
    break;
  case 'h':
    controls = !controls;
    break;
  case 'n':
    index++;
    if(index==music.length){
    index=0;
    }
    playmusic();
    break;
  case 'v':
    voice = !voice;
    if (!voice) {
      song.play();
    } else {
      song.pause();
    }
    break;
  }
}

void draw() {
  background(frameCount%255, 255, 30);
  coef = (repel ? 1 : -1);
  if (lerping) {
    magnitude = lerp(sum, last_sum, 0.7)/2.5;
  } else {
    magnitude = last_sum;
  }
  wave = last_sum/2.5;
  for (int i = 0; i < linesX; i++) {
    for (int j = 0; j < linesY; j++) {
      if (autopilot) {
        jimmy.update();
        distance = new PVector(Nodes[i][j].xpos - jimmy.xpos, Nodes[i][j].ypos - jimmy.ypos);
      } else {
        distance = new PVector(Nodes[i][j].xpos - mouseX, Nodes[i][j].ypos - mouseY);
      }
      scale = (1/distance.mag())*magnitude;
      fill(255);
      intensity = pow(1 - distance.mag()/(maxMagnitude), 5) / 5;
      radius = (intensity*magnitude);
      Nodes[i][j].xpos += coef*(distance.x*scale)/25;
      Nodes[i][j].ypos += coef*(distance.y*scale)/25;
      Nodes[i][j].xpos = lerp(Nodes[i][j].xpos, Nodes[i][j].anchorx, 0.05);
      Nodes[i][j].ypos = lerp(Nodes[i][j].ypos, Nodes[i][j].anchory, 0.05);
      if (radius > 50) {
        radius = 50;
      }
      if (radius < 2) {
        radius = 2;
      }
      c = color(170 + magnitude/2, magnitude*5, 255, 255);
      fill(c);
      stroke(c);
      if (mode == 0) {
        ellipse(Nodes[i][j].xpos + coef*(distance.x*scale), Nodes[i][j].ypos + coef*(distance.y*scale), radius, radius);
      }
      if (mode == 1) {
        strokeWeight(radius/3);
        strokeCap(PROJECT);
        line(Nodes[i][j].xpos + coef*(distance.x*scale), Nodes[i][j].ypos + coef*(distance.y*scale), Nodes[i][j].xpos, Nodes[i][j].ypos);
      }
    }
  }
 
  c = color(170 + wave/2, wave*5, 255, 255);
  fill(c);
  stroke(c);
  strokeWeight(2);
  sum = 0; 
  for (int i = 0; i < song.bufferSize() - 1; i++)
  {
    if (voice) {
      line(i*factor, height/2 + in.left.get(i)*last_sum + 2, i*factor+1, height/2 + in.left.get(i+1)*last_sum + 2);
      sum += abs(in.left.get(i));
    } else {
      line(i*factor, height/2 + song.left.get(i)*last_sum + 2, i*factor+1, height/2 + song.left.get(i+1)*last_sum + 2);
      sum += abs(song.left.get(i));
    }
  }
  last_sum = sum;
  if (controls) {
    fill(255, 0, 255);
    textFont(sourcecode);
    textSize(18);
    text("[ space ] = 改变形式\n[ m ] = 改变模式\n[ v ] = 暂停/播放\n[ a ] = 自动/手动\n[ s ] = 截图\n[ h ] = 隐藏选项\n[ n ] =切歌", 20, 40);
  }
}

minim文档如下:
http://artandtech.aalto.fi/wp-content/uploads/2012/06/minim.pdf
复制地址放入地址栏即可。

  • 18
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Processing是一种编程语言和开发环境,用于创建交互式艺术和设计作品。MinimProcessing的一个音频库,可以用来处理音频数据和创建音乐可视化效果。通过Minim,用户可以读取音频文件、实时录制音频、分析音频数据并将其转换为可视化效果。这使得用户可以在Processing中创建各种音乐可视化作品,包括频谱分析、波形可视化音频反馈等。 ### 回答2: Processing 是一种开源编程语言和集成开发环境,它被广泛用于艺术、设计和教育领域。Processing 中可以使用 Minim 库来实现音乐可视化的效果。 Minim 是一个用于处理音频Processing 库,它可以用来读取、播放和处理音频文件,还可以实现音频效果处理和音乐可视化。它提供了一个简单的接口,可以轻松地将音频数据传递到 Processing 中进行可视化。 通过 Minim 库,我们可以将音乐文件读取到 Processing 中,并对其进行处理和可视化。通常,我们可以使用 FFT(快速傅里叶变换)算法将音频数据转换为频域数据,然后将频域数据可视化为波形、频谱、频率等形式。同时,还可以添加动画效果、颜色变化等渲染效果,从而实现更加生动的音乐可视化效果。 在实际的应用中,音乐可视化可以用于音乐播放器、音乐视频制作、演唱会现场等场合。通过合理的音乐可视化效果,可以增加观众的视听体验,提高音乐表现力和互动性。 总之,Processing 中的 Minim 库为我们提供了实现音乐可视化的便捷工具,可以帮助我们更加轻松地将音乐可视化应用到实际场景中,同时也为我们的音乐创作带来了更多可能性。 ### 回答3: Processing是一款开源的视觉效果编程语言,它可以帮助程序员快速地创建音乐可视化等图形化的交互效果。而MinimProcessing中非常受欢迎的音频库,这个库可以让用户轻松地获取、处理和控制音频数据,实现音乐可视化等效果。 Minim中最重要的类是AudioPlayer,它可以让用户播放音频文件,并获取音频的基本属性,例如采样率、频谱和波形等。这些属性可以作为参数用于创建各种可视化效果,比如音频频率的频域和时间域分析,音频信号的波形可视化等等。 除了AudioPlayer之外,Minim还提供了许多强大的音频处理功能,例如滤波器、均衡器、压缩器等,这些功能可以让用户实现更加复杂和酷炫的音乐可视化效果。除此之外,Minim还支持从实时麦克风输入音频数据,以及对音频数据进行实时修改和处理等功能,让用户能够自由地探索各种音乐可视化效果的可能性。 总的来说,MinimProcessing中非常实用、强大的音频处理库,它能够让用户快速地获取和处理音频数据,实现各种酷炫的音乐可视化效果。如果你正在寻找一个可靠又易于使用的音频处理库,Minim肯定是一个值得尝试的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值