Skip to content

0.24.0

Choose a tag to compare

@ad-repo ad-repo released this 31 May 01:13
· 19 commits to main since this release
2495bdc

Changelog

0.24.0

New Features

  • Reference Tuning — Playback > Options > Reference Tuning can pitch-shift all local playback to a different reference frequency (e.g. retune A=440 content to A=432). Presets for Off, 432 Hz, 440 Hz, and a Custom… dialog accepting source/target Hz are exposed in the menu; settings persist across launches. Applies to local files and HTTP streaming (Plex/Subsonic/Jellyfin/Emby/radio) via AVAudioUnitTimePitch nodes inserted into the active local or streaming graph; the spectrum analyzer continues to display source (pre-pitch) frequencies. Not available while casting (Sonos / Chromecast / DLNA) because the remote renderer receives the stream URL directly with no local audio graph to insert the pitch shifter into. CLI flags --tuning <off|Hz>, --tuning-source <Hz>, and --tuning-offset-cents <n> provide session-only overrides.
  • Playback Speed — Playback > Options > Playback Speed can adjust tempo from 0.25× to 4.0× while preserving pitch. Presets for 0.25×, 0.5×, 0.75×, 1.0×, 1.25×, 1.5×, 1.75×, 2.0×, 2.5×, 3.0×, 4.0×, plus a Custom… dialog are exposed in the menu; settings persist across launches. Applies to local files and HTTP streaming (Plex/Subsonic/Jellyfin/Emby/radio). Not available while casting (Sonos / Chromecast / DLNA) because the remote renderer receives the stream URL directly with no local audio graph to time-stretch.

Improvements

  • Snow visualization is now dynamic — fall speed is driven solely by tempo. While BPMDetector (aubio) converges, a progressive transient-interval estimator (75th-percentile of recent beat intervals, with octave-folding above 100 BPM to favor calm half-time interpretations) provides an immediate moving target so the snow isn't stuck at zero for the first few seconds of each track. Audio energy now also drives a master "storm level" that controls sky whiteout/fog, beat-driven flake bursts, treble sparkle, streak length and slant, and exposure — quiet passages produce light flurries, loud passages build toward a near-whiteout blizzard.
  • Data tab — genre artist drill-down — selecting a genre in the Data tab now shows the artists that play in that genre with their play counts and listen time, mirroring the existing artist → tracks drill-down. The panel appears directly under the Genres chart and clears when the genre filter is removed. Works in both modern and classic library browsers.
  • EKG visualization rebuilt as a pure peak detector — the EKG mode no longer depends on BPM or aubio tempo tracking. Each detected audio peak now fires one QRS complex at the scan head, with height scaled to the peak's prominence (rise above the preceding valley) so soft and loud transients both register with proportional, oscilloscope-style heights. Detection runs on raw RMS instead of the saturated perceptual level signal, so brick-walled / compressed material no longer flatlines. Wider vertical clamp and a perceptual loudness curve give a much larger dynamic range between faint blips and tall kicks. The embedded main-window EKG trace also scrolls its persistent history by whole physical pixels to avoid blur from repeated fractional texture resampling in the tiny in-skin display.
  • Classic secondary window chrome refined — playlist-style windows now share the playlist close-widget artwork and scale, with matching companion circle controls and the small title bar line gap on Spectrum, Waveform, ProjectM, and classic browser chrome while leaving Main and EQ unchanged.
  • Windows menu coverage — all primary toggleable app windows are now discoverable from the top-level Windows menu, including the standalone Spectrum Analyzer and the Video Player when a video window exists.
  • Visualizations menu parity — the top-level Visuals > Visualizations menu now exposes the visualization window toggle, engine selection before the window is opened, and the live visualization window controls once available, matching the functionality previously only reachable from the visualization window context menu.
  • Visualizations menu cleanup — projectM-only preset count, preset-folder, rescan, and bundled-preset Finder actions have been removed from the generic Visualizations menu.
  • Main-window spectrum can be disabled — Visuals > Spectrum Analyzer > Main Window > Mode now includes Off, matching Winamp's blank main-display option so compatible skins can show their prepared artwork without an analyzer overlay.
  • Homebrew cask install — NullPlayer can now be installed via a personal tap: brew install --cask ad-repo/nullplayer/nullplayer. The cask strips the quarantine attribute on install (the app is still ad-hoc signed; Developer ID notarization is on the roadmap). scripts/build_dmg.sh now prints the final DMG SHA256 for the per-release cask bump, and docs/development-workflow.md documents the release flow.

Bug Fixes

  • Sonos cast session preserved on Stop and end-of-playlist — pressing the player Stop button or reaching the end of a playlist now sends Stop to Sonos without disconnecting the active Sonos target or ungrouping rooms, so the next compatible track can resume on the same speaker/group. Chromecast and non-Sonos DLNA still use the existing full-disconnect behavior.
  • Library source switching from Radio fixed — selecting a different source while the Library Browser is on the Radio tab now keeps the Radio tab active and loads that source's library-radio view instead of forcing the browser back to Artists. Fixed in both classic and modern library browsers.
  • Internet radio column sorting fixed — radio station columns now sort correctly in both classic and modern library browsers, including rating-aware sorting without repeated rating-store lookups during comparisons.