Skip to content

Releases: EZmannBuilds/wavread

WavRead 1.4.11 — Large captures stay in one piece

Choose a tag to compare

@EZmannBuilds EZmannBuilds released this 16 Aug 20:43

A large capture could shatter into fragments. A 31-instance Logic take arrived as four separate analyses — 6 parts, 9 parts, 14 parts, and one lone track — instead of one song.

Every instance joins, polls and finishes on its own web-server thread, and each of those is a read-modify-write of the same session file. That produced two failures with one cause:

  • Lost updates. With no lock, two instances read the same session and each wrote its own version back; one vanished. Reproduced: of 31 instances joining at once, 7 survived.
  • A file that was not JSON. Every write went through the same temporary filename, so a short write could land inside a long one, leaving a valid session followed by the tail of a longer one. Unreadable — so the take looked absent and the next instance started a new one.

Writes now take a lock and each gets a private temporary file. Measured after the fix: 31 of 31 instances, valid file, nothing left behind.

The 1.4.10 heartbeat was making it worse. Added so a long recording would not look abandoned, it had every instance writing the session once a second — thirty writes a second to say nothing new. Throttled to one every three seconds.

Sessions damaged by the older version are recovered rather than discarded, so a capture recorded before this fix is not lost.

If you captured a large session on 1.4.9 or 1.4.10 and it came back split up, the audio is intact — every part is still on disk in WavRead's library.


WavRead-1.4.11.dmg — 237 MB
SHA-256: 9851e37904ebdb42e28021ed21cc40712db6ad10f2266c9294e4b2dc209a6d63

Unsigned: on first launch, right-click the app and choose Open. Requires Apple Silicon and macOS 14 or later.

WavRead 1.4.10 — Capture that knows what it is recording

Choose a tag to compare

@EZmannBuilds EZmannBuilds released this 16 Aug 20:12

Everything since 1.4.4, from real sessions rather than planning.

Capture knows what it is recording

The Bridge plugin now asks what each instance is sitting on — Track, Group (a stack or submix), Reverb bus, Delay bus, or Master — and the answer changes the analysis. A group counted beside its own children counts the same music twice; a reverb return counted as a part adds an instrument nobody played. The plugin guesses from the channel name and the selector overrides the guess.

Capture a reverb or delay return on its own bus and its decay and repeat times are measured on the effect itself rather than inferred from what is left over after the parts are subtracted from the master.

One take, one timeline

A host does not run a channel strip's plugins until that channel has audio, so instances begin recording at different points in the song. In one real 31-instance take the captures ran from 20.6 to 192.3 seconds — and every file began at sample zero, so a part that entered at 2:20 was analysed as though it opened the song. Captures now carry the transport position where they began, and are padded to a shared origin before analysis.

The same cause made a late-joining instance start a take of its own and arrive as a separate one-track analysis. Instances now keep a take alive while it records.

Takes and names

Every take was called "Session", so a second capture wrote its analysis over the first. Takes are now named from what they contain, never collide, and can be named by hand while recording. Any analysed track can also be renamed afterwards — documents, audio, markers and mix history all move together, or none of them do.

The stem table answers the question

Six new columns: level against the loudest part, reduce by to reach −6 dBTP, per-part crest, and DC offset with asymmetry — so a DC offset on the master can be traced to the part causing it, and asymmetry says why.

Also new: a housekeeping block naming dead tracks and accidental duplicates (a hard-panned stereo pair is not called a duplicate), a crowding report showing which band is carrying too many parts at once, and an arrangement grid with three states instead of one useful one.

Measurements that were wrong

  • Key detection asks the chords. Naming the relative major instead of the minor tonic is key detection's most common failure, and it was proven here on a track whose chord chart was supplied. The chord detector already had it right. When confidence is low and the chords do not settle it, both readings are reported.
  • Stem separation is cached against a hash of the audio, not the filename. Two different mixes bounced to the same name returned an identical stem table.
  • Tempo offers the half-time reading above 140 BPM.
  • Delay times say how they sit against the grid — "1/4 +7.7% — not synced" — instead of leaving the column empty whenever a delay was not exactly on a division.
  • The master-bus comparison withholds itself when the master and the parts cannot be reconciled, rather than printing arithmetic on unrelated signals. A quiet master is explicitly not a reason: pulling the Stereo Out fader down is a mix decision, and the comparison level-matches before measuring.

Failing in words

A file that is not audio now says so by name instead of raising an empty error, and the frequency graph no longer disappears silently when it cannot be drawn.

Also

  • How to use WavRead is a page inside the app
  • Update now installs a release after checking it against the SHA-256 in these notes
  • The library can live on any drive, and Settings names the audio output device in use

