The short answer: you drop the WAV into the box and it runs in your browser, and what comes back is decided by four properties of that file — sample rate, channels, level and noise floor — each with a section of its own below. Whether this converter is where the file should go at all is a separate question, and that one is decided by three things instead of four.
Whether this WAV belongs here at all
The usual answer to "WAV to MIDI" is a list of tools. A list is not a decision. Three facts about the file in front of you decide it, and each of the three has a number measured on this converter rather than a claim about it. Two of the three rows send you elsewhere — which is the only reason the first row is worth believing.
| What is in the file | Where it should go | Measured here |
|---|---|---|
| Six notes or fewer sounding at once, nothing below the 55 Hz floor, no bend or vibrato worth keeping, and you want a MIDI file to carry into whatever you already use | Convert here | C–G–Am–F: 12 notes for 12 expected |
| Octave doublings that have to survive as two notes, vibrato or a bend that has to survive as bend, a bass note below 55 Hz at its real pitch, cymbals, or more than six notes at once | Go and get a plugin | C4 + C5: 1 pitch in 4 fragments |
| Parts that have to land on separate tracks, a tempo that moves, or note-by-note editing across a whole arrangement | Only a DAW will do | 4 notes, 1 track, 1 MIDI channel |
Convert here: up to six voices, and the six is exact
The clean case is a part you could write on a staff — a melody, a bass line, a triad progression, a two-part texture. A C–G–Am–F progression at one bar per chord came back as 12 notes for the 12 expected: three per chord, no extras, no split notes, and every note starting within 12 ms of its bar line. A six-voice chord returned six notes and not one fragment.
The seventh voice is where it turns. Seven simultaneous pitches came back as eight note objects with one of them broken; eight pitches came back as ten objects with three broken. The cause is a hard cap of six spectral peaks per frame, and an eight-note chord hits that cap on every single frame — 79 frames out of 79. Because which six peaks win shifts from frame to frame, no pitch is lost outright; instead the surviving notes flicker and arrive in pieces. So the limit is not "monophonic versus polyphonic". It is six, it is exact, and the failure just above six is fragmentation rather than silence — which is why choosing the mode matters less than counting the voices you actually have.
Go and get a plugin: four things the file cannot hold
None of these is a quality complaint. They are properties of the MIDI file this converter writes, and no amount of preparation removes them.
An octave doubling is discarded as a harmonic. C4 and C5 played together came back as a single C4 — and not even as one clean note, but four fragments. G3 with G4 returned one note. E2 with E4 returned only E2. The upper note is read as the second or fourth harmonic of the lower one and thrown away, which is the right call for a single instrument and the wrong one for a chord. The octave-down results in plugin demos are a plugin solving exactly this.
Bend and vibrato have nowhere to go. A tone at 440 Hz with 40 cents of vibrato either side, at 5.5 Hz, returned one pitch — A4 — in eight fragments, and zero pitch-bend events in the file. A portamento from 440 Hz to 494 Hz came back as a three-step staircase: A4, A#4, B4. The writer emits note-on and note-off and nothing else on the channel side.
Below the 55 Hz floor the fundamental is never found. A tone at 41.20 Hz with a normal harmonic series came back as E2, B2 and G#3 — the second, third and fifth harmonics promoted into notes, so the lowest note written is an octave above the one played. The same tone as a bare sine returned nothing at all. A bass line played low will be written an octave up, or not at all.
That floor is also a statement about one mode, not two. At 55.00 Hz exactly, single-line mode reads A1 correctly — ten notes over one second — while polyphonic mode returns nothing at all. The refined peak lands at 54.72 Hz, which is 0.28 Hz under the floor, and the range test discards it before any note is built. Single-line mode has no such test, so the same tone survives there.
Percussion above 4 kHz is outside the search. A signal built only from partials between 4.5 kHz and 8.5 kHz returned zero notes. A cymbal's energy up there is not attenuated, it is simply never looked at — which is the same limit that decides what drum transcription catches and what it misses.
What the plugin route actually gives you, tool by tool
This is the support for the row above, not a shopping list. Four tools turn up in almost every walkthrough of this job, and they disagree on exactly the three points that matter here.
| Tool | Chords | Octave | Pitch bend |
|---|---|---|---|
| Edison (FL Studio) | Collapses on dense material — a monophonic tracker under a polyphonic label | Lands one octave low; shift the whole part up 12 semitones before you judge it | Not preserved |
| Neural Note | Built for polyphony; handles chords without being told | — | Writes the bend as extra notes, and can shorten the notes beside it |
| Cubase VariAudio | One line at a time; chords are on you | — | Three modes; the continuous one refuses to run until the bend range is at least 11 semitones |
| ReaTune | — | Low notes are shaky — pitch up one or two octaves before converting, then transpose back down | Not preserved |
Read the three columns again: chords, octave, bend. They are the same three things this converter cannot do either — that is why this row exists at all. So the question is not which brand is better. It is which of the three your file actually needs, because that is the only column that decides which one you open.
Only a DAW will do: separation and tempo
A bass on E2, a C major triad and an A4 melody, all sounding at the same moment, came back as four notes: E2, C4, G4, A4. The E4 of the triad is gone, because it is the fourth harmonic of E2 and was discarded as one. Everything that survived landed on one MIDI track, on channel 0, under one tempo event for the whole file. Whatever you feed it, one conversion produces one part at one tempo.
So if the goal is three instruments on three tracks, or a performance that speeds up in the last bar, the conversion is not the bottleneck — the file this engine writes is. That work belongs in a DAW, and it is quicker to start there than to convert first and untangle afterwards.
If you are in the first row, the rest of this page is written for you: it is about the four properties of a WAV that change what comes back. If you are in the second or third row, preparation will not close the gap, and the sections below will not pretend that it will.
What happens to the file before a single note is looked for
Everything below is from this converter's own analysis code, not a general description of audio software. When you convert a WAV file to MIDI, four things happen to it in this order:
- Your browser decodes the file. Whatever the container held — 16-bit, 24-bit, 32-bit float — comes out as floating-point samples.
- All channels are summed and divided by the channel count. A stereo file becomes one mono signal that is the arithmetic mean of left and right.
- If the sample rate is above 22 050 Hz, the signal is resampled to exactly 22 050 Hz by linear interpolation. If it is at or below 22 050 Hz, nothing is touched.
- The signal is read in 2048-sample windows, Hann-weighted, stepped forward 256 samples at a time.
Step 3 is the one that surprises people, because it is conditional. It resamples down but never up.
Sample rate: the setting that decides the analysis grid
Two numbers fall straight out of the window size and the sample rate: the width of one frequency bin, and how long one frame lasts. Change the sample rate and both change.
| Your WAV | Analysed at | Bin width | Frame length | Frames/sec | Nyquist |
|---|---|---|---|---|---|
| 8 000 Hz | 8 000 Hz | 3.9063 Hz | 32.000 ms | 31.25 | 4 000 Hz |
| 11 025 Hz | 11 025 Hz | 5.3833 Hz | 23.220 ms | 43.07 | 5 512.5 Hz |
| 16 000 Hz | 16 000 Hz | 7.8125 Hz | 16.000 ms | 62.50 | 8 000 Hz |
| 22 050 Hz | 22 050 Hz | 10.7666 Hz | 11.610 ms | 86.13 | 11 025 Hz |
| 32 000 Hz | 22 050 Hz | 10.7666 Hz | 11.610 ms | 86.13 | 11 025 Hz |
| 44 100 Hz | 22 050 Hz | 10.7666 Hz | 11.610 ms | 86.13 | 11 025 Hz |
| 48 000 Hz | 22 050 Hz | 10.7666 Hz | 11.610 ms | 86.13 | 11 025 Hz |
| 96 000 Hz | 22 050 Hz | 10.7666 Hz | 11.610 ms | 86.13 | 11 025 Hz |
The practical consequence: there is no accuracy gain from exporting a 96 kHz WAV instead of a 44.1 kHz one. Both are resampled to the same rate and read with the same 10.7666 Hz bins. There is also no gain from converting at 22 050 Hz yourself, because that is what happens anyway.
There is a difference if you go below 22 050 Hz, because then no resampling happens and you get a genuinely different grid. A 16 kHz file gives finer frequency resolution — 7.8125 Hz bins instead of 10.7666 Hz — but coarser time resolution, 16.000 ms per frame instead of 11.610 ms, and a Nyquist limit of 8 kHz. Whether that trade helps depends on the material, and we have not measured it across a corpus, so treat it as something to test on your own file rather than a recommendation.
How the downsampling is done, and where it is crude
The resampler is a linear interpolation between two neighbouring input samples. There is no anti-aliasing filter in front of it. Two details are worth knowing:
- 44 100 Hz is a special case. The ratio 44 100 ÷ 22 050 is exactly 2.0, so every output sample lands exactly on an input sample and the interpolation weight is zero. Your 44.1 kHz file is decimated — every other sample is kept — rather than blended.
- Other rates are blended. 48 000 ÷ 22 050 is 2.1769 and 96 000 ÷ 22 050 is 4.3537, so those files are genuinely interpolated, which slightly smooths the top of the spectrum.
Missing anti-alias filtering means content above the new Nyquist limit of 11 025 Hz can fold back into the analysed band. In practice this rarely changes a result, because detection is band-limited: single-line mode searches 55 Hz to 1 800 Hz, and polyphonic peak detection stops at 4 000 Hz. Content would have to be loud, above 11 kHz, and fold down into those bands to matter — hi-hats and cymbals sit up there, which is one more reason to convert a clean instrumental take rather than a full mix.
Channels: the file is averaged to mono, and that has a price
The analysis sums every channel and divides by the number of channels. There is no weighting and no mid/side handling. If a part is panned hard to one side and the other channel is silent, the average is half the original amplitude: −6.02 dB.
That number matters because of how velocity is computed. This converter maps the RMS level of a note's frames to velocity as vel = round(20 + (dB + 60) × (100 / 54)), clamped to 1–127. One decibel is worth 1.852 velocity steps, so 6.02 dB is worth 11.1 velocity steps. A hard-panned part loses roughly eleven points of velocity purely through the channel average.
What to do about it: if the source is a single instrument, export mono. If it is a stereo mix and the part you want is off to one side, the average is unavoidable here — there is no stem separation — so expect that part to come back quieter in velocity than it sounds.
Level: velocity is absolute, so normalise before you convert
This is the most common cause of "the velocities all look the same". The mapping above reads the note's RMS in dBFS — decibels relative to full scale — not its level relative to the rest of the file. Loudness in the room does not enter into it; the numbers in the file do.
| Note RMS | Velocity | Note RMS | Velocity |
|---|---|---|---|
| 0 dBFS | 127 | −18 dBFS | 98 |
| −3.01 dBFS | 126 | −24 dBFS | 87 |
| −6 dBFS | 120 | −30 dBFS | 76 |
| −10 dBFS | 113 | −40 dBFS | 57 |
| −12 dBFS | 109 | −60 dBFS | 20 |
Two readings from that table are worth internalising. Velocity tops out at 127 for anything at or above −2.22 dBFS RMS, and bottoms out at 1 for anything at or below about −70.26 dBFS RMS. A sine wave's RMS sits 3.01 dB under its peak, so a sine peaking at full scale reads −3.01 dBFS and returns velocity 126 — reaching a full 127 essentially requires clipping.
So: normalise the file before you convert. A WAV that peaks around −1 dBFS will spread its notes across most of the velocity range; one that peaks at −18 dBFS will compress everything into the 90s and below, and no amount of moving the sensitivity slider will fix that, because sensitivity does not touch velocity.
One caveat on RMS: it is measured across the whole signal in the window, not just the pitch being tracked. A rumbling low end, a fan, or a loud accompaniment in the same file raises the RMS of every frame it overlaps, and therefore inflates the velocity of notes that are themselves quiet. Cleaning the file helps velocity as much as it helps detection.
Bit depth: it genuinely does not matter here
Given the floor above, this is short. Velocity reaches its minimum at about −70.26 dBFS RMS, and 16-bit audio carries roughly 96 dB of range below full scale — about 26 dB more than the mapping can use. Exporting 24-bit instead of 16-bit cannot change a single velocity value on this chain, and it cannot change a note either, since the FFT works on data that has already been decoded to floating point. Save the disk space.
Noise floor: the gate is set from your file, not from a constant
Before any note exists, the converter sorts every frame's RMS level, takes the value at the 10th percentile as a floor, and sets a threshold partway between that floor and the loudest frame in the file:
gate = floor + (loudest − floor) × (0.32 − 0.30 × sensitivity)
At the default sensitivity of 60 that is 0.86 × floor + 0.14 × loudest: the threshold sits 14% of the way up from the quiet tenth of the file to its loudest frame. Two consequences follow, and both are about preparation:
- A single loud transient raises the bar for everything else. The loudest frame sets the top of the range. A door slam, a click, or a drum hit at the start of the take pushes the threshold up, and quiet notes that would otherwise have passed fall below it. Trim or fade those out.
- Constant background noise lifts the floor. Hiss, hum, air conditioning and DC offset add energy to every frame, so both the floor and the threshold rise with them. High-pass filtering and DC removal before conversion is not cosmetic here — it moves the threshold down.
Note the side effect of aggressive silence trimming: the bottom tenth of the file becomes quiet-but-real material instead of digital silence, which raises the floor and therefore the threshold slightly. Trim obvious noise, but re-check your result after doing it.
Timing: your settings are rounded to whole frames
At 22 050 Hz one frame is 11.610 ms, and both timing controls are converted to an integer number of frames before they are applied:
- Shortest note, default 60 ms → 60 ÷ 11.610 = 5.17, rounded to 5 frames = 58.05 ms. A detected note shorter than that is discarded, not shortened.
- Note separation, 0.08 s → 0.08 ÷ 0.011610 = 6.89, rounded to 7 frames = 81.27 ms. A gap of up to that length inside one pitch is bridged rather than split.
So a passage played with gaps shorter than about 81 ms between repeated pitches will come back as one long note, and anything shorter than about 58 ms will not come back at all. If your material is very staccato, lower the shortest-note value before you conclude the conversion is wrong — and if it is very legato with tiny breathing gaps, expect notes to run together.
The two edges of the file
Loudness is measured on the raw samples, but the spectrum is measured through a Hann window whose weight is 0 at its outermost sample and 0.147 by 256 samples in. The first frame covers file samples 0–2047, so a note that begins at exactly 0.000 s is analysed at almost no weight. If your take starts on the downbeat with no lead-in, adding a short silent lead-in gives the detector a full window for that first note.
The other edge is length. If the whole file is shorter than 2048 samples — 92.88 ms at 22 050 Hz — it is zero-padded up to one window. Very short test files still convert, but they produce one frame's worth of evidence.
Preparation checklist
- Export lossless. WAV, FLAC or AIFF. If the source is already lossy, do not re-encode it on the way out.
- Sample rate 22 050 Hz or higher. Anything above that is resampled to it anyway. Do not bother with 96 kHz for conversion, and do not drop below 22 050 Hz without testing.
- Mono for a single part. Stereo is averaged, at a cost of 6.02 dB — about 11 velocity steps — to anything present in only one channel.
- Normalise so peaks land near −1 dBFS. Velocity is absolute; this is the step that decides whether your velocities use their range.
- High-pass and remove DC. Both lower the frame floor, and the gate is placed relative to that floor.
- Cut clicks and bangs. One loud transient raises the gate for the whole file.
- Leave a short lead-in if the first note starts at 0.000 s.
- Check shortest-note and separation against your playing style, remembering they land on 58.05 ms and 81.27 ms at the defaults.
If your only source is an MP3
WAV keeps everything the pitch detector needs, including the low fundamentals that MP3 throws away during encoding. If your source is already an MP3, the preparation steps above still apply, but they only go so far: part of the signal was discarded before you ever opened the converter. Our measured breakdown of whether MP3 to MIDI really loses notes vs WAV covers where the difficulty actually comes from — the bass, not the treble — and how to test your own file.
How to check any of this on your own file
None of the above needs to be taken on trust, and you should not trust published accuracy numbers you cannot reproduce. Convert the file, download the .csv alongside the MIDI, and read it. The columns are index,midi_note,note_name,start_sec,end_sec,duration_sec,velocity.
- Convert the same file twice, once un-normalised and once normalised to −1 dBFS peak. The
note_namecolumns should match; onlyvelocityshould move. If the notes change too, you have found a level-dependent threshold, not a level-dependent velocity. - Sort by
duration_sec. If nothing is shorter than about 0.058 s, that is the shortest-note setting doing its job, not the material. - Sort by
velocityand look at the spread. A narrow band in the 90s on a dynamically played take is an un-normalised file, not a flat performance.
Questions
Should I convert my 96 kHz master down to 44.1 kHz first?
It makes no difference to the result. Both are resampled to 22 050 Hz on arrival, and from that point the analysis is identical: 10.7666 Hz bins, 11.610 ms frames.
Is 24-bit better than 16-bit for this?
No. Velocity bottoms out around −70.26 dBFS RMS, and 16-bit audio already carries about 96 dB of range. The decoded samples are floating point before any analysis happens either way.
Why are all my velocities around 90?
Because velocity is computed from absolute RMS in dBFS. Around −21 dBFS RMS maps to velocity 98. Normalise the file so peaks sit near −1 dBFS and the spread returns.
Does normalising change which notes are detected?
It should not, and that is worth verifying rather than assuming: the note gate is placed relative to levels inside the file, so scaling the whole file scales the floor and the loudest frame together. Export both versions and diff the note_name columns to confirm it on your material.
My stereo mix converts worse than the mono bounce. Why?
The channels are averaged before analysis. Anything panned to one side loses 6.02 dB, and any stereo widening or polarity difference between channels changes what the average looks like. A mono bounce removes that step entirely.
Why does my converted MIDI file sound like a random piano banging?
Two things tend to cause that sound. First, every note comes out at roughly the same velocity when the source has no level variation, so the playback has no dynamics — a real piano is never like that. Second, the converter only finds notes whose running RMS clears the loudness gate, so quiet inharmonic content between notes can either survive as junk or disappear and leave gaps; either way it sounds chaotic on playback. Both are visible in the exported CSV: a flat velocity column means the first; gaps in the index column at points where you can clearly hear sound in the original mean the second.
Does trimming silence help?
Partly. It removes frames that contribute nothing, but it also changes which frames make up the quietest tenth of the file, and the gate is anchored to that. Trim obvious noise and clicks, then re-check the piano roll rather than assuming the edit helped.
Convert a WAV file now — WAV into MIDI in your browser, nothing uploaded.
Related guides
- MP3 to MIDIWhy MP3 loses notes that WAV keeps
- OGG to MIDIWhat the container actually changes (and what it doesn't)
- Voice to MIDIWhat a single-line converter can follow
- MIDI converterWhat is actually inside a MIDI file
- Audio to MIDI converterHow accurate a conversion really is
- Audio to MIDI softwareHow many notes it can hold at once
- MP4 to MIDIWhy the AAC audio, not the video, decides your notes
- Convert audio to MIDIWhat happens to a stereo file first
- YouTube to MIDIWhat a full-length soundtrack comes back as