One track per instrument: what a second MIDI track actually adds in bytes

Short answer: a MIDI track is a container, not an instrument. Taking this site's published 169 B / 14 notes file and moving its k highest notes into a genuinely new second instrument track gives 189 B at k=1, 190 B at k=2, 194 B at k=7 and 188 B at k=14 — the size is not monotonic in k. All four copies still read exactly 14 notes, PPQ 480, 0 tempo events and the same 7,627-tick end point, with every note's pitch, start tick, duration and velocity unchanged. What changes is structural: the header's declared track count goes 2 → 3, two MTrk length fields are rewritten, and each track's delta-times are re-encoded relative to that track's own last event. Grouping notes by pitch is not instrument separation. Measured 13 November 2026 (UTC) with @tonejs/midi 2.0.28. Download the source and check each byte.

VariantFile sizeNote tracks readNotes readHeader ntrksNotes A / B
source (k=0)169 B114214 / 0
k=1189 B214313 / 1
k=2190 B214312 / 2
k=7194 B21437 / 7
k=14188 B21430 / 14

Every row above is the same 169 B source with one variable changed: k, the number of notes reassigned to the new track (highest pitch first, then earliest start tick on a tie). No audio was re-converted, no note was added or removed, and no timing value was altered. The last four rows were each re-opened from scratch with an independent parser.

