How to Check Your Converted MIDI Is Correct

Three readouts to check, in order, and what each one looks like when it is lying to you.

Short answer: check the note count against what you played, then the pitch range against the range you played, then the times in the copied note list. Two failures account for most bad results, and each has a signature: a range sitting far below your material means the input had more than one note sounding at once, and a range sitting exactly twelve semitones above it means the detector locked onto a harmonic instead of the fundamental. Every detected time is also snapped to a 16 ms grid, and velocity is squeezed into a narrow band, so do not read timing or dynamics as precise.

I ran this converter's own detector and writer over material whose notes I already knew, so the failures below are measured rather than guessed. Inputs were synthetic tones at a known pitch and known amplitude, run at the default Confidence setting unless stated.

Start with the three numbers on the result panel

After a conversion the page shows four values. Three of them are diagnostic:

ReadoutLooks right whenLooks wrong when
Notes foundIt roughly matches the notes you played. An 8-note scale came back as 8.It is much lower than what you played - a six-note chord progression came back as 1.
Pitch rangeIt brackets the notes you actually played.It sits below or above your material by an octave or more. This is the single most useful number on the panel.
DurationIt matches your file length.It is not a quality signal at all - it only tells you the decode worked.

The fourth value, analysis time, tells you how long your machine took. It depends on your hardware and includes decoding, so it says nothing about whether the result is any good. I did not measure it for this page.

Check 1 - does the pitch range match what you played?

This one readout catches the two failures that ruin a conversion, and it catches them because both push the range away from your material in a recognisable direction.

Range far below what you played: there was more than one note at once

I fed the detector a progression of two triads - C major then G major, six distinct notes, the lowest being G3 at 196 Hz. Here is what came back:

What went inNotes foundPitch range shownWhat came out
6 notes (two triads), lowest G31C2 - C2C2, 0.000-1.968 s

Six notes in, one note out, and that one note is C2 - nineteen semitones below the lowest note actually played. The range readout said C2 - C2 when the material spanned G3 to D4. That gap is the alarm: the detector tracks one pitch per frame, so when three notes sound together it reports a period that belongs to none of them, and the result tends to land well below the music.

What to do: do not re-export or change settings. Extract the line you want - a single instrument, a hummed melody, a stem - and convert that. This is a property of a monophonic detector, not a setting you can tune past.

Range exactly twelve semitones above what you played: the fundamental was too weak

This is the octave error, and it does not only happen above the frequency ceiling - it happens on ordinary notes whose fundamental is quiet compared with their own harmonics. I tested it directly: a 440 Hz tone held at a fixed level, with a 220 Hz fundamental added underneath at decreasing levels.

220 Hz levelAs a fraction of the 440 Hz harmonicDetected as
0.3001.00A3correct
0.1500.50A3correct
0.1000.33A3correct
0.0800.27A4an octave high
0.0500.17A4an octave high
0.0050.02A4an octave high
0 (no fundamental)0A4correct - there was no fundamental to find

The flip happens between a ratio of 0.27 and 0.33. Below roughly a third, the detector finds the harmonic's period first and reports the note an octave up. That matches the mechanism: the search takes the first lag whose difference drops below the threshold, and a loud second harmonic creates a shallow dip at half the true period. If that dip qualifies, the search stops there.

What to do: raise Confidence and re-run. Confidence is the threshold the search uses, and the slider goes up to 0.95. I tested every setting on the failing cases:

CaseConfidence 0.950.900.85 (default)0.80 and below
Fundamental at 1/6 of the harmonicA3A4A4A4
Fundamental at 0.27 of the harmonicA3A3A4A4
Fundamental at 1/15 of the harmonicA4A4A4A4

So the slider is a real lever, but a limited one. At the maximum setting it recovered the octave in the milder cases and could not recover it when the fundamental was about a fifteenth of the harmonic. It also cuts the other way: a stricter threshold means fewer frames qualify, so on dense material you can raise Confidence and end up with fewer notes, or none.

