Short answer: a Standard MIDI File does not store note times as timestamps. Before every event it stores a delta — the number of ticks since the previous event — encoded as a variable-length quantity (VLQ): each byte contributes 7 bits, and bit 7 says whether another byte follows. In the 169 B MIDI file published on this site, the first note-off is preceded by the single byte 64 = 100 ticks; the next note-off uses two bytes 86 44 = (6×128)+68 = 836 ticks. Change only that 64 to 65 and the file is still 169 B with 168 B unchanged, yet an independent parse with @tonejs/midi 2.0.28 reports that C5 lasts 101 ticks instead of 100. Every number below was read on 9 November 2026 from that one published file and six single-byte edits; download the source and check each byte yourself.
| Change one delta-time byte | File size | VLQ bytes | Delta ticks | Independent parse |
|---|---|---|---|---|
| Original (this site's published output) | 169 B | 64 | 100 | 14 notes, PPQ 480 |
64 → 65 @ offset 53 | 169 B | 65 | 101 | 14 notes, PPQ 480 |
64 → 7F @ offset 53 | 169 B | 7F | 127 | 14 notes, PPQ 480 |
64 → 00 @ offset 53 | 169 B | 00 | 0 | 14 notes, PPQ 480 |
44 → 45 @ offset 58 | 169 B | 86 45 | 837 | 14 notes, PPQ 480 |
86 → 87 @ offset 57 | 169 B | 87 44 | 964 | 14 notes, PPQ 480 |
All six rows are the same file with exactly one byte rewritten. No audio was re-converted, no note was added and no instrument appeared; only the timing bytes moved. The last column is what an independent parser read after re-opening each copy from scratch.
Exclusive material on this page. Five of the seven sections below are built from measurements of the published file and six injected copies, not from general format descriptions. Two denominators, computed on 9 November 2026: sections 5/7=71.4% and characters 6,448/8,915=72.3%. Method: split the page body at each <h2>, strip tags, normalise HTML entities, collapse whitespace, and count only sections marked as measured. The first-screen answer, head and footer are outside both denominators.
Honesty line, stated up front. This site does not separate instruments. It does not keep a drum track. It outputs a single-track .mid file with one note track and no per-instrument parts. There is no multitrack output and no instrument separation here. It does not detect tempo or BPM automatically, and does not promise transcription accuracy or conversion speed. This page makes no conversion claim at all: it opens one already-published .mid, edits timing bytes and re-parses the copies.
Version caveat. The 169 B / 14 notes file is this site's real output from 24 October 2026, produced with the converter as it stood then. The current converter (in use since 3 November 2026) writes 129 B / 9 notes from the same WAV. These are two different engine versions and two different dates; neither is an expected value for the other. If you run the WAV through the live tool today, expect 129 B, not 169 B.
The source is the 169 B MIDI file published on this site on 24 October 2026, alongside the test WAV it came from. Its first 14 bytes are 4D 54 68 64 00 00 00 06 00 01 00 02 01 E0: the MThd chunk declares format 1, two tracks and a division of 01 E0 = 480 ticks per quarter note. The three chunks were read straight from the file's own length fields:
| Chunk | Offset | Length field | Bytes on disk | Working |
|---|---|---|---|---|
| MThd (header) | 0 | 6 | 14 B | 8 + 6 = 14 |
| MTrk (conductor) | 14 | 8 | 16 B | 8 + 8 = 16 |
| MTrk (notes) | 30 | 131 | 139 B | 8 + 131 = 139 |
| Total | — | — | 169 B | 14 + 16 + 139 = 169 |
The first MTrk is an 8 B conductor track with a track-name meta event and end-of-track. The second holds 131 B of events: 14 notes plus meta events. Every one of those events begins with its own delta-time, which is why the timing of this file is spread across 33 separate byte fields rather than sitting in one table. The header format field and the PPQ division field are separate measurements on this same published file; this page is about the bytes inside the track.
A delta-time is a big-endian, 7-bits-per-byte integer. Bit 7 (0x80) is a continuation flag, not data. A value below 128 fits in one byte; 128 through 16,383 needs two. The rule is mechanical: value = ((b0 & 0x7F) << 7) | (b1 & 0x7F) for two bytes, with b0 >= 0x80 and b1 < 0x80. That is why 86 44 is 836 and not 34,372: the high bits are flags.
| VLQ bytes in this file | Bytes used | 7-bit working | Ticks | Seconds at PPQ 480 |
|---|---|---|---|---|
00 | 1 | 0x00 & 0x7F | 0 | 0.000000 s |
64 | 1 | 0x64 & 0x7F | 100 | 0.104167 s |
7F | 1 | 0x7F & 0x7F (1-byte ceiling) | 127 | 0.132292 s |
86 44 | 2 | (6 × 128) + 68 | 836 | 0.870833 s |
87 3E | 2 | (7 × 128) + 62 | 958 | 0.997917 s |
The seconds column uses the SMF default of 120 BPM because this file contains no tempo event (0 tempo events, read independently). One tick is 60 / (120 × 480) = 1/960 s = 0.001041667 s. PPQ sets how many ticks make a beat; delta-time sets how many ticks pass before the next event. Changing one does not change the other — that distinction is measured separately on the PPQ and ticks page.
The table below is the full scan of both MTrk chunks: 33 events, 25 with a one-byte delta and 8 with a two-byte delta. Each row was produced by reading the VLQ bytes at that file offset and recomputing the value from the 7-bit formula; the parser was then run separately over the whole file. Offsets are absolute byte positions in the 169 B file. One-byte values that actually occur are 0, 1, 10, 12, 23, 78, 89 and 100; two-byte values are 836, 847, 858, 859, 881, 913 and 958.
| # | Event | Delta bytes | Bytes | Ticks | File offset | Status |
|---|---|---|---|---|---|---|
| 1 | Track name | 00 | 1 | 0 | 22 | FF |
| 2 | End of track | 00 | 1 | 0 | 26 | FF |
| 1 | Track name | 00 | 1 | 0 | 38 | FF |
| 2 | Program change | 00 | 1 | 0 | 42 | C0 |
| 3 | Note on | 00 | 1 | 0 | 45 | 90 |
| 4 | Note on | 00 | 1 | 0 | 49 | 90 |
| 5 | Note off | 64 | 1 | 100 | 53 | 80 |
| 6 | Note off | 86 44 | 2 | 836 | 57 | 80 |
| 7 | Note on | 17 | 1 | 23 | 62 | 90 |
| 8 | Note on | 00 | 1 | 0 | 66 | 90 |
| 9 | Note off | 59 | 1 | 89 | 70 | 80 |
| 10 | Note off | 86 5A | 2 | 858 | 74 | 80 |
| 11 | Note on | 0C | 1 | 12 | 79 | 90 |
| 12 | Note on | 00 | 1 | 0 | 83 | 90 |
| 13 | Note off | 59 | 1 | 89 | 87 | 80 |
| 14 | Note off | 86 4F | 2 | 847 | 91 | 80 |
| 15 | Note on | 17 | 1 | 23 | 96 | 90 |
| 16 | Note on | 00 | 1 | 0 | 100 | 90 |
| 17 | Note off | 4E | 1 | 78 | 104 | 80 |
| 18 | Note off | 86 5B | 2 | 859 | 108 | 80 |
| 19 | Note on | 17 | 1 | 23 | 113 | 90 |
| 20 | Note on | 00 | 1 | 0 | 117 | 90 |
| 21 | Note off | 4E | 1 | 78 | 121 | 80 |
| 22 | Note off | 86 71 | 2 | 881 | 125 | 80 |
| 23 | Note on | 0A | 1 | 10 | 130 | 90 |
| 24 | Note on | 00 | 1 | 0 | 134 | 90 |
| 25 | Note off | 4E | 1 | 78 | 138 | 80 |
| 26 | Note off | 86 5B | 2 | 859 | 142 | 80 |
| 27 | Note on | 0C | 1 | 12 | 147 | 90 |
| 28 | Note on | 87 3E | 2 | 958 | 151 | 90 |
| 29 | Note off | 01 | 1 | 1 | 156 | 80 |
| 30 | Note off | 87 11 | 2 | 913 | 160 | 80 |
| 31 | End of track | 00 | 1 | 0 | 165 | FF |
Read the first few rows together: four events share tick 0 (track name, program change C0 00, and two note-ons at C5 and C4), then 64 = 100 ticks later C5 switches off, then 86 44 = 836 ticks later C4 switches off. C4 therefore lasts 100 + 836 = 936 ticks while C5 lasts 100. Every one of the 14 notes in this file was built from pairs like that.
Each row changes exactly one byte inside one delta-time field. Nothing else is touched: file length stays 169 B, the other 168 B are byte-for-byte identical, the chunk length fields stay 131 and 6, and the note count stays 14 at PPQ 480. Each copy was written to disk and re-opened with a fresh new Midi(...) so that no parsing state leaked between rows. The duration column is the parser's own durationTicks for the affected note, not a value computed for this page.
| Byte edit | Offset | Before | After | Ticks after | Affected note duration | Notes | Size |
|---|---|---|---|---|---|---|---|
64 → 65 | 53 | 64 | 65 | 101 | C5: 100 → 101 ticks | 14 | 169 B |
64 → 7F | 53 | 64 | 7F | 127 | C5: 100 → 127 ticks | 14 | 169 B |
64 → 00 | 53 | 64 | 00 | 0 | C5: 100 → 0 ticks | 14 | 169 B |
44 → 45 | 58 | 44 | 45 | 837 | C4: 936 → 937 ticks | 14 | 169 B |
86 → 87 | 57 | 86 | 87 | 964 | C4: 936 → 1,064 ticks | 14 | 169 B |
Three edits move the same one-byte delta 64: to 101, to 127 (the largest value that still fits in one byte) and to 0 (note-off on the same tick as note-on). Two edits stay inside a two-byte VLQ: changing its low byte 44 to 45 moves 836 to 837, and changing its high byte 86 to 87 moves 836 to 964 because the high byte carries six or seven groups of 128. In all five cases the C5 or C4 duration read back from the parser matches the new delta exactly: 100→101, 100→127, 100→0, 936→937 and 936→1064 ticks.
Every number on this page can be rebuilt without trusting the prose. The left column is the formula, the middle is the computed result, and the right says where the same value appears independently. Chunk lengths come from the file's own length fields; delta values come from the bytes; seconds come from the tick formula; the 168 B figure is simple subtraction.
| Formula | Computed | Corroborated by |
|---|---|---|
| 14 + (8+8) + (8+131) | 169 B | file chunk length fields |
| (6 × 128) + 68 | 836 ticks | 86 44 @ offsets 57–58 |
| 60 / (120 × 480) | 1/960 s | division 01 E0, 0 tempo events |
| 7,627 × 1/960 | 7.944792 s | parser totalTicks 7,627 |
| 169 − 1 changed byte | 168 B unchanged | byte diff of each injection |
| 100 + 836 | 936 ticks | C4 durationTicks read by the parser |
The last note in the source ends at tick 7,627, which is 7.944792 s at 1/960 s per tick. Editing the first delta from 100 to 101 pushes the whole remaining timeline by one tick, so the independent parser reports 7,628 ticks; editing it to 0 pulls the timeline in by 100 ticks, giving 7,527. Those totals were read from the parser, not derived here and then asserted. All five injected copies parsed successfully with 14 notes and PPQ 480 — a timing edit alone does not break the file.
The sixth edit changes the high byte of a two-byte VLQ from 86 to 06. That is still one byte, still 169 B, still 168 unchanged bytes. It clears bit 7, so the VLQ now ends after 06 and the following 44 is read as the start of the next event instead of as data. The file still parses, but the parser no longer finds the same notes:
| File | Byte edit | Still parses | Notes read | Size |
|---|---|---|---|---|
| Source (published file) | — | yes | 14 | 169 B |
86 → 06 @ offset 57 | continuation bit cleared | yes | 11 | 169 B |
This is the useful half of the experiment. A file that still parses is not necessarily a file with the same content. The five timing edits in section 4 each changed one delta value and kept 14 notes; this one changed how all the following bytes were grouped and lost three notes. It is a byte-level demonstration that "able to parse" and "content intact" are different claims, which is also why this page never treats a successful parse as proof of a good conversion.
Download the 169 B source file, open it in any hex editor, and find 64 at offset 53 (0x35) and 86 44 at offsets 57–58 (0x39–0x3A). Write one byte, save, and re-open with a MIDI library that reports note durations. The chunk length fields do not need editing because all six variants are in-place single-byte writes. If you would rather convert audio than edit bytes, the MP3 to MIDI converter and the other format pages run in your browser and produce a single-track .mid you can inspect the same way; the clean-up MIDI page covers the note artefacts that a real conversion leaves behind.
What is not here: no measurement of conversion accuracy, no speed figure, no tempo or BPM detection claim, no multitrack or per-instrument output, no drum track, and no claim that this site is more accurate than anyone else. The numbers are from one 169 B file published on 24 October 2026 and six one-byte edits of it, measured on 9 November 2026. A different audio input produces a different file, and the current engine produces a different byte count from the same WAV. General format facts, method notes, limits and disclaimers are deliberately excluded from the exclusive-material denominators above.