WaxOn/WaxOff

Podcast audio utility for macOS. Signal conditioning for ingest and broadcast normalization for delivery.

WaxOn prepares raw recordings for ingest. WaxOff finalizes your mixed audio for distribution. Both share the same drag-and-drop workflow, waveform viewer, and file stats panel.

Getting Started

System Requirements

Installation

  1. Download the DMG from the link above
  2. Open the DMG and drag WaxOn/WaxOff to your Applications folder

First Launch: Mode Picker

On first launch, a compact mode picker appears. Choose WaxOn to prepare raw recordings, or WaxOff to finalize a mix. After your first selection, the app remembers your last-used mode and opens directly into it. Switch modes any time using the WaxOn | WaxOff segmented control in the toolbar; each mode maintains its own independent file list, so switching doesn't disturb your work in the other mode.

Updates

WaxOn/WaxOff checks for updates silently on launch and notifies you when a new version is available. You can also check manually at any time: Help → Check for Updates…

The Interface

Both modes share the same window layout, divided into four areas.

Toolbar

The top bar contains the mode switcher (WaxOn | WaxOff) on the left, followed by a Preset picker, and then the action buttons (Process, Remove, Clear). The far right end of the toolbar holds the settings-sidebar toggle.

File List

The left panel shows all loaded files. Each row displays the filename and a status label. Drag rows to reorder; drag the vertical divider to resize the panel.

In WaxOn, files with a high estimated noise floor show an orange warning triangle next to the filename. Hover over the badge for detail. WaxOn also flags channel conversions: a stereo source with Channels set to Mono shows a STEREO→MONO L (or R) badge, and a source with more than two channels shows MULTI→MONO. In WaxOff, mono sources show a MONO badge; by default the file is upmixed to dual-mono stereo before processing, unless Mono delivery is selected.

When two or more files are queued in WaxOn with Phase Rotation enabled, an advisory banner appears above the list: if the files were recorded simultaneously in the same room, consider applying phase rotation once at the mix bus instead of per-track. See Phase Rotation in the Theory of Operation.

WaxOn processes multiple files concurrently, scaling with available CPU cores. Files waiting their turn show a muted static progress bar so it's clear they are queued and not stalled.

Select files and press Delete to remove them, or use ⌘⌥Delete to clear the entire list.

Waveform Panel

The right panel shows different content depending on context:

A toggle button in the top-right corner switches between the waveform view and the Console, a scrollable log showing what WaxOn is doing during processing. A Verbose checkbox reveals additional detail such as filter parameters and per-file loudnorm measurements; the Verbose preference is remembered between launches.

Settings Sidebar

A collapsible panel on the right edge of the window holds output format settings for the current mode (sample rate, channels, output directory). Toggle it open or closed with the sliders icon at the far right of the toolbar.

Processor Strip

The bar across the bottom of the window holds all processing controls for the current mode — high-pass, phase rotation, dynamic leveling, loudness normalization in WaxOn; true peak and target loudness in WaxOff. Toggles glow orange when enabled. Knobs respond to vertical drag or the scroll wheel and snap to discrete steps; most controls show a short helper line beneath them, and every control has a hover tooltip. All values persist between sessions and are captured by presets.

WaxOn Mode WaxOn

WaxOn prepares raw podcast recordings for editing in a DAW. It handles high-pass filtering, optional dynamic leveling, loudness normalization, phase rotation, and true-peak ceiling control, outputting 24-bit WAV files ready to drop into Logic Pro, Reaper, or any other editor.

WaxOn is a first-step ingest processor: get your raw recordings into a consistent, workable format before editing. It does not do spectral repair, noise reduction, or multiband restoration. For recordings with noise problems, de-essing needs, or other surgical work, dedicated tools like iZotope RX are the right choice.

Quick Start

  1. Click WaxOn in the toolbar (or choose it from the mode picker)
  2. Select a preset from the Preset menu in the toolbar, or adjust controls in the processor strip and Settings sidebar
  3. Drag your audio files onto the window
  4. Click Process

WaxOn Presets WaxOn

Presets save and restore a complete group of WaxOn settings in one click. The Preset menu is in the toolbar, to the right of the mode switcher.

Built-In Presets

Preset HPF Loudness Norm Target Channels Sample Rate
Defaults 80 Hz Off Mono L 44.1 kHz
Edit Prep 80 Hz On −30 LUFS Mono L 44.1 kHz
ATSC A/85 80 Hz On −24 LUFS Mono L 44.1 kHz

Defaults resets all WaxOn settings to factory values. A quick way to start fresh.

