v0.23.0 MIT + BSD-2-Clause C++17 · zero dependencies

A meter that can prove its own numbers.

crête measures TT Dynamic Range, EBU R128 integrated loudness, true peak, PLR, PSR and LRA on lossless audio — and every figure it prints is gated weekly against an external reference implementation. The name is French for crest: the origin of the audio term crest factor.

0
dependencies, default build
15,483
metric comparisons per weekly run
217 / 0
passed / failed, weekly #106
0.000e+00
aarch64 vs x86_64, 273 fields

01 — What it is for

The loudness war is a measurable crime. This is the evidence kit.

Thirty years of masters pushed to the ceiling left a catalogue of records with no dynamics left in them — brickwalled, distorted, exhausting after twenty minutes. A dynamic range figure is the cheapest way to see it, which is why a DR number is only worth having if it is correct.

Most meters hand you a number and no way to check it. crête's whole design premise is the opposite: every metric names the specification that governs it, every algorithmic choice that the specification does not cover is stated as a choice rather than smuggled in, and the whole corpus is re-measured against an external commercial reference every week.

Lossy audio sold as hi-res

crête detects MQA and reports it unconditionally — there is no flag to enable it and none to suppress it. If you are measuring dynamic range, you are entitled to know the source is not lossless.

Playback-time compressors in the signal path

AC-3 and E-AC-3 carry Dolby DRC metadata and most decoders apply it by default. That is right for a player and wrong for a meter. crête pins drc_scale=0; leaving it on moved peak by 6.2 dB on one measured 5.1 bed.

Numbers with no oracle behind them

The reference tool, MAAT DROffline, is closed — you cannot audit it. So crête never trusts one oracle: a second independent implementation, analytic synthetics, and crête-vs-crête control suites all have to agree before a number is believed.

02 — What it measures

Every metric, and the standard that governs it

Reported per track and per channel. The tags are printed in the output itself and carried in the JSON standards map, so a measurement records its own provenance.

MetricGoverning standardDefinition as implemented
DR (PMF)TT Dynamic Range PMFMean of the per-channel DR values, rounded once. Per channel: 2nd-highest block peak over the quadratic mean of that channel’s loudest 20 % of 3 s blocks.
Integrated loudnessITU-R BS.1770-4 / EBU R128 ITUK-weighting via hardcoded biquads, absolute gate −70 LUFS, relative gate −10 LU below the ungated mean.
True peakITU-R BS.1770-4 4× polyphase FIR, 12 taps per phase, per channel; the joint figure takes the scored channels, matching the joint sample peak. Clamped to ≥ the sample peak, which the standard requires by definition.
Max M / Max SEBU Tech 3341 400 ms momentary at 75 % overlap; 3 s short-term at 67 % overlap, on one shared 0.1 s hop grid.
LRAEBU Tech 3342 Relative gate at −20 LU. Passes all six official compliance vectors within ±1 LU.
PLRLoudness-ratio convention AESmin(max true peak, 0) − LUFSi, clamped to match reference behaviour on over-full-scale material.
Min PSRAES eBrief 373 3 s window sample peak minus its BS.1770-4 short-term loudness, minimum over the track, −50 LUFS floor.
Crest factor— Peak over RMS, per channel and joint.

Where a standard stops, crête says so rather than implying coverage. TT DR defines nothing past stereo, so the multichannel rule is documented as a chosen rule and shipped alongside two companion figures instead of one number presented as authoritative.

03 — Reading a DR score

Five bands, and what they sound like

> 20 Exceptional
Classical, jazz, vinyl-era. Full dynamic expression.
14–20 Excellent
Well-mastered releases and high-quality remasters.
8–13 Normal
Typical commercial release. Adequate for most genres.
5–7 Compressed
Heavily limited. Loudness-war casualty. Listening fatigue likely.
< 5 Brickwalled
Severely clipped. Near-constant loudness, no dynamics. Distorted.

Standard output — crete -f std

------------------------------------------------
 Analyzed Folder: /Music/Random Access Memories
------------------------------------------------
DR         Peak       RMS        Filename
------------------------------------------------

DR11       -1.77 dB   -17.31 dB  01. Horizon Ouverture.wav
DR10       -0.01 dB   -12.91 dB  02. Horizon (Japan CD).wav
DR9        over       -10.56 dB  03. GLBTM (Outtakes).wav
------------------------------------------------

 Number of Files: 9
 Official DR Value: DR9

================================================

Compatible with the dr.loudness-war.info submission format. Four further formats: foobar, ext (26-column parity table), detail, and json.

04 — The application

A GUI that is the same measurement, not a lighter one

crete-gui is Dear ImGui over SDL2 and OpenGL, laid out as horizontal bands: source bar, DSD strip, verdict band, a DR meter-bar table and a grouped detail panel. Drag-and-drop, native file and folder dialogs, sortable results, light and dark shells.

Since 0.16.1 both front-ends expand an input path through one collector, so a folder cannot mean different things depending on which one opened it: cue sheets slice per TRACK, an SACD .iso lists its TOC behind an area selector, and a multi-stream Blu-ray raises a stream picker before the run rather than a warning after it. Tracks list in album order — sorting changes the view, never the order or the selection.

