JavaFX с аудио визуализатор уверены о MVC / наблюдатель / Listerner шаблонов проектирования


У меня есть класс mp3player, которая выполняет быстрое преобразование Фурье и заносит значения в массив float (под названием группы). Затем каждые 20мс это notifys наблюдатель (VisualizerController), который затем использует getBands (), чтобы получить массив float и использовать его для рисования на холсте.

Мне кажется, что это уродливый способ сделать это, но я не знаю, как это сделать лучше.

Вот весь исходный код на GitHub

Это функция обновления в VisualizerController обработкой чертеж:

@Override
public void update(Observable o, Object arg) {
    if (saturation > 0.5) saturation -= 0.02;
    if (brightness > 0.8) brightness -= 0.02;

    bands = player.getBands();

    if (circle) {
        if (bars) drawCircleBars();
        else drawCircleLine();
    } else {
        if (bars) drawStraightBars();
        else drawStraightLine();
    }

    if (player.isBeat()) {
        saturation = 1.0;
        brightness = 1.0;
    }
}

И вот как это выглядит на CD и mp3player, где я получаю частот и уведомить наблюдателей:

private class FFTThread extends Thread {

    @Override
    public void run() {

        while (!isInterrupted()) {

            fft.forward(audioPlayer.getMix());
            for (int i = 0; i < bands.length; i++) bands[i] = fft.getBand(i);

            beatDetect.detect(audioPlayer.getMix());
            beat = beatDetect.isOnset();

            progess = audioPlayer.position() * 1.0 / audioPlayer.length();

            setChanged();
            notifyObservers();

            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                interrupt();
            }
        }
    }
}

public float[] getBands() {
    return bands;
}

public boolean isBeat() {
    return beat;
}


Комментарии