Skip to content

Repository files navigation

DrumMate Chart

Drop in a song, get drum notation you can practise with — plus the isolated drum track and a drums-removed backing track to play along to.

Built by the people behind DrumMate, the live band that follows the drummer — electronic kit, pads or acoustic: you drum, the band follows. This is the sibling for learning the song first.

DrumMate Chart

Live: chart.drummate.app (free, upload your own audio). Open source under the MIT License.

What it does

  1. Separates the kit from the mix — Demucs, then the MDX23C DrumSep model splits the kit into kick / snare / toms / hi-hat / ride / crash.
  2. Finds the pulse from the drums themselves — period from the kick/snare autocorrelation, an octave/4:3 judge that scores candidates on whether the bars look like bars, a phase follower that only real backbeat strokes may move, and a linear-drift fold for songs recorded without a click.
  3. Detects every hit per stem, with bleed rules learned by comparing against published charts: a floor-velocity kick under a snare is bleed unless the song doubles its backbeat; a stray ghost that repeats nowhere nearby is noise; and so on.
  4. Quantises per bar (8ths / 16ths / 32nds / triplets, swing detection), then snaps weak deviations to the section's groove while leaving fills exactly as played — the way a transcriber writes a chart.
  5. Engraves proper two-voice drumset notation, with a legend, a simple mode, a loop-practice tool and a teach mode that breaks the groove down and calls the hits out loud.
  6. Exports MIDI, MusicXML and a Clone Hero package (Pro Drums).

Measured against full published transcriptions (Songsterr, tTabs) it matches 90–98 % of bars on kick and snare for clean studio recordings (Billie Jean 140/143 kick, 136/143 snare; Every Breath You Take 110/112 kick). Hi-hats are where published charts disagree with each other; live bands without a click are where it still struggles. Details and the tools to measure it yourself are under Accuracy.

Quick start (your own machine)

Easiest — one file to run. Download the ZIP from the latest release, unzip it, then:

double-click installs for you if missing
Windows start.bat Python, ffmpeg, Node.js (winget / direct download)
macOS start.command Homebrew, Python, ffmpeg, Node.js (asks for your password once)
Linux start.sh Python, ffmpeg, Node.js via apt / dnf / pacman (asks for sudo)

The first run installs the Python packages into the app folder (5–10 minutes, ~1.5 GB) and the first chart downloads the separation models (~500 MB). After that it starts in seconds and opens http://127.0.0.1:8000 in your browser. Close the window to stop.

Or with git, if you'd rather:

git clone https://github.com/sashyo/drummate-chart.git
cd drummate-chart
./run.sh                      # same as start.sh, without opening the browser

Links and YouTube are on by default when you run it yourself — that's personal use on your own machine. Paste a YouTube link or a direct audio link, or drop a file.

The public site is deliberately upload-only (DRUMS_LINKS=0) and zero-retention (DRUMS_ZERO_RETENTION=1) and deletes your audio the moment the chart is done (see Terms). Please don't run a public instance that fetches from YouTube; that's a breach of their terms and, served to strangers, a distribution of other people's recordings.

GPU. On CPU a 4-minute song takes 10–20 minutes. With an NVIDIA card it takes about 4, and the fine-tuned Demucs model becomes the default. Create a CUDA environment (.venv-cuda, torch build matching your driver — see DEPLOY.md); run.sh uses it when present. A 3 GB card is enough.

Configuration

variable default meaning
DRUMS_LINKS 1 accept links. 0 = upload only (what the public site runs)
DRUMS_ALLOW_YOUTUBE 1 fetch YouTube/streaming links (personal use on your own machine); 0 on a public instance
DRUMS_YOUTUBE_WITH_CONSENT 1 with YouTube off, still allow it behind a rights checkbox recorded on the job
DRUMS_WORKERS 2 transcriptions in parallel
DRUMS_DEVICE auto cpu to ignore the GPU
DRUMS_SEPARATION auto htdemucs to skip the fine-tuned model on a GPU
DRUMS_MAX_SECONDS 600 cap on analysed audio per job
DRUMS_DATA ./data where jobs, caches and the usage counter live
DRUMS_KEEP_SOURCES 0 1 keeps source audio and separation caches (default: deleted when the job ends)
DRUMS_AUDIO_TTL_HOURS 6 hard cap on how long a chart's drum/backing tracks exist
DRUMS_SESSION_IDLE_MIN 20 a chart's audio is released when its page is closed, or after this idle time
DRUMS_ZERO_RETENTION 0 1 (the public site): the browser takes a finished chart's audio into memory and the server deletes its copies at once; nothing audio is ever kept

How the pieces fit

backend/pipeline/
  fetch.py      audio in (upload / link / yt-dlp) -> 44.1 kHz wav
  separate.py   Demucs drums stem + backing            gpu.py: one inference at a time, CPU fallback
  drumsep.py    MDX23C kit split (6 stems, cached by audio content)
  onsets.py     per-stem onset picking, velocities, open-hat test, toms by pitch
  rhythm.py     tempo from the drums: autocorrelation, octave judge, phase follower, drift fold
  quantize.py   per-bar grid choice, de-lag, bleed rules, section consolidation
  score.py      notation model (two voices, rests, tuplets)  ->  score.json
  exports.py    MIDI, MusicXML          clonehero.py   Clone Hero package
backend/server.py   FastAPI: jobs, queue, persistence, usage counter, janitor
frontend/           vanilla JS + VexFlow: engraving, playback, loop, teach mode, editing
tools/              accuracy tooling (below)

Accuracy

Everything in the engine is measured against published charts, bar by bar, and changes ship only when they win.

.venv/bin/python tools/songsterr_tab.py "Michael Jackson Billie Jean" bj.json   # a published drum track as bars
.venv/bin/python tools/compare_tab.py data/jobs/<id>/score.json bj.json         # per-bar agreement + deviation clusters
.venv/bin/python tools/run_references.py                                        # the reference suite (tools/references.json)
.venv/bin/python tools/requant.py data/jobs/<id>                                # re-run grid + quantiser from a saved detection (seconds)
.venv/bin/python tools/learn_songs.py songs.json data/learn                     # widen the set: fetch tabs, transcribe, compare
.venv/bin/python tools/train_onsets.py data/learn                               # per-onset classifier, leave-one-song-out vs the rules

If you find a bar that's wrong, that's the most useful thing you can send: the song, the bar number, and what should be there. Every rule in quantize.py came from exactly that.

Deploying

DEPLOY.md is the full runbook for a public instance behind a Cloudflare Tunnel: environments, models, data, verification, cutover and autostart. Dockerfile / docker-compose.yml build a CPU-only container.

License

MIT — use it, change it, ship it; keep the notice. The separation models are third-party (see Credits) and carry their own terms.

Credits

  • Separation: Demucs (MIT) and the MDX23C DrumSep model by aufr33 & jarredou via audio-separator.
  • Engraving: VexFlow.
  • Made by DrumMate. If the chart got you through the song, go play it with a band that follows you — on any kit.

About

Drop in a song, get drum notation to practise with - plus isolated drums and a drumless backing track. By DrumMate.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages