v1.10.0
kevinraymond/fosforav1.10.0Jul 18, 2026by github-actions[bot]
AI Summary
Adds spectral contrast, pitch tracking, harmonic/percussive split, and stereo field support.
Key Highlights
- Spectral contrast and timbre flux features added for per-band grit and dynamics.
- Monophonic pitch tracking with confidence scores.
- Harmonic/percussive energy split for separating drums from melody.
- Stereo field support (pan, width, correlation) restored.
Breaking Changes
- Shader ABI v3 updated (NUM_FEATURES 61 → 74, AudioFeatures 244 → 296 B). Compiled user shaders need recompiling.
New Features
- Spectral contrast and timbre flux
- Monophonic pitch tracking
- Harmonic/percussive split
- Stereo field support (pan, width, correlation)
- Shader ABI v3 update
Full Release Notes
### Added - **Spectral contrast and timbre dynamics — `contrast_0…5` / `contrast_mean` / `timbre_flux`** — two gaps closed: nothing scored the per-band peak-versus-valley "grit" that separates a clean sine from a saw in the same octave, and nothing measured how fast a timbre was *moving*. Contrast reports that grit across six octave bands; `timbre_flux` measures timbre-shape change orthogonal to loudness, so a constant-volume filter sweep fires it while a plain volume change does not. A sawtooth reads contrast ≈ 0.92 against a sine's ≈ 0.52. - **`audio.dmfcc.0..12` binding sources** — per-coefficient MFCC rates of change, available to any parameter binding. Kept out of the shader uniform to save 52 bytes. - **Monophonic pitch tracking — `pitch` / `pitch_confidence`** — the engine could name the key and the pitch classes present but never the actual melodic f0, so no effect could follow a lead line or a bassline's note. A YIN tracker now reports f0 as a 0..1 log-frequency (55 Hz → 0.0, 1760 Hz → 1.0, so an octave is always 0.2) plus a confidence, holding the last pitch through unvoiced gaps so a pitch-keyed visual doesn't snap to the lowest note on every rest. Also broadcast in real Hz as `/phosphor/audio/pitch_hz`. - **Harmonic/percussive split — `percussive_energy` / `harmonic_energy` / `harmonic_ratio`** — until now every feature saw the full mix: pads polluted kick flux, hi-hats polluted chroma, and routing drums and melody to separate visual channels meant ML stem separation. A causal median-filter split now partitions the spectrum into a sustained-tonal and a broadband-transient channel with zero added latency, giving two musically meaningful buses and a level-invariant ratio between them. A click train reads a ratio of 0.00, a sustained two-tone chord 0.999. - **Stereo field — `pan` / `stereo_width` / `stereo_corr`** — every capture backend used to collapse to mono *at the callback*, so stereo was destroyed before anything downstream could see it and these three fields sat at `0.0`. The capture path now carries native stereo and derives the mono mix from it, so recording and every existing feature see a byte-identical signal for a 2-channel source. Unlocks pan-to-position and width-to-spread mappings. On input devices with more than two channels this now takes the front L/R pair rather than averaging every channel. - **Shader ABI v3** — one batched bump reserving 13 feature slots so the DSP above could land without further churn: `NUM_FEATURES` 61 → 74, `AudioFeatures` 244 → 296 B, `ShaderUniforms` 352 → 400 B. Existing offsets are untouched and particle uniforms are unchanged, but compiled user shaders need recompiling once for this bump. ## 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](https://ndi.video) for network video output - **Video playback** (optional): `ffmpeg` on PATH for media layers --- NDI® is a registered trademark of Vizrt NDI AB.