Java 尝试在画布上提取频率-处理

Java 尝试在画布上提取频率-处理,java,audio,canvas,processing,frequency,Java,Audio,Canvas,Processing,Frequency,在我停止演奏弦乐后,我在画布上保持绘画时遇到问题 所以我把它映射成从我的麦克风上拾取一个频率,当它听到这个频率时,它会在画布上画一条线。唯一的问题是在频率停止后它消失了 我如何在画布上保持线条,然后用其他频率绘制更多线条 代码如下: import ddf.minim.*; import ddf.minim.analysis.*; Minim minim; AudioInput in; FFT fft; float highestAmp=0,freq,frequency; float ampli

在我停止演奏弦乐后,我在画布上保持绘画时遇到问题

所以我把它映射成从我的麦克风上拾取一个频率,当它听到这个频率时,它会在画布上画一条线。唯一的问题是在频率停止后它消失了

我如何在画布上保持线条,然后用其他频率绘制更多线条

代码如下:

import ddf.minim.*;
import ddf.minim.analysis.*;

Minim minim;
AudioInput in;
FFT fft;
float highestAmp=0,freq,frequency;
float amplitude;
int x = 0;
int y = 0;
int p = x;
int o = y;

void setup(){
        size(512, 200);
        background(0);

        // initialize Minim and catching the output
        minim = new Minim(this);
        in = minim.getLineIn(Minim.MONO, 4096*8, 44100);
        fft = new FFT(in.left.size(), 44100);

}


void draw() {
      highestAmp=0;
      amplitude=0;
      frequency = 0;
      fft.forward(in.left);
      x = constrain(x,0,width);
      y = constrain(y,0,height);


      //searching from 0Hz to 20000Hz. getting the band, and from the band the frequency
     for(int i = 0; i < 20000; i++) {
            amplitude = fft.getFreq(i);
            if (amplitude > highestAmp){
                highestAmp = amplitude;
                frequency = i;
            }
          }
          //write the frequency on the screen
          fill(255);
          background(0);
          text(frequency,200,100);
          text(amplitude,400,100);
          if (frequency > 340.00 & frequency < 360){
            stroke(28,125,85);
            line(x, y, p, o);
            x++;
            y++;

          }

          if (frequency > 320.00 & frequency < 340){
            stroke(255,0,166);
            line(x, y, p, o);
            x++;
            y--;
          }



}
导入ddf.minim.*;
进口ddf.微量分析。*;
极小极小;
音频输入;
FFT;
浮动高电平放大器=0,频率,频率;
浮动幅度;
int x=0;
int y=0;
int p=x;
int o=y;
无效设置(){
大小(512200);
背景(0);
//初始化Minim并捕获输出
最小值=新的最小值(本);
in=最小的getLineIn(最小的MONO,4096*841100);
fft=新的fft(in.left.size(),44100);
}
作废提款(){
highestAmp=0;
振幅=0;
频率=0;
fft.正向(在左侧);
x=约束(x,0,宽度);
y=约束(y,0,高度);
//从0Hz到20000Hz搜索。获取频带,并从频带获取频率
对于(int i=0;i<20000;i++){
振幅=fft.getFreq(i);
如果(振幅>最高振幅){
highestAmp=振幅;
频率=i;
}
}
//在屏幕上写下频率
填充(255);
背景(0);
文本(频率,200100);
文本(振幅,400100);
中频(频率>340.00,频率<360){
中风(28125,85);
线(x,y,p,o);
x++;
y++;
}
中频(频率>320.00,频率<340){
中风(255,0166);
线(x,y,p,o);
x++;
y--;
}
}

通常,您希望在数据结构中存储以前的频率,如数组或ArrayList。然后,您将循环该数据结构并绘制每个先前的频率。下面是一个简单的例子:

ArrayList<PVector> previousPoints = new ArrayList<PVector>();

void draw(){
  background(32);

  previousPoints.add(new PVector(mouseX, mouseY));

  for(PVector point : previousPoints){
    ellipse(point.x, point.y, 20, 20);
  }
}
ArrayList previousPoints=new ArrayList();
作废提款(){
背景(32);
添加(新的PVector(mouseX,mouseY));
对于(PVector点:以前的点){
椭圆(点x,点y,20,20);
}
}

此示例程序存储以前的鼠标位置,并在
ArrayList
上循环以绘制它们。您可能希望对您的频率执行类似的操作。

您好,感谢您的回复,我将研究您的示例,看看如何在代码中实现,再次感谢:)