Short answer: a note in a Standard MIDI File is a status byte plus two data bytes. In the 169 B MIDI file published here, the first note is 90 48 26: 0x90 = Note On on channel 0, 0x48 = note 72 (C5), 0x26 = velocity 38, which @tonejs/midi 2.0.28 reports as 0.2992 because 38 / 127 = 0.2992. Release uses 0x80 with the same two data bytes. Change only velocity to 01 and the file is still 169 B with 168 B unchanged: the parser reads 0.0079 for the first note, while all 14 notes, PPQ 480 and the other 13 velocities stay identical. Every row is that one file with one byte rewritten, measured on 10 November 2026. Download the source and check each byte.
| One-byte edit | File size | Velocity byte | Velocity (0-1) | First note | Independent parse |
|---|---|---|---|---|---|
| Original (published file) | 169 B | 26 | 0.2992 | C5 / 72 | 14 notes, PPQ 480 |
26 → 01 @ offset 48 | 169 B | 01 | 0.0079 | C5 / 72 | 14 notes, PPQ 480 |
26 → 40 @ offset 48 | 169 B | 40 | 0.5039 | C5 / 72 | 14 notes, PPQ 480 |
26 → 64 @ offset 48 | 169 B | 64 | 0.7874 | C5 / 72 | 14 notes, PPQ 480 |
26 → 7F @ offset 48 | 169 B | 7F | 1.0000 | C5 / 72 | 14 notes, PPQ 480 |
All five rows are the same 169 B file with one byte rewritten. No audio was re-converted, no note added, no track split: only the first note's velocity moved. The last column is what an independent parser read after re-opening each copy from scratch.
Exclusive material. Five of the seven sections below are measurements of the published file and twelve single-byte edits, not general format descriptions. Two denominators, computed on 10 November 2026: sections 5/7=71.4% and characters 8,492/10,335=82.2%. Method: split the body at each <h2>, strip tags, normalise entities, collapse whitespace, count only measured sections. 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. A velocity byte is a number in a file, not a claim about separating instruments in audio. This page makes no conversion claim at all: it opens one already-published .mid, edits one byte at a time 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 byte-level experiment below deliberately uses the published 169 B file because that file is public and reproducible; it is not a measurement of the current converter's output.
The source is the 169 B MIDI file published here on 24 October 2026, alongside the test WAV. Its first 14 bytes are 4D 54 68 64 00 00 00 06 00 01 00 02 01 E0: MThd declares format 1, two tracks and division 01 E0 = 480 ticks per quarter. Chunks below come from the file's own length fields, with no assumed offsets:
| 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 | 8+6 + 8+8 + 8+131 = 169 |
The first MTrk is an 8 B conductor track; the second holds 131 B of events. Walking from its body start at offset 38 through the variable-length delta-times locates the first Note On from the bytes themselves. The offsets below were derived by enumerating events, not typed in:
| Offset (decimal) | Byte | What the byte is | How it was derived |
|---|---|---|---|
| 38 | 00 | delta-time 0 before the track-name meta event | note-track body starts at chunk offset 30 + 8 |
| 39–41 | FF 03 00 | track-name meta event, name length 0 at offset 41 | 3 bytes after the delta |
| 42 | 00 | delta-time 0 before Program Change | next event starts here |
| 43 | C0 | Program Change status on channel 0 | 0xC0 >> 4 = 0xC |
| 44 | 00 | program number (GM instrument) | unchanged by every edit on this page |
| 45 | 00 | delta-time 0 before the first Note On | one VLQ byte, value 0 |
| 46 | 90 | status: Note On on channel 0 | 0x90 >> 4 = 9; & 0x0F = 0 |
| 47 | 48 | data byte 1: note number = 72 (C5) | decimal value of 0x48 |
| 48 | 26 | data byte 2: velocity = 38 | 38 / 127 = 0.2992 |
0x90 >> 4 = 9 means Note On, 0x90 & 0x0F = 0 means channel 0; the release status 0x80 has a high nibble of 8. Data bytes are 7-bit, so note number and velocity are in 0..127, and this file's note-off velocity is 0x00. Delta-time bytes and the PPQ field were measured separately on this same file; this page is about the three bytes 90 48 26.
The high nibble of the status byte carries the message type and the low nibble carries the channel. The two data bytes are the note number and velocity; a MIDI file stores the numbers, not a loudness curve or an audio sample. A Note On with velocity zero is conventionally a release, which is why one byte can remove a note without deleting any bytes. Pairing a note-on with its note-off gives the duration: the parser subtracts the start tick from the release tick. None of this is audio separated into parts. The MIDI to MP3 tool renders a .mid to audio; this page only inspects bytes. The Program Change byte is a separate label before these notes.
Four copies each change only the velocity byte at offset 48. Every copy is 169 B, differs in exactly one byte, and was re-opened from scratch with @tonejs/midi 2.0.28. The velocity column is the decimal byte written; the normalised column is that byte / 127 to four decimals, exactly what the parser reported:
| Byte edit | Offset | Before | After | Velocity byte | Velocity (0-1) | Notes | Size |
|---|---|---|---|---|---|---|---|
26 → 01 | 48 | 26 | 01 | 1 | 0.0079 | 14 | 169 B |
26 → 40 | 48 | 26 | 40 | 64 | 0.5039 | 14 | 169 B |
26 → 64 | 48 | 26 | 64 | 100 | 0.7874 | 14 | 169 B |
26 → 7F | 48 | 26 | 7F | 127 | 1.0000 | 14 | 169 B |
Each edit leaves 168 B unchanged, keeps 14 notes and PPQ 480, and stays parseable. The first note remains C5 at pitch 72 and tick 0; the other 13 keep identical pitch, velocity, start tick and duration tick. 7F gives 127 / 127 = 1.0000, the top of the range. Writing 26 back restores the exact source SHA-256, the structural check that each copy is a one-byte edit rather than a re-encoded file. A successful parse alone would not establish this: the note list was compared row by row.
No figure below is copied from a rendered page. Chunk lengths come from the file's own length fields, nibbles from the status bytes, velocity from hexadecimal divided by 127, and 168 B from subtraction:
| Formula | Computed | Corroborated by |
|---|---|---|
| 8+6 + 8+8 + 8+131 | 169 B | sum of the three chunk length fields + 8 B headers |
| 0x90 >> 4 | 9 | high nibble of the status byte = Note On |
| 0x80 >> 4 | 8 | high nibble of the release status = Note Off |
| 0x90 & 0x0F | 0 | low nibble = MIDI channel 0 |
| 0x48 | 72 (C5) | data byte 1 = MIDI note number, 0..127 |
| 0x26 / 127 | 0.2992 | data byte 2 = velocity, 0..127 |
| 0x01 / 0x40 / 0x64 / 0x7F ÷ 127 | 0.0079 / 0.5039 / 0.7874 / 1.0000 | the four injected velocity values |
| 169 − 1 changed byte | 168 B unchanged | byte diff of each injected copy |
| (0x01 << 8) | 0xE0 | 480 ticks / quarter | division field 01 E0 = parser PPQ |
| 60 / (120 × 480) | 1/960 s per tick | SMF default 120 BPM, no tempo event in this file |
| 7,627 ticks × 1/960 s | 7.944792 s | last event tick from the event enumeration |
01 E0 gives 480 ticks per quarter, so one tick is 60 / (120 × 480) = 1/960 s at the SMF default of 120 BPM; the file has no tempo event and none of the four edits changes that. Enumerating the note track reaches offset 169, the end of the file, at tick 7,627 = 7.944792 s. The format and track-count fields were measured separately; the 33 delta-time fields in the whole file include the two conductor-track events absent from this page's 31-event list.
Changing velocity changes one value; changing the status or note-number byte changes what the message means, and changing a meta length byte changes how many following bytes it consumes. Eight more one-byte edits at offsets 41, 46, 47 and 48 are still 169 B with 168 B unchanged. The readings show why "it opens" and "it says the same thing" differ:
| Byte edit | Variant file | Still parses | Notes read | Size | What the parser saw |
|---|---|---|---|---|---|
| — (source) | C-major-eight-notes-44k1.mid | yes | 14 | 169 B | baseline independent parse |
26 → 00 @ offset 48 | velocity-zero.mid | yes | 13 | 169 B | velocity 0 = release; first note never starts |
90 → 80 @ offset 46 | status-80-noteoff.mid | yes | 13 | 169 B | type changes; notes 13 |
90 → 91 @ offset 46 | status-91-channel1.mid | yes | 13 | 169 B | channel moves; 2 tracks |
90 → B0 @ offset 46 | status-B0-control.mid | yes | 13 | 169 B | type changes; notes 13 |
90 → FF @ offset 46 | status-FF-meta.mid | yes | 8 | 169 B | meta event swallows following bytes |
48 → 49 @ offset 47 | note-49-csharp5.mid | yes | 13 | 169 B | pitch moves; notes 13 |
48 → 00 @ offset 47 | note-00-cminus1.mid | yes | 13 | 169 B | pitch moves; notes 13 |
00 → 80 @ offset 41 | metalength-80-vlq.mid | no | — | 169 B | parse failed: unreadable event stream |
00 in velocity turns the first Note On into a release: the file still parses but reads 13 notes because that note never starts. 90 → 80, 91 or B0 also stays parseable with a lower note count; 91 moves the channel and the parser reports two tracks. FF makes the following bytes a meta event and swallows eight notes' worth of structure. At offset 41, changing the meta length 00 to 80 makes it the first byte of a two-byte VLQ, so the event stream is misread and the parse fails. A file that still parses is not necessarily a file with the same content, and a file that fails to parse may still be 169 B with one byte changed. The four velocity edits were therefore checked for note count, track count, PPQ, a row-by-row note comparison and a byte-for-byte restore, not merely for "it opened".
Walking delta-times and status bytes until the byte cursor reached offset 169, the end of the note track, yields 2 meta events, 1 Program Change, 14 Note On and 14 Note Off messages. Each row gives the offset, delta ticks, status byte and the message with its data bytes. No event uses running status.
| Event # | Offset | Delta ticks | Status byte | Message and data |
|---|---|---|---|---|
| 1 | 38 | 0 | FF | meta, type 03 |
| 2 | 42 | 0 | C0 | Program Change 00 |
| 3 | 45 | 0 | 90 | Note On 48 26 |
| 4 | 49 | 0 | 90 | Note On 3C 5B |
| 5 | 53 | 100 | 80 | Note Off 48 00 |
| 6 | 57 | 836 | 80 | Note Off 3C 00 |
| 7 | 62 | 23 | 90 | Note On 4A 24 |
| 8 | 66 | 0 | 90 | Note On 3E 5B |
| 9 | 70 | 89 | 80 | Note Off 4A 00 |
| 10 | 74 | 858 | 80 | Note Off 3E 00 |
| 11 | 79 | 12 | 90 | Note On 4C 22 |
| 12 | 83 | 0 | 90 | Note On 40 5F |
| 13 | 87 | 89 | 80 | Note Off 4C 00 |
| 14 | 91 | 847 | 80 | Note Off 40 00 |
| 15 | 96 | 23 | 90 | Note On 4D 27 |
| 16 | 100 | 0 | 90 | Note On 41 5E |
| 17 | 104 | 78 | 80 | Note Off 4D 00 |
| 18 | 108 | 859 | 80 | Note Off 41 00 |
| 19 | 113 | 23 | 90 | Note On 4F 24 |
| 20 | 117 | 0 | 90 | Note On 43 60 |
| 21 | 121 | 78 | 80 | Note Off 4F 00 |
| 22 | 125 | 881 | 80 | Note Off 43 00 |
| 23 | 130 | 10 | 90 | Note On 51 20 |
| 24 | 134 | 0 | 90 | Note On 45 5F |
| 25 | 138 | 78 | 80 | Note Off 51 00 |
| 26 | 142 | 859 | 80 | Note Off 45 00 |
| 27 | 147 | 12 | 90 | Note On 47 5F |
| 28 | 151 | 958 | 90 | Note On 48 62 |
| 29 | 156 | 1 | 80 | Note Off 47 00 |
| 30 | 160 | 913 | 80 | Note Off 48 00 |
| 31 | 165 | 0 | FF | meta, type 2F |
These 14 notes were read by the independent parser. The four velocity copies reproduce the same pitches, start ticks and duration ticks; only the first note's velocity differs. Time is seconds at 1/960 s per tick:
| # | Note name | Pitch | Velocity (0-1) | Duration ticks | Start (s) |
|---|---|---|---|---|---|
| 1 | C5 | 72 | 0.2992 | 100 | 0.000000 |
| 2 | C4 | 60 | 0.7165 | 936 | 0.000000 |
| 3 | D5 | 74 | 0.2835 | 89 | 0.998958 |
| 4 | D4 | 62 | 0.7165 | 947 | 0.998958 |
| 5 | E5 | 76 | 0.2677 | 89 | 1.997917 |
| 6 | E4 | 64 | 0.7480 | 936 | 1.997917 |
| 7 | F5 | 77 | 0.3071 | 78 | 2.996875 |
| 8 | F4 | 65 | 0.7402 | 937 | 2.996875 |
| 9 | G5 | 79 | 0.2835 | 78 | 3.996875 |
| 10 | G4 | 67 | 0.7559 | 959 | 3.996875 |
| 11 | A5 | 81 | 0.2520 | 78 | 5.006250 |
| 12 | A4 | 69 | 0.7480 | 937 | 5.006250 |
| 13 | B4 | 71 | 0.7480 | 959 | 5.994792 |
| 14 | C5 | 72 | 0.7717 | 914 | 6.992708 |
Nothing here encodes an instrument or a separate part: velocity belongs to one note event, so changing it cannot add, retune or re-time a note. For wrong notes after a conversion rather than a wrong velocity, see the clean-up MIDI page.
Open the 169 B source file in a hex editor at offsets 46–48: 90 48 26. Write one byte at offset 48, save and re-open with a MIDI library that reports velocities. Chunk lengths need no editing: all twelve variants are in-place single-byte writes, and writing 26 back restores the original exactly. To convert audio instead, the MP3 to MIDI converter runs in your browser and produces a single-track .mid.
Not here: no conversion-accuracy measurement, no speed figure, no tempo or BPM detection claim, no multitrack or per-instrument output, no drum track, no URL or YouTube input, and no claim that this site is more accurate than anyone else. Numbers come from one 169 B file published on 24 October 2026 and twelve one-byte edits, measured on 10 November 2026 (UTC). General format facts, method notes, limits and disclaimers are excluded from the exclusive-material denominators above.