Audio 我如何制作一个充满点(白色等级基于振幅)和纹理的图形,以适应不断演变的弧线?

Audio 我如何制作一个充满点(白色等级基于振幅)和纹理的图形,以适应不断演变的弧线?,audio,processing,visualization,Audio,Processing,Visualization,我正在做一个音频可视化,基本上应该是一个圆形的光谱图。我有一张显示频率的图表,还有一条弧线,它根据时间的推移而变化。现在,我想根据每个频率的振幅用白点填充弧,就像这里:。显然,我需要制作一个由点填充的图形,这些点根据振幅从白色变为黑色。然后我需要用这个图形对圆弧进行纹理处理。有人知道怎么做吗 import ddf.minim.*; import ddf.minim.analysis.*; import ddf.minim.effects.*; import ddf.minim.signals.*

我正在做一个音频可视化,基本上应该是一个圆形的光谱图。我有一张显示频率的图表,还有一条弧线,它根据时间的推移而变化。现在,我想根据每个频率的振幅用白点填充弧,就像这里:。显然,我需要制作一个由点填充的图形,这些点根据振幅从白色变为黑色。然后我需要用这个图形对圆弧进行纹理处理。有人知道怎么做吗

import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import ddf.minim.signals.*;
import ddf.minim.spi.*;
import ddf.minim.ugens.*;

Minim minim;
AudioPlayer song;
FFT fft;
PGraphics pg;
PShape arc;

float deg = 90;
float rad = radians(deg);

void setup()
{
  size(1000, 1000);

  minim = new Minim(this);
  song = minim.loadFile("Anthology.mp3");
  song.play();

  fft = new FFT(song.bufferSize(), song.sampleRate());

  pg = createGraphics(width, height);
}

