The short answer: you cannot edit individual notes on this page — what you can change here is the conversion itself. Five controls (mode, sensitivity, shortest note, BPM and snap-to-grid) re-run a cheap segmentation pass over the same analysis, while a real MIDI editor edits the event list inside the downloaded .mid. The split is measurable. On this site's own engine, a 10.22-second clip takes 218.33 ms to analyse once but only 0.377 ms to re-segment — 579 times cheaper — which is why moving a slider feels instant. But across 1,152 control combinations, one chosen note kept the pitch 60, the start 0.0000 s, and a velocity of only 112 or 113. No control can retune it, shift it to an arbitrary time, or set its velocity. Snapping to a 1/16 grid at 120 BPM moved onsets by up to 47.21 ms, and the resulting four-note file is 91 bytes with zero program-change, zero pitch-bend and zero text events. So: fix note selection and grid placement here, then open an editor for anything that concerns one note or one added event. Both the analysis and the preview run entirely in your browser — no upload, no account, and the file is yours to edit wherever you like.
1. Two different things people call "editing"
Search for a MIDI editor after a conversion and you are usually looking for a piano roll: click a note, drag it, change its velocity, delete it. That is file editing — it changes a note-on / note-off pair in a Standard MIDI File. This page has no piano roll. It is an analysis editor: the audio is decoded and analysed exactly once, and every control re-runs only the step that groups analysis frames into notes. The two operations are not interchangeable, and knowing which one you need saves a wasted round trip.
dsp.js, after a warm-up run: 218.33 ms for analyze(), 0.377 ms for segment() averaged over 500 calls.That asymmetry is the whole reason the controls feel free: changing the grid does not touch the FFT work. It also explains the hard limit. Because every control funnels back into segment(), none of them can reach into a finished note and alter one attribute. For a byte-level description of the file those notes become, see what is actually inside a MIDI file; for the note list that sits between analysis and export, see audio to notes.
2. What the five controls can and cannot change
The converter exposes five inputs that affect the export: a mono/poly switch, a sensitivity slider, a shortest-note field, a BPM field, and a snap-to-grid checkbox with a 1/8, 1/16 or 1/32 grid. We ran each one against known synthesised clips using the site's real dsp.js and midi.js, so the numbers below are outputs, not estimates.
| Control | What it changes | What it never changes | One measured result |
|---|---|---|---|
| Mono / poly | Which frames are grouped, and therefore note starts, ends and count | The pitch of a note that both modes find | On a four-note clip with one quiet note, mono returned 3 notes (C4, D4, G4) with the D4 starting at 0.4876 s; poly returned 3 notes (C4, D4, G4) with the D4 starting at 0.4180 s. |
| Sensitivity | The RMS gate and harmonicity threshold, so whole notes appear or disappear | A note's pitch, start or velocity once it passes the gate | At 0–30 the clip gave 0 notes, at 40–50 it gave 2, at 60–70 it gave 3, and at 80–100 it gave 4 as the quiet E4 was admitted at velocity 80. |
| Shortest note | Whether a candidate note survives the minimum-frame test | The duration of any note that survives | At 0, 60, 120, 200 and 300 ms the same 3 notes came back with identical durations (0.3483 / 0.3715 / 0.3483 s); at 400 and 500 ms all 3 vanished. |
| BPM | Tick positions in the .mid; with snap on, also the note times themselves | Note times in seconds or the CSV when snap is off | With snap off, six BPM values from 60 to 200 produced one identical 230-byte CSV but six different .mid files (94–103 B). |
| Snap to grid | Every start and end, rounded to a beat-grid step | Note count, pitch, velocity, and the underlying analysis | At 120 BPM and 1/16, five notes kept pitches 60/62/64/67/69 and velocities 113/112/113/113/112 while their onsets moved by up to 47.21 ms. |
Read the third column as a group. Every control changes which notes exist or where the whole set sits in time. None of them takes a single note as an argument. That is the defining difference between a converter with settings and an editor with a selection.
Why sensitivity is a gate, not a per-note adjustment
In segment(), sensitivity sets two thresholds: a voice gate between the noise floor and the loudest frame (0.32 − 0.30 × sens) and a harmonicity threshold (0.35 − 0.25 × sens). Both are applied to frames, not to notes. A quiet note therefore enters the list whole or not at all; raising the slider cannot make that one note louder, longer, or better in tune. The measured sweep above is the direct consequence: the quiet E4 appeared as a complete note at sensitivity 80 with velocity 80, and at 60 it was simply absent. This is a description of this implementation, not a claim about any other product.
3. Measured: snapping to the beat grid is a bulk rewrite of time
We built a 2.007-second clip with five deliberately off-grid notes (C4, D4, E4, G4, A4). Raw segmentation put their onsets at 0.1277, 0.4528, 0.7663, 1.1029 and 1.3816 s — exactly frames 11, 39, 66, 95 and 119 of the 11.609977 ms analysis grid. Then we swept all three grid values at six BPMs: 18 combinations, 90 note positions.
| BPM | Grid | Step | Max shift | Mean shift | Resulting onsets (s) | .mid |
|---|---|---|---|---|---|---|
| 60 | 1/8 | 500 ms | 233.74 ms | 126.00 ms | 0, 0.5, 1, 1, 1.5 | 97 B |
| 60 | 1/16 | 250 ms | 122.29 ms | 81.42 ms | 0.25, 0.5, 0.75, 1, 1.5 | 93 B |
| 60 | 1/32 | 125 ms | 47.21 ms | 18.96 ms | 0.125, 0.5, 0.75, 1.125, 1.375 | 93 B |
| 90 | 1/8 | 333.33 ms | 127.71 ms | 99.59 ms | 0, 0.3333, 0.6667, 1, 1.3333 | 98 B |
| 90 | 1/16 | 166.67 ms | 67.07 ms | 53.04 ms | 0.1667, 0.5, 0.8333, 1.1667, 1.3333 | 94 B |
| 90 | 1/32 | 83.33 ms | 38.96 ms | 29.21 ms | 0.1667, 0.4167, 0.75, 1.0833, 1.4167 | 96 B |
| 120 | 1/8 | 250 ms | 122.29 ms | 81.42 ms | 0.25, 0.5, 0.75, 1, 1.5 | 100 B |
| 120 | 1/16 | 125 ms | 47.21 ms | 18.96 ms | 0.125, 0.5, 0.75, 1.125, 1.375 | 96 B |
| 120 | 1/32 | 62.5 ms | 22.05 ms | 12.58 ms | 0.125, 0.4375, 0.75, 1.125, 1.375 | 97 B |
| 140 | 1/16 | 107.14 ms | 31.52 ms | 20.77 ms | 0.1071, 0.4286, 0.75, 1.0714, 1.3929 | 98 B |
| 173 | 1/16 | 86.71 ms | 41.00 ms | 20.85 ms | 0.0867, 0.4335, 0.7803, 1.1272, 1.3873 | 99 B |
| 200 | 1/32 | 37.5 ms | 16.26 ms | 11.12 ms | 0.1125, 0.45, 0.75, 1.0875, 1.3875 | 101 B |
Three details are easy to miss. First, the five pitches and five velocities are identical in all 18 rows: snapping rewrites time only. Second, the file size moves between 93 and 101 B with the same five notes, because different onsets produce different delta-time byte widths — a reminder that MIDI file size follows the event bytes, not the audio length. Third, at 60 BPM and 1/8, notes three and four both land at 1.0 s: only four distinct onsets remain for five notes. The segmenter does not merge them. Resolving that collision is exactly the sort of job a piano roll exists for.
Snapping also changes note lengths. At 120 BPM and 1/16 the five durations became 0.25, 0.125, 0.25, 0.125 and 0.25 s; two notes came back at 0.125 s because their ends rounded to the neighbouring grid step. There is no strength control here — the rounding is all or nothing, applied to every note. How to clean up a converted MIDI explains why a partial-strength quantize in an editor is often the gentler choice.
The BPM field is coupled to the grid, and nothing else
This one surprises people, so we isolated it. With snapping off, the BPM field only converts seconds into ticks when the file is written; the note list is untouched. With snapping on, the grid step is (60 / BPM) × (4 / grid), so the BPM field becomes a timing edit.
| BPM | CSV, snap off | .mid, snap off | First onset (s), snap on | First onset (ticks), snap on |
|---|---|---|---|---|
| 60 | One identical 230-byte CSV in all six rows (SHA-256 prefix 9bd6550b1ea5); first onset 0.1277 s every time | 94 B | 0.2500 | 120 |
| 90 | 97 B | 0.1667 | 120 | |
| 120 | 98 B | 0.1250 | 120 | |
| 140 | 100 B | 0.1071 | 120 | |
| 173 | 102 B | 0.0867 | 120 | |
| 200 | 103 B | 0.1500 | 240 |
With snapping on, all six CSVs are different. The first note sits on tick 120 — exactly one sixteenth — at every BPM from 60 to 173, then jumps to tick 240 at 200 BPM because 0.1277 s rounds to two 75 ms steps rather than one. That is a rounding decision, not a tempo detection. How accurate the tempo a converter writes is covers the other half: the BPM value is the one you typed, not a measurement of the audio. If you need it measured from the file, the BPM finder is a separate page.
4. The 1,152-combination check: what no control can do
A table of individual sweeps can always be argued around — maybe some combination of settings reaches the note you want to fix. So we enumerated the entire control space of this page: 2 modes × 6 sensitivity values (0, 20, 40, 60, 80, 100) × 4 shortest-note values (0, 60, 120, 200 ms) × 2 snap states × 3 grids × 4 BPM values (60, 120, 173, 200) = 1,152 combinations. For each, we ran segment() on the same analysis and tracked the C4 note that starts at 0.0000 s. It existed in 960 of them.
| Attribute | Distinct values observed | What that means |
|---|---|---|
| Pitch | 60 only | No control transposes a note. Changing the source audio is the only input to pitch. |
| Velocity | 112, 113 only | Velocity is computed from the mean RMS of the frames a note spans. Changing which frames the note covers moves it by one step; there is no value you can type. |
| Start time | 0.0000 s only | A note at the start of the file cannot be nudged at all, with or without snapping. |
| Duration | 18 distinct values, all frame or grid multiples | Lengths vary only because grouping and rounding change; none of them is a free choice. |
To be precise about the velocity claim: across a different clip, the full combination sweep produced velocity values of 87, 90, 93, 99, 111, 112 and 113 — but those came from notes that covered different sets of frames, not from an edit applied to one note. This matters for the honest conclusion: you can influence velocity indirectly by changing the audio or the grouping, but you cannot select a note and set its velocity. For why a flat velocity lane is worth fixing at all, see why converted MIDI sounds robotic.
There is also a resolution floor. With snapping off, every onset is an integer frame: on the four-note clip the raw starts were frames 0, 42, 85 and 129, with zero residual against the 11.609977 ms grid. At 120 BPM one MIDI tick is 1.0417 ms, so a piano roll can position a note about 11 times more finely than the analysis grid, and the 18 snapped grids above are coarser still (37.5–500 ms). If the timing you need is between two frames, no setting here will produce it.
The same boundary shows up when notes go missing: the order to fix dropped notes walks through format, mode, sensitivity and shortest-note checks — all of them re-segmentation decisions. It does not include "drag the missing note back in", because that step does not exist here.
5. What a real editor has to add, byte by byte
We exported four known notes (C4, D4, E4, G4) and parsed the file back with a running-status-aware reader. This is the complete event census:
| Property | Value | Consequence |
|---|---|---|
| File size / format | 91 B / format 1, 2 tracks, 480 ticks per quarter | Six of the eight delta-times exceed 127 ticks and take two VLQ bytes, hence 91 B rather than the 89 B a tighter clip produces. |
| Note events | 4 note-on, 4 note-off, all on channel 0 | One flat part. No track split, no drum channel. |
| Meta events | 0x51 ×1 (tempo), 0x58 ×1 (4/4), 0x2F ×2 (end of track) | Nothing else is written. |
| Absent | 0 program-change, 0 pitch-bend, 0 key-signature, 0 text, 0 lyric, 0 track-name | Instrument, key, words and expression all have to be added elsewhere. |
| Note-on velocity bytes | Offsets 52, 62, 71, 81 — all 0x71 (113) | Four separate bytes; an editor can change any one of them. |
Now the smallest possible edit. We changed the byte at offset 52 from 0x71 (113) to 0x40 (64). Exactly one byte of the 91 changed, the file stayed 91 B, and its SHA-256 prefix moved from 9156028a2ad6 to b95bcd01a07c. Parsing it back confirms the first note-on velocity is now 64 while the other three are still 113. No combination of the 1,152 settings above can produce that file, because the writer derives all four velocities from the audio. Note that this writer also puts the velocity in the note-off event at offset 57, so a consistent edit is a two-byte change (SHA-256 prefix 88d107d09976).
Adding something new is just as concrete. Inserting three bytes 00 C0 00 at the start of track 2 and raising that track's length from 42 to 45 bytes gives a 94-byte file which our parser reads as one program-change event with the same 4 note-on / 4 note-off events and the same three meta types (SHA-256 prefix 2ca6c739e220). That is the entire difference between "no instrument specified" and "instrument specified". It is a file edit, not an analysis setting. What playing a MIDI file back actually shows explains why the player, not the file, chooses the sound when that byte is missing; how to make a MIDI file shows that a hand-drawn or score-derived file has the same thin shape.
What a general-purpose MIDI editor does with these bytes
A piano-roll editor reads the header, expands delta-times into absolute ticks, then lets you select one note and change its pitch, start, end or velocity, delete it, duplicate it, or split events across tracks and channels. It can also insert meta events (tempo, time signature, key signature, lyrics, markers) and controller or program-change messages. All of that is a rewrite of the event list; the source audio is not consulted. None of it needs a pitch detector, which is why an editor can place a note at any tick even when the recorded audio was ambiguous. This is a structural description of the format, not a recommendation of any particular application.
6. Should you stay here, or open an editor?
Three honest answers, each tied to a number above. The point of writing the "walk away" cases down is that the "stay here" case is only credible if the boundary is real.
Stay on this page and re-convert when the problem is which notes exist, or where the whole set sits in time. Raising sensitivity from 60 to 80 admitted a quiet E4 that was previously absent; snap-to-grid at 120 BPM and 1/16 moved onsets by up to 47.21 ms in a single 0.377 ms re-segmentation. Nothing about the audio has to be re-recorded for those fixes.
Open a MIDI editor when the problem is one note: a wrong pitch, one velocity that sticks out, a note that should be two, or a snapped pair that collided at 1.0 s. Across 960 appearances in our sweep, that C4 never left pitch 60, velocity 112/113 or start 0.0000 s — yet changing its velocity is a one-byte edit at offset 52. If you are fixing a single note, you are doing file editing whether or not you call it that.
Go to a DAW or scoring application when the job needs events the conversion never writes: an instrument, a key signature, lyrics, separate channels, pitch bend or a proper score. The 91-byte census has zero of them, and adding just one program-change took three inserted bytes and a track-length update. There is also the case where the source itself is the problem — if a low note was misread below the 181 Hz resolution line, no editor will recover information the detector never saw; go back to the audio. Can audio to MIDI pull out just the bass line measures that limit, and what a full mix comes back as covers the dense-source case.
Notice that all three rows still begin here: you convert once, download, then decide. The editor is downstream of the conversion, not a replacement for it.
7. A practical order of operations
- Convert a clean, isolated source once. A single-line WAV or MP3 gives the detector a stable harmonic structure; mono vs poly explains which mode to start from, and what a bend does to guitar notes covers a common source of fragments.
- Set mode and sensitivity first. They decide the note set. On the measured clip, sensitivity 0–30 gave 0 notes and 80–100 gave 4; choosing this before anything else avoids polishing notes you will delete.
- Set the shortest-note filter next. It removes whole short candidates (400 ms removed all 3 notes in the sweep) but never shortens a surviving note.
- Decide on snapping last, and set BPM before it. With snapping off, the BPM field leaves the 230-byte CSV identical across six values; with snapping on, it changes every onset. Doing these in the other order produces a file you will want to re-export.
- Download both .mid and .csv. The CSV keeps seconds at four decimal places and is the better handoff when you intend to edit times yourself — audio to notes has the column-by-column comparison, including the 1.0417 ms tick grid the .mid uses.
- Then edit the file. Fix individual pitches and velocities, resolve snapped collisions, add instrument and key, split tracks. The five cleanup passes give a working order for that stage, and how big the file can get explains why adding notes barely changes its size.
One last practical note: converting again does not lose anything except time. The analysis is done once per file, and re-segmenting costs 0.377 ms on a 10.22-second clip, so trying ten setting combinations is cheaper than one careful guess. Batch converting several files covers the case where the queue is longer than one clip.
Questions people actually ask
Can I edit the notes in the browser after converting?
No. There is no piano roll or note selection on this page. The five controls re-run segment() on the analysis already in memory — 0.377 ms per change on the measured 10.22-second clip, versus 218.33 ms for analyze(). You change the conversion, then download a new file. Editing one note means opening the .mid in an editor.
Does the BPM field move my notes?
With snap-to-grid off, no: six BPM values from 60 to 200 produced one identical 230-byte CSV, with the first note at 0.1277 s every time, while the six .mid files differed in their tick numbers (first onset 61, 92, 123, 143, 177, 204 ticks). With snapping on, yes: the grid step depends on BPM, so all six CSVs were different. The tempo the converter writes is the value you typed, not a measurement.
Can I change just one note's velocity here?
No. Across 1,152 control combinations, the C4 at the start of the test clip appeared 960 times and its velocity was always 112 or 113. In a real editor that change is one byte: offset 52 of the 91-byte file, 0x71 to 0x40. The velocity comes from the mean loudness of the frames the note covers, not from an input field.
Why did snapping make two notes start at the same time?
Because snapping rounds every start and end independently and does not merge the results. At 60 BPM and 1/8 (a 500 ms step), the five measured onsets became 0, 0.5, 1, 1, 1.5 s — four distinct positions for five notes. A piano roll lets you see and resolve that overlap; the converter does not.
How precisely can I place a note on this page?
Without snapping, onsets are integer analysis frames of 11.609977 ms (measured frames 0, 42, 85, 129 with zero residual). With snapping, the step is 37.5–500 ms depending on BPM and grid. At 120 BPM a MIDI tick is 1.0417 ms, so a piano roll is roughly eleven times finer than the raw analysis grid.
Can I add an instrument, lyrics or a key signature here?
No. The four-note export holds 4 note-on, 4 note-off, one tempo, one 4/4 time signature and two end-of-track markers — zero program-change, zero pitch-bend, zero key-signature, zero text and zero lyric events. Those are added by editing the file; inserting one program-change is three bytes plus a track-length update.
Should I fix the audio or fix the MIDI?
Fix the audio when a note was never detected correctly: a note below 55 Hz, a chord collapsed by harmonic suppression, or a bass line buried in a mix. Re-running settings cannot restore information that was not in the frames. Fix the MIDI when the notes are right but one is late, loud, duplicated or wrongly pitched. The dropped-note troubleshooting order starts with the first kind; this page's sections 4 and 5 cover the second.
Is the CSV easier to edit than the .mid?
For timing, often yes: the CSV stores seconds to four decimal places and has seven readable columns, while the .mid stores rounded ticks. In the measured sweep, the 230-byte CSV stayed byte-identical across six BPM values with snapping off, which makes it a stable handoff. But a spreadsheet is not a MIDI editor either — you still have to write the file back. Audio to notes compares the two formats in detail.
Convert a file now — runs in your browser, nothing is uploaded, and both the .mid and the .csv are yours to take into any editor.
Related guides
- Clean up a converted MIDIThe five passes that turn a raw export into a usable part
- MIDI playerWhat playing a MIDI file back actually shows
- Audio to notesThe note list and CSV before it becomes a .mid
- MIDI converterWhat is actually inside a MIDI file
- Fix dropped notesThe order to check when a conversion misses something
- Mono vs polyWhat each detection mode misses
- Humanize robotic MIDIWhy converted velocity lanes sound flat
- How to make a MIDI fileThree routes, one two-track file
- MIDI file size limitsWhy size follows note events, not audio length
- Tempo detection accuracyWhat the BPM field writes, and what it does not measure