WavRead-1.4.10.dmg — 237 MB
SHA-256: c48a11f37574cb74c71366e4cfa457d6e1a0e53b966bb51b3682f7f04b2577d8

Unsigned: on first launch, right-click the app and choose Open. Requires Apple Silicon and macOS 14 or later. Analysis runs entirely on your machine; nothing is uploaded and there is no account.

WavRead 1.4.4 — Capture from your DAW

Choose a tag to compare

@EZmannBuilds EZmannBuilds released this 16 Aug 15:51

Everything since 1.4.0. The headline is that WavRead can now read a session straight out of your DAW.

Capture from your DAW

WavRead Bridge is a new AU and VST3 plugin. It passes audio through untouched, records what goes past, and hands the files to WavRead — no exporting.

Where you put it What you get
Stereo Out, set to Master the finished mix, analysed as an ordinary track
One per track or bus, set to Stem a stem set — per-part measurements, arrangement grid, band attribution
Both together a stem set whose mix is the real master, master-bus processing included

Stems cannot come from the master bus: by that insert the audio has already been summed. Busses are the practical middle ground — five instances, not forty.

Arm all arms every instance in the session at once. The arming is cleared when a take is handed over, so the next transport roll never records by itself. A capture panel on the Analyze page shows which instances have joined, what each captured, and links to the document the take became.

What the master bus adds

Capture the master and the parts and WavRead holds the same performance twice — before and after the master bus. The difference is measurable, so reverb and delay are measured rather than guessed:

  • Repeats — delay times in milliseconds, with the note value they land on against the detected tempo
  • Tail — how long what the master adds takes to decay (Schroeder energy decay, T20 fit), measured in a gap where the parts have stopped. No gap, no claim
  • Tone change through the bus, per band, and how much of the master's energy is not in the parts at all

Reverb correlates with its own source, music repeats by itself, and a feedback delay lands again at twice its time. All three are ruled out before a number is printed — the phase transform separates a discrete repeat from a diffuse tail, and the parts are correlated against themselves so their own period is never reported as an effect.

Every part on the page

Each stem is now measured for peak, true peak and clipping across its real channels, so a track that arrived already clipped is visible — and the Feedback Report names the part rather than the mix. The per-band balance measured for each part is now printed too, and the document states which mix its whole-track numbers describe.

Instructions, and an update button

How to use WavRead is now a page in the app, and in the menu bar.

Update now installs a release: the disk image is downloaded, checked against the SHA-256 in these notes, and the app inside is confirmed to carry the version it claims before anything is replaced. The current app is moved aside first and put back if the swap fails. Nothing installs unless you press the button.

Also

  • Choose which drive the library lives on — move it, or start fresh there
  • Settings names the audio output device macOS is using, with a shortcut to change it

WavRead-1.4.4.dmg — 236M
SHA-256: 293f469afc7e55616d54b53bb285bdff020bf87b769c93d3be1f2009ce39c3f2

Unsigned: on first launch, right-click the app and choose Open. Analysis runs entirely on your machine; nothing is uploaded and there is no account.

WavRead 1.4.0 — Evidence-First Findings

Choose a tag to compare

@EZmannBuilds EZmannBuilds released this 15 Aug 22:56

Findings you can check instead of believe.

Listen to the evidence

Every finding that can be heard now carries the measurement, what it was compared against, and a Listen button that plays and loops exactly the range it stands on.

True peak reaches 1.4 dBTP — above full scale between samples.
1.4 dBTP against 0 dBTP full scale · ▶ Listen

Press it and the track jumps to the loudest moment and loops there. Mono-compatibility findings play their worst stretch and tell you to switch Mono on while it repeats. The dynamic-arc finding plays the loudest section.

Findings also open the graph they came from — Show in Mix on the spectral ones, Stems on the arrangement one — so the number and the picture of the number are one press apart.

A finding is now three separable parts

  • the measurement — what was found
  • May mean — what it may indicate, always hedged, because a measurement rarely proves a cause
  • Listen for — what to do with your ears

WavRead used to hand out processing recipes: "try a broad 2–4 dB cut around 200–400 Hz on the densest elements", "back off the limiter", "add a low sine layer". Seventeen of them are gone. WavRead measures; your DAW edits, and it has no idea what is in your session.

Where an action is offered it is one the app can actually perform — mono findings point at the Mono switch in the player, and the low-mid finding points at Suggested EQ, which stays the only place a change is proposed and is inspectable and level-matched.

Stems, named only when earned

Where separation data exists, a band finding says which stems carry the energy — "most of that energy is in the bass and other stems (64.6% of the band)" — weighted by how loud each stem actually is, so a quiet part that happens to be mostly low-mid is not blamed. When the energy is spread and no stem carries a clear majority, WavRead names nobody rather than guessing. Every attribution says separation is imperfect and is a pointer rather than proof.

