Note Local

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.

Input file, measured before the run
ItemValue
Filesample-4notes.wav
Size211,724 bytes
SHA-25627a8563308993e8a387c656130582937b239a1b64f07412dd90b68b40bb67c66
Duration as written4.8 seconds
FormatMono, 16-bit PCM, 22,050 Hz
Sample rate after browser decode44,100 Hz, 1 channel (the browser resampled it)

The requests

Network activity during the whole page load and conversion
ObservationMeasured value
Total requests11
Requests that could carry an upload (non-GET/HEAD, or with a body)0
External hostscdn.jsdelivr.net, static.cloudflareinsights.com
External requests4
Failed requests1 (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:

Model and runtime resources, all GET, all HTTP 200
ResourceBytes
tfjs-backend-wasm-simd.wasm (TensorFlow.js WASM 3.21.0)377,757
@spotify/basic-pitch@1.0.1/model/model.json174,537
@spotify/basic-pitch@1.0.1/model/group1-shard1of1.bin742,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

Output of the conversion, measured after the run
ItemValue
Filesample-4notes.mid
Size106 bytes
HeaderMThd (Standard MIDI File)
SHA-25697cd89629a5326fa591a28affcda03b000fbed8537479299102da8ff583d9f7b
Detected notes4
Tracks1
Note duration covered4.751 seconds
Engine@spotify/basic-pitch 1.0.1 / TensorFlow.js WASM 3.21.0 in Web Worker
Backendwasm
Detection parametersonset 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

Timings from the same run
StageSeconds
Engine and model loading2.882
Conversion itself5.035
Total reported by the page7.987
Wall-clock time measured around the click8.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.

Diagram of the measured network flow: the audio file stays in the browser, model files arrive by GET, and a MIDI file is produced locally
Where the 11 requests went, and the 0 upload requests.
Diagram of the measured input and output: 211,724 byte WAV, 106 byte MIDI, 4 notes, 1 track, MThd header
Input and output values, copied from the conversion report rather than drawn to scale.
Bar chart of measured timings: 2.882, 5.035, 7.987 and 8.406 seconds
Model loading and detection are separate costs.

What this measurement does not prove

How to repeat this check yourself

  1. Open the converter and your browser's developer tools Network panel before selecting a file.
  2. Choose a small MP3 or WAV, then press Convert to MIDI.
  3. 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.
  4. Check that the external requests are GETs for the model and runtime files on cdn.jsdelivr.net.
  5. 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.