Drums to MIDI: Why It Comes Out Wrong, and What to Do Instead
Last updated 28 September 2026
Drums do not convert. In our own test, 140 drum hits went in and 122 pitched notes came out — every single one of them between F#1 and B2, the bass register. No kick, no snare, no hi-hat, no note-10 channel: the engine is a pitch tracker and a drum is not a pitch. And on a real-world case it is worse than useless — a melody with drums on top produced 332 notes where the melody alone contained 80, which means 65% of the file you would download is drum noise you have to delete.
This page is not a description of the problem. We synthesised three files whose contents we knew exactly, ran all three through the converter on this site, and counted what came back note by note.
What we put in, and what came out
Three 20-second files, 120 BPM, 44.1 kHz mono. One was drums only — a kick on every beat, a snare on beats 2 and 4, and hi-hats on every beat and every off-beat: 140 hits in total. One was the melody line alone, 80 notes between G4 and G5, nothing else. One was the two together.
| What went in | Notes in the source | Notes written | Pitch range | Time |
|---|---|---|---|---|
| Drums only | 140 drum hits | 122 | F#1 – B2 | 1 min 11 s |
| Melody only | 80 notes | 128 | G4 – F#7 | 1 min 8 s |
| Melody + drums | 80 notes + 140 hits | 332 | F#1 – F#7 | 1 min 8 s |
One file per row, one conversion per row, desktop Chrome, headless, software WebGL renderer, no other work in the tab. Wall-clock time is decode plus analysis plus file writing. The test signal is synthetic and deterministic — generated by us, so the ground truth is known by construction rather than estimated. These are measurements from one machine and one signal, not a general accuracy claim.
Read the first row slowly. One hundred and forty drum hits produced one hundred and twenty-two notes. The engine is not failing to notice the drums. It is noticing them constantly, and writing every one of them down as a pitched note.
Where the drum notes land
All 122 notes from the drum-only file sit inside a single band, F#1 to B2 — MIDI notes 30 to 47. Ten distinct pitches, for 140 hits:
| Note | F#1 | G#1 | D#2 | E2 | F#2 | G2 | G#2 | A2 | A#2 | B2 |
|---|---|---|---|---|---|---|---|---|---|---|
| Count | 24 | 1 | 4 | 20 | 1 | 38 | 5 | 6 | 18 | 5 |
The reason is arithmetic, and it is the whole story. Our test kick sweeps from 120 Hz down to 45 Hz — that is the sound of a kick drum. F#1 is 46.2 Hz. B2 is 123.5 Hz. The engine did not hear a drum and reach for the nearest drum sound; it heard a low tone and wrote down the low tone. The band it reported is the kick's own pitch range, read back to us.
Nothing above B2 survived. The snare's noise burst and the hi-hat's broadband click produced no high notes at all — they contributed onsets and jitter inside that same low band, not separate events you could find and delete.
Do not read 122 as a stable constant. It is the count for this one signal. The point that transfers is the shape: drums come back as a cluster of low pitched notes, not as drum events, and the cluster's extent follows the fundamental of the loudest low drum in the recording.
Why the engine cannot do this
The transcription model behind this page is a pitch-and-onset model. It reports two things: where something started, and what frequency was sounding. A MIDI writer then turns each reported pitch into a note-on and a note-off pair.
Follow that pipeline and the drum failure is not a bug anywhere in it. A kick has a frequency, so the model reports it. A note-on and a note-off get written. There is no stage at which anything is asked "was this a drum?" — so there is no stage that could answer yes.
That also explains the two things people expect to see and do not. There is no drum channel, because every note is written on the same channel as everything else. And there is no separate drum track, because the output is a single track — one MTrk chunk holding every note that was found.
The mix is where it actually costs you
A drum-only file is a laboratory case. The case that matters is a song, and there the arithmetic is brutal. Our melody-only run found 81 notes inside the melody's real pitch range. Our melody-plus-drums run found 81 notes in that same range — and 251 more outside it. Splitting the mix's output by register:
| Group | Notes | Velocity, median | Velocity range | Length, median |
|---|---|---|---|---|
| Below G4 — drum artefacts | 215 | 35 | 24 – 55 | 0.139 s |
| G4–G5 — the actual melody | 81 | 92 | 86 – 109 | 0.255 s |
| Above G5 — model over-report | 36 | 39 | 34 – 43 | 0.104 s |
Two thirds of the notes — 215 of 332 — are in a register where the source material had nothing at all. The melody-only run is what proves that: with the drums removed, the same melody produced zero notes below G4. Nothing in the music was down there. The drums put it there.
Look at the velocity columns. The drum-derived notes run from velocity 24 to 55. The real melodic notes run from 86 to 109. The two sets do not touch, and there is a 31-value empty gap between them. That is not a coincidence, and it is the most useful thing on this page.
The third row is a different failure and worth naming so you do not confuse it with the drums: 36 notes landed an exact 28 semitones above the melody, which is a frequency ratio of 5.04 — the fifth harmonic of the test tone we generated. It is the model tracking an overtone, it is a separate problem from percussion, and it is why the melody-only run reported 128 notes for 80 played.
What to do instead
The fix is not a setting. It is a decision about what you feed in.
- Convert a version without drums. An instrumental, a karaoke track, a stem, an isolated take. This is the only clean answer, and it is clean because it removes the problem upstream of the engine rather than trying to patch it downstream.
- If you cannot get one, convert a section where the kit drops out. An intro, a breakdown, a solo passage, the last bar. A twenty-second stretch of melody with no drums will transcribe better than three minutes with them.
- Delete the low notes afterwards — but only if you know what you are deleting. Our melody sat two octaves above the drum artefacts, so cutting everything below the melody's lowest real note was safe. That will not be true of a song with a real bass part. Check your source before you start deleting.
- Better: filter by velocity, not by pitch. In our mix, everything below velocity 56 was a drum artefact and everything above velocity 85 was real. Select every note under velocity 70 and delete it in one action. That removes the drum cluster without touching the melody, and it does not require the melody to sit in a particular register. Verify the gap exists in your own file first — ours was 31 values wide, which is a lot of room, but it is a measurement, not a law.
- Do not try to quantise the drums into a beat. They are not late hits sitting on a grid. Only 9 of the 122 drum-derived notes landed within 20 ms of an eighth-note boundary — the rest are smeared across the bar, and no two drum hits mapped to the same pitch reliably. Snapping them gives you a tidy mess, not a drum part.
- Set the tempo yourself. The file you get is written at a fixed 120 BPM regardless of your song, so the bar lines will not line up either. See why your converted MIDI opens at the wrong tempo.
What does not work
High-pass filtering. It helps the kick and almost nothing else. The kick's energy is the thing you are filtering, so the low notes do thin out. But a snare is a noise burst with a 190 Hz body and a hi-hat is broadband click — their energy is spread across the spectrum, and the engine still sees a clear onset at each one. You cannot EQ your way out of a snare.
Looking for a drum lane to mute. There is nothing to mute. The output is one track of pitched notes, all on one channel. There is no drum part in the file to select, which is exactly why the failure is hard to see at a glance: nothing about the file announces that it contains percussion.
Turning the drums down in the mix. Quieter drums produce quieter artefacts, not fewer. The notes still get written; they just arrive with lower velocity. You may actually find this useful — it is the same mechanism that makes the velocity filter in step 4 work — but it is not a solution on its own.
What the file it writes actually is
Worth knowing when you are deciding what to delete, because the format tells you where the seams are:
| Format | Standard MIDI File, format 0 — one track, every note in it |
| Resolution | 480 ticks per quarter note |
| Tempo | 500,000 µs per quarter note — 120 BPM, written as a constant, never detected |
| Time signature | 4/4, also a constant |
| Track name | mp3 to midi |
| Channels | One. There is no percussion channel and no note-10 mapping |
| Pitch bend range | ±2 semitones, set explicitly with an RPN 0 message, centre 8192 |
| Velocity | clamp(amplitude × 127, 1, 127) — carried over from the model's own confidence value, not measured from the audio |
| Note-off velocity | Fixed at 0x40 (64) on every note |
| Shortest note | 0.02 s — anything shorter is clamped up to it |
| Timing | ticks = seconds × 960, so positions are absolute times rather than bar numbers |
Two rows in that table are the reason the velocity trick works and the pitch trick is fragile. Velocity comes straight from the model's amplitude reading, so it carries a real signal about how loud and how confident each detection was — drums read low, melody reads high. Timing, meanwhile, is written as absolute seconds, never quantised to a grid, which is why the smeared drum notes stay smeared no matter how you set the grid afterwards.
Everything above happens in your browser tab: the engine is a 2.28 MB bundle fetched after the first paint, the audio is down-mixed to mono and resampled to 22,050 Hz before the model sees it, and nothing is uploaded. That last part matters here — if you want to try three different versions of a track to find one without drums, nobody is counting.
Frequently asked questions
Can you convert drums to MIDI?
Not into drum MIDI. Our test put 140 drum hits in and got 122 pitched notes out, all of them between F#1 and B2, with no drum events, no note-10 channel and no kick, snare or hi-hat labels. A drum recording will convert into something — it will not convert into a drum part.
Why does my kick drum turn into a bass note?
Because a kick has a fundamental frequency and the engine reports fundamental frequencies. Our kick swept 120 Hz down to 45 Hz; the notes came back across F#1 to B2, which is 46.2 Hz to 123.5 Hz. It is a faithful reading of the sound, just not a useful description of it.
How much of a full mix ends up being drum noise?
In our test, 65%. A melody with drums on top produced 332 notes where the melody alone contained 80, and the 215 notes below the melody's register were not in the source material at all.
How do I remove the drum notes from the file?
Sort by velocity rather than by pitch. In our mix the drum-derived notes ran from velocity 24 to 55 and the real melodic notes from 86 to 109, with an empty gap in between. Select everything below velocity 70 and delete it. Check your own file for that gap before trusting it.
Will a high-pass filter fix it?
Only for the kick. Filtering removes the kick's fundamental, which is what the engine was tracking. A snare and a hi-hat are broadband, so their energy survives any filter you would realistically apply, and the engine still writes notes at those onsets.
What actually works?
Feeding it audio with no drums in it — an instrumental, a stem, or a section where the kit drops out. Our engine takes one file and writes one track of pitched notes. There is no separation stage and no drum channel, so drums have to be removed before the conversion, not after.