explainroo
explainroo is a free, open source tool that lets your AI agent make explainer videos with a voice. It runs on your own computer and needs no API key.
madmom's neural beat tracker ported to plain JavaScript. Listens to your mic or a browser tab, locks onto the tempo, finds the meter and marks the accents — no backend, no WASM, no ONNX.
MediaJavaScript · CSSGitHub @mathigattiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Live beat tracking in the browser: madmom's neural model ported to plain JavaScript. No backend, no WASM, no ONNX.
Translation pending
Loading the full README.
Read the full README ↗Live beat tracker that runs entirely in the browser: it listens to audio, locks onto the tempo, shows which beat of the bar you are on and how hard it was accented — and a little robot dances to it.
No backend, no WASM, no dependencies. madmom's neural model is ported to plain JavaScript and produces exactly the same beats as the original, down to float32 rounding noise.
▶ Try it — hit "Listen to input" (microphone or system monitor) or "Tab audio" to pick up whatever is playing in another tab.
audio ─▶ AudioWorklet ─▶ features ─▶ 8x LSTM ensemble ─▶ HMM ─▶ beats
│ (441 hops) (FFT + (with peepholes) (forward) │
│ filterbank ▼
│ + log + diff) grid
│ (tempo, meter)
└─▶ rolling 6 s window ─▶ bidirectional BLSTM ─▶ phase vote ─▶ the "1"
(in a Web Worker) (downbeat model)
The beat tracker is causal and runs in real time. The downbeat model is bidirectional — it cannot run in streaming — so it lives in a Web Worker over a 6 s window, and every beat votes for its position in the bar.
python3 serve.py 8090 # serves web/, no caching
It has to be over HTTP: ES modules and AudioWorklet do not work from file://.
In production HTTPS is required (the microphone demands it); Netlify handles that
for you.
npm test # parity against madmom, stage by stage
node test/silence.mjs # the gate: noise vs music
node test/gapfill.mjs # filling in skipped beats
node test/meter.mjs a.f32 # meter on songs of known meter
node test/playlist.mjs a.f32 # meter recovery when the track changes
node test/dance.mjs # dance subdivisions, without a browser
The parity tests need fixtures that are not versioned (~11 MB). Regenerate them with the exporters:
AUDIO_E2E=/path/to/a/song.mp3 python tools/export_madmom.py
python tools/export_downbeats.py 3
That needs madmom==0.16.1 in Python (see
docs/MIGRATION.md).
Static site, no build. netlify.toml already sets publish = "web".
netlify deploy --prod
Or connect the repo from the Netlify dashboard: it picks up netlify.toml and
there is nothing to configure.
web/ what gets published
├── index.html, app.js, styles.css
├── worklet.js collects 441-sample hops
├── downbeat-worker.js
├── src/ the port: features, network, HMM, grid, accent, meter, dance
└── public/models/ exported weights (2.7 MB)
tools/ exporters from madmom (Python)
test/ parity and behaviour (Node)
docs/ the two long documents
serve.py development server with caching disabled
The model is madmom's (Böck et al.), BSD. This repo only ports it.
MIT.