v1.33.0
Added
- New
/fosfora/v1/section/boundarySignal address fires whenever the music changes
material, carrying a confidence and the boundary's age in seconds./sectiononly ever
spoke when its label changed, so a chorus following a verse was silent; this one is not.
Gate on the confidence if false cues are costly — the top third of events are right about
66% of the time against 38% for the bottom third.
Changed
- Section boundaries are actually detected now. The self-similarity novelty had been
computed and published for four releases without anything ever thresholding it, so the
section stream announced 3.7 boundaries on a track averaging 12.3 — boundary accuracy
0.105 → 0.503 on 374 Harmonix tracks, at 12.1 boundaries per track. Cues land about 6 s
after the boundary they describe, and each event says so. audio.section_noveltyno longer sits pinned at 1.0. It was normalized against its own
recent maximum, so unchanging music drove it to full scale — the opposite of what the name
promises. It now reads near zero on steady material and rises only on real change. Anything
bound to it will read lower and move more; rescale that binding if it looked right before.- Key detection now hears the actual key on EDM. It used to name an unrelated
key more than half the time — quiet noise frames voted as loudly as drops, the
chroma template manufactured subdominant energy, and the loudest content in the
genre (kick and sub-bass) was either invisible or misread. The key path now
energy-weights a clean fold and tracks the sub-bass root directly: 0.317 → 0.520
MIREX-weighted on 604 GiantSteps EDM tracks, exact keys 153 → 272. Key readouts
and key-driven palettes settle in about 3 s. - Beat and tempo tracking rebuilt. Beats fired on every loud onset whenever tempo
confidence dipped — 1.5-1.7× too many, spraying beat-bound strobes — and drifted
100+ ms late on misses; they now fire on a phase-locked grid (within ~10 ms on
synthetic kicks) and go quiet through breakdowns instead of spraying. The detected
tempo also commits to its level: double-kick and half-time-feel material no longer
flips the readout between 172/115/86-style relatives mid-track, and the BPM value
holds through breakdowns instead of blanking. EDM tempo accuracy rose 0.60 → 0.70
(past offline madmom), tempi between analysis bins like 175 BPM became representable
at all, and hard-stuck octave errors clear. Tracks now stay silent for the first few
seconds until the tempo locks;/onsetand the kick stem keep firing throughout. - Phosphor is now Fosfora, everywhere. Your config directory moves over automatically
on first launch (settings, presets, scenes and mappings all come along), OSC output now
uses/fosfora/...— incoming/phosphor/...is still accepted, and a legacy TX
namespace option in the OSC panel keeps old rigs fed — and the from-source binary is
fosfora(downloads were already named that). macOS asks for microphone permission once
more (new bundle id); debug env vars are nowFOSFORA_*. Custom shaders calling
phosphor_*helpers keep working via deprecated aliases.
Added
- Ableton Link (build option). Build with
--features linkand Fosfora joins your
Link session: Follow mode locks the beat tracker's tempo to the session (beat phase
still tracks the audio it hears), Lead mode pushes Fosfora's detected BPM to your
other gear once it holds steady, and beat-synced scene advance rides the shared
session grid. Works in--signalheadless mode too (/fosfora/v1/link/*). Absent
from the prebuilt downloads — Ableton Link is GPL-licensed, so it's a from-source
option. Enable it in Settings → Ableton Link. - Signal: headless analysis broadcast.
fosfora --signalruns the analysis engine
with no window or GPU and broadcasts what it hears over versioned OSC
(/fosfora/v1/...): beats and bars the hop they fire, BPM, key, build level,
section labels (intro/build/drop/break/steady), phrase position on an inferred
8/16/32-bar grid, and apredict/dropconfidence that rises before the likely
drop — lead time for the operator, with a confidence value on every stateful
address.--signal-dump song.flacwrites the same stream to a JSONL file,
deterministically. See docs/SIGNAL.md. - Seamless beat-locked loop export.
--render-loop <spec.loop.json>renders any
phase-locked overlay to a mathematically seamless loop file — HAP, HAP Alpha (real
transparency for Resolume/VJ software), ProRes 4444, H.264/HEVC — with beat/bar motion
synthesized at an exact tempo (requested BPM snaps to the nearest frame-perfect one and
both are reported). Non-loopable effects get explicit best-effort escapes
(--allow-non-loop,--crossfade-barswith warmup). One CLI call replaces the After
Effects loop-compositing grind; needs ffmpeg on PATH. See docs/loop-export.md.
Fixed
- Intarsia filled the screen with tiles, then blanked and started over every few
bars. Tiles now trade in and out individually on the bar clock, holding a steady
mosaic with no reset. A newdensityparam sets how much of the mosaic is lit at
once;bars_per_cycleis now the turnover period — how often each tile trades. - A mistyped or unsupported command-line flag silently launched the full app —
window, GPU and all. Unknown flags now print an error and exit,--helpand
--versionwork, and a flag needing a build feature you don't have (like
--signal-dumpwithout--features analyze) says so by name. New--capsprints
the features a binary was built with.
Downloads
| Platform | File | Notes |
|---|---|---|
| macOS | .dmg |
Universal binary (Apple Silicon + Intel) |
| Linux x86_64 | .tar.gz |
glibc 2.35+ (Ubuntu 22.04+, Debian 12+) |
| Windows x64 | .zip |
Windows 10+ |
Getting started
macOS: Open the DMG, drag Fosfora.app to Applications (or run directly). Signed and notarized.
Linux / Windows: Extract, run fosfora from the extracted directory. The assets/ folder must be next to the binary.
Requirements
- GPU: Vulkan (Linux/Windows) or Metal (macOS)
- Audio: Built-in mic or line-in for audio-reactive visuals
- NDI® (optional): NDI® SDK runtime for network video output
- Video playback (optional):
ffmpegon PATH for media layers
NDI® is a registered trademark of Vizrt NDI AB.