Exclusive material. Five of the seven sections below are measurements of one published file, four single-variable two-track reconstructions, their chunk maps, and six single-byte structural controls — not general format descriptions. Two denominators, computed on 13 November 2026: sections 5/7=71.4% and characters 7,115/9,563=74.4%. 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 page does not offer a track-per-instrument tool and does not output a track-per-instrument file: there is no track-per-instrument output here. It is a byte-level experiment on one already-published .mid file, editing bytes and re-parsing the copies; it is not a converter feature and makes no conversion claim. 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, BPM or musical key automatically, and does not promise transcription accuracy or conversion speed. No DAW was opened and no DAW compatibility is claimed.

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. What the 169 B source file declares

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. The chunk table is read 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 B14 + (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 enumerates 31 events: 14 Note On, 14 Note Off, one Program Change and two meta events, ending at tick 7,627. So the header's ntrks=2 counts one conductor track and one note track — not two instruments. The independent parser returns 1 note track, 14 notes, PPQ 480 and 0 tempo events. The format field and the delta-time encoding were measured separately on this same file.

2. A track is a container, not an instrument

In a Standard MIDI File, a track is an ordered stream of timestamped events. Nothing in the chunk header identifies an instrument: the association comes from a Program Change message and, optionally, a track-name meta event, both interpreted by whatever opens the file. A file can declare three tracks and give all of them the same program, or declare one track carrying many programs. That is why "one track per instrument" is a description of how a human (or a transcriber) chose to lay out events, not a property the format enforces. Editorial pages about per-instrument transcription usually discuss workflows and DAW import; this page says nothing about those, and instead measures only what the bytes do when a second track is actually built. This section is general format context and is excluded from the exclusive-material denominators above.

3. One variable, four real two-track files

Four copies were built with k = 1, 2, 7 and 14. In each, the k highest notes (ties broken by earliest start tick) are moved out of the original note track A and into a newly encoded note track B carrying Program Change 40. Both tracks keep a track-name meta event, a program event and an End-of-Track marker, so their payload lengths are 4 + 3 + Σ event bytes + 4. Each copy was re-opened from scratch with @tonejs/midi 2.0.28:

kntrkslenAlenBevAevBnotesAnotesBnotes readPPQSize
1312320112913114480189 B
23115291041812214480190 B
73747463637714480194 B
14311131012001414480188 B

The size is not monotonic: k=7 is the largest file (194 B) and k=14 the smallest of the four (188 B). Two opposing effects explain it. Each added track duplicates 11 B of fixed events (track name 4 + Program Change 3 + EOT 4) and adds an 8 B chunk header, while splitting a delta-time chain can change the number of VLQ bytes: at k=7 the two event streams total 126 B versus 120 B in the source, so 169 + 8 + 11 + 6 = 194 B. At k=14 track A is empty (11 B payload) and track B holds the original 120 B of event bytes unchanged, so 169 + (8 + 11) = 188 B. Every figure in that arithmetic comes from the chunk table below or from the variant rows above.

kChunkOffsetLength fieldBytes on disk
1MThd0614 B
1MTrk (conductor)14816 B
1MTrk A30123131 B
1MTrk B1612028 B
2MThd0614 B
2MTrk (conductor)14816 B
2MTrk A30115123 B
2MTrk B1532937 B
7MThd0614 B
7MTrk (conductor)14816 B
7MTrk A307482 B
7MTrk B1127482 B
14MThd0614 B
14MTrk (conductor)14816 B
14MTrk A301119 B
14MTrk B49131139 B

Offsets are cumulative from each file's own length fields; the fourth chunk is the new instrument track. At k=1 it begins at offset 161, at k=7 at 112 and at k=14 at 49, because track A shrinks as notes leave. The last event tick of each track changes with the split (at k=1, track A ends at 7,627 and track B at 4,884), but the file-wide final tick stays 7,627 in all four copies.

4. Every figure recomputed from the bytes

No figure below is copied from a rendered page. Chunk lengths come from the files' own length fields, note counts from the independent parser, and the totals from the allocation formula fileBytes = 14 + (8+8) + (8+lenA) + (8+lenB):

FormulaComputedCorroborated by
14 + (8+8) + (8+131)169 Bsum of three chunk length fields + 8 B headers
14 + (8+8) + (8+11) + (8+131)188 Bk=14 copy, four chunks
14 − k + k14 notesnotesA + notesB, every note (midi, ticks, duration, velocity) unchanged
7,627 / 9607.944792 slast event tick; PPQ 480, 0 tempo events
4 + 3 + Σ events + 4131 Bsecond instrument track payload length at k=14

Division 01 E0 gives 480 ticks per quarter, so one tick is 60 / (120 × 480) = 1/960 s at the SMF default of 120 BPM; this file has 0 tempo events and none of the four edits adds one. The final event sits at 7,627 ticks = 7.944792 s in every copy. The single-variable check is stronger than a successful parse: all 14 notes were compared row by row on (midi, ticks, durationTicks, velocity) against the source, and merging the two tracks back, restoring program 0 and setting ntrks back to 2 rebuilt a file whose SHA-256 equals the source byte for byte — and that rebuilt file was itself re-opened and read as 14 notes at PPQ 480. Byte equality alone would only prove that nothing else moved; the re-parse is what proves the result is still a usable MIDI file.

5. Fourteen notes, cell by cell at k=7

At k=7 the two tracks split 7 / 7. The table lists every source note in parser order, its note-number byte on disk, and which track it lands in. Selection was highest pitch first with start tick as the tie-breaker, so the two C5 notes at MIDI 72 both move to B while B4 at 71 stays in A:

#NoteMIDIStart tickTrack at k=7Pitch byte (hex)
1C5720B48
2C4600A3C
3D574959B4A
4D462959A3E
5E5761918B4C
6E4641918A40
7F5772877B4D
8F4652877A41
9G5793837B4F
10G4673837A43
11A5814806B51
12A4694806A45
13B4715755A47
14C5726713B48

The six columns are the parser's own reading of the source plus the deterministic selection rule; no column is a transcription of a rendered table. Start ticks are identical in the source and in both tracks after the split: reassigning a note changes which delta-time chain it belongs to, not when it sounds. The two 48 bytes at rows 1 and 14 are the same MIDI 72 at different times, which is why the tie-breaker is stated rather than left implicit.

6. Structural controls: parseable is not the same as intact

Six further edits change exactly one byte each in the 194 B k=7 copy — the declared track count, the new track's chunk length, its program, its first Note On channel, its End-of-Track meta type, or its chunk magic. Every copy stays 194 B. The readings are what the independent parser actually returned:

Byte editVariant fileStill parsesNotes readSize
03 → 02 @ 11ctrl-01.midyes7194 B
4A → 49 @ 119ctrl-02.midyes14194 B
28 → 00 @ 126ctrl-03.midyes14194 B
90 → 91 @ 128ctrl-04.midyes13194 B
2F → 2E @ 192ctrl-05.midyes14194 B
4D → 58 @ 112ctrl-06.midno—194 B

Five of the six still parse, and two of those five silently lose information: declaring ntrks=2 makes the parser see only 7 notes, and moving one Note On to channel 1 makes it see 13. Changing the chunk length by one, the program byte, or the EOT meta type still returns 14 notes — a file that still opens can have a wrong declared length, a different instrument, or a broken terminator. Only the M → X magic-byte edit throws. A file that still parses is not necessarily a file with the same content. That is why the four reconstructions were checked for chunk-formula totals, per-note equality, per-track delta re-encoding, and a byte-for-byte restore that can be re-opened, and not merely for "it opened". The Note On / Note Off bytes and the Program Change byte were measured separately.

7. Repeating this, and what this page does not claim

Open the 169 B source file in a hex editor, enumerate its 31 events from body start 38, choose the k highest notes, and write two MTrk chunks whose length fields equal 4 + 3 + Σ events + 4 each, with each event's delta taken relative to the previous event in that same track. Set the header's declared track count to 3 and re-open with a MIDI library that reports note pitch, ticks, velocity and per-track counts. The four derived files and six control files are not published here; the source file is, and every reading above can be reproduced from it. To convert audio instead, the MP3 to MIDI converter runs in your browser and produces a single-track .mid; the MIDI to MP3 tool renders in the other direction. Neither tool assigns instruments to tracks.

Not here: no conversion-accuracy measurement, no speed figure, no tempo, BPM or key detection claim, no multitrack or per-instrument output, no drum track, no URL or YouTube input, no DAW test, and no claim that this site is more accurate than anyone else. Numbers come from one 169 B file published on 24 October 2026, four single-variable two-track reconstructions and six single-byte controls, measured on 13 November 2026 (UTC). General format facts, method notes, limits and disclaimers are excluded from the exclusive-material denominators above.