Edit Prep is optimized for single-mic podcast recordings destined for DAW editing. −30 LUFS leaves generous headroom for editing and processing.

ATSC A/85 targets the −24 LKFS dialog reference level used for US broadcast and video delivery. WaxOn's fixed −1.0 dBTP true-peak ceiling is stricter than ATSC A/85's −2.0 dBTP requirement, so the output stays comfortably within spec. Tracks feel natural at calibrated monitor levels and still leave headroom before typical delivery targets.

Custom Presets

Configure your settings, then open the Preset menu and choose Save Current Settings…. Give the preset a name and it will persist across relaunches. Delete custom presets from the same menu.

WaxOn Settings WaxOn

Setting Range / Options Description
Sample Rate 44.1 kHz · 48 kHz Output sample rate. 48 kHz for video projects; 44.1 kHz for audio-only. Uses FFmpeg's high-quality resampler.
Channels Mono · Stereo Stereo passes both channels through unchanged. Mono extracts a single channel from a stereo source.
Channel Left · Right Mono mode only. Which channel to extract. Use Left for a standard single-mic recording on channel 1. Grayed out when Channels is Stereo.
High Pass On · Off · default On 80 Hz high-pass filter — removes rumble, handling noise, and proximity-effect bass buildup without thinning the voice. Off drops the cutoff to 20 Hz (DC floor only). DC offset is always removed regardless of this setting.
Phase Rotation On · Off · default On 200 Hz allpass filter that reduces peak asymmetry on voice recordings, recovering 1–4 dB of headroom before the limiter. The effect on speech is inaudible. Leave on unless you have a specific reason to disable.
Dynamic Leveling On · Off · default Off Bidirectional dynamic normalization. Best for panel recordings, live Q&As, and multi-guest sources where voices are at inconsistent levels. Not recommended for regular solo voice use — can cause pumping artifacts on recordings with natural pauses. See Theory of Operation.
Strength Gentle → Aggressive · 9 positions · default Medium Controls how quickly and strongly Dynamic Leveling responds. Lower settings use longer analysis frames and a smaller maximum gain (≈ +6 dB) for smoother, more conservative leveling; higher settings use shorter frames and a larger maximum gain (≈ +15 dB) for faster, more aggressive response. Audition output before editing. Dimmed when Dynamic Leveling is off.
Loudness Norm On · Off Enables two-pass EBU R128 loudness normalization. The analysis pass applies RNNoise internally on a temp copy to prevent broadband noise from skewing the loudness measurement; the output signal is not affected. Off = filtering and linear peak normalization to the −1.0 dBTP ceiling only.
Target LUFS −16 to −35 LUFS · 1 LUFS steps · default −30 Integrated loudness target when Loudness Norm is on. −30 LUFS is conservative for ingest and leaves plenty of headroom for editing. Dimmed when Loudness Norm is off.
Output Dir Path or empty Where output files are written. Empty = same folder as the source. Set a path to collect all outputs in one place.

WaxOn Processing Pipeline WaxOn

Every file passes through an FFmpeg processing chain. Three required stages plus up to four optional ones.

  1. Filter, Channel & Resample A single high-pass filter at max(cutoff, 20 Hz) — so even with HPF set to Off, a 20 Hz floor remains and DC offset is always removed. Followed by channel selection if Mono output is selected, an optional 200 Hz allpass for phase rotation (reduces peak asymmetry and improves limiter headroom — on by default), and resampling to the target rate. Output at this stage: 24-bit PCM WAV at the target sample rate.
  2. Dynamic Leveling Optional Bidirectional dynamic normalization using FFmpeg's dynaudnorm. Lifts quiet voices and tames loud ones. The Strength knob maps to three dynaudnorm parameters simultaneously: frame size (f 500→150 ms), Gaussian smoothing window (g 31→15 frames), and maximum gain factor (m 2.0→6.0, ≈ +6 to +15 dB). Best for panel recordings, live Q&As, and multi-voice sources with inconsistent levels. Not recommended for solo voice — can cause pumping on recordings with natural pauses. See Dynamic Leveling in the Theory of Operation.
  3. Loudness Normalization Optional Two-pass EBU R128. First pass measures integrated loudness, true peak, LRA, and threshold. Second pass applies linear gain to hit the configured target. Linear mode preserves the natural dynamic shape of the recording: no compression, no transient changes. The analysis pass runs RNNoise on a temporary copy for measurement accuracy — preventing broadband noise from inflating the LUFS reading; the output pipeline is unaffected. See Theory of Operation.
  4. True-Peak Control When Loudness Norm is on, the signal is upsampled to 2× the target rate, passed through FFmpeg's alimiter with a 5 ms attack and 50 ms release, then resampled back — running at 2× makes inter-sample peaks visible to the limiter, preventing true peak violations. When Loudness Norm is off, the limiter is replaced by downward-only linear peak normalization: the true peak is measured and a single attenuating gain brings it to the −1.0 dBTP ceiling (a transparent pass-through when the source is already under it), preserving the source's dynamics. Either way the output honors the −1.0 dBTP ceiling and is written as 24-bit WAV.

