Попытка рисовать на холсте с подбором частот - обработка - PullRequest
0 голосов
/ 01 июля 2018

У меня проблема с сохранением рисунка на холсте после того, как я перестал играть на струне.

Итак, у меня есть карта, чтобы выбрать частоту из моего микрофона, и когда она услышит эту частоту, она нарисует линию на холсте. Единственная проблема в том, что он исчезает после остановки частоты.

Как сохранить линию на холсте, а затем нарисовать больше линий с другими частотами?

Вот код:

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--;
          }



}

1 Ответ

0 голосов
/ 02 июля 2018

Как правило, вы хотите сохранить предыдущие частоты в структуре данных, например, в массиве или 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, чтобы нарисовать их. Вы хотели бы сделать что-то подобное с вашими частотами.

...