You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Audio missed while the capture source was stopped is now counted as lost
audio, so the frame count includes it and the warning appears. It previously
counted nothing at all: integrated loudness and LRA average every block since
the reset, so a device that stopped for a minute produced a reading of the
programme minus that minute and presented it exactly like a clean one. A
stall's share of the count is derived from the analysis clock rather than from
the ring, so it is accurate to about a quarter of a second rather than to the
frame — enough to prove audio was lost, which is what the figure is for.
Re-measure any session where the warning appeared.
The System Output tap no longer measures an output device that has changed its
own sample rate. A macOS output device can move rate without ceasing to be the
default output — AirPods drop from 48 kHz to 24 kHz the moment anything opens
their microphone — and the tap went on delivering while the K-weighting
filters, the true-peak oversampler, the spectrum's frequency axis and the
elapsed clock all stayed built for the rate the engine opened at. Every
reading was then wrong by the ratio between the two rates: at half the rate
the spectrum sat an octave low and the elapsed clock ran at half real time,
with the meters moving convincingly throughout. The source is now reported as
stopped and reopened at the device's new rate. Re-measure anything metered
through System Output on a Bluetooth output device.
✨ Added
A File menu, and presets that are documents.Open… picks a preset
through the platform's own dialog, starting in the presets folder and reaching
anywhere else you point it — a preset somebody sent you now opens where it was
downloaded to, instead of having to be moved into the configuration directory
first. Save writes back to the file it came from without asking, Save as…
places a copy anywhere and names the preset after the file, and the open
preset's name sits at the left of the status bar with a dot beside it when it
differs from what is on disk. On macOS the menu is in the system menu bar,
after the application menu; on Windows and Linux it is the FILE button in the
status bar. Opening a preset over unsaved changes asks whether to save first.
A privacy policy, at open-audio-analyzer.com/privacy.
It states what the microphone, the camera, the local network and the disk are
used for, that nothing is collected or transmitted, and — the part worth
reading — that the remote display link has neither encryption nor
authentication, so publishing on a network you do not trust means anybody on
it can read your meters. App Store Connect requires the URL; the page is
written for a person rather than for that field.
⚡ Changed
The website serves its three typefaces itself instead of loading them from
Google Fonts. Reading a page no longer makes a request to Google, which
previously saw the IP address of everybody who opened one — the privacy policy
said so and now says the opposite. It is also the reason the site's text used
to move a moment after the page appeared: the fallback face is a different
width, so the first paragraph re-wrapped once the real one arrived.
The faintest text on the website — the footer, the small readouts above each
section, every table heading and the documentation contents list — is light
enough to read. It was the application's own textFaint, which is 2.97:1
against the page and under what WCAG asks even of large text; in the
application it labels a meter you are already looking at, and on a phone in
daylight it was text you could not. The application's own interface still has
this and is not changed here.
⌘O now opens a preset, and analysing an audio file has moved to ⌘I. The
layout is this application's document — the thing that is opened, saved and
sent to somebody — so it takes the chord every desktop user tries first, and
analysing a file is an import, which is what ⌘I means elsewhere. Save on ⌘S
and Save as… on ⇧⌘S are both new. Ctrl on Windows and Linux, as always.
The preset browser is gone, and ⌘P with it. Saving is Save and Save as…;
the list of saved layouts is the presets folder in a file manager, which is
also where the delete button that used to be in that panel now lives.
Settings → Session still prints that folder and lets you select the path.
Whether a preset carries the delivery target and the skin is a property of the
preset now, rather than two switches beside a Save button: two rows in the File
menu, each asking whether the preset should carry one and ticked when it
does. They cannot go in the platform's save dialog — macOS would need a save
panel of our own, Windows a plugin of its own, and Linux cannot do it at all
— and as properties of the document they survive a save, which the
switches did not.
The plugin's window is drawn in the application's own palette and the
application's own two typefaces, both compiled into the VST3, the Audio Unit
and the Standalone rather than asked of the platform — so the panel looks the
same in Logic on a Mac as it does in Reaper on Windows, and looks like the
tool whose meters it is feeding. What it shows changed with it: a diagram of
the three places the path can break, with each run lit only while something is
travelling down it, and the socket's dashes moving while frames are actually
being sent, so a link that came up and quietly stopped no longer looks
identical to one that is working. The middle of that chain is the app icon
itself, drawn as line art in the shape macOS masks an icon with, so the thing
you picked out of the DAW's plugin browser and the thing in the diagram are
recognisably the same object. It also names the format it is loaded in and
the host it is loaded into, which are the first two facts on every bug report
and were the two nobody wrote down.
A dropped-frame warning in the plugin's window no longer erases the readings
it is a warning about. The count, the missing playhead and the loudness
reading shared one line, so the worst news arrived by deleting the evidence;
the readings now have a row of their own and the warning sits directly above
the Reset button that answers it.
The plugin's window says where the meters are when everything is working. A
metering plugin that draws nothing is a confusing object the first time
somebody inserts one — it loads, it reports itself healthy, and nothing
happens — and the line that was blank in exactly that case is the calmest,
most readable moment in the window.
The Super Meter's target tick is a plain mark again rather than one cut into
the arcs. 0.10.0 widened the slot beneath it to stand 1.5 px out either side,
which put a notch through all three rings at the target; the slot is back to
the tick's own width, so the rings run unbroken and only the tick crosses
them. 0.10.0's note describing the wider slot stands as written and is
superseded by this one.
Every menu in the application marks the value it holds with a check and a
band across the whole row. The band used to be the darkest colour in the skin,
which in Precision Instrument put a near-black hole in a menu that is itself
nearly black, and it stopped short of the menu's edges so the current value
read as a chip sitting in the list rather than as one of its rows. It is a
wash of the colour the rest of the interface already uses for selection now,
it reaches both sides, and the check says which row it is without anybody
having to compare two greys. Menus of actions — duplicate, rename, delete —
hold no value and are unchanged.
The iPad build no longer offers itself to iPhones. Its Xcode target had been
universal since the project was created, so a phone could install a
twenty-four-column canvas drawn for a tablet, and App Store Connect asked for
a set of iPhone screenshots of it. It is iPad-only now, which is what every
document already said it was.
🐛 Fixed
The live analyzer's own document no longer offers itself to search engines as oaa_analyzer_demo, described as "A new Flutter project.". It is the page the
front page loads into an iframe, and it had shipped as the Flutter scaffold
wrote it — no language, no viewport, and a title and description that
described the project worse than nothing would have. It now says what it is
and asks not to be indexed.
The website's 404 page no longer asks to be indexed, and no longer tells
crawlers that every address without a page is really /404.
"Linux dependencies" in the building document is a second-level heading, so
the page no longer skips from its title straight to a third level.
Re-saving a preset no longer silently drops the delivery target or the skin it
was carrying. The two switches in the preset browser reset to off every time
the panel opened and were never read back from the preset being saved, so
opening a layout that carried EBU R 128, moving one module and saving wrote a
preset that carried nothing — and nothing in the interface said so. They are
rows in the File menu now, and they are ticked from the preset itself.
The meters no longer freeze until you switch to another source. A capture
source that stopped delivering left the engine publishing an empty ring at the
same forty-seven frames a second for the rest of the session: every meter held
its last reading, the window and the menus stayed perfectly responsive around
it, RESET moved the readings to their floors and they held there, and
nothing anywhere said why. The engine now notices within a quarter of a
second, puts the source back itself when the format allows it, and says so on
screen; when only a new engine can follow the device, the application opens
one and the notice says the measurement has restarted. Reported as: the meters
freeze, reset resets them but they stay stuck, and it only comes back when I
switch to another sound source.
A System Output tap whose rebuild fails when the default output device changes
is no longer dead for the rest of the session. It tore the old chain down,
failed to build the new one — a format that had moved, a device that vanished
between the notification and the query — and left no producer and nothing that
would ever try again. It is retried once a second now, against whatever the
default output is at the time, so a device that comes back or a rate that
returns is picked up without the source being reselected. Reselecting it was
never the remedy the code comments claimed it was: choosing the source that is
already chosen changes no setting, so nothing reopened.
🚧 Internal
npm run audit runs Lighthouse over every page the website publishes, mobile
and desktop, and prints the four category scores per page. Nothing in ci.yml builds or measures that directory, so the score was only ever as
durable as the next change; the page list comes out of the documentation
manifest, so a new document is measured without the script being edited. It
also parses every JSON-LD block, which no Lighthouse audit does.
website/public/_headers gives the deploy a cache policy. Cloudflare's
default for static assets is max-age=0, must-revalidate, which is an ETag
round trip for a typeface that will never change again; the fonts are a year
and immutable because their filenames carry the family version, the committed
photographs a month because they are regenerated in place, and the HTML
revalidates so a deploy is seen at once.
The website's sitemap is generated from the documentation manifest rather than
written by hand, and its <lastmod> is each source file's commit date, left
out rather than guessed when git cannot answer. The hand-written one it
replaces named the front page alone for as long as the documentation had been
part of the site.
Every page of the website states what it is in JSON-LD rather than all ten
claiming to be the application: the front page is the software, a
documentation page is a TechArticle with a breadcrumb, the privacy policy is
a page, and the 404 claims nothing. No rating is asserted, because there is no
rating data.
The front page's photograph is published at 768, 1024, 1440, 1920 and 2560 px
with a srcset. It is the element the page's Largest Contentful Paint is
measured on, and one 2560 px file was arriving on phones to be drawn a seventh
of that wide — a phone now gets 28 or 41 kB depending on its screen, against
121 kB before.
The plugin's editor renders to a PNG without a DAW. plugin/test/editor_snapshot.cpp photographs its five states — waiting,
connected, reconnecting, no playhead, dropping frames — in about a second,
needing no host, no window and no screen-recording permission. It is the one
surface in this repository that nothing but a person loading a bundle could
previously look at, and its interesting states were the ones that had to be
arranged for.
Pressing "Load the live analyzer" on the front page now animates rather than
swapping its label: the play mark travels to the middle of the picture, the
label goes the other way and disappears behind it, and the square around the
mark rounds into a ring that spins for as long as the two megabytes take —
then the whole control fades out with the frame it was covering. A reader who
has asked the system for less motion gets the label change instead, and either
way a live region announces the wait and the end of it.
The live analyzer's "play the audio" control sets the gap between its note and
its label from Space rather than from two monospace spaces, which at that
size was 13 px — wider than the padding around the pair, so the note read as
sitting nearer the border than the words it belongs to. The note and the words
are also centred in the button now: they share a baseline but not a face — ♪ is in neither of the two the demo bundles — so the fallback's descent set
the row's depth and left the words two pixels low and the note one.
The front page's demo canvas draws its oscilloscope over five seconds,
overlaid on one centre line and zoomed to fill the lane. A triggered
twenty-millisecond window is the right default in the application, where the
picture moves; frozen into a still it read as one cycle of a sine and said
nothing about the programme.
The front page says less. The hero no longer recites the standards, the module
catalogue no longer explains that its pictures are photographs, and the
dynamics section states what Open Audio Analyzer reports rather than framing
it as a substitute for a figure another product computes.
The website no longer names the commercial analyser it set out from. The
footer, the manual's opening page, the macOS system-audio section of the
install page and the Dynamics section of the metrics reference each explained
Open Audio Analyzer by comparison; each now states what it does on its own
terms, and the one claim that mattered — that no proprietary single-figure
dynamics number is reproduced or approximated — is made without naming a
product. The footer says what the canvas is for while it is at it: a preset
per way of working, one for tracking, one for mixing, one for the last hour
before a master goes out. Released sections of this changelog still name the
product and are left as written.
On a phone the front page's canvas is a photograph and nothing else. The
control that loads the live analyzer is not drawn there, and neither is the
line under the picture: eight dense meters scaled to a 390 px screen are not
legible, the compiled application behind that control is two megabytes over
whatever connection a phone has, and an iframe that takes touch inside a
document you are scrolling fights the scroll for every gesture. The two go
together — the credit is required of a page that publishes the programme, and
with nothing to press the audio is never fetched. A tablet is above the
breakpoint and still gets the real thing.
The analyzer still is re-rendered without the demo's own play-the-audio
button in the corner of it. ?seconds= — the query string that freezes the
demo for a screenshot — now takes that button off the canvas as well; the
audio is still decoded, because the oscilloscope and the phase scope draw from
it. It matters because of the line above: with no facade control on a phone,
the button inside the photograph was the only play mark left on that screen,
and it was a picture of one.
The play mark on that control is a drawn path rather than a typed character. ▶ is on the emoji tables with a text default presentation, which a desktop
honours and a phone does not: iOS and Android both resolved it out of the
colour emoji font, so the hairline square came out holding an oversized emoji
play button.
The front page is written for somebody making a record rather than for
somebody reading the source. The architecture section is gone, and so is the
readout of a quantity nobody measured; the measurement table says what each
reading means and which published standard it follows instead of how the
filters and windows are built; the modules, the configuration and the dynamics
sections are in a musician's terms; the correctness panel says that the meters
are held against the EBU's own reference cases rather than listing what a
continuous-integration run asserts and in what units; and Known gaps carries
the six a musician will actually meet — no Pro Tools plugin, metering the
system's output takes all of it, the plugin needs the app running beside it —
in place of two that only meant something to a contributor, one of which had
also been wrong since releases started being signed. All of it is still stated
in full in README.md and docs/METRICS.md, which is where a reader has asked
for it.
The documentation pages mark the section you are reading again. The list on
the right was driven by an IntersectionObserver watching a band of negative
height — nothing intersects one of those, so the callback ran once as the page
loaded and never again, and every page marked its first heading and held that
mark to the end. It reads the scroll position directly now, once per frame.
Four things about how the documentation is set. A code listing has space above
it again: the rule removing the browser's own block margins outranked the one
that spaces every other block, so a listing stood flush against the sentence
introducing it. The # beside a heading sits in front of the words rather
than a line above them, and is drawn in the accent it declares rather than in
the heading's own white. And the first column of a metric table fits its
names — it had been sized from a width that let Correlation break in half
while the sentence beside it took the room.
packaging/ios/screenshots.sh renders the App Store screenshots, and packaging/ios/app-store.md holds the listing text beside them. The pictures
are of the application metering real music rather than a test tone: a
simulator app binds the host's own loopback, so the fake DAW in plugin/host/ plays a track through the real plugin into the port the
application already listens on, and every reading in them was measured by the
engine.