This guide provides comprehensive documentation for configuring Pulse Audio Visualizer.
The configuration file is located at ~/.config/pulse-visualizer/config.yml for
Linux and C:\Users\<username>\.config\pulse-visualizer\config.yml for Windows
and uses YAML format.
- Start Pulse at least once to generate the config file
- Edit the configuration file to match your system
Most config options update live, so you can change them without restarting Pulse, but some may require a restart.
Boolean configuration options accept multiple formats:
True values:
trueyeson1
False values:
falsenooff0
Note: Some boolean options that previously existed are now implied by their
respective int/float counterparts being nonzero. For example,
phosphor.screen.curvature_enabled: true is implied when
phosphor.screen.curvature > FLT_EPSILON (FLT_EPSILON is 1e-6).
Controls how audio is captured, processed, and displayed.
audio:
# Audio sample rate in Hz (must match your system's audio output)
# Common values: 44100, 48000, 96000
sample_rate: 48000
# Threshold below which audio is considered silent (in dB)
# Lower values = visualizer will draw even at lower volumes
silence_threshold: -90.0
# Audio backend: "pulseaudio", "pipewire", "wasapi", or "auto" (auto-detects best available, pipewire first, then pulseaudio, then wasapi)
# "auto" is recommended for most systems, but you can force a specific backend
engine: pipewire
# Audio device name (see system audio devices)
# Find your device with: pactl list sources short (PulseAudio) or pw-cli ls Node (PipeWire)
device: default
# Audio gain adjustment in dB (positive=louder, negative=quieter)
# Adjust if audio is too quiet, like when Spotify or YouTube normalizes the volume
gain_db: 0.0Audio Device Examples:
- PulseAudio:
alsa_output.pci-0000_0e_00.4.iec958-stereo - PipeWire:
alsa_output.pci-0000_0e_00.4.iec958-stereo - USB Audio:
alsa_output.usb-Focusrite_Scarlett_2i2_USB-00.analog-stereo - Bluetooth:
bluez_sink.00_11_22_33_44_55.a2dp_sink - Windows:
Speakers (Realtek High Definition Audio)
Controls debugging and logging features.
debug:
# Enable FPS logging to console (true/false)
# Useful for performance monitoring
log_fps: false
# Show bandpassed signal on oscilloscope
# Shows the filtered signal used for pitch detection
show_bandpassed: falseControls frequency analysis and spectrum visualization.
fft:
# FFT size (must be power of 2, higher=better frequency resolution)
# Common values: 2048, 4096, 8192, 16384
size: 4096
# Enable frequency markers on the display
markers: true
# Slope correction for frequency response (dB per octave, visual only)
slope: 3.0
# Note key mode: "sharp" or "flat" (affects frequency labels)
key: sharp
# Stereo mode: "midside" (mid/side channels) or "leftright" (left/right channels)
mode: midside
# Beam multiplier for phosphor effect
beam_multiplier: 1.0
# Rotation of the FFT display
# 0 = 0 degrees, 1 = 90 degrees, 2 = 180 degrees, 3 = 270 degrees
rotation: 0
# Flip the FFT display along the frequency axis
flip_x: false
# Enable hover cursor for FFT display
cursor: false
# Show readout header with peak/frequency/note info for strongest partial
readout_header: false
# Frequency scale for the FFT display: "log", "linear", or "mel"
frequency_scale: mel
# Frequency and amplitude limits
limits:
# dB level at the top of the display before slope correction
max_db: 0.0
# dB level at the bottom of the display before slope correction
min_db: -60.0
# Maximum frequency to display in Hz
max_freq: 22000.0
# Minimum frequency to display in Hz
min_freq: 10.0
# Smoothing settings for FFT values
smoothing:
# Enable velocity smoothing for FFT values
enabled: true
# Fall speed of FFT bars (higher=faster fall, more responsive)
fall_speed: 50.0
# Fall speed when window is hovered over (higher=faster fall)
hover_fall_speed: 10.0
# Rise speed of FFT bars (higher=faster rise, more responsive)
rise_speed: 500.0
# Constant-Q Transform settings (better frequency resolution in the low end)
cqt:
# Enable Constant-Q Transform
enabled: true
# Number of frequency bins per octave for CQT (higher=better resolution)
# Significant CPU usage increase with higher values
bins_per_octave: 60
# 3D sphere visualization settings
sphere:
# Enable 3D sphere visualization
enabled: false
# Maximum frequency to display in sphere (lower frequencies look better)
max_freq: 5000.0
# Base radius of the sphere
base_radius: 0.1Controls text rendering for frequency labels and UI elements.
# Path to TrueType font file for text rendering
# Common font paths:
font: ~/.local/share/fonts/JetBrainsMono/JetBrainsMonoNerdFont-Medium.ttf
# font: /usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf
# font: /usr/share/fonts/TTF/CascadiaCode-Regular.ttfControls the Lissajous curve visualization (X-Y plot of left vs right channel).
lissajous:
# Beam multiplier for phosphor effect
beam_multiplier: 1.0
# Spline settings for curve interpolation
spline:
# Enable Catmull-Rom spline interpolation for smoother curves (tension controls strength)
tension: 1.0
# Number of interpolated points between each pair of samples
segments: 10
# Options: "normal", "circle", "pulsar", "rotate", "black_hole"
# rotate is a 45 degree rotation of the curve
# circle is the rotated curve stretched to a circle
# pulsar is all of the above, makes the outside be silent
# and the inside be loud which looks really cool
# black_hole is a rotated circle with a black hole-like effect
# normal is the default mode
mode: normal
# Rotation of the lissajous display
# 0 = 0 degrees, 1 = 90 degrees, 2 = 180 degrees, 3 = 270 degrees
rotation: 0Controls the oscilloscope waveform visualization.
oscilloscope:
# Time window for oscilloscope in ms
window: 50.0
# Beam multiplier for phosphor effect
beam_multiplier: 1.0
# Rotation of the oscilloscope display
# 0 = 0 degrees, 1 = 90 degrees, 2 = 180 degrees, 3 = 270 degrees
rotation: 0
# Flip the oscilloscope display along the time axis
flip_x: false
# Pitch following and alignment settings
pitch:
# Follow pitch for phase alignment (true=align to detected pitch)
follow: true
# Alignment type: "peak" or "zero_crossing"
type: zero_crossing
# Alignment position: "left", "center", or "right"
alignment: center
# Number of cycles to track
cycles: 0
# Minimum time window to display in oscilloscope in ms
min_cycle_time: 16.0
# Spline settings for curve interpolation
spline:
# Spline tension for curve smoothness (0.0-2.0)
tension: 1.0
# Spline density for curve detail
segments: 10
# Lowpass filter settings for oscilloscope
lowpass:
# Enable lowpass filter for oscilloscope
enabled: false
# Cutoff frequency in Hz
cutoff: 200.0
# Order of the lowpass filter (higher = steeper filter, more CPU usage, must be multiple of 2)
order: 4
# Bandpass filter settings for pitch detection
bandpass:
# Bandwidth in Hz
bandwidth: 10.0
# Sidelobe attenuation in dB
# Higher values = more attenuation, more CPU usage
sidelobe: 60.0Controls the CRT phosphor simulation effect (realistic glow and persistence).
phosphor:
# Enable or disable phosphor effects globally
enabled: true
# Electron beam settings
beam:
# Energy of the electron beam (affects brightness of phosphor effect)
energy: 90.0
# Enable rainbow color effect for the beam
rainbow: true
# Blur effect settings
blur:
# Spread of the blur effect (higher=more spread, more GPU intensive)
spread: 128
# Intensity of blur for nearby pixels (0.0-1.0, higher=more blur)
near_intensity: 0.6
# Intensity of blur for distant pixels (0.0-1.0, higher=more blur)
far_intensity: 0.8
# Screen effect settings
screen:
# Decay parameters for phosphor persistence
decay:
# When the rate of decay starts slowing down
threshold: 0.999999046
# How quickly the tail of the decay fades
tail: 0.099999994
# How quickly the head of the decay fades
depth: 0.899999976
# Curvature intensity for curved screen effect (0.0-1.0)
curvature: 0.1
# Gap scalar for curved screen effect (0.0-1.0)
gap: 0.03
# Vignette strength (0.0-1.0)
vignette: 0.3
# Chromatic aberration strength (0.0-1.0)
chromatic_aberration: 0.008
# Grain strength (spatial noise, 0.0-1.0)
grain: 0.1
# AntiAliasing size (2-16)
aa_size: 4
# Reflections settings
reflections:
# Strength of reflections (0.0-1.0)
strength: 0.5
Controls the spectrogram visualization (time-frequency heat map).
spectrogram:
# Frequency scale: "log", "linear", or "mel"
frequency_scale: mel
# Sharpen broad spectral peaks by iteratively reassigning energy to nearby dominant bins
iterative_reassignment: true
# Time window for spectrogram in seconds
window: 4.0
# Frequency and amplitude limits
limits:
# Maximum dB level
max_db: -10.0
# Minimum dB level
min_db: -60.0
# Minimum frequency
min_freq: 10
# Maximum frequency
max_freq: 4000
Controls the LUFS (Loudness Units) visualization.
lufs:
# Mode: "shortterm", "momentary", "integrated"
# momentary is over a 400ms window
# shortterm is over a 3s window
# integrated is over the entire recording
mode: momentary
# Scale: "log" or "linear"
scale: log
# Label: "on", "off", "compact"
# on = full label following the LUFS bar on the right
# off = no label
# compact = compact label in the top area
label: compactControls the VU meter visualization.
vu:
# Time window for VU meter in ms
window: 100.0
# Style: "analog" or "digital"
style: digital
# Calibration dB level
# a calibration of 3dB means a 0dB pure sine wave is at 0dB in the meter
calibration_db: 3.0
# Scale: "log" or "linear"
scale: log
# Needle width for analog VU meter
needle_width: 2.0
# Momentum settings for analog VU meter
momentum:
# Enable momentum for analog VU meter
enabled: true
# Spring constant of needle
spring_constant: 500.0
# Damping ratio of needle
damping_ratio: 10.0Controls arrangement of visualizers using a nested hierarchy tree.
The layout is a YAML tree where each node is either:
- a split branch with
type: hsplitortype: vsplit, aratio(0.0–1.0), andchildren(sequence). Split branch nodes must have exactly two children (primary and secondary). - a leaf with
id: <visualizer_id>, referencing a single visualizer
This enables flexible nested splits and resizing. Rearrangement is swaywm-like: drag a visualizer and drop it to replace another (center) or create a split (top/bottom/left/right); the tree will be adjusted accordingly. Only one instance of each visualizer ID may exist.
Example (tree form):
visualizers:
main:
type: vsplit
ratio: 0.5
children:
- type: hsplit
ratio: 0.333
children:
- type: hsplit
ratio: 0.445682466
children:
- type: hsplit
ratio: 0.375
children:
- id: vu
- id: lufs
- id: lissajous
- type: hsplit
ratio: 0.5
children:
- id: oscilloscope
- id: spectrum_analyzer
- type: hsplit
ratio: 0.5
children:
- id: waveform
- id: spectrogramAvailable visualizers: spectrum_analyzer, lissajous, oscilloscope, spectrogram, waveform, lufs, vu
Scrolling time-domain envelope display. The renderer groups samples by pixel-width buckets and draws a min→max line for each emitted history column.
waveform:
# History length in seconds across the full waveform width
window: 2.0
# Frequency split between low and mid bands for color analysis
low_mid_split_hz: 250.0
# Frequency split between mid and high bands for color analysis
mid_high_split_hz: 4000.0
# Display-only tilt for color analysis (dB/oct)
# Positive values emphasize highs, negative values emphasize lows
slope: 3.0
# Channel mode: "mono" or "stereo"
# In stereo mode waveform follows fft.mode:
# - midside => Mid/Side
# - leftright => Left/Right
mode: stereo
# Show a center midline when the signal is effectively silent.
# true = draw a single center pixel when min and max are nearly equal.
# false = never draw the silent midpoint.
midline: trueControls the main application window.
window:
# Default window width in pixels
default_width: 1080
# Default window height in pixels
default_height: 200
# FPS limit for the main window
# This will also throttle the audio thread to save CPU
# Note: this does not define the exact FPS limit,
# as pipewire/pulseaudio only accept base-2 read sizes.
fps_limit: 240
# theme file (from themes/ directory)
theme: mocha.txt
# Enable window decorations in your desktop environment
decorations: true
# Keep the window always on top of other windows
always_on_top: false
# Try to use Wayland instead of X11
wayland: falsePlugin-managed options are stored under the plugins top-level key.
plugins:
my_plugin:
optionA: 5
subcategory:
optionB: selectableAmy_pluginis defined by the plugin viapvPluginGetInfo.- Nested keys are created from plugin-registered option paths.
- Options are read during config load/reload and written by normal config saves.
No Audio Input:
- Check your audio device name with
pactl list sources short(PulseAudio) orpw-cli ls Node(PipeWire) - On Windows, use the Human Readable device name or a substring of it.
- Ensure the device is not muted
- Try different audio engines (
pulseaudio,pipewire,wasapi, orauto)
High CPU Usage/Poor Performance:
- Disable phosphor effects:
phosphor.enabled: false - Reduce FFT size:
fft.size: 2048 - Disable CQT:
fft.cqt.enabled: false - Lower FPS limit:
window.fps_limit: 60
Visual Artifacts:
- Adjust phosphor settings
- Check your GPU drivers and OpenGL support