If raising Confidence does not fix it, the problem is in the recording, not the tool. A weak fundamental is usually a mic placement or an EQ problem - close-miking, a high-pass filter, or a small speaker that cannot reproduce the low end. Fixing the source is the reliable route.

Check 2 - do the note times sit on a 16 ms grid?

This is a check you can run on the note list without any reference recording, because it is a structural property of the method. The analysis advances in hops of 256 samples at 16 kHz, which is exactly 16 ms, so every time the detector can report is a multiple of 0.016 s.

I converted a scale whose notes were each exactly 0.500 s long, starting on the half second. The detected start times, converted back to hop numbers:

hop:    0    31    62    93   125   156   187   218
time: 0.000 0.496 0.992 1.488 2.000 2.496 2.992 3.488  (seconds)

Every one is a whole number of hops. If you copy the note list and divide the start times by 0.016, you should get whole numbers too. If you do not, something is off in a way worth investigating.

Two consequences follow, and both showed up in the same test:

What to do: treat the timing as quantised, not wrong. If you need legato or a tight groove, fix it deliberately in the DAW - most editors have a legato or quantise function that will do it in one action - rather than expecting the file to arrive that way.

Check 3 - is the velocity telling you anything?

Short version: not much. Velocity is written as 40 plus up to 60 more derived from loudness, so it can never exceed 100, and it saturates quickly. I measured both ends of that.

First, a scale with loud and soft notes alternating, a 6.25× difference in amplitude:

NoteAmplitudeVelocity written
C4, E4, G4, B40.5 (loud)100
D4, F4, A4, C50.08 (soft)87, 84, 87, 81

A 6.25× difference in loudness came out as roughly a 1.2× difference in velocity. Play a passage with real dynamics and the file will look almost flat.

Second, a scale with the amplitude stepped up across the whole usable range:

Amplitude0.010.020.050.080.100.200.500.90
Velocity4550658192100100100

Amplitude moved by 90× across that table. Velocity moved from 45 to 100 and then stopped: everything from 0.20 upward - a further 4.5× increase in level - produced exactly the same number. The top of the dynamic range is flat.

What to do: accept the relative shape, or redo the dynamics yourself. If you care about dynamics, the useful thing in the file is the ordering - which notes are louder than which - not the absolute numbers. The note list gives you the velocity column so you can see what it decided before you start editing.

The fastest check: copy the note list

The page has a Copy note list button. It produces plain text, and reading three things in it will tell you more than the panel does. Here is the real output for the 8-note scale:

#  Start(s)  End(s)  Dur(s)  Vel  Note
1  0.000  0.480  0.480  100  C4
2  0.496  0.976  0.480  100  D4
3  0.992  1.488  0.496  100  E4
...

Read it for:

  1. The note column against what you played. Wrong note names in a consistent direction (everything exactly an octave high) is the harmonic problem. Wrong note names scattered randomly usually means the source was too noisy or too dense.
  2. The start column, divided by 0.016. Whole numbers mean the detector behaved normally. It also tells you the resolution you are working with.
  3. The duration column. Notes all sitting at a similar short length, or wildly varying on material you played evenly, is a sign the detector was losing and re-finding the pitch.

What to fix, and in what order

  1. Source first. If the range is an octave off, or notes are missing at the bottom, the recording is the problem. Try Confidence at 0.95, then try a better recording or a different octave. Do not start editing notes that should not exist.
  2. Then polyphony. If the range sits below your material and the note count is far too low, the input had chords or a full mix in it. Get a single line and convert again. No amount of cleanup fixes a file that was built from the wrong information.
  3. Then timing. Quantise or apply legato in your DAW. Expect notes about 20 ms short and everything on a 16 ms grid.
  4. Then dynamics. Redraw velocity by hand if it matters. The file's velocities are relative, not absolute.

What the detector can and cannot hear in the first place is covered in how the pitch detection works and where the 2000 Hz ceiling falls, and what the downloaded file does and does not carry is in what is inside the .mid file.

What I could not test