Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 13:32
a7260ab

0.4.0 (2026-10-01)

Features

  • analysis: trimming never removes audio; shorter segues (c8fa45b)
  • app: ask before analysing tracks of an older version (08212f1)
  • app: look for missing files again (4de2bb4)
  • app: start the remote control server (0c6f587)
  • control: a control-surface crate that reads MIDI messages (c88dae5)
  • control: a MIDI service with hot-plug, feedback and learn (c87a68e)
  • control: LED feedback for bound buttons (76418d6)
  • control: MIDI faders move volumes with soft takeover (5a4fb66)
  • control: route MIDI buttons to player commands (0696431)
  • control: which control a message offers to MIDI learn (bd5f32c)
  • MIDI control surfaces (24bf6a0)
  • missing files explained and recovered, loaded waveforms first, stopped players show their next (47dba88)
  • model: insert and assign tracks already in the library (a2e0728)
  • model: MIDI configuration and a shared fader curve (5eda331)
  • model: OSC remote configuration and source allow-lists (775725d)
  • model: record each player's history (53f7414)
  • model: remote control configuration (f2c2b93)
  • model: repeat an entry until the operator moves on; stop after it (ff56fbf)
  • model: repeat and stop-after flags on playlist entries (a0f9659)
  • model: restart the current entry and go back to the previous one (04d91d8)
  • model: say which transport actions are available (f1a35ba)
  • model: tuning.missing_recheck_ms (6ef70b4)
  • per-track repeat and stop after (75003af)
  • remote: crate with the control trait and the API's JSON contract (03b02aa)
  • remote: edit playlists, cart pages and markers (d8a774d)
  • remote: editing routes and Settings > Remote (3338789)
  • remote: event stream over SSE (be49a10)
  • remote: HTTP API to read and operate the player (ee97a9e)
  • remote: HTTP routes to read and operate players and carts (0085f00)
  • remote: live events over SSE and OSC control (4c2a5ed)
  • remote: OSC addresses, values and subscriptions (fb0e6bb)
  • remote: OSC server with subscriptions (e8f1bae)
  • remote: reduce a waveform to n buckets, and send it without a JSON tree (68dd94a)
  • remote: resource events from snapshot diffs (ec53675)
  • remote: server thread that follows the configuration (9f1bffc)
  • remote: token, origin and host checks with CORS and limits (5ed95c2)
  • remote: turn operations into checked model commands (88ae81f)
  • restart and previous with button availability (8704ec2)
  • store: drop config fields this version does not use (953dd24)
  • ui: a stopped player shows the track Play will start (756a3bc)
  • ui: a view mapping for waveform zoom (417a2da)
  • ui: drag on the waveform to seek on release; dim trimmed audio (a98031a)
  • ui: elapsed / total under the waveform (a543b08)
  • ui: give the meter muted zone colours (e6dde85)
  • ui: interface polish from operator feedback (bc576b2)
  • ui: make slate the default waveform colour (e5803f7)
  • ui: meter and fader column with a dB scale (d9d16f0)
  • ui: move the meter and fader into a column on the right (bcf9d3e)
  • ui: own icons for missing files and outdated analyses (bf9fe46)
  • ui: proportional playlist columns (81739e5)
  • ui: proportional playlist columns and follow the current track (075da68)
  • ui: repeat and stop-after in the track table (e726520)
  • ui: restart and previous buttons, dimmed when unavailable (9d9d855)
  • ui: restart and previous shortcuts, ignored when unavailable (12e9a5d)
  • ui: say why a track is unavailable (c6db4c1)
  • ui: Settings > MIDI and MIDI control at start-up (9acba92)
  • ui: Settings > Remote (ab35d3c)
  • ui: show the version and an About window (34fc916)
  • ui: the playlist follows the current track (8f39032)
  • ui: waveform drag, zoom and trimmed regions (a038b48)
  • ui: zoom and pan the waveform with the wheel (7de230a)