Output Format

All WaxOn outputs are 24-bit WAV, regardless of input format. Lossless, uncompressed, and compatible with every DAW.

WaxOn Output Files WaxOn

Individual Files

{original-name}-{rate}waxon.wav

Examples: episode-01-44kwaxon.wav   guest-48kwaxon.wav

Location

By default, output files are written alongside the source file. If a custom output directory is configured, all files go there. If neither location is writable, WaxOn falls back to ~/Music/WaxOnWaxOff/ — and if that folder can't be created or written, to the Desktop as a last resort. Existing files with the same name are overwritten.

WaxOff Mode WaxOff

WaxOff finalizes your edited podcast mix for distribution. It applies phase rotation (200 Hz allpass) for headroom recovery, EBU R128 loudness normalization, and a 2× oversampled brick-wall limiter as a true-peak safety backstop. It delivers 24-bit WAV, MP3, or both, ready to upload to your podcast host.

WaxOff assumes your mix is already balanced and edited. It applies a single linear gain adjustment from loudnorm to hit the target loudness — no compression, no changes to stereo image. Phase rotation is applied unconditionally as a transparent crest-factor reduction. The brick-wall limiter only engages when inter-sample peaks slip past loudnorm's TP analysis; on a well-mixed source it leaves the audio untouched. See the Theory of Operation for detail. If your mix sounds right, WaxOff just makes it loud enough and packages it for delivery.

Quick Start

  1. Click WaxOff in the toolbar
  2. Select a preset from the Preset menu in the toolbar, or dial in true peak and target loudness in the processor strip
  3. Drag your finished mix file onto the window
  4. Click Process

WaxOff Presets WaxOff

Presets save and restore a complete group of WaxOff settings in one click. The Preset menu is in the toolbar, to the right of the mode switcher.

Built-In Presets

Preset Target True Peak Output MP3 Sample Rate
Podcast Standard −18 LUFS −1.0 dBTP WAV + MP3 160 kbps 44.1 kHz
Podcast Loud −16 LUFS −1.0 dBTP WAV + MP3 160 kbps 44.1 kHz
WAV Only (Mastering) −18 LUFS −1.0 dBTP WAV only 48 kHz

Podcast Standard is correct for most podcast hosting platforms (Spotify, Apple Podcasts, Buzzsprout, etc.).

Podcast Loud targets −16 LUFS for a louder perceived result, still within typical platform limits. Use this if your finished episodes consistently feel quiet on shuffle.

WAV Only (Mastering) outputs a 48 kHz WAV with no MP3. Use when handing off to a mastering engineer or delivering to a video platform.

Custom Presets

Configure your settings, then open the Preset menu and choose Save Current Settings…. Give the preset a name and it will persist across relaunches. Delete custom presets from the same menu.

WaxOff Settings WaxOff

Setting Range / Options Description
Sample Rate 44.1 kHz · 48 kHz Output sample rate for the WAV. 44.1 kHz for podcast delivery; 48 kHz for video or mastering handoff. MP3 output is always encoded at 44.1 kHz regardless of this setting.
Output WAV · MP3 · Both WAV is always 24-bit PCM. MP3 is CBR at the chosen bitrate. Both produces two output files.
Channels Mono · Stereo · default Stereo Mirrors WaxOn's channel toggle. Stereo (default) keeps the existing behavior — a stereo source passes through and a mono source is upmixed to dual-mono stereo. Mono delivers a mono source as a true single channel instead, skipping the upmix. Enabled only when every loaded source is mono — the control is batch-wide, not per-file — and grayed out otherwise. It never downmixes a stereo source; stereo content is unaffected regardless of this setting.
MP3 Bitrate 128 · 160 · 192 kbps CBR bitrate for MP3 output. 160 kbps is a good default for podcast delivery. Grayed out when Output is WAV only.
True Peak −3.0 to −0.5 dBTP · 0.5 dBTP steps · default −1.0 Maximum true peak ceiling. −1.0 dBTP is the standard for podcast streaming platforms and prevents inter-sample clipping on compressed streams.
Target LUFS −24 to −14 LUFS · 1 LUFS steps · default −18 Integrated loudness target. −18 LUFS is a safe, conservative target that sits below the major platform levels (Spotify −14, Apple Podcasts −16), so both boost rather than attenuate it. −16 LUFS gives a louder result.
Output Dir Path or empty Where output files are saved. Empty = same folder as the source.