An album's files are decoded and analysed across a thread pool fitted to the host's free memory as well as its cores — since 0.19.0 the same plan the CLI makes, with a note in the log when memory is what limits it — order-preserving and verified bit-identical to a sequential run: around 5–6× faster on a typical album, with no number moved. Log writing is opt-in; by default results stay in the window.

DSD strip

Appears only for DSD sources; exposes chain, filter and output rate. Picking Direct auto-restricts the other two to the one valid combination.

Channel matrix

Per-channel meter bars with the lowest scored channel in accent and the LFE greyed as unscored.

About & DSD Guide panels

The measurement standard behind each metric, and the full decimation support matrix, in the app. About also pins the two axes the GUI does not expose.

Codec profile

Where a stream declares one, the detail panel names it — and an immersive carrier says which bed the numbers describe.

The crête GUI in its dark shell, showing a quad album’s results table — a DR meter bar and the peak, RMS, LUFS, PLR and duration columns for each track.
Results table with DR meter bars.
The per-channel panel on a 5.1 master: a meter bar per channel, the lowest scored channel (C) drawn in the accent, and the LFE greyed as unscored under an “LFE excluded” marker.
Per-channel matrix on a 5.1 master.
The side panel open on Settings: the dark-shell toggle, the “score the LFE in DR” switch noting that the LFE is measured but not scored by default, the opt-in analysis log, and below them the About text and the measurement-standards list.
Settings, About and the measurement standards.
The DSD strip, shown only for DSD sources: chain (multistage or direct), filter (default, firls or kaiser) and output rate (44.1 to 352.8 kHz), with the shipping defaults — multistage, default, 44.1 kHz — selected. Below it, the empty drop target listing the accepted formats.
DSD strip: chain, filter, output rate.

05 — Build

Three CLI tiers, one GUI. The default has nothing to install.

A single translation unit, no external libraries, no build step beyond make. Optional tiers layer on top and never enter the default path. The FFmpeg tiers are also packaged, as crete and crete-gui: for openSUSE, Fedora, Debian, Ubuntu and Arch, for macOS through a Homebrew tap, and for Windows through Scoop.

git clone https://codeberg.org/abksh/Crete
cd Crete
make                  # zero-dep CLI
./crete /path/to/album/
TargetBinaryAdds
makecreteCore analysis, text output formats. No dependencies.
make cli-jsoncrete-f json; header auto-fetched once.
make cli-json-ffmpegcrete-ffmpegALAC, MP3, AAC, Opus, TrueHD, DTS-HD MA, AC-3, DVD title sets, and the codec profile.
make guicrete-guiSDL2 + Dear ImGui drag-and-drop app.
make gui-ffmpegcrete-gui-ffmpegBoth of the above.

06 — Reach

What it reads, on how many channels, and where it runs

crête is validated against MAAT DROffline and was cross-checked against foobar2000's DR Meter, so on a stereo PCM album the three should agree — that is the whole point of the weekly run, and where they still differ, the Testing page names the metric and the size of the gap.

The difference is in reach. A reference that reads two channels cannot gate a 5.1 figure, and a meter that is one binary with no dependencies can be run on an architecture nobody has shipped a build for. Below is where crête goes further, and the suite that holds each claim up.

gated Nine native formats, and the container cannot change the number
WAV, RF64/BW64, Wave64, AIFF, AIFF-C sowt, FLAC, DSF, DFF and SACD .iso — DST-compressed areas included — all decoded by crête’s own code in every build, with no libFLAC and no libsndfile. The FORMAT suite transcodes six albums every way and requires Δ 0.000 across all of them; CUE slicing is held to the same figure against the equivalent per-track album.
gated Mono through 7.1, measured per channel
Per-channel DR, peak, true peak, RMS and loudness with BS.1770-4 weighting, the LFE measured in full but not scored, and the multichannel rule stated as a chosen rule rather than implied. SURROUND runs 1620 comparisons, QUADIO 240 with zero flags, DTSX 350. The MAAT reference rows crête holds carry at most two channels, which is why those suites are gated against stems — there is no external oracle for a 5.1 figure. Since 0.21.0 a declared channel mask sets the labels, LFE and weights for layouts the count cannot express, such as Auro-3D 8.0 and 9.1; the corpus holds no such file, so that path is gated by a synthetic self-check, not by the weekly.
gated Two architectures, compared to each other every week
Both Linux agents build natively and their JSON is compared field by field: 273 fields at 0.000e+00 on the lossless carriers. It needs -ffp-contract=off — without it the compiler fuses multiply-add on the architecture that has an FMA instruction and not on the one that does not, and the K-weighting biquads diverge at ULP level. macOS is one ULP away on log10, and the site says so rather than claiming three platforms agree.
planned RISC-V as the third gated architecture
Not built, not scheduled, and no number behind it yet. It is worth doing for the same reason aarch64 was: bit-identity is only a claim until a machine that rounds differently has to agree, and a third instruction set is the cheapest remaining test of it. It joins the weekly cross-architecture gate or it does not count.
shipped One binary, and nothing to install
The default build is a single C++17 translation unit with no external libraries and no build step beyond make; STATIC=1 links it fully. MIT plus BSD-2-Clause for the DSD engine, so the whole measurement path can be read, audited and rebuilt — which is the one thing a closed reference cannot offer, however good its numbers are.
shipped A damaged file is named, not silently scored
Since 0.17.0 crête verifies FLAC frame CRC-8 and CRC-16, checks every declared length against what actually decoded, and rejects a sample peak above 0 dBFS on integer PCM as arithmetically impossible. The file is still measured — crête is a meter, not a repair tool — but every affected number is flagged, listed in JSON under a warnings array that is always present, and reflected in exit code 2. Before this, a FLAC with one bad sector took an album from DR13 to DR9 at a sample peak of +48.16 dBFS and exited 0.
shipped Disc audio measured as authored
AC-3 and E-AC-3 carry Dolby DRC metadata and most decoders apply it by default — right for a player, wrong for a meter. crête pins drc_scale=0. Leaving it on moved peak by 6.2 dB on one JOC 5.1 bed. Atmos and DTS:X are decoded as their channel bed and the output says so, because there is no renderer in the chain and a bed measurement is not an Atmos measurement.