void draw()
{
  background(0);
  fft.forward(song.mix);

  for (int i = 0; i < fft.specSize(); i++)
  {
    pushMatrix();
    stroke(255);
    line(i, height, i, height - fft.getBand(i)*0.5);
    popMatrix();
    println(fft.getBand(i));

    //Map Amplitude to 0 → 255, fill with points and color them
    float brightness = map(fft.getBand(i), -1, 1, 0, 255);
    pg.beginDraw();
    pg.endDraw();

    fill(255, 255, 255,);
    noStroke();
    float evolution = radians(map(song.position(), 0, song.length(), 90, 450));
    //texture(pg);
    arc(height/2, height/2, height-100, height-100, rad, evolution, PIE);
  }
}
导入ddf.minim.*;
进口ddf.微量分析。*;
进口ddf.最小影响。*;
输入ddf最小信号。*;
进口ddf.minim.spi.*;
进口ddf.minim.ugens.*;
极小极小;
音频播放器歌曲;
FFT;
PGraphics-pg;
形状弧;
浮动度数=90;
浮动半径=弧度(度);
无效设置()
{
大小(10001000);
最小值=新的最小值(本);
song=mini.loadFile(“Anthology.mp3”);
歌曲。游戏();
fft=新的fft(song.bufferSize(),song.sampleRate());
pg=createGraphics(宽度、高度);
}
作废提款()
{
背景(0);
fft.forward(song.mix);
对于(int i=0;i
根据您的代码,很少有概念看起来不清楚:

import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import ddf.minim.signals.*;
import ddf.minim.spi.*;
import ddf.minim.ugens.*;

Minim minim;
AudioPlayer song;
FFT fft;

PGraphics pg;

void setup()
{
  size(600, 600, P2D);

  minim = new Minim(this);
  song = minim.loadFile("jingle.mp3", 1024);
  song.loop();

  fft = new FFT(song.bufferSize(), song.sampleRate());
  // optional: use logarithmic averages: clover to how we perceive sound
  fft.logAverages( 30, 6 );
  // setup pg graphics layer disable fill, make points stroke thick
  pg = createGraphics(width, height);
  pg.beginDraw();
  pg.strokeWeight(3);
  pg.noFill();
  pg.endDraw();
}

void draw()
{
  background(0);
  image(pg, 0, 0);
  // perform FFT on stereo mix
  fft.forward(song.mix);
  // center coordinates
  float cx = width * 0.5;
  float cy = height * 0.5;
  // count FFT bins
  int fftSpecSize = fft.specSize();
  // calculate the visual size for representing an FFT bin
  float sizePerSpec = (height * 0.5 ) / fftSpecSize;

  stroke(255);
  noFill();

  // start @editing@ the pg layer (once
  pg.beginDraw();

  // start the FFT graph shape
  beginShape();

  // for each FFT bin
  for (int i = 0; i < fftSpecSize; i++)
  {
    // get the vands in reverse order (low frequencies last)
    float fftBand = fft.getBand(fftSpecSize - i - 1);
    // scale FFT bin value to pixel/render size
    float xOffset = fftBand * 10;
    // map FFT bins to 0-255 brightness levels (note 35 may differ 
    float brightness = map(fftBand, 0, 35, 0, 255);

    // draw the line graph vertex
    vertex(cx + xOffset, cy + sizePerSpec * i);
    // map song position (millis played) to 360 degrees in radians (2 * PI)
    // add HALF_PI (90 degrees) because  0 degrees points to the right and drawing should start pointing down (not right)
    //float angle = map(song.position(), 0, song.length(), 0, TWO_PI) + HALF_PI;
    // as a test map it to a lower value
    float angle = (frameCount * 0.0025) + HALF_PI;
    // map radius from FFT index
    float radius = map(i, 0, fftSpecSize - 1, 0, width * 0.5);
    // use mapped brightness as point stroke 
    pg.stroke(brightness);
    // use polar coordinates mapped from the centre
    pg.pushMatrix();
    pg.translate(cx,cy);
    pg.rotate(angle);
    pg.point(radius,0);
    pg.popMatrix();
    // alternatively use polar to cartesian coordinate conversion
    // x = cos(angle) * radius
    // y = sin((angle) * radius
    // cx, cy are added to offset from center
    //pg.point(cx + (cos(angle) * radius),
    //         cy + (sin(angle) * radius));
  }
  // finish FFT graph line
  endShape();
  // fnish pg layer
  pg.endDraw();
}
  • 如果计划在
    pg
    PGraphics实例中渲染圆弧,请使用
    符号访问pg,并在
    beginDraw()
    /
    endDraw()调用之间调用绘图函数。目前,pg中没有任何渲染内容,pg也没有使用
    image()
    在任何地方渲染。有关更多详细信息,请参阅参考,运行示例代码/调整它/打破它/修复它/理解它
  • 类似地,
    p形状弧
    被创建,但未使用
  • 有人试图将
    pg
    用作纹理,但纹理贴图不清楚
  • 如果同时使用
    PGraphics
    PShape
    会造成混淆,那么单独使用
    PGraphics
    可以获得类似效果:只需渲染一些较大的灰点而不是圆弧。它的效果不会完全相同,但它的外观会非常相似,而且省力

    以下是基于您的代码的变体:

    import ddf.minim.*;
    import ddf.minim.analysis.*;
    import ddf.minim.effects.*;
    import ddf.minim.signals.*;
    import ddf.minim.spi.*;
    import ddf.minim.ugens.*;
    
    Minim minim;
    AudioPlayer song;
    FFT fft;
    
    PGraphics pg;
    
    void setup()
    {
      size(600, 600, P2D);
    
      minim = new Minim(this);
      song = minim.loadFile("jingle.mp3", 1024);
      song.loop();
    
      fft = new FFT(song.bufferSize(), song.sampleRate());
      // optional: use logarithmic averages: clover to how we perceive sound
      fft.logAverages( 30, 6 );
      // setup pg graphics layer disable fill, make points stroke thick
      pg = createGraphics(width, height);
      pg.beginDraw();
      pg.strokeWeight(3);
      pg.noFill();
      pg.endDraw();
    }
    
    void draw()
    {
      background(0);
      image(pg, 0, 0);
      // perform FFT on stereo mix
      fft.forward(song.mix);
      // center coordinates
      float cx = width * 0.5;
      float cy = height * 0.5;
      // count FFT bins
      int fftSpecSize = fft.specSize();
      // calculate the visual size for representing an FFT bin
      float sizePerSpec = (height * 0.5 ) / fftSpecSize;
    
      stroke(255);
      noFill();
    
      // start @editing@ the pg layer (once
      pg.beginDraw();
    
      // start the FFT graph shape
      beginShape();
    
      // for each FFT bin
      for (int i = 0; i < fftSpecSize; i++)
      {
        // get the vands in reverse order (low frequencies last)
        float fftBand = fft.getBand(fftSpecSize - i - 1);
        // scale FFT bin value to pixel/render size
        float xOffset = fftBand * 10;
        // map FFT bins to 0-255 brightness levels (note 35 may differ 
        float brightness = map(fftBand, 0, 35, 0, 255);
    
        // draw the line graph vertex
        vertex(cx + xOffset, cy + sizePerSpec * i);
        // map song position (millis played) to 360 degrees in radians (2 * PI)
        // add HALF_PI (90 degrees) because  0 degrees points to the right and drawing should start pointing down (not right)
        //float angle = map(song.position(), 0, song.length(), 0, TWO_PI) + HALF_PI;
        // as a test map it to a lower value
        float angle = (frameCount * 0.0025) + HALF_PI;
        // map radius from FFT index
        float radius = map(i, 0, fftSpecSize - 1, 0, width * 0.5);
        // use mapped brightness as point stroke 
        pg.stroke(brightness);
        // use polar coordinates mapped from the centre
        pg.pushMatrix();
        pg.translate(cx,cy);
        pg.rotate(angle);
        pg.point(radius,0);
        pg.popMatrix();
        // alternatively use polar to cartesian coordinate conversion
        // x = cos(angle) * radius
        // y = sin((angle) * radius
        // cx, cy are added to offset from center
        //pg.point(cx + (cos(angle) * radius),
        //         cy + (sin(angle) * radius));
      }
      // finish FFT graph line
      endShape();
      // fnish pg layer
      pg.endDraw();
    }
    
    导入ddf.minim.*;
    进口ddf.微量分析。*;
    进口ddf.最小影响。*;
    输入ddf最小信号。*;
    进口ddf.minim.spi.*;
    进口ddf.minim.ugens.*;
    极小极小;
    音频播放器歌曲;
    FFT;
    PGraphics-pg;
    无效设置()
    {
    尺寸(600,600,P2D);
    最小值=新的最小值(本);
    song=mini.loadFile(“叮当声.mp3”,1024);
    song.loop();
    fft=新的fft(song.bufferSize(),song.sampleRate());
    //可选:使用对数平均值:我们如何感知声音
    对数平均值(30,6);
    //设置pg图形层禁用填充,使点笔划变粗
    pg=createGraphics(宽度、高度);
    pg.beginDraw();
    pg.冲程重量(3);
    pg.noFill();
    pg.endDraw();
    }
    作废提款()
    {
    背景(0);
    图像(pg,0,0);
    //对立体声混音执行FFT
    fft.forward(song.mix);
    //中心坐标
    浮动cx=宽度*0.5;
    浮动cy=高度*0.5;
    //清点垃圾桶
    int fftSpecSize=fft.specSize();
    //计算表示FFT箱的可视大小
    浮动尺寸PERSPEC=(高度*0.5)/fftSpecSize;
    中风(255);
    noFill();
    //开始@编辑@pg层(一次
    pg.beginDraw();
    //启动FFT图形形状
    beginShape();
    //对于每个FFT仓
    对于(int i=0;i
    注意

    • 您可能需要将
      single.mp3
      更改为音频文件名
    • 为了进行短道测试,我使用了
      角度的任意映射(与代码中的
      进化
      相同):有一个注释版本考虑了轨迹持续时间
    • 灰度点位置使用坐标变换进行渲染。请务必仔细阅读,并记住变换的顺序很重要。或者,有一个版本可以执行s