o.mp4
Ever wanted to see your music? Pulse is a real-time audio visualizer inspired by MiniMeters. It turns whatever your system is playing into eye-candy (or at least, that's the idea). Built in C++ with SDL3, OpenGL, PulseAudio, and FFTW, Pulse tries to make your music look as cool as it sounds. Unless your system sucks, then, well, good luck.
- Experimental colorful beam
- Real-time, low-latency audio visualization
- CRT phosphor emulation with GPU compute shaders (glow, persistence, etc)
- Curved screen, vignette, grain, chromatic aberration (toggle as you like)
- Blur, light spread, and overdrive are all configurable
- Reflections on curved screen
- Multiple visualizer styles:
- Lissajous curve (with fancy spline interpolation and stretch modes)
- Oscilloscope (gradient modes, pitch following, cycle limiting)
- FFT/Constant-Q (mid/side, right/left, sharp/flat note key)
- Spectrogram (log/linear scale, iterative reassignment)
- Peak and LUFS (shortterm, momentary, integrated)
- VU meter (digital and analog)
- Configurable order at runtime
- Settings menu (press
mto open) - Separate FFT/CQT threads for mid/side channels
- Extensive SIMD (AVX2) acceleration
- Live config and theme hot-reloading (no restart needed, mostly)
- Draggable splitters for custom layout
- Cross-platform: PulseAudio and PipeWire
- Hardware-accelerated graphics (OpenGL)
- A pile of ready-made themes (see
themes/) - Plugin support
Just grab it from the AUR as pulse-visualizer-git:
yay -S pulse-visualizer-gitUse the unstable channel for packages:
environment.systemPackages = [ pkgs.pulse-visualizer ];You can get the binary from the Releases page. There is an install script in the tarball, make sure to run it as root before running the binary:
tar -xvf pulse-visualizer-<version>.tar.gz
cd pulse-visualizer-<version>
chmod +x install.sh
sudo ./install.sh- SDL3
- SDL3_image
- PulseAudio or PipeWire (0.3+)
- FFTW3
- FreeType2
- OpenGL
- YAML-CPP
- libebur128
- libcurl
Works on:
- Linux (PulseAudio or PipeWire)
- BSD (PulseAudio)
- Windows (WASAPI)
pulse-visualizer now has a settings menu! You can open it by pressing m.
You can also edit the config file directly.
For comprehensive configuration documentation, see CONFIGURATION.md.
You can pick a theme in the Window page in the settings menu.
You can also create your own themes by copying a template and editing the colors.
Theme files support a bunch of color and property keys
(see _TEMPLATE.txt for all options). All the main colors are required.
You can fine-tune visualizer-specific stuff too.
Theme and config changes reload live.
Pulse has experimental plugin support.
Plugins are .so/.dll files dropped into ~/.config/pulse-visualizer/plugins/ on linux
and C:\Users\<username>\.config\pulse-visualizer\plugins on Windows
and can draw using a small rendering API, handle SDL events, and access config/theme data.
See PLUGINS.md for details on the plugin lifecycle, required symbols, and the PvAPI interface.
Just run:
pulse-visualizer- Drag splitters to resize/rearrange visualizers
- Lissajous will enforce a square aspect ratio
- Hover FFT for real-time frequency, dB, and note readout
- All config and theme changes are live, no restart needed
If you want to build from source, you can do so with the following commands:
- C++20 compiler
- CMake 3.10+
- Ninja-build
- Development headers for: SDL3, SDL3_image, PulseAudio or PipeWire (0.3+), FFTW3, FreeType2, YAML-CPP, libebur128, libcurl
Fedora:
sudo dnf5 install SDL3-devel SDL3_image-devel fftw3-devel freetype-devel yaml-cpp-devel ninja pipewire-devel libebur128-devel libcurl-devel
Debian:
sudo apt install clang cmake libsdl3-dev libsdl3-image-dev libfftw3-dev libfreetype-dev libyaml-cpp-dev ninja libebur128-dev libcurl-dev
mkdir build
cd build
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ..
ninja
sudo ninja installNixOS:
- If you want to try out the latest version:
git clone https://github.com/Audio-Solutions/pulse-visualizer
cd pulse-visualizer
nix-shell- To install download
pulse-visualizer.nixand add this to your configuration.nix
nixpkgs.config.packageOverrides = pkgs: {
pulse-visualizer = pkgs.callPackage ./pulse-visualizer.nix { };
};
environment.systemPackages = [ pkgs.pulse-visualizer ];- With flakes:
inputs.pulse-visualizer.url = "github:Audio-Solutions/pulse-visualizer";
environment.systemPackages = [ pulse-visualizer.packages.${system}.default ];
# or
nixpkgs.overlays = [ pulse-visualizer.overlays.default ];
environment.systemPackages = [ pkgs.pulse-visualizer ];Do not build with sudo ninja install.
This will cause ownership and permission issues.
Please run the build as a regular user (ninja)
and only use sudo ninja install for the install step.
Want to help? PRs welcome! Please clang-format your code before submitting (see the clang-format file). Sorry for the chaos.
See CONTRIBUTORS for a list of contributors to this project.
If you like pulse-visualizer, you can buy me a coffee at ko-fi.com/beacrox.
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
- MiniMeters for inspiration
- Richard Andersson for the Phosphor effect
- JetBrains and the Nerd Fonts project for the JetBrains Mono Nerd Font
- SDL3, PulseAudio, PipeWire, FFTW, FreeType, libebur128, YAML-CPP, and everyone else who made this possible