Not Yet Another Music Visualizer
Sylwester Kominek
Not Yet Another Music Visualizer is a real-time music visualizer and spectrum analyzer that analyzes audio played on your computer (e.g., Spotify, YouTube,... games) using Windows audio loopback (WASAPI).
Themes can be switched instantly using keys 0–9. The app allows you to customize many parameters - including bar count, frequency ranges, and colors - via simple configuration files located at:
C:\Users\USER\Documents\NotYetAnotherMusicVisualizer\config
If something goes wrong, you can delete a file or the entire folder and the app will recreate default settings. Each configuration file includes a description of its purpose. You can also create your own custom color themes if the default ones are not enough. For additional help, you can copy the file contents into ChatGPT for guidance.
Not Yet Another Music Visualizer is useful for learning, signal analysis, experimentation, and entertainment.
This project is licensed under the GNU General Public License v2 (GPLv2). It also uses the following third-party libraries:
PortAudio – MIT License
glText – zlib License
FFTW – GNU General Public License v2 (GPLv2)
Below is a detailed technical description of how the application works.
Not Yet Another Music Visualizer is a compiled version of the original open-source project sylwekkominek/SpectrumAnalyzer on GitHub. This version is written entirely in C++ and uses WASAPI loopback for system audio capture.
The core of this project is the AudioSpectrumAnalyzer class, which manages the entire process using several parallel threads for real-time performance:
samplesUpdater – collects audio data using PortAudio and places it into a queue.
fftCalculator – applies a window function and computes the FFT using the FFTW library. It uses Welch’s method with overlapping to increase the number of frames per second (FPS), which is crucial for smooth animation.
processing – processes FFT data, applies gain correction, peak hold, averaging and smoothing.
drafter – converts dBFS levels into vertex offsets sent to the GPU to render the bars.
flowController – monitors the current FPS and dynamically adjusts the amount of overlapping used in Welch’s method. This adaptive algorithm automatically increases or decreases overlap depending on hardware performance and the desired FPS set in config.
Why Welch’s method and overlapping are necessary
To accurately detect low frequencies (such as 20–50 Hz) at the commonly used sampling rate of 44,100 Hz, the application processes audio in chunks of 4096 samples.
This results in a frequency resolution of approximately 10.77 Hz for the FFT (calculated by dividing 44,100 by 4096). In simpler terms, the FFT measures energy in discrete frequency steps of about 10.77 Hz.
Processing 4096 samples at once means a new analysis frame is created roughly every 4096 ÷ 44,100 ≈ 93 milliseconds, which equals about 11 frames per second (FPS) - too low for smooth real-time visualization.
To improve responsiveness without sacrificing low-frequency resolution, the application uses overlapping windows based on Welch’s method. Instead of waiting for a completely new block of 4096 samples, it shifts the analysis window forward by a smaller step (for example, 512 or 1024 samples), reusing much of the previous data. This significantly increases the number of analysis frames per second - allowing for smooth 60 FPS animation while still analyzing long enough segments to preserve detail in the bass range.
Full documentation: https://sylwekkominek.github.io/SpectrumAnalyzer/
Free