← Back to Specula
- NewCustom loudness targets. Settings → Targets → Custom targets holds your own delivery specs: a name, a mode, a measurement source (integrated, dialog-gated, or un-weighted RMS), a reference level, a tolerance band, and a true-peak ceiling. A custom target joins its mode's list and works everywhere a built-in target does: verdict badge, hover breakdown, Match, Normalize to target, and the report exports. Mastering to a house spec like -18 LUFS ±1 under -1 dBTP is a first-class target instead of mental math against the nearest platform preset.
- NewOpen raw PCM. Specula opens headerless audio: a
.pcm or .raw dump from a decoder under test, an I2S capture, a .bin of samples from a test harness. Open the file through any path (any extension works) and declare the format: sample rate, channels, sample format from 8-bit unsigned to 64-bit float including packed 24-bit, byte order, interleaved or planar, an optional header skip. The whole analysis stack then applies: loudness, true peak, FFT, spectrogram, compare, edit, reports. The import sheet checks that the file size divides into whole frames, ranks the byte formats that fit by decoding a few seconds of each and scoring the result, and previews the decoded waveform with playback before you commit. The one thing it never guesses is the sample rate, because nothing in a headerless file can reveal it and a wrong rate corrupts every number without an error. Declarations are remembered per file, so reopening never re-asks, and can be saved as named presets. The declared format stays visible in the info panel and is recorded in every report, since the numbers from a raw file ride on it. On the command line: specula analyze dump.pcm --raw-rate 48000 --raw-channels 2 --raw-format s24le, with the same flags on report and edit, and --raw-preset for saved presets.
- ImprLarger text and better contrast. Settings → Layout → Text size scales the text across the main window to Default, Large, or Extra Large: the info panel, the module control strips (channel chips, zoom and amplitude clusters, the IN / OUT / LEN fields, the loudness-curve, FFT, and stereo-width strips), the transport bar (timecode display, Analyse, Generate, the mode selector), the segmented switches, and the axis labels. The info panel's faintest labels are brighter across the board, and it honors the system Increase Contrast accessibility setting by lifting its dimmed labels further.
- FixThe live Momentary and Short-term readouts are readable again. At the 10 Hz update rate the rolling-digit animation was re-triggered before it could finish, so both numbers showed as a permanent blur. The digits now repaint plainly by default, and two new options under Settings → Layout → Loudness readout tune the live Momentary, Short-term, and Integrated rows together: a refresh-rate picker (10 Hz default, since EBU Tech 3341 requires at least that for a live meter's short-term update; 5 Hz and 2 Hz for easier reading, all of them above the 1 Hz the standard asks of integrated) and a separate Rolling digits toggle for the animation. Both are display-only and no measurement changes.
- FixClicking outside a text field now commits it. Text fields (violation thresholds, chapter names, routing gain cells, popover parameters) give up focus when you click anywhere else, and the typed value commits the same as pressing Return. Fields used to hold focus until Return, which also kept single-key shortcuts going into the field instead of the app.
- ImprDouble-click resets zooms. Double-click the time-zoom readout in the waveform control strip to fit the whole file, the amplitude-zoom readout to return to 1x, or the FFT spectrum to restore the full 20 Hz to Nyquist range. The module-height dividers already reset on double-click; the zoom surfaces now behave the same way.
- ImprReset zoom in Spectral mode. ⌘0 puts the canvas back to the whole file across the full frequency range. ⇧⌘0 fits time alone and ⌥⌘0 restores the frequency range alone, so one axis can go back to full while the other stays where you zoomed it. Each axis also gets a small button in the top right corner of the canvas while that axis is zoomed.
- ImprThe Live / Offline analysis switch is now its own Analysis section in the sidebar, between Mode and Channels. It selects the source for the loudness readouts and the spectrogram together, and that was easy to miss in its old spot inside the Loudness section header: with Live selected, the spectrogram appeared to render only during playback, even when the whole-file analysis was already computed.
- FixThe spectrogram draws short files solid, all the way to the end. On files shorter than about 44 seconds, the rendered spectrogram left gaps between analysis columns, so a steady tone read as a dashed line; the shorter the file, the sparser the dashes. The last stretch of every file, where no further full analysis window fits, also rendered dark, which read as missing analysis when zoomed into the tail. Each column now fills the full time span it covers and the final column carries to the end of the file. Display only: every measurement was always correct.
- FixLoudness curves stay drawn at high zoom. The momentary, short-term, and integrated curves dropped any point outside the visible view, so zooming in far enough made a curve stop short of the edges or vanish entirely once no data point fell inside the window. The segments crossing the view edges are now drawn.
- FixSpectral mode tooltips appear on the controls they describe. The brush-size, wand-tolerance, and wand-reach sliders carried their tooltip on the strip around them, so pointing at the slider itself showed nothing. The selection-tool picker's tooltip now says what each of the four tools does.
- NewSignal generator. A new Signal Generator window (⌘G, or the Generate button next to the mode selector) builds test signals from scratch and writes them to a file: sine, square, sawtooth, and triangle tones, three noise colours (white, pink, brown), a single impulse, and sine sweeps, linear or logarithmic. The square, sawtooth, and triangle are band-limited, so they stay clean to the top of the band at any frequency with no aliasing. Give a channel several sources and they layer when they overlap in time, or form a sequence when they follow one another: a second of silence, an impulse, a tone, a sweep. Each source has its own level, start, and length, with optional fades, a level sweep, and burst gating. Build the same signal on every channel or give each its own, from mono up. Choose the sample rate, bit depth (16 or 24-bit integer, or 32-bit float), and container (WAV, AIFF, or CAF), with an optional peak ceiling that scales the whole render under a level you set. A live waveform and spectrum preview updates as you build the signal, with running peak, RMS, and loudness, and Preview in Specula loads the current signal into the main window for full analysis. Generate reports the file's peak, RMS, and integrated loudness, and can open the result straight into Specula. The same generator is on the command line as
specula generate for scripted test-file batches.
- NewRecord mode. A sixth mode (⌘6) records from any input device straight into the app, and it's the one mode that works with nothing loaded: record a take and it opens for analysis the moment you hit Stop. Choose how many channels the take captures (mono, stereo, or 5.1, stored as one file) and which hardware inputs feed it, then record through live meters: momentary loudness, true peak, and per-channel level, plus a noise-floor readout while you're armed, so a spoken-word spec like ACX's room-tone gate can be checked before the take instead of discovered after. While a take records, it draws itself as a live waveform across the main canvas. With a file loaded, Append continues from its end, Insert puts the take in at the playhead and pushes the rest later, and Punch records over existing audio: it replaces the selection when there is one (a flubbed word, a wrong sentence), or records over from the playhead, tape style, when nothing is selected; take length is free to differ, every join is smoothed by an adjustable equal-power crossfade, and each landing is a single Undo away. Takes ride the same session as Edit: record, trim, level, then punch the one word you don't like. To Compare sends the finished take to a Compare slot, so recording a part twice and A/B-ing the takes level-matched is a natural loop. Recording streams to disk as it goes, so take length is bounded by your drive, not memory, and macOS will ask for microphone permission the first time.
- NewHost Audio Unit effect plugins in Edit mode. Add any Audio Unit effect installed on your Mac, chain several in order, and tune each one by ear while the file plays. Because the analysis tap sits after the chain, every live meter, LUFS, true peak, FFT, spectrogram, and phase, tracks the processed sound as you turn knobs. Bypass, reorder, or remove any plugin, and open each one's own window (or a generic parameter panel for plugins that ship no interface). Render bakes the chain into the audio through fresh, latency-compensated instances and commits it as a normal edit you can Undo; with the effect tail off (the default) the result is exactly as long as the input, so it still lines up for A/B and auto-align. Rendering clears the chain and remembers it, so Undo then Restore Last is the tweak-again loop, and it survives quitting the app. Render to Compare Slot loads the processed version next to the original in Compare mode to measure the difference with real numbers. Mono and stereo files; both AUv2 and AUv3 effects. A setting keeps plugins in their own process by default, so a third-party plugin crash can't take the app down.
- NewSpectral editing: see it, select it, take it out. A new mode, Spectral (⌘5), turns the main canvas into a full resolution, zoomable spectrogram of the loaded file where you select time and frequency regions and process just those: a cough inside a piano chord, a chair squeak under speech, a bite of mains hum. Four selection tools: a rectangle, a lasso, a brush, and a wand that grows the selection across the connected region at a similar level from a click or a drag, shaped live by a dB tolerance and a time reach (the brush and wand paint: strokes add, Option-strokes remove; with the rectangle and lasso a plain drag starts a new selection, Shift adds, Option subtracts). Then Attenuate the selection by a chosen dB amount, Erase it down to the noise floor learned from the surrounding audio, minus an adjustable erase depth so removal stays decisive inside busy material, or Repair it by interpolating each frequency's level from the clean audio on both sides. Audition first: Space plays the selection's span, Solo (⇧Space) plays only the selection itself, and Result (⌥Space) plays the span with the selection removed. Every operation feathers its edges in time and frequency (adjustable); everything outside the selection stays untouched, sample for sample. For stereo files the canvas shows the left channel, the right, or both stacked, and operations apply to all channels or just one. Multichannel files work channel by channel: pick a channel of the bed from the toolbar (labelled by the file's layout: L, C, LFE, Ls, and so on) and every operation applies to that channel alone, so a squeak in the left surround of a 5.1 mix comes out of Ls without touching the other five; the selection persists across channel switches. Works on any channel count; edits share Edit mode's undo history, the selection survives an apply and an undo so you can iterate, and Save As always writes a new file.
- NewHide the info panel. A toggle at the far left of the transport bar, or ⌘I, collapses the left info panel so the waveform and analysis views get the full window width. The choice is remembered between launches.
- NewThree starting points in the empty window. With nothing loaded, the main window offers the drop zone, a Generate a test signal tile, and a Record audio tile side by side. The drop zone now also opens the file picker on click.
- ImprNormalize and Limit True Peak work on much longer files. The disk-streaming path these operations take on very large files needed several times the file's size in temporary memory for the limiter's gain computation, so hours-long stereo files could hit the "not enough memory" refusal. That temporary need is now about a third of what it was. Output is unchanged.
- ImprLoading long files needs far less memory. The true-peak measurement that runs when a file loads, and again when files are added to Compare, briefly allocated working buffers sized to the whole file: around 8 GB extra for a 2-hour 96 kHz stereo file. It now runs in small chunks with identical results, and Compare slots and command-line reports no longer hold a second full copy of the file while computing dynamic range.
- ImprZooming and panning the waveform stays smooth at every zoom level on long files. Between the whole-file overview and sample-level zoom, every redraw used to re-scan the visible audio, which made zooming, panning, and playhead motion stutter on files over a few minutes. Specula now builds a set of pre-computed waveform resolutions in the background right after a file loads and draws from those. Peaks are never clipped by the summarized drawing.
- ImprFades, gain changes, and other in-place edits apply instantly on long files. After an in-place edit the waveform overview and clip markers refreshed for the entire file, which froze the interface for seconds on multi-gigabyte files. Only the edited stretch is refreshed now, and clip detection itself got much faster, which also shortens loading on very long files.
- ImprThe averaged spectrum computes in seconds on long files. The averaged FFT view from Analyse used to run one FFT per overlap window across the whole selection; on hours-long audio that could take minutes at high overlap. It now samples up to 65,536 windows spread evenly across the selection, which reads the same for a time-average. A new setting (Settings, FFT / Analysis, "Average every window") restores the exhaustive behavior.
- ImprThe app stays responsive during heavy operations on long files. Auto-align, the live residual recompute while dragging a gain or nudge control, the speech-detection sliders, and chapter detection all did large parts of their work on the interface thread, which could freeze the app for seconds on multi-gigabyte files. That work now runs fully in the background.
- ImprAnalysing the whole file is faster and uses far less memory. Running Analyse over the entire file no longer makes a second in-memory copy of the audio, and when the dialogue regions are untouched it reuses the speech detection already computed at load instead of running it again.
- ImprLoudness measurement cost no longer grows with length. The gating, loudness-range, and noise-floor statistics re-scanned their entire history on every 100 ms block, so whole-file measurement slowed quadratically (tens of seconds of pure computation on a 2-hour file) and live monitoring got progressively more expensive over hours-long sessions. The statistics now update incrementally with identical results, verified against the previous algorithms and the full conformance suite.
- FixSelection analysis measures every channel of >8-channel files. Running Analyse (⌘Return) on a file with more than 8 channels, such as a 7.1.4 bed, silently measured only the first 8 channels; loudness, speech-gated values, per-channel stats, and the true-peak curve could disagree with the values shown at load and in exported reports, which always covered all channels. All channels are now included.
- FixLoudness range excludes ramp-up windows. EBU Tech 3342 defines LRA over 3-second short-term windows, but the first 29 windows of every measurement, built from less than 3 seconds of audio, were entering the distribution and inflating LRA on material with a quiet opening, by around 2 LU on a 30-second ramp. LRA values now agree with reference implementations; files shorter than about 4 seconds report no LRA, since no full window fits.
- FixSpeech regions end where the speech ends. Each detected speech segment was extended one extra 100 ms block past its actual end, so a slice of room tone after every phrase counted as speech. Speech percentage read slightly high, that room tone was left out of the noise-floor measurement, and speech-gated loudness admitted a quiet trailing block per phrase. Segments now map to exactly the blocks they touch.
- FixLoudness readings match the BS.1770-4 filter exactly. The second stage of the K-weighting filter carried a small normalization that made every LUFS value read about 0.04 LU low, varying slightly with sample rate. The filter now matches the coefficients published in ITU-R BS.1770-4, verified against the standard's 48 kHz table and the canonical −3.01 LKFS full-scale 997 Hz sine anchor. Expect readings roughly 0.04 LU higher than previous versions; loudness range is unaffected.
- FixAuto-align lands on the exact sample. Compare mode's auto-align used to apply the offset from its coarse search directly, which rounded to the nearest 10 ms; two takes offset by an arbitrary sample count came back with a comb-filtered A−X residual instead of a null. A full-rate refinement pass now follows the coarse search, so auto-align recovers the exact sample offset and the null test nulls.
- FixTrue-peak violation highlights sit exactly on the peak. The per-block true-peak curve behind the waveform and timeline violation regions ran one 100 ms block late, so zooming to a highlighted region landed you just after the actual inter-sample overshoot, and an overshoot in the very last block of a selection could go unmarked. Highlights now land on the block that contains the peak. Headline true-peak values were always correct and are unchanged.
- FixSmall controls are easier to click. Compact icon buttons across the app now respond across their whole area: the waveform zoom controls, the spectrum's filter and peak-count controls, the loudness-target buttons (match, normalize, limit true peak), the output-routing controls, and the help (?) buttons.
- FixSpace always plays and pauses. Moving keyboard focus onto a toolbar button with Tab could make Space press that button instead of toggling playback. Space now plays and pauses wherever focus sits (typing a space in a text field still works), and Tab no longer lands on the main window's toolbar buttons.
- FixQuitting or opening over unsaved work asks first. ⌘Q with unsaved edits now prompts to save them, quit without saving, or cancel; a still-recording take asks before stopping, and a recorded take that was never saved out of the takes folder offers Save Take As… on the way out. Opening a new file over the same unsaved work, from the picker, a drop, the Dock, Open With, or Open Recent, runs the same checks. The app used to quit or load silently over all of it.
- FixWaveform amplitude zoom. The minus button beneath the waveform, which zooms the amplitude back out, now responds reliably on every click.
- NewEBU R128 / ITU-R BS.1770-4 loudness. Momentary, short-term, integrated, loudness range, and 4× oversampled true peak, verified against the EBU Tech 3341 / 3342 loudness test signals. Read it live while a file plays, or offline over the whole file or a time selection.
- NewSpeech-gated loudness with neural speech detection. A bundled Silero VAD model gates loudness to dialogue only, so room tone, music beds, and silence are excluded and podcast and film dialogue read true. It runs fully offline, with no download and no network connection.
- NewA 22-target compliance catalog across four modes. Music reports the gain each platform applies (Spotify, Apple Music, YouTube, Tidal, Amazon Music, Deezer, SoundCloud, AES TD1008); Podcast / Spoken word mixes streaming penalties with the ACX audiobook spec including the −60 dB RMS noise-floor check; VOD verifies the Netflix / Prime / Apple TV+ / Disney+ / Max −27 LKFS dialog-gated band; Broadcast verifies EBU R128, R128 S1 short-form, ATSC A/85 (CALM Act), ARIB TR-B32, and OP-59. Each row gives a hard verdict; Match previews the level by ear and Normalize / Limit TP commit it with a two-pass true-peak limiter.
- NewSpectrum, spectrogram, and stereo views. An FFT spectrum with five selectable windows, a configurable-overlap spectrogram, per-channel peak / RMS / crest / DC, dynamic range, and a stereo correlation and phase scope.
- NewReference compare, up to six files. Load up to six masters, level-match them by integrated LUFS, auto-align to the sample, and hear the A−X residual, the part that actually differs, as its own waveform you can solo, scrub, and export.
- NewNon-destructive editing without a DAW. Trim, cut with a crossfade join, insert silence, gain, fade, invert phase, remove DC, swap channels, split to mono, normalize to a peak or LUFS target, and a standalone Limit TP, all keyboard-driven with 16-level undo. Specula always saves a new file and never overwrites the source.
- NewChapter mode for audiobooks. Segment a book at its silences, score every chapter against the three ACX gates (RMS, true peak, noise floor) and against the book's own median, level every chapter to a common loudness in one move, and put the per-chapter table in the PDF, or export it as CSV.
- NewDialogue mode. Hand-correct the detected speech regions that drive dialog-gated loudness and the noise floor (add / drag / Mark In-Out), with provenance tinting and a JSON sidecar so corrections travel with the file.
- NewSurround and downmix. A per-channel routing matrix with BS.775 and Pro Logic II fold-down presets (real ±90° phase, not just polarity), correct BS.1770 weighting for non-SMPTE multichannel orders such as AAC 5.1 and 7.1, and Render to File to write the routed result.
- NewReports you can hand off. A dark-themed PDF / HTML / JSON report with every metric, a per-target verdict, the loudness curve, and the chapter table. The JSON carries an inline verdict per target so a script can branch on pass/fail without recomputing it.
- NewCommand line and Shortcuts. A
specula command-line tool (analyze / compare / edit / report) ships inside the app, plus eight App Intents and three Finder Services, all on the same engine, so batch QC scripts and automations get the exact same numbers as the app.
- NewBuilt for current macOS. Liquid Glass chrome and an Icon Composer app icon on macOS 26, document-app conventions (Open With, drag onto the Dock, Open Recent, multi-file open), and automatic updates. Free 7-day trial; after it ends you can still run two 5-minute test sessions a day. Requires macOS 14 Sonoma or later.