64 lines
1.7 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|