foo_vis_vumeter is modern reimplementation of the analog VU meter component by DRON. It renders using DirectX 12, falling back to DirectX 11 under Wine.
.bin panels
directly, loose or packaged in .rar and
.7z archives, with an optional companion
.ini of defaults..vu source projects
natively (loose or inside
.zip/.rar/.7z) with no build
step, interpolating needle angles across the [Angles]
knots..zip skins and
AIMP LED .zip (LVU) skins..bin compression schemes:
bzip2, LZMA, XZ (LZMA2), Gzip, Zstandard, LZ4, Lzip,
Brotli, or uncompressed..ini files.libebur128.IVUMeter and IVUMeterWindow interfaces for
external scripting.Alt+Enter) with display keep-awake,
auto-hiding cursor, and optional multi-monitor spanning.foo_vis_vumeter.fb2k-component) from the component
page.foo_vis_vumeter.fbk2-component into foobar2000
using the File > Preferences > Components >
Install... menu item.<foobar2000 profile folder>\vumeter.The panels or skins files define the visualizations.
The foobar2000 component is not packaged with any panels. It supports
various formats, namely foobar2000 .bin files, VUEditor
.vu source projects, AIMP analog .zip skins
and AIMP LED .zip skins.
Use these references to find community-made skins or create new ones using VUEditor:
VUEditor.zip (in Russian).foo_vis_vumeter
thread in the HydrogenAudio Forum.The component is controlled via the context menu, accessible by right-clicking anywhere on the component window. In addition, fine tuning can be performed by using the mouse wheel.
What the mouse wheel controls is selected through the "Tuning" menu. If the changes result in bad state, use the "Options > Reset" option. The selected tuning mode value can be reset to its default using middle click.
In the context menu there are a few symbols placed next to some options. These are their meaning:
What follows are the different menu categories with a short explanation of each option.
At the very top of the context menu, the current resolution of the loaded panel is displayed as a grayed informational item. If no panel is loaded, it shows a corresponding message.
Layout:
Mode:
(left + right) / 2. Side is show in the right panel and is
calculated as (left - right) / 2. Same downmixing into left
and right channels for multi-channel audio as the Stereo mode applies
before mid and side components are calculated.Levels:
libebur128 library. Stereo output meters the left and right
channels independently (each needle reflects its own channel loudness);
downmixed or mono output shares a single combined measurement.Movement:
Decay:
Tuning (mouse wheel-controlled):
.bin panels. Default is 0
and the range is [-128.0, 512.0]. If:
Ctrl key is held down during the mouse wheel scroll,
the step size is 100.Shift key is held down during the mouse wheel scroll,
the step size is 10.Left Alt key is held down during the mouse wheel
scroll, the step size is 0.1..bin panels when a level other
than Loudness (LUFS) is selected. Default is 0 and the range is [0.0,
2.0] in steps of 0.01.Ctrl key is held down during the mouse wheel scroll,
the step size is 10.Shift key is held down during the mouse wheel scroll,
the step size is 0.1.Left Alt key is held down during the mouse wheel
scroll, the step size is 0.01Options:
.ini files that may accompany the .bin files,
both loose and archived in .rar or .7z, and
disables automatic layout selection from filename layout suffixes.
Defaults are not ignored by default.Configure: opens a dialog box with the tuning options.
Mix: opens a dialog box with the channel level mixer board.
Explore: opens the profile directory in Windows Explorer.
Fullscreen: toggles the component between fullscreen mode and embedded or windowed mode. Keeps the screen on and stops the screensaver from starting during fullscreen. In fullscreen mode, the mouse cursor is automatically hidden after 1 second of inactivity and reappears on mouse movement or context menu interaction.
The Fullscreen option is bolded because it is the double-click default.
The different panels/skins found during the scan of the
<foobar2000 profile folder>\vumeter directory appear
in lexicographical order (directories first) below the "Fullscreen"
toggle.
There are some options under: Preferences > Advanced > Visualisations > VU Meter:
<unchecked>. Enables debug
console logging.<unchecked>. Unloads
resources when the component window is hidden.<unchecked>.
Exposes the component through COM/ActiveX objects for external scripting
and automation.<0>. Selects the
graphics backend. Automatic uses Direct3D 11 under Wine/Proton and
Direct3D 12 on Windows; it can also be forced to Direct3D 12 or Direct3D
11.<empty> (implies
<foobar2000 profile folder>\vumeter\ when empty).
Supports %fb2k_profile_path% and environment variables
(also enclosed between %; DOS-style).<empty>; untested). If
the MD5 hash of the entered string matches a specific digest, the teapot
easter egg mode is activated on launch.The currently selected tuning parameter is denoted by a square symbol
under the context menu's Tuning popup. The selected tuning
parameter can be changed by three main methods. The first is directly
through selecting the desired one in the context menu. The second is
using a modifier key and the vertical mouse wheel together to cycle
through the parameters in menu order. The modifier key that must be held
down while the vertical mouse wheel turns is one of Esc,
Right Alt or AltGr. The third is to use the
horizontal mouse scroll wheel. As the tuning parameter changes, the
mouse tooltip should display the active one and its current value.
Once again, the selected tuning mode value can be reset to its default using middle click and all tuning parameters will fall back to their defaults if the Options > Reset option is used.
Note: selecting a parameter simply means this is the one that will be affected by the mouse wheel and middle mouse click. The combination of all settings and tuning parameter values determines the visualization's behavior appearance.
Tuning can also be done through the context menu's Configure dialog box. Notes:
Home/PgUp/PgDn/End.Channel level mixing can be customized through the context menu's Mix dialog box. Notes:
.bin panels. It
contains the edge-sampled RGB hexadecimal background color. It can be
changed to any other valid color, overriding the automatically-sampled
color.Skin filenames can include a layout suffix using the pattern
N where N is a number from 0 to 4
corresponding to the layout modes (0 = Left+Right H, 1 = Left+Right V, 2
= Left, 3 = Right, 4 = Mono). When a skin with a layout suffix is
loaded, the layout is automatically set to the specified mode. The
suffix is removed from the display name in the context menu. This
behavior is disabled when "Ignore Defaults" is enabled.
The component adds a dynamic menu item under foobar2000's main menu
(hidden by default; hold Shift when opening to reveal). It
displays the panel groups and skins, along with "Previous" and "Next"
navigation commands per group.
The component responds to several touch gestures:
The pan and pinch gestures are ignored while tuning is disabled, a dialog is open, or the frame is frozen.
The horizontal mouse wheel and buttons 4 and 5 can be used to cycle through the selected tuning option. Be aware that buttons 4 and 5 might have other side-effects in the player such as moving to the next or previous track.
A screenshot can be taken by holding Ctrl and
left-clicking on the component window. The screenshot is saved as a PNG
file in the screenshots subfolder of the panels directory.
Files are named sequentially (shot_00.png,
shot_01.png, etc.).
A single skin/panel file can be loaded by dragging it from the file
system and dropping it onto the component window. Supported file types
are .bin, .vu, .zip,
.rar and .7z, along with the standalone
compressed .bin variants (.bz2,
.lzma, .gz, .lz,
.xz, .lz4, .br and
.zst). A dropped file that lies outside the panels
directory is copied into it (as a temporary entry) before loading. The
drop is ignored if the file is not a valid panel or while the tuning or
mixer dialog is open, and performing a drop cancels screensaver
mode.
As with the mouse buttons, be aware that any custom keyboard shortcuts set in the player can alter or prevent the component from reacting to these.
Alt + Enter: toggles fullscreen.Esc: exits an easter egg mode (teapot or text
entry).Backspace: removes the last character in text entry
mode.Delete: clears all text in text entry mode.Page Up / Page Down: changes the texture
in teapot mode.
When foobar2000 is installed as a non-Steam title, it can be launched
against its Proton prefix directly from the command line. Replace
<id> with the app's compatdata
identifier and adjust the Proton build path if you use a different
Proton version.
STEAM_COMPAT_DATA_PATH="/home/deck/.steam/steam/steamapps/compatdata/<id>" \
STEAM_COMPAT_CLIENT_INSTALL_PATH="/home/deck/.steam/steam" \
"/home/deck/.steam/steam/steamapps/common/Proton - Experimental/proton" run \
"/home/deck/.steam/steam/steamapps/compatdata/<id>/pfx/drive_c/users/steamuser/foobar2000/foobar2000.exe"STEAM_COMPAT_DATA_PATH points at the app's
compatdata/<id> directory; its pfx
subfolder is the Wine prefix used for the fonts and scaling tweaks
below.STEAM_COMPAT_CLIENT_INSTALL_PATH points at the Steam
installation root.foobar2000.exe inside
the prefix.The dialogs and the on-screen frame counter request the "Segoe UI" font. Windows ships this font, but Wine and Proton do not, so they substitute a default sans-serif face (often Liberation Sans or the host desktop font). To restore a Segoe UI-like appearance, use one of the following approaches. In each case, restart foobar2000 afterward.
~/.steam/steam/steamapps/compatdata/<AppID>/pfx; for
plain Wine it is $WINEPREFIX (default
~/.wine). Copy the Segoe UI family
(segoeui.ttf, segoeuib.ttf,
segoeuii.ttf, segoeuiz.ttf,
segoeuil.ttf, seguisb.ttf,
segoeuisl.ttf, seguibl.ttf and their italics)
from a licensed C:\Windows\Fonts into
<prefix>/drive_c/windows/Fonts/.selawik*.ttf into the prefix Fonts
folder, then map the name: under the
HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements registry
key, add a string value named Segoe UI with data
Selawik.Wine\Fonts\Replacements key, map Segoe UI
to a similar installed face such as Open Sans,
Noto Sans or Liberation Sans.Note 1: The
Wine\Fonts\Replacementskey is also where to look for (and delete) an existingSegoe UI(andSegoe UI Semibold) mapping if a copied font is not being picked up. A stray mapping to a serif face such asTimes New Romanis a common reason the dialogs render in a serif font even when Segoe UI is installed.
Note 2: Copying Segoe UI from a licensed Windows installation for personal use is permitted; it may not be redistributed, which is why Selawik exists for bundling a prefix.
If the dialogs render too small or too large under Wine or Proton, adjust the prefix's DPI. Scaling is controlled through winecfg.
WINEPREFIX=<prefix> winecfg.winetricks, select the prefix, then
choose Run winecfg.protontricks, select the prefix,
then choose Run winecfg.Note: The DPI value is stored in the registry at
HKEY_CURRENT_USER\Control Panel\Desktop\LogPixels(a decimalREG_DWORD, e.g. 120), which you can also set directly withwine regeditinstead of winecfg.
On KDE Plasma (e.g. SteamOS Desktop) running the Wayland session, the visualization freezes within a second of entering fullscreen. It briefly resumes only while a context menu or dialog overlaps the window, then freezes again once that overlay closes. The effect affects any fullscreen visualization, regardless of the rendering API (Direct3D 11/12, OpenGL or GDI).
This is a compositor issue. When a window covers the whole screen, KWin promotes it to DRM direct scan-out: instead of compositing the window, KWin hands the client buffer straight to the display controller for page-flipping. Under the Wine Wayland driver, the buffer KWin latches for scan-out is not refreshed on subsequent presents, so the display keeps flipping the same stale frame. Rendering continues normally but the new frames never reach the screen. Overlapping the window with a menu or dialog forces KWin back into composited mode, which is why motion briefly returns while an overlay is visible.
To work around the problem use either of the following:
~/.config/plasma-workspace/env/kwin-no-scanout.sh
containing export KWIN_DRM_NO_DIRECT_SCANOUT=1, then log
out and back in. This keeps KWin compositing the fullscreen window so
every presented frame is displayed.PROTON_ENABLE_WAYLAND=0 in the launch command shown above,
which avoids the Wine Wayland driver's scan-out path.The needle movement can be approximated using the following formula:
display = old +/- (e ^ (new - old) - 1) * rise/decay. The
rise or decay factor limits how far the needle can move per frame or
iteration of the calculation.
The needle position, frame number in foobar2000 .bin
panels or angle in AIMP analog .zip skins, is calculated
using the point-slope equation referenced to the zero dB frame or angle.
For the AIMP LED .zip skins, the "light" fill is calculated
by interpolating between the points in the dbs parameter's
array using Catmull-Rom splines. For VUEditor .vu projects,
the needle angle is interpolated across the [Angles] knots
using the curve selected by SplineType (Catmull-Rom by
default).
Used a circuit of a stereo VU meter, tracing the PCB and translating all the component values of the driving circuit into a SPICE netlist. The netlist was simulated to get the step/transient and impulse responses of the "system." Since the VU meter face plate is logarithmic, the circuit uses analog differentiator, integrator and summer circuits. To validate the netlist simulation correctness, various points of the working circuit were probed with an oscilloscope.
With the characteristics of the driving circuit in hand, turned attention to the needle. The needle can be modeled as a mass-spring-damper system. So, setting up the ODE for the system (with some minor guesses) provides the behavior characteristics of the needle. This is a common second-order system with known roots.
The needle was set up underdamped. The transient and impulse response targets of the SPICE simulation (which come from the voltage levels closest to the visualization audio levels provided by foobar2000) are exposed as higher-level abstractions called "rise" and "decay"--where larger numbers mean faster--and "jitter", a control on the minimum change threshold. These knobs drive the ODE Roots movement. For a standards-based alternative, the default VU Ballistics movement derives the ANSI/IEC second-order response directly from a settle time and overshoot (see the Movement section).
This methodology only provides an approximate model of the analog behavior of the needle in a discrete simulation. Although the derivation was detailed, the needle movement of this component is not and will never be an accurate duplicate to its real-world analog. However, using the tuning knobs provided along time and experimentation it should be possible to create a pleasing ballistic needle movement.
.bin File
SpecificationPanel Specification
===================
Reverse Engineer: Jimmy Cassis
Date: 2024-10-01
This specification defines the format of the BIN file.
Panel File Format
-----------------
The files in this format use ".bin" extension.
The panel file begins with a header.
The panel file format layout:
Offset Size Description
0 2 Bitmap width (16-bit unsigned integer, little-endian), between 2 and 4096
2 2 Bitmap height (16-bit unsigned integer, little-endian), between 2 and 4096
4 2 Frame count (16-bit unsigned integer, little-endian), between 2 and 1024
6 2 Zero dB frame (16-bit unsigned integer, little-endian), between 0 and 1024
8 n Needle delta offset list (array of 32-bit unsigned integer offsets, little-endian), `n` is "frames * 4" and the first entry must be greater than or equal to 32; note that some offsets might be repeated due to the "knots" interpolation.
8+n p Background image bitmap pixel array (BI_RGB format [B8G8R8A8 UNORM], 32 bits per pixel, little-endian), `p` is "width * height * 4", format below
8+n+p l Optional, lamp delta offset list (array of 32-bit unsigned integer offsets, little-endian), `l` is "frames * 4"
8+n+p+l d Needle delta arrays (variable size, offsets are big-endian, deltas are BI_RGB and apply per channel), `d` is variable, format below
8+n+p+l+d a Optional, lamp delta arrays (variable size, offsets are big-endian, deltas are BI_RGB and apply per channel), `a` is variable, format below
The total size of the file is: 8+n+p+l+d+a
The total size of the file must be greater than: 8+n+p
The bitmap pixel array layout is as follows (address _decreases_ from left-to-right) and arranged in top-down order:
+-------------------------+-------------------------+-------------------------+-------------------------+
Sample Length: | 8 | 8 | 8 | 8 |
Channel Membership: | Alpha | Red | Green | Blue |
Pixel Bits: | A A A A a a a a | R R R R r r r r | G G G G g g g g | B B B B b b b b |
Bit Number: | 31 30 29 28 27 26 25 24 | 23 22 21 20 19 18 17 16 | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0 |
+-------------------------+-------------------------+-------------------------+-------------------------+
^ ^
| |
| + less significant byte
+ more significant byte
The needle and lamp delta arrays use the following format:
- For every frame there is a 2-byte big-endian offset while the most significant bit (MSB) of the even byte is unset.
- If the MSB for the even byte is set, it indicates a count (excluding the MSB) of the number of pixel channels to override starting at the offset in the pixel array indicated by the sum of all the previous 2-byte offsets.
* Note that the offset might not necessarily start or end at a pixel boundary.
- Repeat, calculating a new offset from the end of the final overriden pixel until the even byte MSB is set and the count is zero (0x80).
Worked example for the needle delta array (address _increases_ from left-to-right):
+-----------------------------------+-----------------------+-----+-----------------------------------------------------------+-----+---------...---+
Offset Sum: | 174272 | 7 | 1489| 19 | 1481| 23 ... |
Offset: |32768+32768+32768+32768+32768+10438| 7| 0| 1| 2| 3| 4| 5| 6| 1488|19| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16|17|18| 1480|23| 0| 1|...| 0|
Bytes: |7F FF 7F FF 7F FF 7F FF 7F FF 28 BF 87 8A 8B 87 00 E0 E2 DE 05 D0 93 B1 B2 AE 00 69 6A 67 00 6B 6D 68 00 B8 B9 B6 00 E0 E2 DF 05 C8 97 E6 EE ... 80|
Pixel Bits: |^^ ** | Bb Gg Rr Aa Bb Gg Rr| | Bb Gg Rr Aa Bb Gg Rr Aa Bb Gg Rr Aa Bb Gg Rr Aa Bb Gg Rr| | Bb Gg ...End|
+-|--|------------------------------+-----------------------+-----+-----------------------------------------------------------+-----+---------...---+
| |
| + odd byte (higher address, least significant)
+ even byte (lower address, most significant)
Notes
-----
When drawing, ignore the alpha channel.
Extensions
----------
1. Separate Left and Right Panels
By default, the panel file represents both the left and the right panels.
If the file format is repeated at the end of the delta arrays, it is assumed that the first format corresponds to the left panel and the second format corresponds to the right panel.
The file formats can be concatenated uncompressed into one file. Alternatively, individually compressed files can be concatenated (keep the same compression scheme for both).
Another method to provide separate left and right panels is to provide a pair of files where the left panel file ends in `1.bin` and the right panel file in `2.bin`.
2. Transparency (Alpha Channel)
By default, the alpha channel is ignored.
If the alpha channel is not to be ignored (BI_BITFIELDS format [B8G8R8A8 UNORM], 32 bits per pixel, little-endian), set bit 7 (the most significant bit) of the upper byte of the zero dB frame in the header.
3. Bottom-up Background Bitmap Pixel Array.
By default, the bitmap pixel array is assumed to be in top-down order.
If the bitmap pixel array is arranged in bottom-up order instead of top-down order, set bit 6 of the upper byte of the zero dB frame in the header.
.bin NotesWarning: Identifying LZMA-compressed heuristic is limited; especially if the skin was compressed outside of VUEditor. Therefore it is possible to confuse an uncompressed
.binfile of any width less than 225 with a LZMA-uncompressed one. Using a bzip2-compressed file mitigates this issue since this scheme starts with an easily identifiable magic number.
.vu
SpecificationA .vu file is the VUEditor project source: an INI text
file that references loose PNG assets by relative path. VUEditor builds
these projects into the .bin panel format, but this
component renders .vu projects directly, so no conversion
step is required. A .vu project draws as an analog needle
meter with an optional glass overlay and optional lamps (LEDs).
.vu file specification below for details..vu project can be loose in the component directory
or packed inside a .zip, .rar or
.7z archive, in which case the assets it references must be
present in the same archive. Archives are identified by content.<filename>1.vu/<filename>2.vu
naming pattern is supported for individual left and right panels;
otherwise the shortest-named .vu in the archive is used for
both channels.Note: Missing parameters are assumed to be 0.
.vu File SpecificationVU Panel Source Specification
=============================
Reverse Engineer: Jimmy Cassis
Date: 2026-08-18
Purpose
-------
A ".vu" file is a plain INI text file that describes an analog VU meter panel from loose image assets. It is the human-editable source that the VUEditor tool converts into a ".bin". foo_vis_vumeter reads ".vu" files directly and renders them at load time (JIT), rotating the needle bitmap live, so VUEditor is no longer required.
Encoding: ANSI/INI text. Sections may appear in any order. Image paths are relative to the ".vu" file's own directory (a leading ".\" is permitted). Numeric values use '.' as the decimal separator.
[Main]
-----
Target=<string> ".bin" output path (optional); ignored.
AngleCount=<integer> Needle rotation sampling resolution used when the knot curve is evaluated. Default 192.
Width, Height=<integer> Output canvas size in pixels; 0 selects the background image size. Default 0.
Resize=<0 or 1> Scale the assets to Width x Height when 1. Default 0.
Compressed=<0, 1 or 2> ".bin" compression; ignored. (0 = none, 1 = bzip2, 2 = LZMA)
BackPinX/Y=<float> Needle pivot expressed in background pixels.
NeedlePinX/Y=<float> Needle pivot expressed in needle image pixels.
[Angles]
-------
SplineType=<0, 1 or 2> The curve fit through the knots. Optional, default 1.
(0 = piecewise linear, 1 = Catmull-Rom, 2 = cubic spline).
<dB>=<degrees> One entry per knot; repeatable. The dB key is the audio level (0 = the 0 VU reference).
The value is the needle angle in degrees. The smallest and largest dB knots limit the
needle travel and the 0 dB knot defines the reference angle.
[Lights] (optional)
--------
SplineType=<0, 1 or 2> The curve fit through the light knots. Optional, default 0.
(0 = piecewise linear, 1 = Catmull-Rom, 2 = cubic spline).
<dB>=<selector> Threshold map for lamp/LED overlays. Each entry is a knot (dB level -> selector value).
Below the first knot the lamp is off. Selector meaning depends on the number of lamp images:
- One lamp (Lamp only): the selector is the lamp's opacity (0.0 = hidden, 1.0 = fully opaque).
A single knot (e.g., a peak lamp) gives a hard on/off step at its threshold; the lamp
only ramps up gradually if intermediate knots define a rising selector.
- Multiple lamps (Lamp, Lamp1, ..., LampN): the lamps form a progressive LED bar and the
selector is a combined-image index (0 = background [all off], N = Lamp N-1).
Panels with no needle omit the Needle source and run entirely from [Lights].
[Sources]
--------
Back=<image> Background/dial image (required).
Needle=<image> Needle sprite rotated at runtime (optional; omit for pure LED panels).
Lamp=<image> First lamp/LED image; additional lamps as Lamp1, ..., LampN (optional).
Glass=<image> Non-rotated overlay drawn last (optional).
Rendering (draw order)
----------------------
1. Background: unrotated.
2. Needle: translated by `BackPin - NeedlePin`, then rotated by the interpolated angle pivoting on BackPin.
3. Active lamp(s): selected from [Lights] and the current level.
4. Glass overlay: unrotated.
Notes
-----
- Level to dB uses `dB = 20 * log10(level)`; dB knots map to linear thresholds via `pow(10, dB / 20)`.
- Angles are absolute degrees applied as follows: 0 draws the needle bitmap with no transformation, positive rotates clockwise and negative counter-clockwise, pivoting about BackPin.
- Separate left/right assets and additional lamp images extend the same model.
- A ".vu" and its referenced assets may also be bundled inside a ".zip", ".rar" or ".7z" archive, including a left/right pair in a single archive.
.zip
Specificationskin.ini alongside
corresponding PNG images at the root of the archive.0.png
(background), 1.png (needle), 2.png (glass)
with optional 3.png (LED) and bg.png
(wallpaper).VU section in the skin.ini file; the supported
parameters are MinAngle, MinLevel,
ZeroAngle, ZeroLevel, MaxAngle,
MaxLevel, PivotPointX,
PivotPointY, MobilityNegative,
MobilityPositive, orientation, and
dbs. The section and parameter names are case
insensitive.l_0.png (background), l_1.png (needle),
l_2.png (glass) with optional l_3.png (LED)
and the right panel images must be named r_0.png
(background), r_1.png (needle), r_2.png
(glass) with optional r_3.png (LED). There can be an
optional bg.png (wallpaper). The image names are case
insensitive.skin.ini file under the
VU_L section and the right panel parameters must be
specified under the VU_R section. The supported parameters
are the same as the single panel ones.Note 1:
MobilityNegative,MobilityPositive, andorientationparameters are currently unused.
Note 2: The
dbsparameter array is optional and only used in skins that include an LED component in addition to the needle. As noted previously, the LED image isl_,r_,3.png.
Note 3: Missing parameters are assumed to be 0 or false.
.zip
Specification (LVU)settings.ini
alongside corresponding PNG images at the root of the archive.settings.ini file under the left section and
the right panel parameters must be specified under the
right section. The background must be specified in the
bg section. The supported parameter in all 3 sections is
png. The supported parameters in the left and
right sections are orientation,
start_point, finish_point, pos_x,
pos_y, and dbs.dbs image "dimension" can increase or decrease with
the decibel level depending on whether the LED image is covered or
uncovered.orientation value of 0 specifies that the
dbs dimension refers to width (i.e., horizontal).
Conversely a value of 1 refers to height as the value that changes with
the level (i.e., vertical).png
parameter for each section..rar
Specification<filename>.bin file alongside an optional
<filename>.ini file. Where
<filename> must exactly match the name used as the
base name of <filename>.rar. Further, these files
must be placed in the root of the archive.<filename>1.bin/<filename>2.bin
naming pattern (with or without space between file name root and number)
is also supported for individual L/R panels..bin file(s) contained in the archive must follow
the .bin file specification outlined above and compressed,
if desired, using a supported format.DEFAULT section in the <filename>.ini
file; the supported parameters are fall, rise,
singleMeter, peakLED, isVertical,
curveAdj, and bgColour. The section and
parameter names are case insensitive.Note 1:
fallandriseparameters are currently unused.
Note 2: The
peakLEDparameter being true sets Levels to _Mixed as soon as the panel is loaded. ThesingleMeterandisVerticalparameters combine to set the Layout mode. ThebgColourparameter sets the background color, overriding the edge color detection. ThecurveAdjparameter flattens the logarithmic curve by affecting the quadratic parameter.
Note 3: Missing parameters are assumed to be 0 or false.
Note 4: A
.rararchive is probed by content and may instead contain a VUEditor.vuproject or an AIMP skin, in which case that format's specification applies.
.7z
Specification.rar specification above, except that the archive uses the
.7z extension. It must contain a
<filename>.bin file alongside an optional
<filename>.ini file, where
<filename> must exactly match the base name of
<filename>.7z, and both files must be placed in the
root of the archive.<filename>1.bin/<filename>2.bin
naming pattern (with or without space between file name root and number)
is also supported for individual L/R panels..bin file(s) contained in the archive must follow
the .bin file specification outlined above and compressed,
if desired, using a supported format.DEFAULT section in the <filename>.ini
file; the supported parameters and their notes are identical to those of
the .rar specification..7z archive is probed by content and may instead
contain a VUEditor .vu project or an AIMP skin, in which
case that format's specification applies..ini File.rar and .7z
specifications, except that <filename>.bin and
<filename>.ini are not archived together.<filename>.bin and
<filename>.ini must live in the same folder.The component exposes COM interfaces for automation. The
IVUMeter and IVUMeterWindow COM interfaces for
managing and interacting with the foobar2000 VU Meter component. In
foobar2000, these interfaces are mainly accessed through JavaScript.
com_get_interfaceRetrieves a IVUMeter interface instance.
extern "C" __declspec(dllimport) HRESULT __cdecl com_get_interface(IVUMeter** pp);LayoutEnumDefines the layout options for the VU Meter window.
| Value | Name | Description |
|---|---|---|
| 0 | BothH | Both channels, horizontal |
| 1 | BothV | Both channels, vertical |
| 2 | Left | Left channel only |
| 3 | Right | Right channel only |
| 4 | Mono | Mono layout |
ModeEnumDefines the channel (audio) mode for the VU Meter window.
| Value | Name | Description |
|---|---|---|
| 0 | Stereo | Discrete left and right channels |
| 1 | SumLeftRight | Average of the left and right channels |
| 2 | MaxLeftRight | Greater of the left and right channels |
| 3 | MidSide | Mid in left panel, side in right panel |
IVUMeterProvides control and status for the VU Meter component.
IID:
{9EBE6FDE-502B-4571-922F-5D5942A53638}
| Property | Returns (get) / Accepts (put) | Description |
|---|---|---|
ComponentVersion |
UINT; get |
Gets component's version number. |
ComponentVersionText |
BSTR; get |
Gets component's version as text. |
LeftLevel |
FLOAT; get |
Gets left channel RMS level. |
RightLevel |
FLOAT; get |
Gets right channel RMS level. |
LeftPeak |
FLOAT; get |
Gets left channel peak level. |
RightPeak |
FLOAT; get |
Gets right channel peak level. |
Offset |
DOUBLE; get, put |
Gets or sets gain offset value. |
UpdatePeriod |
DOUBLE; get, put |
Gets or sets update window period. |
BackgroundTimeout |
UINT; get, put |
Gets or sets the transparent-background recapture interval (ms). |
DownmixChannels |
BOOL; get, put |
Gets or sets downmix state. |
AutoGain |
BOOL; get, put |
Gets or sets automatic gain control state. |
Correction |
BOOL; get, put |
Gets or sets needle correction state. |
RoundCorners |
FLOAT; get, put |
Gets or sets corner rounding. |
CubicInterpolation |
BOOL; get, put |
Gets or sets cubic interpolation state (hidden; no menu option). |
DisableTuning |
BOOL; get, put |
Gets or sets tuning disable state. |
DisallowFullscreen |
BOOL; get, put |
Gets or sets fullscreen restriction state. |
MultiMonFullscreen |
BOOL; get, put |
Gets or sets multi-monitor fullscreen state. |
RemoveBackground |
BOOL; get, put |
Gets or sets background removal state. |
EnableTransparency |
BOOL; get, put |
Gets or sets transparency state. |
IgnoreDefaults |
BOOL; get, put |
Gets or sets "ignore defaults" state. |
DisablePause |
BOOL; get, put |
Gets or sets the "equivalent pause and stop" state. |
Freeze |
BOOL; get, put |
Gets or sets freeze state. |
ShowCounter |
BOOL; get, put |
Gets or sets FPS counter visibility. |
ScreensaverMode |
BOOL; get, put |
Gets or sets screensaver mode state. |
VSync |
BOOL; get, put |
Gets or sets (no effect) VSync state. |
WindowID |
UINT; get |
Gets current active window ID. Returns -1 if there is no active window. |
WindowCount |
UINT; get |
Gets total window count. |
| Function | Returns | Description |
|---|---|---|
Print(BSTR Text) |
None | Prints text to the foobar2000 console. |
Rescan() |
None | Rescans vumeter folder. |
Defaults() |
None | Restores defaults. |
CreateWindow(UINT ID) |
IVUMeterWindow** |
Creates VUMeterWindow interface for the window using ID. |
RegisterWindow(UINT ID) |
None | Sets window using ID as active. |
RegisterRect(UINT ID, INT Left, INT Top, INT Width, INT Height) |
None | Registers a rectangle region -- no effect. |
StartWaves() |
None | Starts periodic waveform/level updates. |
StopWaves() |
None | Stops periodic waveform/level updates. |
IVUMeterWindowRepresents a VU Meter window instance with properties for visibility, layout, channel mode, and skin/panel configuration.
IID:
{482C5F92-2D21-4F6F-9857-87C1D2C04344}
| Method | Returns (get) / Accepts (put) | Description |
|---|---|---|
Visible |
BOOL; get, put |
Gets or sets (no effect) window visibility state. |
Enabled |
BOOL; get, put |
Gets or sets (no effect) window enabled state. |
Layout |
LayoutEnum; get, put |
Gets or sets current layout. |
Mode |
ModeEnum; get, put |
Gets or sets the current channel (audio) mode. |
LockAspectRatio |
BOOL; get, put |
Gets or sets aspect ratio lock state. |
Fullscreen |
BOOL; get |
Gets the fullscreen state. |
SkinName |
BSTR; get, put |
Gets current skin name or changes skin. |
GroupName |
BSTR; get, put |
Gets current group name or changes skin to first one in group. |
GroupCount |
UINT; get |
Gets number of groups (directories). |
SkinCount |
UINT; get |
Gets number of skins in group of currently-selected skin. |
| Function | Returns | Description |
|---|---|---|
SetBounds(int Left, int Top, int Width, int Height) |
None | Sets window position and size -- no effect. |
ToggleFullscreen() |
None | Toggles fullscreen mode. |
SetConfig(BSTR GroupName, BSTR SkinName, LayoutEnum Layout) |
None | Changes skin and layout. |
LoadSkin(BSTR GroupName, BSTR SkinName) |
None | Changes skin. |
LoadPrevSkin(BSTR GroupName) |
None | Loads previous skin in group (does not wrap around). |
LoadNextSkin(BSTR GroupName) |
None | Loads next skin in group (does not wrap around). |
GroupSize(UINT Index) |
UINT |
Gets size of a group by index. |
Groups(UINT Index) |
BSTR |
Gets group name by index. |
Skins(UINT Index) |
BSTR |
Gets skin name by index in group. |
Skin(UINT Group, UINT Index) |
BSTR |
Gets skin name by group index and skin index. |
The component identifies itself, its preferences, and every persisted setting to foobar2000 through fixed GUIDs. These are internal identifiers of interest primarily to developers and for troubleshooting configuration state.
Entries marked Reserved are allocated but currently
inactive; the GUIDs remain reserved so the identifiers are not reused.
Type prefixes follow Hungarian notation: sz is a string,
b is Boolean, and n is an integer.
| Symbol | GUID | Status | Description |
|---|---|---|---|
vumeter |
0A8B8B7A-2E90-43BB-B395-EB41A124F7E2 |
Active | Visualization UI element (component) class. |
vumeter_preferences |
F390D0B0-F19E-4FEA-A0D9-0DC0AC11A055 |
Active | Component preferences page. |
main_menu |
FE456D4A-7D11-4086-9869-6FBBDFDEB7F5 |
Active | Main menu group ("Analog VU Meter skins"). |
None. All persisted settings are exposed through the context menu, tuning/mixer dialogs, or advanced preferences rather than a dedicated preferences page.
| Symbol | GUID | Status | Description |
|---|---|---|---|
advconfig_branch |
3DBF6F5C-18BD-4E12-A018-A2C93FD40943 |
Active | Advanced preferences branch (tree node). |
cfg_bDebugOutput |
288048A7-F084-4C4F-ABBB-0204CE61E161 |
Active | Boolean; enables debug console output. |
cfg_szPanelsDir |
A409AF0E-3249-411C-9F43-10BFE1C1EAA3 |
Active | String; panels/skins directory override. |
cfg_szDegreelessness |
26C9437C-7A9B-4431-A3C6-E4D7381CA3B7 |
Active | String; hidden diagnostic setting. |
cfg_bMemoryOptimize |
908C4494-A58F-45B0-8853-98D977550B1E |
Active | Boolean; memory optimization. |
cfg_bEnableCOM |
B3DB04F7-5E99-4AC0-8A9A-F7D4004AF872 |
Active | Boolean; enables COM automation. |
cfg_nRenderBackend |
C7A3F1E2-9B84-4D6A-BE12-3F5A9C0D7E48 |
Active | Integer; render backend selection (DX12/DX11). |
None.
Controlled through the context menu or keyboard shortcuts.
| Symbol | GUID | Status | Description |
|---|---|---|---|
cfg_layout |
368B5693-7091-408A-A3C1-74FA0259AF9A |
Reserved | Panel layout. |
cfg_lock_aspect_ratio |
86D87AC0-F34C-46BA-A50C-03E3FBD67D37 |
Reserved | Aspect ratio lock. |
cfg_mode |
7D098528-8D61-4CAD-807A-908C65B07A70 |
Reserved | Channel mode. |
cfg_level |
0705F80D-FF4E-4B7F-940D-0E0EC5B79E63 |
Reserved | Level metering method. |
cfg_tune |
06412F09-F77F-4861-A6AC-73B2029C357F |
Active | Active mouse-wheel tuning mode. |
cfg_zero |
C8565C14-E384-45F2-99A1-3D0CC0F549B2 |
Active | Needle zero-frame offset. |
cfg_range |
5E21CED6-7E84-4109-B63D-16EA025ECDAD |
Active | Needle range compression. |
cfg_decay |
2731521E-9ABB-4CD0-87CB-8D2050DB3EC3 |
Active | Needle decay factor. |
cfg_rise |
4E52E172-C866-405A-8916-6EC9AD496146 |
Active | Needle rise factor. |
cfg_jitter |
D769DF7E-CC47-4AAA-ACF4-BBF55E2C872B |
Active | Movement jitter threshold. |
cfg_preamp_gain |
37EF1A37-F1C6-4C9D-9D44-98575AD3A732 |
Active | Preamp gain. |
cfg_auto_gain |
9A1F4B2C-7D3E-4C6A-B58F-2E9C10AD37B4 |
Active | Automatic gain control toggle. |
cfg_correction |
7C2A9E14-3B6D-4F81-A0C5-8E1D2F4B6A90 |
Active | Needle correction toggle. |
cfg_sample_window |
385E0310-CE68-4F8D-9493-F069EF8F485B |
Active | Level sample window. |
cfg_max_fps |
473E162D-FC44-45CF-807A-A5F100B686C0 |
Active | Maximum frames per second. |
cfg_round_corners |
4C99FF1D-28CE-406F-AB2A-105DEC4DC11A |
Active | Rounded corner radius. |
cfg_timeout |
554AD54E-C110-41C4-8D38-6623B2E00C1A |
Active | Background/transparency timeout. |
cfg_inertia |
6FFBFBE7-9E00-473E-A30A-E99CB5E8800B |
Reserved | Needle inertia. |
cfg_downmix |
6C79D6FE-4F8F-4B1C-A47A-59975F5EBAD6 |
Active | Downmix channels toggle. |
cfg_cubic_interpolation |
D005942F-399D-4763-B495-3887EEF18DC9 |
Reserved | Cubic interpolation. |
cfg_lock_tuning |
BBFD6455-5F48-4E79-A023-F582A2C4AA37 |
Active | Disable tuning toggle. |
cfg_fullscreen |
349B0CD8-3A61-4328-BAE1-52C89FEE0430 |
Active | Disallow fullscreen toggle. |
cfg_background |
E85F0D94-D654-46CD-8F8C-B4C893B0D67A |
Active | Remove background toggle. |
cfg_transparent |
D2124978-AF41-4EDF-9A54-0788BC530CEA |
Reserved | Enable transparency. |
cfg_ignore |
E236AB91-15EE-4EBB-A9A9-E150CAD37B20 |
Active | Ignore panel defaults toggle. |
cfg_pause |
AF200679-B16D-411E-9CD1-332817398C58 |
Active | Equivalent pause and stop toggle. |
cfg_screensaver |
CA938CA1-3BEB-4E7C-A078-A9886E91391D |
Reserved | Screensaver mode. |
cfg_proportional |
80985F2F-67D7-4C14-85C8-A0542922D206 |
Reserved | PID controller proportional term. |
cfg_integral |
1C8BE59B-6B09-4184-A4E8-D198EBE26109 |
Reserved | PID controller integral term. |
cfg_derivative |
40A4648C-3777-4188-BB08-C8476A2728CF |
Reserved | PID controller derivative term. |
cfg_settle |
2F7A1C3D-9B4E-4A21-8C6F-112233445566 |
Active | VU ballistics settle (rise/fall) time. |
cfg_overshoot |
3E8B2D4E-AC5F-4B32-9D7A-223344556677 |
Active | VU ballistics overshoot. |
cfg_speed |
8EE17EAC-E63C-4AEB-91D7-76AEDAA37EB0 |
Active | Needle movement speed. |
cfg_damping |
A9EEFA40-6C9A-4583-80BA-DA279940E4D7 |
Active | Needle movement damping. |
cfg_vsync |
63D61429-0510-4107-B82D-28EA87EE3DDB |
Active | Vertical synchronization toggle. |
cfg_font |
BA10193B-9C66-4F8F-9D49-A529FF1C1510 |
Active | Counter font family. |
cfg_size |
0714F23B-D637-4CB2-A375-D24C2671DE7A |
Active | Counter font size. |
cfg_weight |
AC5085D9-8B45-487F-8810-9F9DF1237450 |
Active | Counter font weight. |
cfg_style |
FD99483F-0850-41CA-909E-A2B65BB20224 |
Active | Counter font style. |
cfg_color |
5E0B88AC-E4E2-4AB4-9A1E-641A7AFCD70E |
Active | Counter font color. |
cfg_panel |
BC6BEAFF-6845-4D3F-B641-240358C43A1B |
Reserved | Selected panel/skin. |