MIDI Note On and Note Off: three bytes, one note

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 editFile sizeVelocity byteVelocity (0-1)First noteIndependent parse
Original (published file)169 B260.2992C5 / 7214 notes, PPQ 480
26 → 01 @ offset 48169 B010.0079C5 / 7214 notes, PPQ 480
26 → 40 @ offset 48169 B400.5039C5 / 7214 notes, PPQ 480
26 → 64 @ offset 48169 B640.7874C5 / 7214 notes, PPQ 480
26 → 7F @ offset 48169 B7F1.0000C5 / 7214 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.

1. Where the three bytes sit in a 169-byte MIDI file

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:

ChunkOffsetLength fieldBytes on diskWorking
MThd (header)0614 B8 + 6 = 14
MTrk (conductor)14816 B8 + 8 = 16
MTrk (notes)30131139 B8 + 131 = 139
Total——169 B8+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)ByteWhat the byte isHow it was derived
3800delta-time 0 before the track-name meta eventnote-track body starts at chunk offset 30 + 8
39–41FF 03 00track-name meta event, name length 0 at offset 413 bytes after the delta
4200delta-time 0 before Program Changenext event starts here
43C0Program Change status on channel 00xC0 >> 4 = 0xC
4400program number (GM instrument)unchanged by every edit on this page
4500delta-time 0 before the first Note Onone VLQ byte, value 0
4690status: Note On on channel 00x90 >> 4 = 9; & 0x0F = 0
4748data byte 1: note number = 72 (C5)decimal value of 0x48
4826data byte 2: velocity = 3838 / 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.

2. What Note On and Note Off are, and what they are not

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.

3. Four single-byte edits to the velocity byte

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 editOffsetBeforeAfterVelocity byteVelocity (0-1)NotesSize
26 → 0148260110.007914169 B
26 → 40482640640.503914169 B
26 → 644826641000.787414169 B
26 → 7F48267F1271.000014169 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.

4. Every number recomputed from the bytes

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:

FormulaComputedCorroborated by
8+6 + 8+8 + 8+131169 Bsum of the three chunk length fields + 8 B headers
0x90 >> 49high nibble of the status byte = Note On
0x80 >> 48high nibble of the release status = Note Off
0x90 & 0x0F0low nibble = MIDI channel 0
0x4872 (C5)data byte 1 = MIDI note number, 0..127
0x26 / 1270.2992data byte 2 = velocity, 0..127
0x01 / 0x40 / 0x64 / 0x7F ÷ 1270.0079 / 0.5039 / 0.7874 / 1.0000the four injected velocity values
169 − 1 changed byte168 B unchangedbyte diff of each injected copy
(0x01 << 8) | 0xE0480 ticks / quarterdivision field 01 E0 = parser PPQ
60 / (120 × 480)1/960 s per tickSMF default 120 BPM, no tempo event in this file
7,627 ticks × 1/960 s7.944792 slast 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.

5. A structural control: editing the other two bytes, and one meta-length byte

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 editVariant fileStill parsesNotes readSizeWhat the parser saw
— (source)C-major-eight-notes-44k1.midyes14169 Bbaseline independent parse
26 → 00 @ offset 48velocity-zero.midyes13169 Bvelocity 0 = release; first note never starts
90 → 80 @ offset 46status-80-noteoff.midyes13169 Btype changes; notes 13
90 → 91 @ offset 46status-91-channel1.midyes13169 Bchannel moves; 2 tracks
90 → B0 @ offset 46status-B0-control.midyes13169 Btype changes; notes 13
90 → FF @ offset 46status-FF-meta.midyes8169 Bmeta event swallows following bytes
48 → 49 @ offset 47note-49-csharp5.midyes13169 Bpitch moves; notes 13
48 → 00 @ offset 47note-00-cminus1.midyes13169 Bpitch moves; notes 13
00 → 80 @ offset 41metalength-80-vlq.midno—169 Bparse 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".

6. All 31 note-track messages and all 14 notes

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 #OffsetDelta ticksStatus byteMessage and data
1380FFmeta, type 03
2420C0Program Change 00
345090Note On 48 26
449090Note On 3C 5B
55310080Note Off 48 00
65783680Note Off 3C 00
7622390Note On 4A 24
866090Note On 3E 5B
9708980Note Off 4A 00
107485880Note Off 3E 00
11791290Note On 4C 22
1283090Note On 40 5F
13878980Note Off 4C 00
149184780Note Off 40 00
15962390Note On 4D 27
16100090Note On 41 5E
171047880Note Off 4D 00
1810885980Note Off 41 00
191132390Note On 4F 24
20117090Note On 43 60
211217880Note Off 4F 00
2212588180Note Off 43 00
231301090Note On 51 20
24134090Note On 45 5F
251387880Note Off 51 00
2614285980Note Off 45 00
271471290Note On 47 5F
2815195890Note On 48 62
29156180Note Off 47 00
3016091380Note Off 48 00
311650FFmeta, 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 namePitchVelocity (0-1)Duration ticksStart (s)
1C5720.29921000.000000
2C4600.71659360.000000
3D5740.2835890.998958
4D4620.71659470.998958
5E5760.2677891.997917
6E4640.74809361.997917
7F5770.3071782.996875
8F4650.74029372.996875
9G5790.2835783.996875
10G4670.75599593.996875
11A5810.2520785.006250
12A4690.74809375.006250
13B4710.74809595.994792
14C5720.77179146.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.

7. How to repeat this yourself, and what this page does not claim

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.