Why this tool is single-file by design
The converter on the homepage accepts one audio file at a time. The file input element (<input type="file">) in the HTML does not have the multiple attribute. When you drag and drop a file, the drop handler reads e.dataTransfer.files[0] — the first file only. Once a file is loaded, the converter decodes it, runs pitch detection, displays the note list, and lets you download the result. There is no queue, no pending list, and no way to stack files.
This is not a limitation we are hiding. It is a consequence of how the tool works. The audio is decoded by the Web Audio API inside your browser. The pitch detection — an autocorrelation function called autoCorrelate — runs as JavaScript on your device's CPU. The MIDI bytes are assembled by a function called buildMidi and offered as a download via URL.createObjectURL. No part of this pipeline touches a server. A batch system that processes files in parallel would need a server to receive and store your files, which contradicts the no-upload design.
The no-upload tradeoff
Because your files never leave your device, there is no server-side queue, no cloud processing, and no way to submit a batch job. Every conversion happens in your active browser tab. If you close the tab, the work is gone. This is the tradeoff: privacy and simplicity in exchange for no batch automation in the web interface.
What a realistic batch workflow looks like
If you have a handful of files — say five to ten melodies you hummed into your phone — the workflow is straightforward:
- Open the converter on hummingtomidi.com.
- Load the first MP3. Drag and drop it or click to browse.
- Click convert. The pitch detector runs through the audio frame by frame, using a hop size of
0.023 * sampleRatesamples and a window of0.046 * sampleRatesamples, mapping each detected frequency to a MIDI note number withMath.round(69 + 12 * Math.log2(f / 440)). - Check the note list before downloading. Each entry shows the note name (like C4 or F#3), the start time in seconds, and the duration in seconds. If the output looks wrong — wrong octave, missing notes, garbage from a noisy recording — the source audio needs cleaning before reconverting. See our guide on why your MP3 to MIDI sounds bad.
- Download the .mid file. It is a Standard MIDI File (SMF format 0, 480 PPQ, 120 BPM) generated entirely in your browser.
- Repeat for the next file. Click the remove chip to clear the current file, then load the next one.
For five files, this takes a few minutes. For fifty files, it becomes tedious. For five hundred, it is impractical. The rest of this page addresses what to do when the manual workflow is not enough.
When you need actual batch automation
If you are converting a large collection of audio files — a sample library, a set of field recordings, or an archive of vocal takes — the browser interface is not the right tool for the job. The realistic options are:
Option 1: Script it locally with the same algorithm
The pitch detection and MIDI writing logic in this tool is JavaScript. The core functions — autoCorrelate for pitch detection, detectNotes for note tracking, and buildMidi for SMF generation — are self-contained and do not depend on a server. If you are comfortable with Node.js, you can replicate the pipeline locally:
- Use a library that decodes MP3 to PCM samples (the browser version uses
decodeAudioData). - Port the
autoCorrelatefunction — it takes a float array of samples and a sample rate, computes RMS to reject silence (threshold below 0.008 returns -1), trims the buffer at a 0.2 amplitude threshold, runs autocorrelation, finds the peak, applies parabolic interpolation, and returns the frequency assampleRate / T0. - Port
detectNotes— it walks the mono buffer with the hop and window sizes mentioned above, callsautoCorrelateon each window, maps frequencies above 0 and below 2000 Hz to MIDI note numbers, groups consecutive same-pitch frames into notes, and filters out notes shorter than the minimum duration threshold. - Port
buildMidi— it takes the note array and writes an SMF format 0 file with PPQ of 480, BPM of 120, note-on velocity of 90, and VLQ-encoded delta times. - Loop over your file list, run the pipeline for each file, and write the
.midoutput to disk.
This gives you true batch processing with the same detection logic, running on your machine, with no uploads. The code is visible in app.js on this site — you can read every function and replicate it.
Option 2: Use a DAW or audio editor with scripting
If you already work in a DAW like Reaper, Ableton Live, or Logic Pro, you may have access to scripting or batch processing features. Reaper's ReaScript, Ableton's Max for Live, and Logic's Scripter all let you automate repetitive tasks. You can write a script that imports each audio file, runs a pitch-to-MIDI function (Reaper has a built-in "Audio to MIDI" feature), and exports the result. This is a different detection algorithm than the one on this site, but it solves the batch problem within a tool you already own.
Option 3: Accept the manual workflow and prioritize
If you have a large collection but only need MIDI for a subset — the melodies you actually want to use, the takes that mattered, the ideas worth developing — then the manual workflow is fine. Convert the files you care about, one at a time, and skip the rest. The tool is free, requires no login, and adds no per-file cost. The constraint is your time, not money or account limits.
What does not work
Some things that sound like they should work for batch MP3-to-MIDI conversion but do not:
- Dropping a folder onto the converter. The drop handler reads one file. Even if the browser supported folder drops, the tool has no queue to hold multiple files.
- Opening multiple tabs. You can open several tabs and convert different files in each, but each tab decodes audio and runs autocorrelation on your CPU independently. Browser memory and CPU limits will cap how many you can run before tabs crash or the browser becomes unresponsive. This is parallelism by brute force, not a batch feature.
- Expecting a queue or background processing. There is no service worker, no background job, and no cloud backend. Closing the tab stops everything.
- Uploading to a server for batch processing. This tool has no upload endpoint. The
decodeAudioDatacall happens on the client. There is no API endpoint that accepts your files and returns MIDI in bulk.
Quality stays the same whether you convert one or many
Batch processing does not change the accuracy of the conversion. Each file is processed identically — the same autocorrelation function, the same hop and window sizes, the same frequency-to-MIDI mapping, the same minimum duration filter. Whether you convert one file or fifty, the pitch detector is monophonic: it detects one pitch per window, and chords or multi-instrument audio will not convert cleanly. If a file produces bad output in a single-file conversion, it will produce the same bad output in a batch script. The fix is always the same: use cleaner source audio, isolate the melody, and feed the converter a single-line input.
For more on what causes bad output and how to fix it, read why your MP3 to MIDI sounds bad. For the specific limitations of monophonic detection, see why MP3 to MIDI cannot hear chords.
The honest summary
No browser-based tool that never uploads your files can also be a one-click batch processor. The no-upload design — decoding audio with decodeAudioData, running autocorrelation in JavaScript, generating SMF bytes with buildMidi — means every conversion happens in your active tab, one file at a time. For a small number of files, the manual workflow works. For large collections, port the detection logic to a local script and run it on your machine. The code is on this page and in app.js — nothing is hidden, nothing requires a server, and nothing sends your audio anywhere.