Skip to content

v0.8.3

Choose a tag to compare

@dataO1 dataO1 released this 17 Feb 11:17
· 689 commits to main since this release

Changelog

All notable changes to Mesh are documented in this file.

Release Packages

Package Platform Description
mesh-cue_amd64.deb Linux (Debian/Ubuntu) Full DJ application with stem separation (CPU)
mesh-cue-cuda_amd64.deb Linux (Debian/Ubuntu) Full DJ application with NVIDIA CUDA acceleration
mesh-cue_win.zip Windows 10/11 Full DJ application with DirectML GPU acceleration
mesh-player_amd64.deb Linux (Debian/Ubuntu) Lightweight stem player
mesh-player_win.zip Windows 10/11 Lightweight stem player
sdimage-*.img.zst Orange Pi 5 Pro (aarch64) NixOS SD card image for embedded standalone unit

Installation

Linux (.deb):

sudo dpkg -i mesh-cue_amd64.deb      # or mesh-cue-cuda_amd64.deb for NVIDIA GPUs
sudo dpkg -i mesh-player_amd64.deb   # optional: lightweight player

Windows (.zip):

  1. Extract the zip file to a folder (e.g., C:\Program Files\Mesh)
  2. Run mesh-cue.exe or mesh-player.exe

GPU Notes: The CUDA build requires NVIDIA driver 525+ and CUDA 12. The Windows build uses DirectML which works with any DirectX 12 capable GPU (AMD, NVIDIA, Intel) without additional drivers.


[0.8.3] - 2026-02-17

Improved

  • Beat grid phase detection — Beat grid phase is now computed using circular
    statistics (atan2 of mean sin/cos) across ALL detected beats, replacing the
    naive first-tick anchor that was highly sensitive to misdetected beats in
    intros. This gives a statistically robust consensus phase aligned to where
    beats actually land across the entire track.

  • Energy-gated intro skip — Beats detected in silent or low-energy regions
    (ambient intros, breakdowns) are automatically filtered before computing the
    phase anchor. Ticks with RMS energy below 10% of the peak tick energy are
    discarded, preventing phantom beats from pulling the grid off-phase.

  • Onset-weighted phase refinement — After the circular median provides an
    initial phase estimate, a second stage searches ±25% of one beat period using
    the onset detection function (ODF). Each candidate phase is scored by summing
    interpolated ODF values at all grid positions across the full track. The
    highest-scoring phase wins, giving sub-frame precision aligned to actual
    rhythmic events.

  • Real beat detection confidence — Beat detection now reports actual
    confidence from Essentia's multifeature tracker (TempoTapMaxAgreement,
    normalized from [0, 5.32] to [0, 1]) instead of a hardcoded 0.8 value.
    Low-confidence tracks can be identified for manual review.

  • Drums-only BPM source separation — BPM analysis can now optionally run
    on the isolated drum stem instead of the full mix. This removes melodic and
    harmonic content that confuses tempo estimation, especially on tracks with
    syncopated basslines or complex arrangements. Configurable in Settings → BPM
    → Audio Source (drums, bass, other, vocals, or full mix).

  • Trimmed-mean BPM estimation — Inter-beat intervals are now aggregated
    using a 10% trimmed mean instead of a simple median, reducing sensitivity to
    50fps frame quantization artifacts and outlier beats in intros/outros.

Fixed

  • BPM re-analysis sample rate mismatch — Re-analysis (Analyze > BPM) was
    reading collection files at 48 kHz (playback rate) and feeding them to Essentia
    which expects 44.1 kHz, causing BPM to read ~8 % too slow (e.g. 172 → ~158).
    Now reads stems at 44.1 kHz via the existing rubato resampler. Import path also
    gained a defensive resample for non-44.1 kHz source files.

  • LUFS measurement sample rate — LUFS K-weighting filter was incorrectly
    using 48 kHz regardless of actual input rate. Now correctly uses 44.1 kHz to
    match the analysis audio.

  • Beat This! BPM rounding — The Advanced (Beat This!) backend now applies
    fit_bpm_to_range() to round BPM and handle octave/triplet fitting before
    storing, matching the Essentia path. Previously, raw median-IBI values like
    173.47 were stored, causing the UI to display unrounded BPM.

Added

  • Beat This! ML beat detection — SOTA beat and downbeat tracking via the
    Beat This! ONNX model (CPJKU, ISMIR 2024). The small variant (~2M params,
    ~10 MB) achieves Beat F1=88.8 and eliminates the half-tempo errors common
    with DnB and fast tempos. Select "Advanced" in Settings → BPM → Beat
    Detection to enable. The default backend is Essentia ("Simple"), which
    provides the most reliable results across genres after statistical comparison.

    • Pure Rust Slaney mel spectrogram preprocessing (n_fft=1024, hop=441,
      f_min=30 Hz, f_max=11000 Hz) matching the original PyTorch LogMelSpect
    • Chunked ONNX inference with cosine overlap blending for tracks of any length
    • Sigmoid activation + peak picking (no Dynamic Bayesian Network)
    • Integrated into both import and re-analysis paths
    • Model auto-downloaded on first use (~10 MB, cached in
      ~/.cache/mesh-cue/ml-models/)
    • Nix conversion script: nix run .#convert-beat-model to export from
      PyTorch weights
  • Beat This! research document (documents/beat-this-research.md) —
    Comprehensive integration plan for Beat This! (ISMIR 2024, CPJKU).
    Documents the model architecture and preprocessing requirements.