Skip to content

v0.4.0 — Beat detection + audio device selector + reactive-signals framework

Choose a tag to compare

@ALunfb ALunfb released this 24 Apr 01:09
· 24 commits to main since this release

Companion and website now share a single reactive-signals bus — FFT, level, beat events all flow through the same pub/sub and drive a matrix of visual effects. This release lays the foundation for future CS2 GSI integration: new topic producers plug in, existing consumers get new reactive dimensions for free.

Install

  1. Download `tracklist-link.exe` below.
  2. Double-click. Tray → Pair dashboard. Or just launch the app and paste the token into the dashboard manually.
  3. Play music. Visualizer tab flashes its accent border on kicks; the overlay card (if paired) pulses too.

What's new since v0.3.0

Beat detection

  • Energy-based onset detector on the low 8 log bands. Rolling 1.5s mean + stddev with `sensitivity × stddev` threshold, 180 ms debounce (333 BPM ceiling).
  • Emits `audio/beat` frames with a `confidence` 0..1 on the same bus the FFT rides. Wire latency ~20 ms from kick → pulse.
  • Visualizer tab: accent border pulses on each beat. Running beat counter in the header.
  • Overlay card: pulses the card's border in the streamer's accent color. No extra setup needed — just pair.
  • Dashboard companion-status tile: surfaces FFT fps + peak + live beat count as a "your companion is alive" confirmation.

Audio device selector

  • Settings tab → new dropdown listing every cpal output device on your machine.
  • Default follows Windows system default. Change persists to config. Takes effect on next restart (hot-swap mid-capture is a bigger refactor; shipping the simpler thing).
  • Graceful fallback — a named device that's been unplugged since last launch falls back to system default rather than failing startup.

Reactive signals framework

  • New `docs/REACTIVE_SIGNALS.md` lays out the producer/consumer contract. Every topic is a wire-level `kind` with `t_ms` + optional `confidence`; consumers subscribe to topic names.
  • Current producers: audio capture (FFT + level + beat), server heartbeat.
  • Planned producers: CS2 GSI (`game/cs2/round`, `game/cs2/player`, `game/cs2/match`) per `CS2_GSI_ARCHITECTURE.md`. Once the listener lands, every reactive consumer (viz flash, overlay pulse, dashboard tile) automatically picks up CS2 events with zero consumer changes.

Preset previews (scaffold)

  • `docs/PRESET_PREVIEWS.md` with the full batch plan.
  • `scripts/generate-preset-previews.mjs` in the website repo — Puppeteer-based WebP renderer with 4-worker parallelism. Run with `npm install puppeteer --save-dev && npm run presets:preview`.
  • Gallery cards and catalog are ready to surface previews when the batch finishes. Nothing breaks while they're not rendered.

Platform-side shipped alongside

On music.blackpearl.gg:

  • Reactivity filter in the preset gallery (bass / mid / treb / vol, with counts). Catalog generator parses each preset's compiled equations at build time to tag it.
  • Dashboard companion-status tile: real-time health check for your paired companion.
  • Offline-fallback consistency: streamer page header, discover cards, overlay all gracefully render the last session when a stream is offline.

Security

Unchanged: `127.0.0.1` only, origin allowlist, per-install 32-byte token. Hardened CSP with `unsafe-eval` (Butterchurn's compiler needs it) and everything else locked down. MIT-licensed. See `SECURITY.md`.

Verify the binary

```bash
git clone https://github.com/ALunfb/tracklist-link.git
cd tracklist-link
git checkout v0.4.0
cd frontend && npm install && npm run build && cd ..
cargo build --release
sha256sum target/release/tracklist-link.exe
```