WaxOff Processing Pipeline WaxOff

WaxOff uses FFmpeg's loudnorm filter in a two-pass pipeline, the only correct way to apply EBU R128 linear normalization.

  1. Analysis Pass A 200 Hz allpass for phase rotation is prepended to FFmpeg's loudnorm filter, which measures integrated loudness (I), true peak (TP), and loudness range (LRA) for the entire file. The allpass runs first so the TP measurement reflects the post-rotation peak budget; the measured values feed the next pass.
  2. Normalization Pass The same filter chain runs again with linear=true and the measured values from pass 1 injected. The 200 Hz allpass is applied here too so the rendered output matches what was measured. This applies a single precise linear gain: no compression, no change to stereo image. Output is stereo (2-channel) by default; mono input is upmixed to dual-mono at the start of the filter chain so both passes measure and normalize the stereo signal. With mono delivery selected the upmix is skipped and both passes run on the native single channel instead.
  3. Brick-Wall Limiter A 2× oversampled true-peak limiter runs after loudnorm with its ceiling set to the user's true-peak target. It exists as a safety backstop for inter-sample peaks that loudnorm's linear-mode TP analysis missed; on a well-mixed source it doesn't engage. Output: 24-bit WAV at the target sample rate.
  4. MP3 Encoding Optional If Output is MP3 or Both, the normalized WAV is encoded using libmp3lame at the chosen CBR bitrate. A pre-encode brick-wall limiter sits 1 dB below the user's true-peak target as a margin for the inter-sample peak overshoot lossy decoders introduce, so the decoded MP3 stays under the same effective ceiling as the WAV output. MP3 is always encoded at 44.1 kHz regardless of the sample rate setting. The WAV is always written first; MP3 is derived from it.

While processing with no file selected, the waveform panel shows live phase labels: Analyzing loudness… → Normalizing… → Encoding MP3… Selecting a file shows its waveform and stats instead.

Why Two Passes?

EBU R128 loudness measurement requires the entire file to compute integrated loudness (gated measurement over the full duration). You can't know the correct gain until you've read every sample, so two passes are unavoidable for accurate normalization. WaxOff makes this transparent: drop the file, click Process, and both passes happen automatically.

WaxOff Output Files WaxOff

Naming

{original-name}-lev{target}LUFS.wav
{original-name}-lev{target}LUFS.mp3

The {target} placeholder includes its sign — e.g. -18 — so a target of −18 LUFS produces …-lev-18LUFS.wav.

Examples: episode-42-final-lev-18LUFS.wav   episode-42-final-lev-18LUFS.mp3

Channels

WaxOff outputs stereo (2-channel) by default. Mono input is accepted — by default it is upmixed to dual-mono stereo before processing, but the Channels control in WaxOff Settings can instead deliver a mono source as a true single channel. Stereo sources always remain stereo; the control has no effect on them.

Location

Output files are written alongside the source by default, or to your configured output directory. Existing files with the same name are overwritten.

File Stats

Selecting a file in either mode displays a stats strip below the waveform. Stats are computed asynchronously as files load and typically appear within a second or two of dropping a file in. After a file is processed, the strip switches to the output file's info and measurements, marked with an OUTPUT badge.

The strip has two rows separated by a divider: file info on top, audio analysis below.

File Info Row

FORMAT
Container format: WAV, MP3, FLAC, etc.
SR
Sample rate: 44.1 kHz, 48 kHz, etc.
CH
Channel layout: Stereo or Mono
BIT
Bit depth: 16-bit, 24-bit, 32-bit. Not shown for lossy formats.
DUR
Duration in M:SS or H:MM:SS
BR
Bit rate derived from file size and duration (Mbps or kbps)

Audio Stats Row

