Does MP3 to MIDI conversion upload your audio?
No — not on this site, in the run we measured. We performed a real conversion while recording every network request the browser made. There were 11 requests. None was a POST, PUT, or any request carrying a body. Only two external hosts appeared: a public model CDN and a host-injected analytics script that this page's Content Security Policy blocked. The audio file itself was not sent anywhere in this run.
Measured on 6 November 2026 in Chrome 156.0.8078.80 on Windows, with one 4.8-second synthesised WAV containing four notes. This is a report of one run, not a guarantee about every browser, every extension, or every file. The input in this run was WAV, not MP3.
What we measured
We generated a WAV file locally: four sine-wave notes (261.63, 329.63, 392.00 and 523.25 Hz), 1.2 seconds each, mono, 16-bit, written at 22,050 Hz. Then we opened the public converter page, selected that file, pressed Convert to MIDI, and recorded the browser's network activity together with the conversion report that the page produces itself.
| Item | Value |
|---|---|
| File | sample-4notes.wav |
| Size | 211,724 bytes |
| SHA-256 | 27a8563308993e8a387c656130582937b239a1b64f07412dd90b68b40bb67c66 |
| Duration as written | 4.8 seconds |
| Format | Mono, 16-bit PCM, 22,050 Hz |
| Sample rate after browser decode | 44,100 Hz, 1 channel (the browser resampled it) |
The requests
| Observation | Measured value |
|---|---|
| Total requests | 11 |
| Requests that could carry an upload (non-GET/HEAD, or with a body) | 0 |
| External hosts | cdn.jsdelivr.net, static.cloudflareinsights.com |
| External requests | 4 |
| Failed requests | 1 (the host-injected analytics script, blocked by the page's CSP) |
Three of those external requests were GETs for the publicly hosted runtime and model files. The page's own conversion report recorded each one:
| Resource | Bytes |
|---|---|
tfjs-backend-wasm-simd.wasm (TensorFlow.js WASM 3.21.0) | 377,757 |
@spotify/basic-pitch@1.0.1/model/model.json | 174,537 |
@spotify/basic-pitch@1.0.1/model/group1-shard1of1.bin | 742,392 |
These are public package files fetched from a CDN so the model can run inside a Web Worker. They are inbound downloads, not outbound copies of your recording. The site's response header restricts what the page may load:
content-security-policy: default-src 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self'; font-src 'self'; img-src 'self' data:; worker-src 'self' blob:; connect-src 'self' https://cdn.jsdelivr.net blob:; media-src 'self' blob:; object-src 'none'; base-uri 'self'; form-action 'none'
The hosting platform injects a Cloudflare Insights script into served pages. In this run that script was blocked by the script-src 'self' rule above, which is the one failed request in the table.
What came out
| Item | Value |
|---|---|
| File | sample-4notes.mid |
| Size | 106 bytes |
| Header | MThd (Standard MIDI File) |
| SHA-256 | 97cd89629a5326fa591a28affcda03b000fbed8537479299102da8ff583d9f7b |
| Detected notes | 4 |
| Tracks | 1 |
| Note duration covered | 4.751 seconds |
| Engine | @spotify/basic-pitch 1.0.1 / TensorFlow.js WASM 3.21.0 in Web Worker |
| Backend | wasm |
| Detection parameters | onset threshold 0.5; frame threshold 0.3; minimum note frames 11; model sample rate 22,050 Hz |
The four notes in the WAV produced four notes in the MIDI file. That is a result for this one synthetic file; it says nothing about how a full song, drums, or vocals would behave.
Where the time went
| Stage | Seconds |
|---|---|
| Engine and model loading | 2.882 |
| Conversion itself | 5.035 |
| Total reported by the page | 7.987 |
| Wall-clock time measured around the click | 8.406 |
Model loading is a separate cost from detection. On a later conversion in the same tab, cache behaviour may differ; we did not measure a second run.
Three diagrams from the same run
Each diagram is drawn directly from the measurement file of this run, so the numbers in the images match the tables above.
What this measurement does not prove
- One run, one synthetic file, one browser build. We did not repeat it across browsers, devices, or network conditions.
- The input was WAV. We did not test an MP3 here, so this page makes no claim about how lossy compression changes detected notes.
- The CDN can observe that a client requested those three public model files. We did not inspect what any CDN logs.
- The host-injected analytics script was blocked in this run by the CSP. We did not test a browser or extension that overrides that policy.
- We did not audit browser extensions, server-side logs, or the hosting platform's own processing. Our observation is limited to the browser's network activity and the page's own report.
How to repeat this check yourself
- Open the converter and your browser's developer tools Network panel before selecting a file.
- Choose a small MP3 or WAV, then press Convert to MIDI.
- In the Network panel, look for POST, PUT, or PATCH requests, and inspect any request that has a payload. In our run there were none.
- Check that the external requests are GETs for the model and runtime files on
cdn.jsdelivr.net. - Press Download conversion report on the result panel. It contains the input hash, output hash, note count, timings, parameters, and the resource list shown above, so you can compare your own run with this one.
Short answers
Does the converter need an account?
The tool page has no sign-in control and no account step. In this run the MIDI file was available to download directly after conversion.
Can I keep the MIDI file?
Yes. In this run the page produced a .mid download of 106 bytes. The download is generated in the browser from the conversion result.
Does the MIDI contain my original recording?
No. It contains notes, timing and velocity. The original sound, voices and effects are not in the file; the tool page states this too.
Is my audio stored after I close the tab?
We did not observe an upload or storage request in this run, and we did not audit anything outside the browser's network activity. That is the extent of what we can report here.