Note

Analyses made by earlier versions keep their existing findings until you reanalyze — the new voice, the Listen buttons and stem attribution appear once a track has been analyzed by 1.4.0. Settings → Reanalyze all updates the whole library.

Free during development, still unsigned (right-click → Open on first launch).

WavRead 1.3.0 — Measurement Trust

Choose a tag to compare

@EZmannBuilds EZmannBuilds released this 15 Aug 21:18

Measurement trust. This release checked WavRead's own numbers instead of trusting them, and found three real defects.

Fixed

  • Peak was measured on the mono fold-down. Averaging the channels before measuring hides a peak that lives in one channel by up to 6 dB, and measures an anti-phase pair as silence. Peak now comes from the actual channels, and crest factor follows. If you have tracks analyzed by an earlier version, their peaks are understated — Settings → Reanalyze all corrects them.
  • Loudness points were placed approximately. The loudness series were spread evenly across the track instead of sitting at their real BS.1770 gating-block positions — on a 30-second file that put short-term loudness 0.67 s away from the audio it described, and that data drives the loudness timeline, the per-section averages and every marker's context.
  • WavRead understated what it downloads. The app, the site and the README each claimed the speech model was the only thing fetched. The built-in separation also downloads its model (about 80 MB) on first use, and there is now a daily update check. All three are named, in every place, and melody downloads nothing — its model ships with the app.

New measurements

  • True peak (dBTP) — what the waveform reaches between samples, which is what a DAC or a lossy encoder reconstructs and what delivery specs are written in. Estimated by 4× oversampling per ITU-R BS.1770 Annex 2, per channel, labelled an estimate.
  • Loudness range (LRA) to EBU Tech 3342, and peak-to-loudness (PLR).
  • Per-channel peaks, samples at full scale, DC offset, sample rate, channel count and encoding.
  • A delivery contract in Mix and in every document — each value naming the standard it was measured to and the exact DSP stack that produced it.

Trust

  • A measurement that could not be taken now reads "unavailable", never a dash or a zero. An analysis from before these measurements says so and offers to reanalyze.
  • The first test suite: 39 assertions against signals whose answers are known on paper — a full-scale tone in one channel, an anti-phase pair, the textbook inter-sample peak, a known DC offset. The first cases fail against the previous code, which is what makes them worth having.
  • A pinned build (requirements.lock.txt), because loudness comes from pyloudnorm and true peak from scipy's resampler — different versions can give different numbers, and every document now records which ones made it.

Free during development, still unsigned (right-click → Open on first launch). Analyses made under the app's former name, SoundScribe, keep working.

WavRead 1.2.1 — Mix history, mono switch, update checks

Choose a tag to compare

@EZmannBuilds EZmannBuilds released this 15 Aug 17:39

Two playback fixes, and three ways to hear more of your mix.

Fixed

  • "Hear the difference" did nothing until you pressed Play. The button sat disabled while the track was stopped, so the first thing anyone tries — open Mix, press it — had no effect, and the feature looked broken. Pressing it is asking to hear the suggestion, so it now starts playback itself. The Play button still starts flat.
  • "Play this section" played from the section, not the section. It seeked to the section start and then ran on through the rest of the track unless Loop happened to be on. It now stops at the section end, and the seek waits for the audio's metadata so a cold page no longer starts at 0:00.

New

  • Mono fold-down — a Mono switch sums playback to (L+R)/2 in both channels, so the mono-compatibility findings can be heard: correlated material keeps its level and anything that cancels audibly disappears. It composes with the EQ demo, and neither interrupts playback.
  • Skip back and forward — ten seconds either way on the transport.
  • Mix history — group mixes of one song as ordered versions, keep a note on each, and see the measured headline values with the change from the version before. Grouping is explicit: WavRead never merges tracks because their filenames look alike. A value missing from an older analysis reads as unavailable, not as a change.
  • Update checks — WavRead tells you when a newer version exists and stops there. It never downloads or installs. One request to the public release page, nothing sent about you, silent when offline, at most once a day, and a Settings switch that means no request is ever made.

Grouping and notes are stored outside the analyses, like listening markers, so reanalysis cannot destroy them.

Free during development, still unsigned (right-click → Open on first launch). Analyses made under the app's former name, SoundScribe, keep working.

WavRead 1.2.0 — Listening markers

Choose a tag to compare

@EZmannBuilds EZmannBuilds released this 15 Aug 11:30

