DIGWASH

/// Trust pages · the conversion chain

What a conversion
actually does.

We do not master your tracks. We tell you what may fail. When a track does need a compatibility copy, this page is the complete list of what happens to the audio — and, just as importantly, what never does. Every claim below is traceable to a named function in the conversion code of the current build.

§ The contract — read this first

Compatible. Not better.

DigWash does not master, normalize, repair, or "enhance" your tracks. It creates a compatibility copy only when your chosen booth preset requires one. Originals are opened read-only. A file that already plays on the target deck is skipped, not re-encoded. When a conversion costs quality — a downsample, a shorter word length, a lossy re-encode — the plan says so before a single byte is written.

A bad source stays a bad source. DigWash can make it playable. It cannot make it good.

That is the whole promise. Everything below is the engineering behind it, for anyone who wants to check.

§ The chain, step by step

Six steps. Nothing hidden.

The source: lines below name real functions in the build you download. The code is not public, so read them as implementation notes rather than audit links — commit-pinned references are planned alongside V1. If a claim on this page ever drifts from the code, that is a bug in the page and we treat it as one.

  1. 01 Decode The source file is opened read-only and decoded in-process with PyAV — Python bindings to FFmpeg's libavformat and libavcodec, widely used, battle-tested decoding libraries. No shell commands, no hidden intermediate files. source: convert.py · _transcode_audio
  2. 02 Resample — only when needed If the source sample rate is above the target ceiling (48 kHz by default), it is converted down with libswresample, FFmpeg's resampling library, through an explicit aresample filter graph. A source already at or below the ceiling passes through at its own rate. DigWash never upsamples. source: convert.py · _AudioFilterResampler, target_sample_rate
  3. 03 Requantize with TPDF dither When samples are written to a shorter word length, triangular (TPDF) dither is applied — the textbook way to trade correlated quantization distortion for a small, benign noise floor. For 24-bit output the filter is told to keep 24 significant bits, so dither is scaled to the real output depth. source: convert.py · aresample dither_method=triangular
  4. 04 Encode to AIFF PCM Output is plain linear PCM in an AIFF container — 16-bit sources stay 16-bit, 24-bit sources stay 24-bit, and anything deeper is clamped to 24-bit because no CDJ benefits from more. The channel layout is copied from the source: no mono fold-down, no stereo widening. source: convert.py · target_pcm_codec
  5. 05 Carry tags and artwork Title, artist, album, album artist, date, disc, genre, label and track number are carried over, and embedded cover art is re-attached to the AIFF as a standards-compatible ID3 chunk. The picture bytes are copied as-is — never re-encoded. The precise inventory — including what is not carried yet, and what is rekordbox's business rather than ours — is spelled out further down this page. source: convert.py · USEFUL_METADATA_KEYS, _append_aiff_id3
  6. 06 Verify, then move into place The finished file is probed again and checked: codec, bit depth, sample rate, duration (within 0.5%), every carried tag, and the artwork. Conversion happens in a temporary file that only replaces the destination after it exists in full. A conversion that loses a single tag fails loudly instead of shipping a quiet defect. source: convert.py · verify_cdj_aiff, _verify_useful_metadata

Step 06 leaves a paper trail. Every committed conversion produces a per-file receipt — shown in the app and the CLI output, and optionally written next to the copies as a session log (--receipt-log). The facts are recorded during the run, never reconstructed after it. The gain line is on every receipt and always says the same thing — that is the point. Real output shape:

DigWash conversion receipts — any-booth preset
  written 2026-07-06T18:10:22

  receipt — Artist - Track.aiff
    original : flac / 96 kHz / 24-bit
    output   : clean copy (AIFF PCM) · pcm_s24be / 48 kHz / 24-bit
    audio    : downsample 96 kHz → 48 kHz
    gain     : unchanged — never normalized, never limited
    dither   : TPDF
    tags     : 9/9 carried · artwork preserved
    duration : +0.000 s vs source
    verify   : passed

  Gain is unchanged on every copy — DigWash never normalizes, never limits.

§ What never happens

The waveform is not "improved."

Between decode and encode there is exactly one audio operation: resampling with dither, and only when a ceiling forces it. Everything a mastering tool would do is absent on purpose.

No normalization

The only audio filter in the conversion graph is the resampler. There is no loudness normalization, no gain change, no limiter, no EQ — your levels come out exactly as they went in. What that means for sources already pushing past full scale is spelled out in the clipping policy below.

No upsampling

A 44.1 kHz source stays 44.1 kHz. Raising the sample rate adds bytes, not information, so DigWash never does it.

No bit-depth padding

A 16-bit source stays 16-bit. Padding samples to 24-bit would fake resolution the recording never had.

No repairs, no upgrades

Converting a lossy file to AIFF makes it playable on decks that reject the original format. It does not restore anything the lossy encoder discarded. A bad source stays a bad source — the check report is where that truth lives.

Originals never edited

Conversion always writes a new copy. The source file is never modified in place, and it is only moved to the Trash if you explicitly ask for that.

Nothing written without a preview

Convert and wash show the full plan — file by file, with reasons — and write only after you confirm. A file the preset would keep as-is is skipped, not needlessly re-encoded.

§ Levels, full scale, clipping

Never turned down. Never limited.

