Single engine, many tools
SignalKey runs one analysis pipeline. Each tool surfaces a different slice of the same backend run — that's how the BPM Finder, Key Finder and Camelot Wheel can all use one upload.
The pipeline
- Upload — Audio is sent over HTTPS to the analysis server. Decoded with ffmpeg into 16-bit PCM at 22.05 kHz.
- Tempo + downbeat — librosa onset detection + dynamic-programming beat tracker. Stable across half/double-time.
- Key + Camelot — 12-class chromagram averaged over the track, weighted by harmonic salience, matched against major/minor key profiles.
- Chords — beat-aligned chroma vectors matched against 24+ chord templates (maj, min, 7, m7, sus2, sus4, dim, aug...).
- Loudness — pyloudnorm, BS.1770-4 compliant integrated + short-term LUFS, 4× oversampled true-peak.
- Sections — self-similarity matrix + structural segmentation to find verse / chorus / bridge boundaries.
- Stems — Demucs v4 on Replicate's GPUs for the real separation; quality-estimation heuristics fall back when no API token is configured.
- MIDI melody — Spotify Basic Pitch model for pitch-accurate transcription.
- MIDI chords — beat-quantised chord blocks from the chord detector, written to Standard MIDI File via pretty_midi.
Open-source libraries we use
| Library | Purpose | License |
|---|---|---|
| librosa | Tempo, onset, chroma, structure | ISC |
| scipy / numpy | FFT, filtering, math | BSD |
| pyloudnorm | BS.1770 LUFS measurement | MIT |
| Spotify Basic Pitch | Audio-to-MIDI melody transcription | Apache 2.0 |
| pretty_midi | MIDI file generation | MIT |
| FastAPI + uvicorn | Async backend | MIT |
| ffmpeg | Decoding + tempo/pitch processing | LGPL/GPL |
What runs in your browser
The Group B tools are entirely client-side — no upload happens:
- Tap Tempo — JavaScript timing math
- Metronome — Web Audio API scheduled clicks
- Tuner — auto-correlation pitch tracking on mic input
- Spectrum Analyzer — Web Audio AnalyserNode + canvas FFT
Your microphone stream and audio files for these tools never leave your device.
Where your audio lives during analysis
- Browser POSTs the file to
/api/backend/analyze - FastAPI writes it to a tempfile and returns a job ID
- Job runs through the pipeline (sequentially queued — see /status)
- Server-Sent Events stream progress back to your browser
- On completion, the tempfile is deleted
- Generated stems / MIDI / PDF are kept long enough for you to download, then expire
Why we queue jobs
Each librosa pipeline peaks ~600 MB RAM and is CPU-bound. Running 5 in parallel would crash the box and degrade quality for everyone. We process one at a time and show you "Queued — N ahead" so you know where you stand. Average wait is under 90 seconds.
Read more
See the public roadmap, the live status page and our API documentation.