Mark the moment you noticed something. Press Mark while the track plays, write down what you heard, and WavRead reports what its measurements say differs around that moment — what changed, never why it sounds bad.

  • Marking is a listening action — one button captures the current position, opens the Markers tab and puts your cursor in the note field. Markers show as amber pins on the waveform, in their own colour and shape so they can never be mistaken for measured data
  • Measured context for every marker — loudness, activity, stereo width and L/R correlation across a ±1.5 s window, each compared with the track average and the section it falls in, plus the frequency band that moved most
  • Markers go into the Track Document, so Copy, Download Markdown, Export HTML and the AI handoff all carry what you noticed next to what WavRead measured. Your note stays labelled user-entered; the readings stay labelled measured
  • Your notes outlive reanalysis. Markers are stored per track outside the analysis document, because reanalysis rewrites that document and a note written at 1:24 has to survive an engine upgrade
  • Silence is named, not measured. In a window below −55 LUFS, stereo width and correlation are measuring noise, so a marker on a fade-out says the moment is effectively silent instead of claiming it is "0.996 wider than average"
  • Markers are their own category in the storage dashboard, flagged as the only data here WavRead cannot regenerate

A track with no markers produces exactly the document it did before.

Free during development, still unsigned (right-click → Open on first launch). Analyses made under the app's former name, SoundScribe, keep working.

WavRead 1.1.0 — Suggested EQ you can hear

Choose a tag to compare

@EZmannBuilds EZmannBuilds released this 15 Aug 01:50

Hear the suggestion, don't just read it. The Suggested EQ has always been a curve and a sentence. Now you can listen to it against your own track and decide with your ears.

  • Audible A/B during playback — switch between your track flat and your track through the suggested curve. Switching doesn't interrupt playback
  • Level-matched — the suggested side is compensated by a gain estimated from your track's own average spectrum, so the comparison is never won just by being louder. The figure is shown, not hidden
  • The curve you see is the curve you hear — the graph now draws the real response of the same filters the demo plays, replacing an illustrative drawing that no real filter would produce
  • Exactly what is applied — an expandable list gives each filter's type, frequency, gain and Q

It stays a preview, never a processor: nothing is written, exported, or altered, playback always starts flat, and the demo is unavailable while stopped. Exported documents keep the static curve and gain no controls.

Why 1.1.0 and not 1.0.0? The 1.0.0-rc series is superseded rather than completed. The paid launch has no date and features keep landing, so a version stuck at "release candidate" implied a launch that isn't coming yet. This is the first stable release.

Also corrected: the About panel and README still described the code as PolyForm Noncommercial licensed. WavRead is proprietary — © 2026 Erik Mann, all rights reserved — and both now say so.

Free during development, still unsigned (right-click → Open on first launch). Analyses made under the app's former name, SoundScribe, keep working.

WavRead 1.0.0-rc3 — player, waveform seeking, stem soloing

Choose a tag to compare

@EZmannBuilds EZmannBuilds released this 15 Aug 00:19

Listening while you read. The analysis told you section 4 loses mono compatibility — now you can hear section 4 while looking at that.

  • Persistent player that stays put while you move between Mix, Structure, Stems and the rest
  • Waveform seeking — the real peak envelope with section boundaries; click anywhere to seek, or focus it and use arrow keys and space
  • Play and loop a section — from the player, or Play this section on any block in the Structure timeline
  • Solo a stem — choosing Drums, Bass, Vocals or Other on the Frequency Balance graph now switches what you hear as well as what you see, keeping your position
  • Recently opened tracks on the Library page
  • Fixed the Play button's label wrapping out of its own outline

Reanalyze a track to add its waveform. Free beta, still unsigned (right-click → Open on first launch).

WavRead 1.0.0-rc2 — time-based analysis

Choose a tag to compare

@EZmannBuilds EZmannBuilds released this 14 Aug 23:51

Time-based analysis. Until now every measurement was whole-track or a per-section average — WavRead could tell you a track is −14.9 LUFS but not how it moved to get there.

  • Loudness over time — short-term loudness against the integrated reference, aligned to your song's sections, naming the loudest and quietest and the range between them
  • Stereo width over time and mono compatibility — width and L/R correlation as timelines, listing the exact moments that fall below the mono-risk threshold instead of one whole-track verdict
  • Section-to-section comparison — pick any two sections: "section 6 is 4.8 LU louder than section 2"
  • New findings only time-aligned data can produce: the dynamic arc across the song, and the specific stretches to check in mono
  • All of it from one measurement pass, so no two views can disagree. Loudness uses the BS.1770 standard implementation
  • Wide arrangement tables (37-stem sessions) now scroll with headers pinned

Tracks analyzed with an earlier version keep working — reanalyze one to add its timelines.

Free beta, still unsigned (right-click → Open on first launch).