ENCODING CONTROLS / OFFLINE CPU / OCTOBER 19, 2026
MP3 to MIDI.
Smaller files. Separate note fields.
For two fixed synthetic sources, 6 of 6 MP3 exports matched their WAV event counts; 6 matched pitch-and-timing geometry, and 2 matched all saved note fields including velocity. The selected targets were 32, 64 and 128 kbps. The 32/64 inputs were newly encoded and inferred offline; WAV and 128 kbps captures are retained anchors. These results do not establish a best bitrate or musical accuracy.
Keep the source.
Change the encoding.
| Fixed source | Input | Actual stream | File bytes | MIDI events | Capture |
|---|---|---|---|---|---|
| first-only | WAV | 22050 Hz / 1 channels | 141164 | 2 | Retained Oct18 capture |
| first-only | 32 kbps target | 22050 Hz / mono | 13287 | 2 | New Oct19 input capture |
| first-only | 64 kbps target | 22050 Hz / mono | 26374 | 2 | New Oct19 input capture |
| first-only | 128 kbps target | 22050 Hz / mono | 52705 | 2 | Retained Oct18 capture |
| second-only | WAV | 22050 Hz / 1 channels | 141164 | 2 | Retained Oct18 capture |
| second-only | 32 kbps target | 22050 Hz / mono | 13287 | 2 | New Oct19 input capture |
| second-only | 64 kbps target | 22050 Hz / mono | 26374 | 2 | New Oct19 input capture |
| second-only | 128 kbps target | 22050 Hz / mono | 52705 | 2 | Retained Oct18 capture |
first-only / WAV
Input stream: 22050 Hz / 1 channels. Actual file: 141164 bytes. MIDI events: 2. Retained Oct18 capture.
first-only / 32 kbps target
Input stream: 22050 Hz / mono. Actual file: 13287 bytes. MIDI events: 2. New Oct19 input capture.
first-only / 64 kbps target
Input stream: 22050 Hz / mono. Actual file: 26374 bytes. MIDI events: 2. New Oct19 input capture.
first-only / 128 kbps target
Input stream: 22050 Hz / mono. Actual file: 52705 bytes. MIDI events: 2. Retained Oct18 capture.
second-only / WAV
Input stream: 22050 Hz / 1 channels. Actual file: 141164 bytes. MIDI events: 2. Retained Oct18 capture.
second-only / 32 kbps target
Input stream: 22050 Hz / mono. Actual file: 13287 bytes. MIDI events: 2. New Oct19 input capture.
second-only / 64 kbps target
Input stream: 22050 Hz / mono. Actual file: 26374 bytes. MIDI events: 2. New Oct19 input capture.
second-only / 128 kbps target
Input stream: 22050 Hz / mono. Actual file: 52705 bytes. MIDI events: 2. Retained Oct18 capture.
The two-boundary source experiment supplied the first-only and second-only WAVs used here. Those files are copied byte-for-byte, not regenerated with altered phase, duration, envelope or amplitude. Within each source, every new encoding starts from that same WAV. The two source constructions remain distinct controls, not statistical replicates of a natural performance.
The new encoder targets are 32 and 64 kbps. The existing 128 kbps MP3 and original WAV are retained reference files with their original model captures. There are 4 new Oct19 input captures and 4 prior captures in this record. The actual number of model evaluations in the measurement run is separately recorded as 4, rather than counting a replay as a new model execution.
A matching total
does not compare the notes.
| MP3 input | Event-count difference | Geometry identical | All note fields identical | MIDI bytes identical |
|---|---|---|---|---|
| first-only-32k | 2 - 2 = 0 | yes | yes | yes |
| first-only-64k | 2 - 2 = 0 | yes | yes | yes |
| first-only-128k | 2 - 2 = 0 | yes | no | no |
| second-only-32k | 2 - 2 = 0 | yes | no | no |
| second-only-64k | 2 - 2 = 0 | yes | no | no |
| second-only-128k | 2 - 2 = 0 | yes | no | no |
first-only-32k versus its WAV
Count difference: 2 - 2 = 0. Geometry identical: yes. All note fields identical: yes. MIDI bytes identical: yes.
first-only-64k versus its WAV
Count difference: 2 - 2 = 0. Geometry identical: yes. All note fields identical: yes. MIDI bytes identical: yes.
first-only-128k versus its WAV
Count difference: 2 - 2 = 0. Geometry identical: yes. All note fields identical: no. MIDI bytes identical: no.
second-only-32k versus its WAV
Count difference: 2 - 2 = 0. Geometry identical: yes. All note fields identical: no. MIDI bytes identical: no.
second-only-64k versus its WAV
Count difference: 2 - 2 = 0. Geometry identical: yes. All note fields identical: no. MIDI bytes identical: no.
second-only-128k versus its WAV
Count difference: 2 - 2 = 0. Geometry identical: yes. All note fields identical: no. MIDI bytes identical: no.
The count formula is candidateCount - referenceCount. Both inputs are parsed event totals from the named MP3 and WAV MIDI files, not expected note counts from the source construction. The result JSON gives both export filenames and counts for every subtraction. The displayed tally 6 of 6 is the number of rows for which that difference is zero; it is not a percentage of correctly transcribed music.
Geometry is checked separately by comparing the ordered parsed pitch, tick, duration-tick, start-second and duration-second fields. The complete note-field check adds velocity. A final check compares the actual MIDI byte hash. These are different equality questions: matching counts do not answer the geometry question, and matching geometry does not imply matching velocity. The comparison uses full numeric fields; rounded text on this page is not the equality test.
Across the measured MP3 rows, 6 of 6 geometry comparisons and 2 of 6 complete field comparisons match their corresponding WAV reference. These tallies describe only these saved exports. They do not rank an encoder, prove a bitrate threshold or determine whether a performer intended any of the exported boundaries. If a geometry comparison matches, the independently recorded decoded audio hash still tells a different, source-level question.
Read the stream.
Do not assume the label.
Every actual input is inspected with the installed FFmpeg before decoding. Its input-stream line, sample rate, channel description and reported stream bitrate are saved verbatim in the result record. New MP3 encoding explicitly selects libmp3lame, -ar 22050, -ac 1 and the chosen -b:a target. The command arguments are retained for each new input. The retained reference files are not silently re-encoded today.
Declared mono/sample-rate mismatches in this record: 0. FFmpeg's description 1 channels is interpreted as one channel, equivalent to mono for this check; the original wording remains available. This normalization does not change audio or invent a stream value. If the encoder changed a relevant stream setting, that would be a confound to disclose, not a reason to label the run bitrate-only anyway.
Native decoding then produces mono float32 samples at 22050 Hz for the unchanged model. Each file's decoded sample count, RMS, peak and SHA-256 are recorded. A target bitrate is an encoder setting, a stream line is an inspected description, file bytes are a saved-file size and a decoded-sample hash identifies actual model input. None of those measurements substitutes for the others.
The two WAV hashes are the source identity check. No normalization, added silent gap, changed phase reset or new fade is applied before encoding. Compression can change the decoded samples, so equal source WAVs do not mean every candidate has equal decoded waveform or energy. This experiment checks those actual files; it does not make a listening-quality judgment.
An encoding observation.
Not a recommended setting.
A converter user's useful distinction here is between a file that is smaller, an export with the same total and an export with the same complete note data. The measured table keeps those outcomes separate instead of treating the first one as a promise about the last. The unchanged WAV remains a reference export, not a ground-truth musical score.
The sources are authored sine-wave controls with one selected frequency and boundary construction, not songs, voices or recorded instruments. The chosen bitrate settings and these few inputs cannot establish a safe minimum rate for other audio. We did not compare perceived sound quality, run the public browser converter, test a physical phone, import into a DAW or measure musical accuracy. A count difference is not an accuracy score, and zero count difference is not a guarantee of correct notes.
MP3MIDITool's input and repair guidance describes editable note timing rather than a copy of the source waveform. That observed workflow motivates inspecting exports beyond a filename. This is a separate project-authored experiment, not a test of that converter. Only the fixed comparison pages were reviewed; no claim about all pages elsewhere or a current ranking is made.
New encoding.
Original capture dates.
Basic Pitch 1.0.1, TensorFlow.js 3.21.0, MIDI writer 2.0.28, v24.19.0 on win32; offline CPU backend. Native encoder: ffmpeg version 6.0-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers. Onset and frame thresholds remain 0.25 and 0.25, with an extraction minimum of 5 frames. The converter source and prior experiment bodies are unchanged.
Retained files must match actual input bytes, decoded float32 hashes and model hashes before their capture is reused. Original capture dates stay intact. New input captures contain the real frame, onset and contour matrices. Re-extraction rebuilds each Standard MIDI and parses it back; an independent check requires the exact MIDI hash and complete fields to agree. Reusing or replaying a capture is not a newly executed inference.
Capture timestamps have a separate clock basis. During publication, the execution-host clock disagreed with the live HTTP Date and Cloudflare deployment clock. The JSON field capturedAtUtc is preserved as a raw host-clock reading, not certified wall-clock UTC. No offset has been applied to old or new captures; use hashes to check identity, not clock differences to infer elapsed experiment time. Publication times come from the deployment service. Inspect the observed clock readings.
Model manifest SHA-256: 1ed1aaee3409ec1dc098c8b01f430c0911f6fe9412e7af8086750f9e8f302f68. Combined weights: b142a95737a52e1e412d5f92e73d8bb80dfe8d04941acc0702f11f4524fb377c. Unchanged converter source: e42f9b0b60bb6fd73b2539a1ae9ca3b09f34ab874e35423162b384df68c19660. No visitor recording is used or uploaded. The joining experiment and repeated-note counterexample retain their original bodies and reciprocal links.
The actual fields
behind each export.
These lines come from the saved Standard MIDI files, not model predictions written directly into prose. Seconds and velocity are rounded to six decimal places for display; full precision, ticks, duration ticks and PPQ remain in the result record. No musical-intent label is assigned to the source construction or to an exported event.
- first-only / WAVpitch 69; start 0.162500 s; duration 0.812500 s; velocity 0.614173 | pitch 69; start 0.986458 s; duration 1.638542 s; velocity 0.614173
- first-only / 32 kbps targetpitch 69; start 0.162500 s; duration 0.812500 s; velocity 0.614173 | pitch 69; start 0.986458 s; duration 1.638542 s; velocity 0.614173
- first-only / 64 kbps targetpitch 69; start 0.162500 s; duration 0.812500 s; velocity 0.614173 | pitch 69; start 0.986458 s; duration 1.638542 s; velocity 0.614173
- first-only / 128 kbps targetpitch 69; start 0.162500 s; duration 0.812500 s; velocity 0.622047 | pitch 69; start 0.986458 s; duration 1.638542 s; velocity 0.606299
- second-only / WAVpitch 69; start 0.162500 s; duration 1.625000 s; velocity 0.614173 | pitch 69; start 1.800000 s; duration 0.826042 s; velocity 0.606299
- second-only / 32 kbps targetpitch 69; start 0.162500 s; duration 1.625000 s; velocity 0.614173 | pitch 69; start 1.800000 s; duration 0.826042 s; velocity 0.598425
- second-only / 64 kbps targetpitch 69; start 0.162500 s; duration 1.625000 s; velocity 0.614173 | pitch 69; start 1.800000 s; duration 0.826042 s; velocity 0.598425
- second-only / 128 kbps targetpitch 69; start 0.162500 s; duration 1.625000 s; velocity 0.614173 | pitch 69; start 1.800000 s; duration 0.826042 s; velocity 0.598425
Download the files.
Check the differences.
Full results and provenance include original timestamps, input-stream text, encoder arguments, decoded hashes, comparisons and all MIDI fields. Reproduction code runs in this project's locked environment as node scripts/measure-mp3-bitrate.cjs. Prior Oct18 source evidence is needed for reference validation. With --replay, a missing model capture is refused rather than invented, and actual model executions remain counted separately.
- first-only / WAV inputRetained Oct18 capture. Raw capture-clock reading: 2026-10-18T03:59:52.990Z. Input SHA-256:
5717d14a433763ad08676a3194a5f5cce6645149cf5cccb106e0d039f475f7c2. Captured model output:0c30695f73ce52870f30cd0754294ca5bf2fe1c1c733125fa3e86de55b8f52bf. Actual MIDI:9b06b137eac75cea4c89496acf1f66874d61bc446a2d993e239161af0179600d. - first-only / 32 kbps target inputNew Oct19 input capture. Raw capture-clock reading: 2026-10-18T19:01:47.546Z. Input SHA-256:
ed1cd12057a708366068d1053fc4f80e7de00635e9d01ab8a1a42efb3ea709e8. Captured model output:e2b1655bb58fad07816daa7c9e0b7faa163cfcd71abc345c14e15bbf14213217. Actual MIDI:9b06b137eac75cea4c89496acf1f66874d61bc446a2d993e239161af0179600d. - first-only / 64 kbps target inputNew Oct19 input capture. Raw capture-clock reading: 2026-10-18T19:02:17.165Z. Input SHA-256:
e9a857dc9e39a8e8bbd4e8507b8ce0bd878c47b370ff60cbfc3b0295932286bc. Captured model output:62ead923f6fee772076754401803cd0585edcbe2f9e26ad0b92f0a6c801226fc. Actual MIDI:9b06b137eac75cea4c89496acf1f66874d61bc446a2d993e239161af0179600d. - first-only / 128 kbps target inputRetained Oct18 capture. Raw capture-clock reading: 2026-10-18T04:00:21.477Z. Input SHA-256:
40cecf2f9251c9d756266eb1437415d5cff0ad0d093216606005427d3bf95797. Captured model output:1e705817ff47cccd5781537affbd0fff377ede6613697670cbd2d88d3e8a06b9. Actual MIDI:48f41d2caf7a6702e4f52ade6241675ae32d9da262772bc385032f8e501bda74. - second-only / WAV inputRetained Oct18 capture. Raw capture-clock reading: 2026-10-18T04:00:55.335Z. Input SHA-256:
85d935ba4b881059cf2fb3254f2c7fc08818ebd65126d9aca12933411be51ece. Captured model output:c1334d608de171abadfd9499a6c71e0ca7fbea595324c199b85f1b408495f0fd. Actual MIDI:d579396eb3a4f000c3cd18587271d5a0dbba44e1f6699f2d62e9697adc1270ad. - second-only / 32 kbps target inputNew Oct19 input capture. Raw capture-clock reading: 2026-10-18T19:02:46.625Z. Input SHA-256:
7346b371a316906999811e41b717db8741e7ea9f4ded7391ab51756b8bd1a477. Captured model output:0ffb3803f483f1c0e0da03bae6702bf22a5d48edbd66fd66f0dc606cd4486a19. Actual MIDI:3cca788b6844af29fc4fe9e1df3db083a02f9904842dc5a0515d8c97e7548423. - second-only / 64 kbps target inputNew Oct19 input capture. Raw capture-clock reading: 2026-10-18T19:03:32.511Z. Input SHA-256:
5c6d9d94db38c94b0e8bf811da7e9f15626cee90c28948cb2773c3eb858579fe. Captured model output:2d04c782a3b98d5d09a856ef937de90dffa6c04afb0a47233bf1422fad8d9b16. Actual MIDI:3cca788b6844af29fc4fe9e1df3db083a02f9904842dc5a0515d8c97e7548423. - second-only / 128 kbps target inputRetained Oct18 capture. Raw capture-clock reading: 2026-10-18T04:01:27.689Z. Input SHA-256:
1ee66119d8a0c8953077398bc26085007898f7eac1ebb70a58ef56a429eaf197. Captured model output:7cf5463398ccaeb77f1b25efde734678a75d70546d7306fc165083e81640148e. Actual MIDI:3cca788b6844af29fc4fe9e1df3db083a02f9904842dc5a0515d8c97e7548423.
All source audio was generated by this project. These controls are evidence files, not user recordings. The single-boundary matrix keeps its original claim; this page changes only the encoding path for two of its saved WAV sources.