Skip to content

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 22 Aug 22:14
· 30 commits to main since this release

✨ Added

  • A skin editor. Settings → Appearance → Edit skin opens all thirteen colour
    roles with a picker on each, and the canvas behind the panel repaints as you
    drag — as does a tablet mirroring the session. Every role prints its contrast
    ratio against the surface it is read on, and the ones below the floor that
    role is held to are marked with the reason; a low-contrast palette still
    saves, because refusing to save what is already on screen is worse than a
    warning. Skins remain plain JSON files and hand-editing them is unchanged.
  • Skins can be deleted from the editor, which previously meant finding the file.
  • Reset, beside Edit on Settings → Meters → Delivery target, deletes every
    target you have saved and puts the built-in six back. It asks first, in a
    dialog naming what goes, and afterwards says how many files it removed.
    Targets you wrote by hand are gone from the disk, so this is also how a
    correction to a built-in is undone without going looking for its JSON file.
  • The VU Meter marks where the needle reached. A mark rides the scale at the
    loudest point of the last second and a half and then falls back to the
    needle, because a 300 ms movement is slow by design and the loudest moment of
    a phrase is over before the needle has finished describing it. It is the same
    quantity the needle draws, held rather than measured a second time.
  • The VU Meter prints its reading and its reference along the bottom of the
    face: the deflection in VU on the left, and which dBFS level reads as 0 VU on
    the right. The second one is the genuinely confusing thing about a VU meter
    and the face now says it out loud. A module too small for either drops it and
    keeps the dial.
  • The Spectrogram and the Oscilloscope can be drawn in full colour.
    Colour: Full RGB in either module's menu replaces the skin's one-hue ramp,
    and what it paints is the quantity that module's axes leave uncoloured. On the
    Spectrogram that is the level: the spectrogram rainbow, indigo through
    green and yellow to red and white, which separates far more steps of level than
    one hue can. On the Oscilloscope it is the band balance, because a waveform
    has no frequency axis at all: red, green and blue are its bass, its mids and
    its highs, split at 200 Hz and 2 kHz, so a kick is red, a hat is blue and a
    full-spectrum hit is white, the way DJ software has coloured audio for twenty
    years. That balance is taken in decibels against the loudest of the three bands
    rather than in power — bass carries an order of magnitude more power than air
    does, and a power mix draws every piece of music red — and it is recorded with
    the column, so the picture holds its colours instead of being repainted by
    whatever is playing now. A column whose source published no spectrum keeps the
    accent rather than being handed a colour that would claim a balance nobody
    measured. Off by default in both, because a rainbow reads as more precise
    than the measurement behind it, it collapses for the eight percent of men who
    cannot separate red from green, and on the Spectrogram it brings its own dark
    ground into a light skin. Nothing measured changes at either setting: no
    reading, no report and no byte on the wire moves.

⚡ Changed

  • A menu marks the value it holds by recessing that row, not by brightening
    it.
    Every dropdown in the application — the delivery target, the signal
    source, and a module's dozen settings — used to print its current value as the
    lightest row in the menu, which put the emphasis on the one choice pressing
    cannot change and left the options you can still take looking greyed out. The
    chosen row now sits in a darker well and the alternatives sit on the menu's
    own surface, which is how selection reads everywhere else in the interface.
    Nothing about what the menus contain or choose changed.
  • The signal source in the status bar is a bordered chip, the same shape the
    delivery target beside it has always had. It is the menu people open most and
    it was drawn as a dot and a bare word in a row of bordered controls, which
    reads as a caption rather than as something you can click. The dot stays,
    inside the chip: bright while something is being metered, dim on Silence.
  • The OAA wordmark is gone from the status bar. The window carries the
    application's name; the bar carries what changes while you work, and three
    capitals that never change were the one item in it saying nothing about the
    signal. Every width at which the bar drops an item moved with it — the
    controls at the narrow end now leave 25 to 40 px earlier than they did,
    because a bordered chip cannot give back the width a bare word could. All of
    them still have keyboard shortcuts except the three remote controls, which is
    unchanged.
  • The sample rate no longer prints flush against the DAW's playhead. The gap
    between the source group and the readings is a fixed one now rather than
    whatever the window had left over, so it is there at every width instead of
    only on a wide one.
  • The VU Meter has a face. The scale is a band along the rim rather than a
    hairline arc, red above 0 VU over a tinted ring, and the needle is a taper
    under a machined hub — so how far up the scale the programme is can be read
    from the rim before the needle is read at all. Nothing about the movement,
    the ballistics or the reading changed.
  • The Loudness Distribution fits its loudness axis to the programme instead of
    always drawing −60 to 0 LUFS. A mastered programme's gated distribution
    occupies eight to fifteen of those sixty decibels, so the picture the LRA
    reading is taken from was squeezed into a fifth of the module with the rest
    left blank; the axis now holds every occupied bin, the gated range and the
    delivery target, rounds outwards to whole ticks, and stays where it is until
    the distribution grows past it. No reading changes — the same bins are drawn
    against a shorter stretch of the same scale. Scale: Full range in the
    module's menu restores the published axis, which is the one to pick when two
    distributions are being compared side by side.
  • Open Audio Analyzer has a new logo, and every icon it ships follows it. A
    white waveform on a teal ramp, replacing the four teal bars on graphite. The
    app icon, the installers' icons, the Android launcher icon, the layered icon
    macOS and iOS render, the favicon, the documentation site's header, the
    README and the social card all change together. The tile is also a rounder
    shape than it was, because the one macOS 26 and iOS 26 draw is rounder than
    the one every version before them drew. Nothing about what the application
    measures or displays is affected.
  • The icon reads less well at 16 px than the one it replaces, and that is a
    real cost rather than an oversight. Four bars at four heights survived being
    two pixels wide; a waveform with nine excursions across twelve pixels does
    not, and no stroke weight rescues it. The line is held at one device pixel so
    that it stays white instead of smearing to grey, and the sizes the icon is
    now designed around are 32 px and up. Where this shows is the Windows
    Explorer list view and a Linux panel at its smallest setting.
  • Precision Instrument and Daylight can no longer be replaced. A skin file
    naming one of their two ids used to shadow the built-in; it is now ignored,
    and the skin editor offers Save as new rather than an in-place save. The two
    shipped skins are what proves the thirteen colour roles are semantic rather
    than aliases for particular colours, and a reference point a file on disk can
    quietly redefine is not one. If you had such a file it is inert now
    rename its id and it comes back as a skin of its own. Delivery targets are
    unaffected and still shadow their built-ins, because a target is a claim about
    somebody else's published specification and has to be correctable without a
    release.

