v1.10.0
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_fluxmeasures 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..12binding 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 at0.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_FEATURES61 → 74,AudioFeatures244 → 296 B,ShaderUniforms352 → 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 for network video output
- Video playback (optional):
ffmpegon PATH for media layers
NDI® is a registered trademark of Vizrt NDI AB.