07 — Known limitations

What crête does not do, stated before you find out

Nothing below is hidden in a footnote elsewhere. Every one of these is an open item with a measurement behind it, and the Testing page carries the numbers.

All limitations in detail
44.1 kHz is the parity-guaranteed DSD rate. 88.2 / 176.4 / 352.8 kHz output is offered for analysis, not parity. Retained ultrasonic noise-shaping inflated DR by +1…+3 at 352.8 kHz; since 0.22.0 a 50 kHz band limit in the decoder removes most of that, but the band still holds content the 44.1 kHz decode does not. At the default rate the continuous per-track DR comparison flags nothing on any of the 8 DSD albums and album DR matches on 7 of 8; the exception misses a .5 boundary by 0.020 dB and is an accuracy question, not a rate one.
Min PSR disagrees with the reference by design. MAAT uses a 0.5 dB/s decaying peak-hold; crête implements the published AES eBrief 373 formula. Average delta 0.574 dB over 573 comparisons in weekly #106 — the worst metric in the suite.
MQA is detected, never decoded. No open decoder exists, so DR is measured on the delivered base-band PCM and content encoded above it is not reconstructed.
Atmos and DTS:X are measured as their channel bed. There is no renderer in the chain. Object metadata is discarded, and since 0.15.0 the output names the profile and marks the layout as a bed. An Auro-3D carrier cannot be identified this way and is not attempted; a discrete Auro-3D file, which declares its speakers, is labelled from its channel mask since 0.21.0.
Disc audio and SACD have no external oracle. TrueHD / DTS-HD MA / AC-3 are gated against crête’s own recorded values and against the LPCM carrier of the same master — nothing outside crête, and DST sits in the same position. The SACD comparison that would settle it, crête on the ISO against crête on the .dsf extracted from the same disc, is written but is not running in CI.
A DVD-Audio title set measures as its first mix. One title set can carry a 5.1 mix, a stereo mix and more, with boundaries that ignore the file fragments. crête measures the first group, warns and exits 2 rather than metering through the change. The disc’s track tables are read exactly, but there is no per-track DVD-Audio measurement yet.
DST decoding runs at about 2× realtime. Six channels through one arithmetic decoder, which cannot be parallelised inside a frame — a 43-minute 5.1 disc takes roughly 20 minutes. Frames are independent, so this is fixable and not yet fixed.
Altered samples in WAV and AIFF cannot be caught. Neither container carries a checksum, so a changed sample value is undetectable by crête or any other meter — only declared length and the 0 dBFS range check apply. FLAC proves itself through frame CRC-8 and CRC-16. The test suite asserts the blind spot rather than assuming it away.
The 0.16.1 GUI bands have not been looked at. The SACD, cue and stream-picker bands are verified by construction and headlessly, never visually. Narrow window widths are the case to check.
Memory-aware scheduling has not met a container limit. Since 0.19.0 the default worker count is fitted to free memory and any container limit. The Linux detection has run on both weekly agents, neither of which has a limit, so the cgroup reads have never returned one; the Windows path has never been run. No measurement depends on them.
The >4 GB path is exercised; a >4 GB allocation is not. RF64 / BW64 / Wave64 64-bit sizes are honoured and verified, but crête loads a whole file before decoding and no test host is large enough yet.

The whole point

Every number has an oracle. Anything else is a vibe with a decimal point.

Reference-validated, deterministic, bit-reproducible across architectures. Where no reference exists, crête declines to invent one — it states the rule, reports the companion figures, and tells you what it could not check.

See how it is gated →
crête 0.23.0 MIT License — Ashwin Balaji 2026. DSD decode by libdsddpcm (BSD-2-Clause). FFmpeg tier under LGPL 2.1+. codeberg.org/abksh/Crete