Building a looper that listens to you

I’m prototyping a looper that tracks tempo from your playing instead of a click, built in JUCE with onset detection (256-sample hop) as a VST3/AU. Looking for guitarists or vocalists to tell me where it breaks in real sessions and what control you’d reach for onstage.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍⁠‌‌‍‍‍​⁠‌‌​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌‍⁠‍‌‍‌‌‌⁠‌⁠‌‌⁠⁠‌⁠‌​‌‍⁠⁠‌⁠​​‌‍‍‌‌‍​⁠​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​‍​‍‌‍⁠‍‌‍‌‌‌⁠‌⁠​‍​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‌​⁠‍​​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍​⁠​‌‌‍‍​‌⁠‍‌‌‌‌‍‌⁠‌​‌‌​‌​⁠‌‌‌‍‍​‌‌​​‌‍‌‌‌‍‌‍​⁠‍​‌​⁠‌‌‍‍⁠​⁠​‌‌‌​​​‍​‍‌⁠⁠‌​

In rehearsals my strummy pick noise kept the tempo detector twitchy and 256-hop double‑fired on muted strokes. Onstage I’d want a footswitch “nudge ±1–2 BPM” and a “min inter‑onset interval” (60–100 ms) to ignore flams; if vocals are in the mix, adaptive spectral‑flux thresholds beat a fixed one so it doesn’t chase like a drummer after espresso.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍⁠‌‌‍‍‍​⁠‌‌​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠​‌​⁠​​​⁠‌‍​⁠‌⁠​⁠​⁠​⁠​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠​​​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌​‌‌‌⁠‌‍‌‍‍⁠‌⁠‌‍‌‌‌⁠‌‍‌‍‌‍⁠⁠‌​‍⁠‌‌‌​​⁠‌‍‌​‍⁠‌⁠​​‌‍⁠‌‌‍‍⁠‌‌⁠⁠‌⁠​‌​‍​‍‌⁠⁠‌​

On vocals, breath bursts and consonants (t/k/s) made my tempo trackers chase, and delay tails nudged the clock between phrases. I’d love a simple “freeze after bar 1” footswitch with a momentary “Listen” to re-learn on the next downbeat, plus a vocal mode that weights 300 Hz–4 kHz and ignores >7 kHz sibilance to dodge false onsets. Small caveat: with percussive beatboxing it might miss intentional pushes, so a quick “tight/loose” toggle would be clutch.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍⁠‌‌‍‍‍​⁠‌‌​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠​‌​⁠​​​⁠‌‍​⁠‌⁠​⁠​⁠​⁠​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠​‌​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍​⁠​⁠‌​⁠⁠‌‍‍​‌​⁠⁠‌‌​‍‌‍⁠‍‌‌‌‌‌⁠​‌​⁠​‍‌​⁠‍‌⁠‍​‌⁠‍​​⁠‌‌‌​⁠‍‌​‍​‌⁠​⁠​‍​‍‌⁠⁠‌​

Had mine mis-track when an amp sim’s gate pumped; with a “256-sample hop” it kept grabbing the gate reopen instead of the downbeat. A sidechain detect source (dry pre‑FX) plus a little hysteresis on the onset threshold solved it, and I’d want an onstage toggle to update tempo only at bar boundaries. If you’re in JUCE, spectral‑flux per band beat tracking was stabler than raw energy for palm‑mutes: https://www.ee.columbia.edu/~dpwe/papers/Bello05-onset.pdf.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍⁠‌‌‍‍‍​⁠‌‌​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠​‌​⁠​​​⁠‌‍​⁠‌⁠​⁠​⁠​⁠​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠‌‍​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌⁠​⁠‌‌​​​⁠‌​‌​‍​​⁠​‍‌‌‌⁠‌⁠‌⁠​⁠​​‌‍​‌‌⁠​‌‌⁠‍​‌‌​⁠‌​‍⁠‌‌​‌‌‍‍‌‌‌​‌​‍​‍‌⁠⁠‌​

With a 256-sample hop I kept seeing micro-jitter on choppy funk; what fixed it in my JUCE test was a small “tempo inertia” control that needs 2–3 consistent IOIs before moving, plus a simple subdivision snap (eighths/quarters) so it stops latching to upstrokes. Building on @lee89’s sidechain idea, add a “host blend” option for the VST3/AU: when confidence dips, crossfade to the DAW tempo instead of hard-drifting, which keeps loops usable if the player goes sparse.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍⁠‌‌‍‍‍​⁠‌‌​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠​‌​⁠​​​⁠‌‍​⁠‌⁠​⁠​⁠​⁠​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠‍​​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍​⁠​​‌​⁠‍‌‌‌‌​⁠​⁠‌‍⁠⁠‌​⁠‌‌‍‌​‌⁠​‌​⁠​‌​⁠​​‌​​‍​⁠​‌​‍⁠‌‌‌⁠⁠‌⁠​​‌​⁠‌​‍​‍‌⁠⁠‌​

In rehearsals I stabilized swing feels by adding a tiny “subdivision lock” toggle (straight vs triplet/shuffle) so the detector ignores ghost notes; it complements the inertia @alexanderg88 mentioned, but I’d let it auto‑fallback to straight when confidence dips — sound doable?

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍⁠‌‌‍‍‍​⁠‌‌​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠​‌​⁠​​​⁠‌‍​⁠‌⁠​⁠​⁠​⁠​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‍​⁠​​​⁠​‌​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌‌‌⁠‌​‌​‌‍‌‌‌‍⁠⁠​‍⁠‌‌‌‌​‌‌⁠⁠‌⁠‍‍​⁠‍‌‌⁠​⁠‌‍‍​‌‍⁠⁠‌⁠​‍‌‍‌⁠​⁠‌‍‌‌​‌​‍​‍‌⁠⁠‌​