Fast and professional audio metering for Linux.
- Features
- Installation
- Usage and key bindings
- Configuration and theming
- Frequently Asked Questions
- Contributing
- Credits
- License
Everything below describes behavior implemented thus far. If you have ideas for the next thing OpenMeters should do, please feel free to open an issue or pull request.
- PipeWire audio capture
- Per-application capture.
- Direct device/default-sink capture with negotiated layouts of up to eight channels.
- Windowing
- Normal desktop windows on X11 or Wayland.
- Wayland layer-shell "bar mode" when the compositor exposes
zwlr_layer_shell_v1, anchored to the top or bottom of a given monitor. - Pop-out windows for individual visuals.
- Configurable 30, 60, 120 FPS, or vertical-synced frame cadence.
- Window decoration toggle.
- Appearance and persistence
- Configurable RGBA background color.
- Editable JSON settings with lossy loading for unknown or invalid fields.
- User themes.
- Hot-reload for configurations and themes.
- Loudness
- BS.1770-5 K-weighted short-term and momentary LUFS meter modes.
- BS.1770-5 integrated LUFS meter mode with EBU Tech 3342 loudness range (LRA), dimmed for its first 60 s per EBU Tech 3341.
- True Peak meter modes.
- Fast and slow K-weighted RMS dB meter modes.
- Oscilloscope
- Selectable left, right, mid/mono, side, or
nonechannel traces. - Selectable trigger source, including channel-dependent triggering for independently stable traces.
- A stable waveform trigger that uses autocorrelation period estimation and waveform template correlation. (Often referred to as "pitch-following" or "phase-locking" in other applications.)
- Selectable cycle count in stable trigger mode.
- Zero-crossing trigger for traditional scope behavior.
- Selectable left, right, mid/mono, side, or
- Spectrogram
- Selectable source: left, right, mid/mono (default), side, or none.
- A multitude of window types, lengths, and hop sizes.
- Classic STFT rendering.
- Time-frequency reassignment (Similar to Wavecandy's "Enhanced frequency" mode, or MiniMeters' "Sharper" mode.)
- Click-and-hold crosshair with frequency, note, and time tooltip.
- Piano-roll overlay.
- Frequency-axis zoom and pan.
- ERB, logarithmic, and linear frequency scales.
- Adjustable color map, stop positions, and stop spreads.
- Spectrum analyzer
- A multitude of window types, lengths, and hop sizes.
- Selectable primary and secondary source: left, right, mid, side, or none.
- Raw or IEC 61672-1 A-weighted display.
- Peak label with frequency, note, and level.
- No averaging, exponential averaging, or peak hold.
- ERB, logarithmic, and linear frequency scales.
- Line or bar display with adjustable color map.
- Stereometer
- L/R vector display in Lissajous or dot-cloud modes.
- Frequency-band dot-cloud mode with low/mid/high bands.
- Single-band or low/mid/high phase-correlation meter.
- Adjustable correlation window.
- Adjustable dot-cloud scale, rotation, channel flip, unipolar fold, dot size, and grid.
- Waveform
- Selectable left, right, mid/mono, side, or
nonechannel lanes. - Adjustable scroll speed.
- Optional low/mid/high band-level history overlay, clipped out at the history floor.
- Color by low/mid/high band balance, loudness, or a static color.
- Selectable left, right, mid/mono, side, or
OpenMeters requires:
- A graphical Linux session on X11 or Wayland.
- PipeWire 0.3.77 or newer, installed and running.
- A compatible Vulkan or OpenGL/EGL driver stack. Mesa's llvmpipe can provide CPU rendering when hardware rendering is unavailable. Vulkan is recommended.
- For pre-built release artifacts: x86_64 GNU/Linux with
glibc>= v2.39. The release workflow builds these artifacts in Ubuntu 24.04.
Normal application windows are available on both X11 and Wayland. Bar
mode additionally requires a Wayland compositor that exposes
zwlr_layer_shell_v1.
Install openmeters or openmeters-git from the AUR:
yay -S openmeters # stable yay -S openmeters-git # development
Note
The stable openmeters AUR package is maintained by
Zorbatron with my
permission. Massive thanks!
Download the latest .deb package from GitHub
Releases.
Download the latest .rpm package from GitHub
Releases.
OpenMeters is available in nixpkgs thanks to
@magnetophon and
@bitbloxhub. Add it to your nix
config with:
nix profile add nixpkgs#openmeters
Tarballs are available under tagged releases, or you can build OpenMeters from source. I cannot guarantee OpenMeters will work on every distribution, although it is designed to stay fairly distro-agnostic. If you have trouble getting it running, please open an issue and I will try to help.
-
Install a Rust toolchain, a C toolchain,
pkg-config,libclang, and native development packages for PipeWire, Wayland/X11, xkbcommon, fontconfig/freetype, and the Vulkan loader/development headers. PipeWire/SPA development headers must be from PipeWire 0.3.77 or newer. The recommended way to install Rust is rustup. OpenMeters currently requires the Rust version declared inCargo.tomlor newer. -
Clone the repository:
git clone https://github.com/httpsworldview/openmeters/ cd openmeters -
Build and run the release binary:
cargo build --release ./target/release/openmeters
Or run it directly through Cargo:
cargo run --release
See packaging/ for instructions on building Debian,
Fedora, and tarball artifacts. If you would like to package OpenMeters
for your distribution and run into any problems, please feel free to
reach out via E-Mail.
| Binding | Action |
|---|---|
ctrl+shift+h |
Show/hide the configuration window; while open, drag visuals to rearrange them. |
| right click on a visual | Open that visual's settings window. |
p |
Pause or resume meter updates. |
q twice |
Quit the application. |
ctrl+space |
Pop out the hovered visual, or dock the focused pop-out. |
| Binding | Action |
|---|---|
| left click+hold | Show the crosshair and frequency/note/time tooltip; highlight the corresponding piano key in yellow. |
ctrl+scroll up/down |
Zoom the frequency axis. |
middle click+drag or ctrl+left click+drag |
Pan the frequency axis while zoomed in. |
| Binding | Action |
|---|---|
| double click | Reset LUFS Integrated and its loudness range. |
On first launch, all six visuals are enabled. Application settings are
saved to $XDG_CONFIG_HOME/openmeters/settings.json, or to:
~/.config/openmeters/settings.json
when XDG_CONFIG_HOME is unset.
settings.json is intentionally editable. GUI ranges are not hard
limits, but visuals limit some values when drawn. Unsupported keys,
structurally invalid values, and values outside a setting's supported
range are logged and replaced with their defaults.
Invalid JSON syntax is ignored: default settings are used on startup, and current settings are kept while running. Your configuration file will not be overwritten unless you explicitly change settings in the GUI. Window sizes edited while OpenMeters runs apply the next time that window opens, except bar height, which applies immediately.
If a bug causes OpenMeters to misbehave, you can reset application
settings by deleting settings.json while OpenMeters is closed.
Please consider reporting the bug if you run into this.
Themes are saved as separate JSON files in
$XDG_CONFIG_HOME/openmeters/themes/, or in the same alternate
location as above.
You can create and switch between themes in the Appearance section of the configuration page. Feel free to share custom themes by sharing the corresponding JSON files.
Changes to themes are immediately reflected in the running
application. Theme files follow the same rules as settings.json,
except that editing colors never overwrites a theme file with invalid
JSON syntax; only saving a theme under its name does.
Q: Can I build upon OpenMeters or use it in a commercial application?
A: Yes, as long as you abide by the terms of the GPL. My primary focus is keeping OpenMeters free and open source, not profiting from it.
Q: Will you support Windows or macOS?
A: Maybe, but probably not. I'm a Linux user and have been for most of my life. I am not currently confident in my ability to maintain reliable support for either platform. That said, I aim to keep things modular and platform-agnostic where possible. The DSP code at the core of this project will run anywhere; the GUI, persistence, and audio backend code will not.
Q: How do I force OpenGL, Vulkan, or software rendering?
A: Selection is automatic by default. To override it for one launch:
WGPU_BACKEND=gl openmeters # OpenGL WGPU_BACKEND=vulkan openmeters # Vulkan LIBGL_ALWAYS_SOFTWARE=1 WGPU_BACKEND=gl openmeters # Mesa llvmpipe
Window transparency is not guaranteed to work across driver/window
managers/compositors or any arbitrary combination of the
three. Software rendering requires Mesa's EGL and software drivers and
can be much slower. If another EGL vendor is selected, also set
__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
using your distribution's Mesa vendor file path.
Q: Why is OpenMeters' FFT size about twice the value shown in MiniMeters or Wave Candy?
A: OpenMeters labels FFT/window size by the number of input samples used. MiniMeters and Wave Candy instead label the visible positive-frequency bins, which represent roughly half the FFT for real-valued audio. To match settings, use approximately twice their displayed band count (for example, 2048 in MiniMeters corresponds to 4096 in OpenMeters).
Please see CONTRIBUTING.md for guidelines on how to contribute and how to get started. No matter what you have to offer, I greatly appreciate your interest in the project. Every bit helps.
OpenMeters is GPL-3.0-or-later software. You may reuse code under the GPL's terms. If you want to discuss other arrangements or have licensing questions, feel free to email me at [email protected]. You are also free to draw inspiration from the ideas and methods used here, provided you respect the GPL.
It would be unfair to ask for attribution over ideas alone when this project exists thanks to the countless researchers and open-source contributors who came before me.
Thank you for checking out OpenMeters. If you think it is useful, please consider starring the repository and sharing it with others. I appreciate criticism, bug reports, and feedback, so feel free to reach out.
- MiniMeters (https://minimeters.app/) inspired this project. If you can, please support their work.
- Corrscope (https://github.com/corrscope/corrscope) was a key reference for correlation-triggered oscilloscope stability.
- EasyEffects (https://github.com/wwmm/easyeffects) has been a valuable reference for PipeWire integration and audio processing.
- Ardura's Scrolloscope (https://github.com/ardura/Scrollscope)
- Tim Strasser's Oszilloskop (https://github.com/timstr/oszilloskop)
- Audacity (https://www.audacityteam.org/)
- FFmpeg (https://ffmpeg.org/)
- libebur128 (https://github.com/jiixyj/libebur128), the original C library for EBU R 128 loudness measurement.
- Brecht De Man's companion Python implementation (see referenced paper below) (https://github.com/BrechtDeMan/loudness.py)
- BBC's audiowaveform (https://github.com/bbc/audiowaveform)
- librosa (https://librosa.org/)
- ITU-R BS.1770-5, loudness and true peak measurement.
- EBU Tech 3341, 'EBU Mode' loudness metering.
- EBU Tech 3342, loudness range measurement.
- IEC 61672-1, A-weighting reference curve.
- Brecht De Man, "Evaluation of Implementations of the EBU R128 Loudness Measurement", 145th Audio Engineering Society Convention, paper 10064, October 2018.
- A. de Cheveigné and H. Kawahara, "YIN, a fundamental frequency
estimator for speech and
music",
Journal of the Acoustical Society of America, vol. 111, no. 4, April
2002.
- Historically, the algorithm within this paper was implemented by our oscilloscope.
- F. Auger and P. Flandrin, "Improving the readability of time-frequency and time-scale representations by the reassignment method", IEEE Transactions on Signal Processing, vol. 43, no. 5, May 1995.
- K. Kodera, R. Gendrin, and C. de Villedary, "Analysis of time-varying signals with small BT values", IEEE Transactions on Acoustics, Speech, and Signal Processing, vol. 26, no. 1, February 1978.
- S. Fulop and K. Fitz, "Algorithms for computing the time-corrected instantaneous frequency (reassigned) spectrogram, with applications", Journal of the Acoustical Society of America, vol. 119, no. 1, January 2006.
- K. Fitz and S. Fulop, "A Unified Theory of Time-Frequency Reassignment", arXiv:0903.3080, March 2009.
- iced_exwlshell and related crates
(https://github.com/waycrate/exwlshelleventloop)
- Special thanks to Decodetalkers for reviewing and merging my patches, and for maintaining such a useful library.
- Iced (https://github.com/iced-rs/iced)
- RustFFT (https://github.com/ejmahler/RustFFT)
- RealFFT (https://github.com/HEnquist/realfft)
- wgpu (https://github.com/gfx-rs/wgpu)
OpenMeters is licensed under the GNU General Public License v3.0 or later. See LICENSE for more details.