"No gain change" invites a hard question from anyone who has watched a limiter quietly save a mix: what happens when decoded samples land above full scale? Here is the exact policy — and where the warning meets you before anything is written.

The trap, named

Lossy decoders (MP3, AAC) output floating-point samples that can legitimately land above 0 dBFS — encoder overshoot the original file never had to store as integers. Integer PCM has no room above full scale. Any converter that writes lossy sources to PCM has to have a policy here; most just don't tell you theirs.

What DigWash does

Writes your levels as they are. Samples above full scale saturate at 0 dBFS on the way into PCM — libswresample clamps, it never wraps. DigWash does not turn the track down to make room, and does not run a limiter to hide the overs. A converted copy can therefore preserve a clipping risk the source already carried — preserved, not created, and never silently "fixed."

source: convert.py · _AudioFilterResampler

Where the warning lives

digwash check measures a 4×-oversampled true peak and counts hard-clipped samples on every track. True peak over 0 dBTP or real flat-top clipping is flagged as hot in the report — before you convert anything. The report's own words: transcoding does not repair clipping.

source: analysis · measure_true_peak_oversampled, clip_stats

The flag on the plan itself

The convert preview now carries the warning where the decision happens: any would-write line whose source measures a true peak over 0 dBTP — or real flat-top clipping — is flagged before you confirm, in the CLI plan and on the same line in the app. The wording is deliberate: "this copy preserves an existing clipping risk — reported, not repaired." Never "will clip" — the saturation may already live in the source's own decode. The measurement is reused from the check when the track was already checked, and the severity is the check engine's own call, never re-judged at plan time.

source: convert.py · plan_level_flag, LEVEL_FLAG_LINE

§ Where conversion does cost something

Honest about the trade.

"Lossless workflow" is a nice phrase, but a compatibility clamp is a real reduction and we would rather you know exactly which ones exist and when they apply.

96 kHz → 48 kHz

Downsampling discards spectral content above 24 kHz. That is above the range of human hearing and of most playback chains, but it is still a removal, so we say it: the copy is not bit-identical to the master.

24-bit → 16-bit (audio-cd only, V1)

Word-length reduction raises the noise floor. TPDF dither keeps that floor smooth and program-independent, and 16-bit noise sits far below anything a club system reveals — but it is a real reduction. No verified USB deck needs 16-bit, so DigWash keeps 24-bit everywhere; the only 16-bit path is the Red Book audio-cd preset (lands in V1).

Lossy → lossy re-encode — last resort only

Re-encoding lossy audio is always quality-negative: new artifacts on top of old ones, nothing restored. DigWash offers it in exactly one situation — when the alternative is a file that will not play (MP3/AAC above 320 kbps, rejected by every deck family we track) — and only behind an explicit confirmation. The original is kept, the plan calls the move what it is, and the result is a playable copy, not a clean one.

File size

PCM is uncompressed: an AIFF copy of a FLAC is roughly twice the size. That is the price of playing on decks that never learned FLAC.

§ File tags vs. library data

What "carrying metadata" means here.

"Tags and artwork" is vague, and DJs are right to push on it: what about BPM, key, comments, hot cues, beatgrids, My Tags? Here is the precise inventory — carried, not yet carried, and deliberately never touched.

Carried today

Title, artist, album, album artist, date, disc number, genre, label, track number — plus embedded artwork, byte for byte. Every carried tag is re-checked on the finished file; a conversion that loses one fails instead of shipping.

Not carried yet

BPM, initial key, and comment tags written into the file by other tools are not copied to the AIFF in this beta. That is a gap, not a policy — it is on the V1 list. Until then, expect your DJ software to re-analyze the copy as it would any new file.

Never touched: rekordbox library data

Hot cues, memory cues, beatgrids, loops, My Tags, color tags, ratings, play history, date added — these live in rekordbox's database, not in your audio files. DigWash never opens that database. It writes new audio files and plain .m3u8 playlists, nothing else. To rekordbox, a converted copy is a new track: cues set on the original stay on the original. We would rather say that plainly than let you assume otherwise at 1 a.m.

§ Known limitations

Named upfront.

Trust is won here, not in the feature list. These are the edges of what conversion does today.

DRM-protected files

Cannot be decoded, so conversion fails with an error — loudly, not silently.

Corrupt sources

A file that cannot decode or verify fails the conversion and the temporary file is removed. No partial output is ever left in the destination.

Multichannel sources

The channel layout is copied as-is — nothing is folded to stereo behind your back. Decks expect stereo; what to do with a 5.1 file is your call, not ours.

Damage is reported, not repaired

Clipping, lossy artifacts, low-bitrate roll-off: the check report names them, the conversion preserves them. There is no repair mode to oversell.

Cues and grids

Deck and rekordbox performance data is out of scope for a file converter — see the metadata inventory above.

AIFF copies are larger

PCM is uncompressed: roughly twice the size of the FLAC it came from. That is the price of decks that never learned FLAC.

§ Continue

The other proofs.

Deck compatibilityThe five deck families and exactly which formats each one plays. Lossy sourcesWhat lossy is accepted for now — the codec-aware bars and the no-forcing rule. Privacy & offlineWhat runs locally, what the beta sends, and what never leaves. ResearchThe white paper behind the checks and their evidence grades.