LEDControl/src/main/java/de/zuim/ledcontrol/effects/AudioFFTEffect.java
2021-03-14 12:18:00 +01:00

64 lines
1.7 KiB
Java

package de.zuim.ledcontrol.effects;
import java.awt.*;
import java.util.Arrays;
import static de.zuim.ledcontrol.LEDControl.HEIGHT;
import static de.zuim.ledcontrol.LEDControl.WIDTH;
public class AudioFFTEffect extends AudioEffect {
@Override
public String getDescription() {
return "Audio FFT";
}
@Override
public void render(long timeDelta, Graphics g) {
double[] avg = null;
if (!getData().isEmpty()) {
avg = new double[getMagnitudeLength()];
for (int i = 0; i < getMagnitudeLength(); i++) {
for (int j = 0; j < getData().size(); j++) {
avg[i] += getData().get(j).magnitudes[i];
}
avg[i] = avg[i] / getData().size();
}
getData().clear();
getData().add(new AudioData(avg, -1));
for (int x = 0; x < WIDTH; x++) {
double val = 0;
int ignoreMagnitudes = 6;
double base = Math.exp(Math.log(avg.length ) / (WIDTH + ignoreMagnitudes));
int intervalStart = (int) Math.pow(base, x + ignoreMagnitudes),
intervalEnd = (int) Math.pow(base, x + ignoreMagnitudes + 1);
//System.out.println(x+" "+intervalStart+"-"+intervalEnd);
for (int magPos = intervalStart; magPos < intervalEnd; magPos++) {
val += avg[magPos];
}
val /= intervalEnd - intervalStart;
/*
int magnitudesInPixel = (avg.length / WIDTH) / 2;
for (int sample = 0; sample < magnitudesInPixel; sample++) {
val += avg[x * magnitudesInPixel + sample];
}
val /= (double) avg.length / WIDTH;*/
val*=1+Math.pow(2, x/((double)WIDTH*.5));
int y = (int) Math.min(HEIGHT, Math.round(Math.max(1, val + 10)) / 30);
g.setColor(new Color(Math.abs(y) + 1, 2, 0));
g.drawRect(x, HEIGHT - y, 0, HEIGHT);
g.setColor(new Color(Math.abs(y), 0, 0));
g.drawRect(x, HEIGHT - y, 0, 0);
}
}
}
}