31-Band Filter Rewrite for AudioReactive on ESP32-P4

Nov 01, 2026 Last reply: 1 day ago 3 Replies
Jump to replies (3)

The trickiest part here was the muddy bass separation in the stock AudioReactive code, and the maker went at it head-on by ditching FFT analysis completely. Instead of a frequency transform, the audio now runs through 31 software filter banks spaced at one-third octave intervals from 20Hz up to 20000Hz. That is a serious rework of the core, and the result shows: every band stands on its own, and the onsets come through clean and clearly separated.



The whole thing runs on an Olimex ESP32-P4-PC board, whose HDMI output drives a monitor in the demo. There is an ES8311 codec on the board itself, with two profiles: one for the onboard mics and one for line-level signal arriving on the TRRS mic input. The effect shown, GEQ PPA, works in decibels, so all the tuning happens in dB rather than raw levels.



What stands out to me is the validation method. A TC Electronic RTA with 31 bands sits beside the effect, letting the maker map each band one-to-one and confirm the output tracks the meter. After setting an attack value of 1 and a decay of 300, the two screens agree closely. The demo does look jittery, but that is explained: dynamics were switched off so the effect pulls as fast as possible for comparison, and the RTA itself smooths internally. The maker describes the approach as extracting clean bands rather than filtering.



One thing still open: the settings need more work before they are friendly for everyday users. The code sits in a GitHub branch, and the maker says an AI coding assistant helped write it and grew the scope along the way. Aiming this at pro use with line-in hardware seems like a sensible direction to me.


Replacing FFT with fixed filter banks is the clever bit here. One-third octave spacing across 20Hz to 20000Hz gives a well-defined grid, so each band can be checked against a matching band on the RTA. The trade-off is that the settings are still raw, and the maker has said they need work before regular users can handle them comfortably.

Question for the maker: on the ES8311 codec, how does switching between the two profiles work in practice? Is the mic profile and the line-level profile on the TRRS input something you pick in software each time, or does the board detect which source is connected? I am curious how that handover happens on the P4 board.

A concrete idea for the next step: since the maker already has a Pro DJ Link usermod pulling beat-grid and beat-in-bar data from a Pioneer network, that stream could drive a chase synced to the strobe effect that flashes each beat. Pairing clean 31-band GEQ output with proper beat data would make timed sequences far tighter than anything audio-derived alone could manage.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required