используя FFT в обработке

1

Мне было интересно, может ли кто-нибудь помочь мне. В настоящее время я работаю над проектом, использующим обработку для использования FFT для проекта эстетики. Я хочу сделать это, чтобы пользователь мог импортировать песню, а fft - визуализатором для реагирования и отображения разных цветов на основе песни. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить сам fft работать. Как я могу обработать, чтобы распознать fft?

Вот код fft, который я использую.

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

   //DRAW FFT
  fft.forward(song.mix);
  colorMode(HSB, 255);


  void wavewave() {
  float spread = map(450, 0, width, 1, 21.5);
  float x = 0;
  for (int i = 0; i < song.sampleRate() && x < width; i += spread)
  {
    x = i/spread;
    stroke(map(fft.getFreq(i), 0, 256, 0, 360) * 2, //Hue
    255, //Saturation
    255); //Brightness
    line(x, 512, x, 512 - fft.getFreq(i) * 4);
  }
  //map(value, minimum1, maximum1, minimum2, maximum2);

  x = 0;
  for (int i = 0; i < song.sampleRate() && x < width; i += spread)
  {
    x = i/spread;
    stroke(map(fft.getFreq(i), 0, 256, 0, 360) * 2, //Hue
    255, //Saturation
    255); //Brightness
    line(x, 512, x, 512 + fft.getFreq(i) * 4);
  }
  }

Я продолжаю получать неопознанный токен fft, так как ошибка

 import ddf.minim.spi.*;
 import ddf.minim.signals.*;
 import ddf.minim.*;
 import ddf.minim.analysis.*;
 import ddf.minim.ugens.*;
 import ddf.minim.effects.*;
 import java.io.File;
 import java.io.FilenameFilter;


    color waveColor;
    int waveIncr = 0;
    int counter = 0;
    int songCounter = 0;
    int fadeLevel = 10;


    float buttonX;
    float buttonY;
    float buttonW;
    float buttonH;

    Minim minim;
    AudioPlayer player;
    FFT fft;
    ArrayList<Songs> s;
    int k;

    String filename;

    boolean isSelected = false;

    void setup() {

      s = new ArrayList();

      textSize(24);

      frame.setResizable(false);

      background(255);

      size(600, 600);

      fill(0);
      stroke(0);
      noFill();

      buttonW = 200;
      buttonH = 50;
      buttonX = width - width/2 - buttonW/2;
      buttonY = height/2 - buttonH/2;

      // Minim stuff
      minim = new Minim(this);
    }

    void draw() {

      background(255);
      fill(0);

      rectMode(CORNER);

      rect(buttonX, buttonY, buttonW, buttonH);

      fill(255);

      textAlign(LEFT);
      text("Import File", buttonX+35, buttonY+30);

      if (isSelected) {
       // s.get(k).waveform();
        s.get(k).wavewave();
      }
    }

    void mouseClicked() {
      if (mouseX>buttonX && mouseX < buttonX+buttonW && mouseY > buttonY && mouseY < buttonY+buttonH) {
        selectInput("Import music file", "fileSelected");
      }
    }

    /* Taken from Processing.org */
    void fileSelected(File selection) {
      if (selection == null) {
        println("Window was closed or user hit cancel");
      } 
      else {
        filename = selection.getAbsolutePath();
        s.add(new Songs(player, filename, "Filename"));
        isSelected = true;
      }
    }

    // stop minim and the player.
    void stop() {
      player.close();
      minim.stop();
      super.stop();
    }

    class Songs {
      AudioPlayer song; 
      String directory;
      String songName;
      Songs(AudioPlayer song, String directory, String songName) {

        song=minim.loadFile(directory);    

        this.song=song;
        this.songName=songName;
        song.play();
      }



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

       //DRAW FFT
      fft.forward(song.mix);
      colorMode(HSB, 255);


      void wavewave() {
      float spread = map(450, 0, width, 1, 21.5);
      float x = 0;
      for (int i = 0; i < song.sampleRate() && x < width; i += spread)
      {
        x = i/spread;
        stroke(map(fft.getFreq(i), 0, 256, 0, 360) * 2, //Hue
        255, //Saturation
        255); //Brightness
        line(x, 512, x, 512 - fft.getFreq(i) * 4);
      }
      //map(value, minimum1, maximum1, minimum2, maximum2);

      x = 0;
      for (int i = 0; i < song.sampleRate() && x < width; i += spread)
      {
        x = i/spread;
        stroke(map(fft.getFreq(i), 0, 256, 0, 360) * 2, //Hue
        255, //Saturation
        255); //Brightness
        line(x, 512, x, 512 + fft.getFreq(i) * 4);
      }
      }


    }
  • 0
    Попробуйте свести код к минимальному рабочему примеру и добавьте тег с языком, который вы используете.
  • 0
    Там нет ничего, чтобы уменьшить это. Единственное, что не работает в коде - это fft. Что касается тега, то это уже говорит об обработке.
