4#include "AudioTools/CoreAudio/AudioBasic/Collections/Vector.h"
5#include "AudioTools/AudioLibs/AudioFFT.h"
11struct LEDOutputConfig;
14void fftLEDOutput(LEDOutputConfig *cfg, LEDOutput *matrix);
38 bool is_serpentine_layout =
true;
39 bool is_matrix_vertical =
true;
87 if (p_fft !=
nullptr) {
124 if (x > cfg.
x) x = cfg.
x - 1;
126 if (y > cfg.
y) y = cfg.
y - 1;
128 int index = xy(x, y);
134 if (index > cfg.
x * cfg.
y)
return not_valid;
148 ledXY(x, y) = CRGB::Black;
150 if (x > max_column) max_column = x;
159 if (max_column >= cfg.
x) {
162 if (max_column > cfg.
x - 1) {
163 max_column = cfg.
x - 1;
174 if (p_vol !=
nullptr) {
178 if (p_fft !=
nullptr) {
179 for (
int j = 0;
j < cfg.
x;
j++) {
202 VolumeMeter *p_vol =
nullptr;
203 FFTDisplay *p_fft =
nullptr;
209 for (
int x = 1; x < cfg.x; x++) {
210 for (
int y = 0; y < cfg.y; y++) {
214 for (
int y = 0; y < cfg.y; y++) {
215 ledXY(cfg.x - 1, y) = CRGB::Black;
222 if (cfg.is_serpentine_layout ==
false) {
223 if (cfg.is_matrix_vertical ==
false) {
226 i = cfg.y * (cfg.x - (x + 1)) + y;
230 if (cfg.is_serpentine_layout ==
true) {
231 if (cfg.is_matrix_vertical ==
false) {
234 uint8_t reverseX = (cfg.x - 1) - x;
235 i = (y * cfg.x) + reverseX;
242 i = cfg.y * (cfg.x - (x + 1)) + y;
244 i = cfg.y * (cfg.x - x) - (y + 1);
257 for (
int x = 0; x < cfg->
x; x++) {
259 int currY =
matrix->fftDisplay().getMagnitudeScaled(x, cfg->
y);
260 LOGD(
"x: %d, y: %d", x,
currY);
271 static_cast<float>(cfg->
y));
278 int color =
map(magnitude, 0, 7, 255, 0);