Skip to the answer

ORIGINAL PARTIAL CONTROL / OCTOBER 6, 2026

MP3 to MIDI.
One tone.
Several notes.

Extra MIDI notes can follow a tone's overtones, not a second performance. In our generated controls, stronger upper partials added higher simultaneous pitches; removing the fundamental component left only those higher pitches in each tone slot. Check the source and the note timing together before deleting an octave. These are six offline CPU tests, not a full-song accuracy claim.

Keep the timing. Change the spectrum.

We generated the same 2.5-second, one-tone-at-a-time phrase in three versions. Reference pitches were MIDI 48, 52, 55 and 60. Starts were 0.2, 0.75, 1.3 and 1.85 seconds; each tone lasted 0.35 seconds, rounded to samples at 22,050 Hz. Every tone had the same 220-sample edge fade. No recorded instrument, human voice or user file was used.

The fundamental-only control used coefficients [1, 0, 0] at frequencies [f, 2f, 3f]. The stronger-upper-partial control used [0.2, 1, 0.3]. The missing-fundamental control used [0, 1, 0.3]: its reference frequency defined the harmonic series, but no sine component at that frequency was generated. These are waveform components, not separately played musical parts.

Three defined mixtures at f, 2f and 3f: fundamental only, stronger upper partials, and no fundamental component
Defined generator coefficients before RMS scaling, not measured spectra. Open the diagram.

Each complete waveform was scaled to a target RMS of 0.16 before 16-bit PCM quantization. The actual decoded WAV RMS values were 0.15999508013879654, 0.15999507048516143 and 0.1599951291717377 respectively. Their peaks differed. This controls overall source energy; it does not make the frequency components equally strong or the signals perceptually equally loud.

Each WAV was encoded locally to 128 kbps MP3, giving six inputs. Native FFmpeg decoded them to one-channel Float32 at 22,050 Hz. The installed Basic Pitch 1.0.1 model ran on Node's CPU backend. Extraction used the homepage's unchanged onset threshold 0.25, frame threshold 0.25 and minimum length 5 frames. The existing MIDI writer serialized the events, and we parsed those real files again.

More events are not more performance.

FUNDAMENTAL ONLY / WAV, MP39 / 8 eventsThe reference pitch remains in each slot.
Held tones still split into fragments.
STRONGER UPPER PARTIALS / WAV, MP313 / 14 eventsEach slot contains its reference pitch
plus two higher detected pitches.
NO FUNDAMENTAL / WAV, MP38 / 8 eventsEach slot contains two higher pitches.
Its reference pitch is absent in that slot.
Actual offline exports. The last column is the first tone slot, whose reference pitch is 48.
ControlFormatEventsMIDI bytesFirst-slot pitches
Fundamental onlyWAV917148
Fundamental onlyMP3816248
Stronger upper partialsWAV1320248, 60, 67
Stronger upper partialsMP31421048, 60, 67
No fundamental componentWAV816260, 67
No fundamental componentMP3816260, 67

Fundamental only

WAV: 9 events · 171 bytes.
MP3: 8 events · 162 bytes.
First-slot pitches: 48 in both.

Stronger upper partials

WAV: 13 events · 202 bytes.
MP3: 14 events · 210 bytes.
First-slot pitches: 48, 60, 67 in both.

No fundamental component

WAV and MP3: 8 events · 162 bytes.
First-slot pitches: 60, 67 in both.

Three actual WAV MIDI exports: only reference pitches in the fundamental control, extra higher pitches in the stronger-partial control, and only higher pitches without the fundamental component
Actual WAV note starts, durations and pitches. Dashed marks are the defined source references. Color marks membership in the whole reference-pitch set, not per-slot correctness. Inspect the full-size note plot.

Both stronger-partial formats had these pitch sets in successive slots: [48,60,67], [52,64,71], [55,67,74] and [60,72,79]. The missing-fundamental files kept the two higher pitches in every slot and not the corresponding reference pitch. That is a different defect from several adjacent events of the same pitch.

We assigned each parsed event to the nearest defined tone centre using its time midpoint: argmin(abs((note.time + note.duration/2) - (sourceStart + 0.175))). The centres are 0.375, 0.925, 1.475 and 2.025 seconds. The per-slot analysis lists pitch sets and event counts. Counting unique pitches over the whole file would mislead here: pitch 60 appears as a higher partial in the first slot and as the intended reference in the last.

The two formats did not produce identical event boundaries or counts. Their MP3 decoded RMS values were also lower than the WAV controls; the raw report records them. We did not adjust the decoded MP3 gain, sweep thresholds or test different devices. Six successful exports do not establish a format-wide ranking or a transcription accuracy percentage.

Check the layer before cutting the notes.

  1. Keep the source and the downloaded MIDI together. Compare simultaneous note layers with the passage you meant to capture, not just the number of notes in the file.
  2. Separate repeated same-pitch fragments from a second, higher pitch layer. Our split-note experiment covers boundaries; this experiment isolates spectral components.
  3. For a known solo source, inspect higher notes that share the lower note's timing. In these controls, those layers came from one defined partial mixture. A real source may contain genuinely independent notes, so do not delete every octave automatically.
  4. If the intended lower pitch is absent, do not assume a shorter-note filter will reconstruct it. Compare against the original source, then edit deliberately or choose a cleaner source for the existing converter.

One control does not prove every cause.

The added layers here follow our defined upper components. This does not diagnose every extra note in a real recording. Reverb, overlapping parts and model errors were not independently tested. No blanket octave-removal rule is supported by these files.

Tuneonmusic's converter page identifies harmonics as one extra-note cause and describes instrument-range controls. That is the observed diagnostic angle behind this test, not a tested result from its converter. Our evidence is the downloadable matched controls and the parsed output from this project's offline processing path.

Take the inputs and the outputs.

The reproduction script requires the local model and installed TensorFlow.js, Basic Pitch, MIDI writer and native FFmpeg packages; it is not a standalone installation. It generates its own media and does not call an external audio-conversion service. The report names the environment and hashes the unchanged converter source used for the settings.

These are Windows Node CPU results. No actual browser conversion, human listening judgement, DAW import, vocal performance or phone conversion is claimed. To compare a browser run, use the same fixture and retain its actual downloaded MIDI separately.