Skip to content

v0.3.0

Latest

Choose a tag to compare

@github-actions github-actions released this 27 Jul 23:19
09b647a

Vynull v0.3.0

The headline features: BPM detection now lands exactly on integer tempos and beat grids stop drifting; album art appears in the web UI without needing a deck; tracks can finally be removed from playlists; the TUI gains a live Logs tab; and logs are quiet by default.

Exact BPMs, straighter grids

The tempo detector's peak interpolation could land a fraction off the true tempo (120.85 for a track that is really 121), which also poisoned the beat grid: a grid fit at the wrong period drifts a full beat over a typical track. Detection now verifies candidate tempos by tempogram coherence before any grid work:

  • Tracks at integer tempos detect exactly; the roughly one-in-three that used to come out fractional snap to the right whole number
  • Genuinely fractional tempos are kept when the audio supports them decisively, and half-integer tempos (a true 127.5) are recognized
  • The beat grid is fit at the corrected period, so beat indicators stay locked across the whole track
  • Library rows now follow re-analysis, so the displayed BPM always matches the grid that actually plays; manual BPM overrides survive untouched

Existing libraries upgrade themselves: the analysis cache version was bumped, so tracks re-analyze once in the background as they are viewed or loaded and pick up the corrected values.

Web UI

  • Album art now appears the first time a track is viewed. Previously the artwork extraction was only ever triggered by a CDJ loading the track, so newly added tracks sat artless until they hit a deck
  • Tracks can be removed from a playlist: a per-row button, plus a bulk action for removing a whole selection at once. Both are scoped to regular playlists, remove only the membership (the track, its tags, and its cues stay in the library), and pick the right track even with an active search or sort
  • Waveform thumbnails for newly added tracks appear the moment analysis completes. Previously they could flash black on view switches, lag the analysis by half a minute, or (with analysis behind a long queue) never appear until a page refresh; a browser image-caching subtlety kept resurrecting the pre-analysis placeholder, and the thumbnail URL now changes when analysis lands so it cannot

TUI

  • A new Logs tab shows the live log stream in-place: it follows the tail by default, scrolling up pauses it, and single keys jump to the oldest line or back to following. The log file remains the complete record
  • The Settings tab scrolls properly instead of pushing the whole screen off on short terminals
  • A DJM mixer now shows reliably in the Players view. A startup race could hide it for an entire session, and newer mixers' stripped status packets were wiping the channel state learned from their on-air broadcasts, making the mixer line flicker between states

Quiet logs

--log-level is now honoured everywhere. The default level no longer produces a line-per-packet spam stream with hex dumps while a deck browses and plays; it keeps the operationally useful record (sessions, loads, errors, deck writes). debug adds per-request browse and mount detail, trace adds wire-level hex dumps, and load-path log lines now show track titles alongside IDs.

Docs

  • Run commands in the README, Makefile, and website no longer say sudo for the default rekordbox mode, which needs no privileged ports; only --mode cdj needs UDP 111, and the sudo-free options for that are documented
  • The README now leads with what the app does for hardware DJs, and a new Troubleshooting section covers the problems people actually hit (the waveform-color quirk, the post-upgrade re-analysis pass, the rekordbox slot collision) plus how to collect useful logs

Internals

A new end-to-end suite (make e2e) drives the real binary over its HTTP API against synthesized ground-truth media, covering the analysis pipeline, artwork, playlists, the cache upgrade path, and bulk-add responsiveness in about fifteen seconds. The newer-DJM status handling is additionally pinned by deterministic packet-level tests, since an idle mixer never exercises that path live. make check runs the whole pre-release gate (build, vet, formatting, unit tests, e2e) in one command.

Upgrade notes

  • The one-time re-analysis pass after updating is CPU-heavy but bounded; the library stays usable while it runs
  • Expect BPM values to visibly change on tracks the old detector had a fraction off; that is the fix working, and the grids move with them
  • Hardware-verified on a CDJ-2000NXS2

Full changelog: git log --merges v0.2.0..v0.3.0