# pulse-visualizer - Audio Visualizer
## What Even Is This?
Ever wanted to *see* your music? Pulse is a real-time audio visualizer inspired by [MiniMeters](https://minimeters.app/). 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.
## Features
- Experimental colorful beam
- Real-time, low-latency audio visualization
- CRT phosphor emulation with GPU compute shaders (glow, persistence, all the retro stuff)
- Curved screen, vignette, grain, chromatic aberration (toggle as you like)
- Blur, light spread, and overdrive are all tweakable
- 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, interpolation)
- Peak and LUFS (shortterm, momentary, integrated)
- VU meter (digital and analog)
- Configurable order at runtime
- Settings menu (press `m` to 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/`)
## Installation
### Arch Linux (AUR)
Just grab it from the AUR as `pulse-visualizer-git`:
```bash
yay -S pulse-visualizer-git
```
### NixOS
Download `pulse-visualizer.nix` and add this to your flake:
```nix
nixpkgs.config.packageOverrides = pkgs: {
pulse-visualizer = pkgs.callPackage ./pulse-visualizer.nix { };
};
environment.systemPackages = [ pkgs.pulse-visualizer ];
```
### Nix
Change directory to the project root and add it to your shell via:
```bash
nix-shell
```
### Other Distros
You can get the binary from the [Releases page](https://github.com/Beacroxx/pulse-visualizer/releases/latest). There is an install script in the tarball, make sure to run it as root before running the binary:
```bash
tar -xvf pulse-visualizer-.tar.gz
cd pulse-visualizer-
chmod +x install.sh
sudo ./install.sh
```
## Dependencies & Platform Support
- SDL3
- PulseAudio **or** PipeWire (0.3+)
- FFTW3
- FreeType2
- OpenGL
- GLEW
- YAML-CPP
- libebur128
**Works on:**
- Linux (PulseAudio or PipeWire)
- BSD (PulseAudio)
- Windows (WASAPI)
## Configuration
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](CONFIGURATION.md).
### Theming
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.
## Usage
Just run:
```bash
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
## Building
If you want to build from source, you can do so with the following commands:
#### Build dependencies
- C++17 compiler
- CMake 3.10+
- Ninja-build
- Development headers for: SDL3, PulseAudio or PipeWire (0.3+), FFTW3, FreeType2, GLEW, YAML-CPP, libebur128
Fedora:
```sudo dnf5 install SDL3-devel fftw3-devel freetype-devel glew-devel yaml-cpp-devel ninja pipewire-devel libebur128-devel```
Debian:
```sudo apt install clang cmake libsdl3-dev libfftw3-dev libfreetype-dev libglew-dev libyaml-cpp-dev ninja libebur128-dev```
```bash
mkdir build
cd build
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ..
ninja
sudo ninja install
```
#### Note
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.
## Contributing & Support
Want to help? PRs welcome! Please clang-format your code before submitting (see the clang-format file). Sorry for the chaos.
See [CONTRIBUTORS](CONTRIBUTORS.md) for a list of contributors to this project.
If you like pulse-visualizer, you can buy me a coffee at [ko-fi.com/beacrox](https://ko-fi.com/beacrox).
## License
This project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details.
## Acknowledgments
- [MiniMeters](https://minimeters.app/) for inspiration
- [Richard Andersson](https://richardandersson.net/?p=350) for the Phosphor effect
- [JetBrains](https://www.jetbrains.com/) and the [Nerd Fonts](https://www.nerdfonts.com/) project for the JetBrains Mono Nerd Font
- SDL3, PulseAudio, PipeWire, FFTW, FreeType, libebur128, YAML-CPP, and everyone else who made this possible