🐛 Fixed

  • The VU Meter no longer draws a needle for a reading nobody measured. The
    per-channel arrays are NaN while a remote display's link to the host is
    quiet, and the dial rested at the bottom of its scale with exactly the
    confidence it reads a quiet passage with; the face now shows no needle and
    the reading is an em dash. Only a tablet display could reach this.
  • The VU Meter's scale numbers no longer overprint each other on a small
    module: −5 and −3 sit close together on a face that crowds towards the bottom
    in voltage, and at the narrowest widths they collided into one smear. The
    face now sheds the numbers it has no room for, keeping 0 and both ends.
  • A panel that scrolls draws one scrollbar rather than two. Settings, and
    every other panel tall enough to scroll, carried the skin's own thumb on its
    right edge and a second, wider grey one immediately inside it, which faded in
    whenever the panel was scrolled. The second was supplied by Flutter, which
    decorates a scrolling region on macOS, Windows and Linux without being asked;
    the panel now declines it. Tablets never showed it.
  • The Super Meter's target tick sits in its slot again. The slot is a
    surround laid down under the tick so that its contrast is identical on all
    three rings, whatever each ring is currently drawing; it was being stroked at
    exactly the tick's own width, so the tick covered it completely and was read
    against the arc after all. It stands 1.5 px out either side now, which is what
    the constant describing it always said. The tick itself is unchanged.

🚧 Internal

  • The skin editor's suite waits for the effect of a save rather than for the
    file. Its helper stopped as soon as the skin's file existed, which is one
    event-loop turn before the editor is told the write finished — so the four
    assertions about what saving then selects raced the disk, and won on a Mac and
    lost on the Linux runner every time.
  • flutter analyze no longer walks website/tools/. The two Flutter web
    targets that render the real modules for the site now share the mock
    MeterSource as a package rather than each holding a copy, and a
    package:oaa_mock import needs package resolution where the relative one it
    replaced needed none — so on any machine that had not run pub get inside
    each of them, which is every CI runner, the repository's analyze gate failed
    on eight unresolved references in code that no gate builds. They are excluded
    in analysis_options.yaml and analysed by their own.
  • The remote display's skin frame is rate-limited to one every 150 ms, with the
    last value always delivered. Dragging a colour in the new editor produces a
    palette per pointer move, and those frames are queued rather than dropped —
    unthrottled they grew that queue for as long as the pointer was down.
  • The artwork and the program that renders it swapped places.
    assets/brand/oaa-logo.svg is now the drawing, hand-edited, and
    packaging/icon/make_icons.dart reads it; previously the mark was four
    rectangles described as numbers in that program and every vector in the
    repository was a hand-copied transcription of them, kept in step by a rule
    saying the mark changed there first and was brought across afterwards. That
    rule does not scale to a path with three hundred control points. The program
    now also writes packaging/icon/oaa.svg, the rest of assets/brand/ and the
    website's icons, which removes the last four files anybody kept by hand.
  • make_icons.dart grew a path rasteriser — an SVG path parser, a cubic
    flattener and a scanline fill — because the mark is a stroked cubic path and
    the old renderer only knew rectangles. Still no dependencies. The stroke is
    drawn as the union of a rectangle per segment and a disc per vertex rather
    than by offsetting the outline, which is the same shape and is not a research
    problem.
  • The tile's corner is measured rather than remembered. Three macOS 26 system
    icons were rendered through NSWorkspace, thresholded to a silhouette and
    fitted: a corner of a third of the side on a superellipse of exponent 2.7,
    where the shape Apple drew from iOS 7 to iOS 18 was 22.37% on an exponent
    near 4. The first cut of this release used the remembered numbers and looked
    visibly square next to everything else in the Dock.
  • The documentation site serves its favicon as a file instead of inlining it
    into every page as a data URI. The mark was a few hundred bytes when that
    choice was made and is three kilobytes now, which across twenty pages was a
    hundred kilobytes of the same icon.