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