Skip to the answer

ORIGINAL STEREO CONTROL / OCTOBER 5, 2026

MP3 to MIDI.
Keep the signal.

Check the mono signal before blaming note detection. Opposite left and right channels can cancel when averaged. In our generated WAV and MP3 controls, that average was exactly zero and exported no notes. Keeping the original left channel produced MIDI again. Recover a suitable channel from the original source; turning up an already-cancelled mix cannot restore it.

Same melody. A different channel relationship.

We generated a 2.5-second phrase with pitches 60, 64, 67 and 72. The defined tone starts are 0.2, 0.75, 1.3 and 1.85 seconds, each lasting 0.35 seconds, rounded to whole samples at 22,050 Hz. The WAV generator uses 16-bit PCM, a defined peak of 0.4 and a 220-sample edge fade. No music recording or user file was used.

For the first stereo source, both channels contain the same samples. For the second, the right channel is the exact negative of the left. A third, single-channel source keeps the original left samples. Each was also encoded to 128 kbps MP3, giving six files. The mono source was not extracted from the cancelled average.

SAME-POLARITY CONTROL4 / 5 notesWAV / MP3, offline export.
Both retain a nonzero mono signal.
OPPOSITE-POLARITY CONTROL0 notesBoth formats. Mono RMS = 0.
No MIDI file was written.
ORIGINAL LEFT AS MONO4 / 5 notesWAV / MP3, offline export.
A channel-preserving input, not a repair of silence.
Same samples average to the original signal; a signal plus its exact negative averages to zero; keeping one original channel avoids that averaging
Algebraic schematic of the generated controls, not a screenshot of a music waveform. Open the full-size diagram.

Native FFmpeg decoded each file to stereo Float32 samples at 22,050 Hz. We explicitly calculated mono[i] = (left[i] + right[i]) / 2, then ran the installed Basic Pitch 1.0.1 model on Node's CPU backend. Note extraction used this site's unchanged thresholds: onset 0.25, frame 0.25 and minimum length 5 frames. These are settings, not accuracy claims.

For the single-channel control, this particular offline decoder first upmixed mono to stereo. That introduced a gain difference: its WAV average RMS was 0.14678459295747626, versus 0.20758476563144898 for the same-polarity stereo WAV. Do not interpret that difference as source damage or a browser measurement. The result here is the presence or absence of a signal and exported notes, not equal amplitude across decoder paths.

The average disappears before the model runs.

Actual offline results. RMS is the decoded average's amplitude in normalized sample units.
InputMono RMS, roundedExported notesMIDI bytes
Same polarity · WAV0.2075854130
Same polarity · MP30.1972035138
Opposite polarity · WAV00No file
Opposite polarity · MP300No file
Original left as mono · WAV0.1467854130
Original left as mono · MP30.1394425138

Same polarity

WAV: RMS 0.207585 · 4 notes · 130 bytes.
MP3: RMS 0.197203 · 5 notes · 138 bytes.

Opposite polarity

WAV and MP3: RMS 0 · 0 notes.
No MIDI file was written.

Original left as mono

WAV: RMS 0.146785 · 4 notes · 130 bytes.
MP3: RMS 0.139442 · 5 notes · 138 bytes.

RMS was calculated as sqrt(sum(mono[i]²) / N); N = 55,125 decoded samples for each file. The nonzero table values are rounded to six decimals. Both opposite-polarity inputs had zero peak as well as zero RMS, despite their separate left and right channels remaining nonzero. The raw report contains the full values and hashes.

Measured mono RMS for six offline decodes: both opposite-polarity controls are zero while the other four are nonzero
Bars are calculated from our raw RMS values, not an accuracy or loudness score. The gain caveat for the single-channel controls is described above. Open the measured chart.

The detector returned no events for either cancelled average. Our script did not create an empty MIDI as a pretend success. For the two WAV controls with signal, the parsed pitches were 60, 64, 67 and 72. Both corresponding MP3 runs split pitch 60 into two adjacent events, producing five events from four tones. Recovering the input signal did not eliminate that separate transcription defect.

All four successful MIDI files were serialized and parsed again. They contain the actual detected events; sizes are the resulting file bytes. Our separate held-tone experiment addresses event splitting. No full-song, vocal, DAW import or phone conversion result is claimed by these six CPU runs.

Inspect the input, then change one thing.

  1. Keep the original stereo source. Inspect or listen to left, right and the mono sum separately in an editor. Silence in the average with signal in each side is the condition this experiment isolates.
  2. If one original channel contains the melody you need, export that channel alone as a mono input. Do not merge the two sides first. Keep the original available for comparison.
  3. Convert the new input using the existing homepage tool, then review the exported pitches and boundaries. A nonempty MIDI is not proof that the transcription is correct.
  4. If the mono input still contains an audible melody, our cancellation control does not explain the failure. Do not apply a polarity fix indiscriminately or assume that every stereo file is defective.

The missing signal cannot be amplified back.

(s + s) / 2 = s
(s + (−s)) / 2 = 0
gain × 0 = 0

These identities describe exact copies and exact negatives. A real recording need not have either relationship, and retaining only one channel can discard other wanted material.

The W3C Web Audio channel-downmixing specification gives the stereo-to-mono rule as output = 0.5 × (input.L + input.R). The homepage code uses a one-channel OfflineAudioContext when normalizing multichannel browser-decoded input. The offline experiment isolates that averaging operation; it does not establish bit-identical results from every browser decoder or audio layout.

Download the controls. Keep the scope.

Run the script within this project's installed dependency environment and pass the project directory as its first argument. It requires the local Basic Pitch model, TensorFlow.js, the MIDI library, native FFmpeg and this build's source file for hashing. The downloaded script alone is not a complete installation. It generates its own fixtures and uses the local model; no audio is sent to an external conversion API.

The raw record identifies Windows, Node, the CPU backend and library versions. It is evidence for this controlled processing path only. No browser conversion result is included in the table, and file size or event count must not be read as a general accuracy percentage.