Bug Fixes

  • analysis: never trim audio, and start segues relative to the track (1f570af)
  • analysis: tracks on a player are analysed ahead of the library (ecddf8e)
  • app: analyse again tracks marked by an older analysis version (c70d5e5)
  • app: look for missing files on a probe thread (68b1326)
  • app: review follow-ups for the file probe and promotion (8b297ce)
  • app: tracks with a missing file do not count as outdated (1cc4ee8)
  • backends: label unnamed devices and fall back to the address (023aa4c)
  • backends: tell same-named output devices apart (d11f551)
  • control: keep MIDI faders in control and leave other ports alone (5d5cb4d)
  • decode: drop the Opus pre-skip in Ogg and Matroska (1cec52a)
  • engine: keep repeat passes and commands in step at a boundary (05f2e3e)
  • model: a position restored at the end comes back at the cue-in (998e66e)
  • model: previous skips missing and unreadable files (f817624)
  • remote: edit a cart page and a cart as one atomic command (e31b07b)
  • remote: idempotent on/off commands and no wildcard origin without a token (7d10096)
  • remote: JSON 405, bind retry, case-insensitive bearer, cart times like the UI (5522c1e)
  • remote: log a busy port once, not on every retry (97e043c)
  • remote: one in-flight request limit for the whole server (5006bd2)
  • remote: OSC clears the addresses that disappear (56cd347)
  • remote: refuse deeply nested OSC packets and bound the cost of floods (f435371)
  • remote: review follow-ups, long recordings, meters and screenshot (0a8703a)
  • ui: a discreet alignment mark on the meter (4d428d9)
  • ui: a stopped player's waveform shows times without seeking (32f51fd)
  • ui: count table scrolls and drags, and keep resizes out of widths (2d26486)
  • ui: draw a labelled dB scale with lines across both meter bars (6adbd0c)
  • ui: draw SINGLE and CONT as one segmented control (4501cbe)
  • ui: each meter type shows only the settings its standard defines (de1be28)
  • ui: fit the countdown between the grid and the meter (6b6547b)
  • ui: keep countdowns and times at a fixed width (2895ec7)
  • ui: keep waveform drags and zoom from acting on the wrong track (f61407c)
  • ui: redraw the stop-after-current icon as play then stop (95c146a)
  • ui: Settings > Remote applies a pending edit when another section opens (09e5ae3)
  • ui: Settings > Remote buttons look like the other sections' (fa77283)
  • ui: Settings > Remote keeps what is in use until a value is valid (318ee59)

Performance

  • decode: decode Opus with a real FFT, not an O(n²) DFT (d6f0005)

Documentation

  • a 1920x1080 main screenshot made in Xvfb (df150a3)
  • CLAUDE.md lists the vendored Opus decoder (4f5deb0)
  • describe MIDI control surfaces (66d32de)
  • describe peak trimming and relative segues (c479c20)
  • describe per-track repeat and stop after (683ec74)
  • describe proportional columns and follow current (00c9afe)
  • describe remote events and OSC (a94f3d2)
  • describe restart, previous and button availability (a0df87e)
  • describe the interface polish (eeb3fec)
  • describe the meter column (ad9f81a)
  • describe the remote control API (8d2e79b)
  • describe waveform drag, zoom and trimmed regions (ad58e3e)
  • docs: design and plan the operator feedback work (23c0ef6)
  • docs: design the operator feedback work (cfcd2f6)
  • docs: plan MIDI control (b6c1e6a)
  • docs: plan per-entry repeat and stop (6b06495)
  • docs: plan proportional columns and follow current (a339c2f)
  • docs: plan restart, previous and button availability (b4eecd6)
  • docs: plan the marker tuning (02a0f7e)
  • docs: plan the operator feedback work (7e348a9)
  • docs: plan the waveform drag and zoom (5638059)
  • plan 4 adds long recordings and the re-analysis notice (660d994)
  • plan 4, remote follow-ups, restore at the end, meter and screenshot (4a29405)
  • plan the missing-file tooltip and recheck (ed35c47)
  • plan: remote control plan 1, HTTP foundation (888495c)
  • plan: remote control plan 2, events and OSC (5de4d98)
  • plan: remote control plan 3, editing and Settings (5e8db60)
  • remote editing, Settings > Remote, and a main screen on air (27eb705)
  • spec: remote control over HTTP and OSC (e3231ce)

Unsigned installers

  • the Windows installer (SmartScreen warns about an unknown publisher)
  • the macOS app (not signed or notarised: macOS asks before its first start)

How to open them: Getting started.