RMS
Root Mean Square level in dBFS. Represents average loudness over the entire file.
PEAK
Sample peak level in dBFS. The highest sample value across all channels. Color-coded: orange at −3 dBFS and above, red at 0 dBFS.
ISP (est.)
Estimated inter-sample peak in dBFS, from 2× linear interpolation between samples. Only shown when the estimate rises above the sample peak. A lower bound, not a full BS.1770 true-peak measurement — the real true peak may be higher; the Console's "measured" line after processing reports the broadcast-accurate value. Color-coded like PEAK.
CREST
Crest factor (PEAK − RMS) in dB. Indicates dynamic range. Higher values mean more headroom between peaks and average level.
LUFS
Integrated loudness per ITU-R BS.1770-4. The broadcast and streaming standard. Computed with K-weighting and two-stage gating (absolute −70 LUFS, relative −10 LU). Labeled LUFS (src) for unprocessed files — the source's integrated loudness before any processing.
FLOOR
Estimated noise floor in dBFS. The 10th percentile of per-block RMS values, representing the quietest sections of the file (room tone, background noise). Color-coded in WaxOn: orange above −50 dBFS (may affect loudness accuracy), red above −40 dBFS (likely affecting measurements). In WaxOff the value is still shown but not color-coded — a finished delivery mix may legitimately carry continuous low-level content (music beds, room tone under a mix), so the raw-speech thresholds don't apply. Only shown when enough audio blocks are available to estimate.
LUFS vs. RMS Both measure loudness, but LUFS is perceptually weighted and gated. Silence doesn't drag the number down, and high-frequency content is weighted more like human hearing. For comparing files intended for broadcast or streaming, LUFS is the more meaningful number.
Noise Floor Warning In WaxOn, files with a high estimated noise floor show a ⚠️ badge next to the filename in the file list. A high noise floor can inflate integrated loudness measurements, causing loudness normalization to underestimate the gain needed for the speech content. When Loudness Norm is enabled, WaxOn automatically applies RNNoise to the measurement pass (only — the output signal is never touched) to mitigate this. If the badge appears, the most reliable mitigation is to enable Loudness Norm so the auto-NR analysis runs. The badge does not appear in WaxOff: the floor warning targets raw recordings, not finished delivery mixes that may carry continuous low-level content by design.

Supported Formats

WAV, AIFF, AIF, AIFC, MP3, FLAC, M4A, CAF, AAC, MP4, MOV.

MP4 and MOV are video containers; WaxOn/WaxOff extracts the audio track and processes it normally. All processing uses FFmpeg, bundled inside the app. No separate installation required. Unsupported file types are silently rejected; a notice appears if any files in a drop were skipped.

Tips & Workflow

The Full Podcast Workflow

  1. Record host and guest on separate tracks
  2. Drop both files into WaxOn and click Process
  3. Edit in your DAW: remove noise, add music, cut and arrange
  4. Export your finished mix from the DAW
  5. Drop the export into WaxOff and click Process
  6. Upload the WaxOff output to your podcast host

Checking Levels Before Processing

Select a file and read the stats strip before hitting Process. The LUFS value tells you how loud the file is. In WaxOn, if LUFS is much lower than your target, normalization will apply significant gain, which is fine for ingest but worth knowing. In WaxOff, comparing input LUFS to your target tells you how much gain WaxOff will apply.

Reading the Noise Floor

The FLOOR stat estimates the background noise level. Below −60 dBFS is typically a clean recording. Between −60 and −50 dBFS the noise may be audible but is unlikely to affect processing. Above −50 dBFS (orange) the noise floor is high enough to skew loudness measurements, and above −40 dBFS (red) it will almost certainly affect results. At those levels, make sure Loudness Norm is enabled — WaxOn auto-applies RNNoise to the measurement pass — and consider running a dedicated noise-reduction tool (e.g. iZotope RX) on the source before WaxOn for the best result.

WaxOn: Loudnorm On or Off?

For consistent batch ingest where files were recorded at different gain levels, turn Loudness Norm on. It ensures every file lands at the same integrated loudness before the limiter. For a single file or when you want to preserve the original level relationship between takes, leave it off and let downward-only linear peak normalization handle ceiling compliance only — no limiting.

WaxOff: Choosing a LUFS Target

−18 LUFS is a safe, conservative delivery target rather than a level the platforms themselves use: it sits below the major platform targets (Spotify −14, Apple Podcasts −16), so both boost it modestly rather than attenuate it. −16 LUFS gives a louder result but is still within typical platform limits. Going higher than −14 LUFS risks clipping or rejection by some platforms. When in doubt, use the Podcast Standard preset.

WaxOn: Mono vs. Stereo for Podcasts

Most podcast editing workflows prefer mono tracks per speaker, which are easier to pan, balance, and process individually. Use Mono / Left for a standard single-mic recording on channel 1. If your interface captures both mics on a single stereo file, set Channels to Stereo and process before bringing into your DAW.

Phase Rotation (WaxOn)

Leave Phase Rotation on unless you have a specific reason to turn it off. The 200 Hz allpass reduces the crest factor of voice recordings, recovering headroom for the limiter. The effect on speech is inaudible.


WaxOn/WaxOff is free software licensed under the GPL-3.0. Built by Seven Morris with AI collaboration.