Показать ещё 2 комментария
Теги:
music
fft
processing
visualizer

1 ответ

1
Лучший ответ

У вас, похоже, есть синтаксические ошибки. Здесь ваш код немного изменился:

import ddf.minim.spi.*;
import ddf.minim.signals.*;
import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.ugens.*;
import ddf.minim.effects.*;
import java.io.File;
import java.io.FilenameFilter;


color waveColor;
int waveIncr = 0;
int counter = 0;
int songCounter = 0;
int fadeLevel = 10;


float buttonX;
float buttonY;
float buttonW;
float buttonH;

Minim minim;
AudioPlayer player;
FFT fft;
ArrayList<Songs> s;
int k;

String filename;

boolean isSelected = false;

void setup() {

  s = new ArrayList();

  textSize(24);

  frame.setResizable(false);

  background(255);

  size(600, 600);

  fill(0);
  stroke(0);
  noFill();

  buttonW = 200;
  buttonH = 50;
  buttonX = width - width/2 - buttonW/2;
  buttonY = height/2 - buttonH/2;

  // Minim stuff
  minim = new Minim(this);
}

void draw() {

  background(255);
  fill(0);

  rectMode(CORNER);

  rect(buttonX, buttonY, buttonW, buttonH);

  fill(255);

  textAlign(LEFT);
  text("Import File", buttonX+35, buttonY+30);

  if (isSelected) {
    // s.get(k).waveform();
    s.get(k).wavewave();
  }
}

void mouseClicked() {
  if (mouseX>buttonX && mouseX < buttonX+buttonW && mouseY > buttonY && mouseY < buttonY+buttonH) {
    selectInput("Import music file", "fileSelected");
  }
}

/* Taken from Processing.org */
void fileSelected(File selection) {
  if (selection == null) {
    println("Window was closed or user hit cancel");
  } 
  else {
    filename = selection.getAbsolutePath();
    s.add(new Songs(player, filename, "Filename"));
    isSelected = true;
  }
}

// stop minim and the player.
void stop() {
  player.close();
  minim.stop();
  super.stop();
}

class Songs {
  AudioPlayer song; 
  String directory;
  String songName;
  Songs(AudioPlayer song, String directory, String songName) {

    song=minim.loadFile(directory);    

    this.song=song;
    this.songName=songName;
    song.play();


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

  void wavewave() {
    //DRAW FFT
    fft.forward(song.mix);
    colorMode(HSB, 255);

    float spread = map(450, 0, width, 1, 21.5);
    float x = 0;
    for (int i = 0; i < song.sampleRate() && x < width; i += spread)
    {
      x = i/spread;
      stroke(map(fft.getFreq(i), 0, 256, 0, 360) * 2, //Hue
      255, //Saturation
      255); //Brightness
      line(x, 512, x, 512 - fft.getFreq(i) * 4);
    }
    //map(value, minimum1, maximum1, minimum2, maximum2);

    x = 0;
    for (int i = 0; i < song.sampleRate() && x < width; i += spread)
    {
      x = i/spread;
      stroke(map(fft.getFreq(i), 0, 256, 0, 360) * 2, //Hue
      255, //Saturation
      255); //Brightness
      line(x, 512, x, 512 + fft.getFreq(i) * 4);
    }
  }
}

Вы должны попробовать режим PDE X, может помочь вам с ошибками в будущем, плюс это потрясающе!

  • 0
    Большое спасибо за Вашу помощь. Это мне очень помогло.
  • 0
    Круто, не стесняйтесь голосовать / ставить оценки, как считаете нужным;)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню