{
  "date": "2026-10-01",
  "question": "Which tested workflow produced fewer note edits for each of these two synthetic inputs?",
  "method": {
    "generator": "This script generates mono 16-bit PCM WAV sine notes with 25 ms attack and 45 ms release; FFmpeg encodes each to 192 kb/s MP3.",
    "decoder": "FFmpeg 20181217-f22fcd4 to mono 44.1 kHz float PCM",
    "site": "Unmodified detector and MIDI writer functions extracted from current dist/script.js, Balanced mode (2), downsampled to 11,025 Hz.",
    "basicPitch": "Official @spotify/basic-pitch 1.0.1 JS inference with TensorFlow.js CPU; the same decoded samples averaged to 22,050 Hz; event thresholds 0.25/0.25 and minimum 5 frames.",
    "scoring": "Greedy same-pitch event matching; nearest onset within 0.35 s. Report missed targets, unmatched output events, and mean absolute onset error among matched events. No aggregate winner score."
  },
  "fixtures": [
    {
      "id": "solo-melody",
      "description": "Five non-overlapping pure sine notes with short gaps; mono source.",
      "input": {
        "wav": "/assets/best-mp3-to-midi-converter/solo-melody/solo-melody.wav",
        "mp3": "/assets/best-mp3-to-midi-converter/solo-melody/solo-melody-192k.mp3",
        "mp3Sha256": "258df51afea019be250e2348f65682c73217d83508178027dab1c40dd2b33454",
        "wavSha256": "aeac15c63bc13b119c184f245a30b1a248cf22894216b6cbb471f1565b69f28f",
        "durationSeconds": 4,
        "sampleRateHz": 44100,
        "channels": 1,
        "mp3BitrateKbps": 192
      },
      "expectedNotes": [
        {
          "pitch": 60,
          "start": 0.2,
          "duration": 0.48
        },
        {
          "pitch": 64,
          "start": 0.9,
          "duration": 0.48
        },
        {
          "pitch": 67,
          "start": 1.6,
          "duration": 0.48
        },
        {
          "pitch": 72,
          "start": 2.3,
          "duration": 0.48
        },
        {
          "pitch": 69,
          "start": 3,
          "duration": 0.48
        }
      ],
      "siteDetector": {
        "mode": "Balanced (2)",
        "processingSampleRateHz": 11025,
        "output": "/assets/best-mp3-to-midi-converter/solo-melody/site-detector.mid",
        "notes": [
          {
            "pitch": 60,
            "start": 0.046,
            "duration": 0.65
          },
          {
            "pitch": 64,
            "start": 0.743,
            "duration": 0.65
          },
          {
            "pitch": 67,
            "start": 1.44,
            "duration": 0.65
          },
          {
            "pitch": 72,
            "start": 2.136,
            "duration": 0.65
          },
          {
            "pitch": 69,
            "start": 2.833,
            "duration": 0.65
          }
        ],
        "score": {
          "matchingRule": "greedy same-pitch match, nearest onset, maximum absolute onset difference 0.35 s",
          "matched": [
            {
              "pitch": 60,
              "targetStart": 0.2,
              "detectedStart": 0.046,
              "absoluteOnsetErrorSeconds": 0.154
            },
            {
              "pitch": 64,
              "targetStart": 0.9,
              "detectedStart": 0.743,
              "absoluteOnsetErrorSeconds": 0.157
            },
            {
              "pitch": 67,
              "targetStart": 1.6,
              "detectedStart": 1.44,
              "absoluteOnsetErrorSeconds": 0.16
            },
            {
              "pitch": 72,
              "targetStart": 2.3,
              "detectedStart": 2.136,
              "absoluteOnsetErrorSeconds": 0.164
            },
            {
              "pitch": 69,
              "targetStart": 3,
              "detectedStart": 2.833,
              "absoluteOnsetErrorSeconds": 0.167
            }
          ],
          "missed": [],
          "unmatchedOutputEvents": [],
          "meanAbsoluteOnsetErrorSeconds": 0.16
        }
      },
      "spotifyBasicPitch": {
        "package": "@spotify/basic-pitch",
        "version": "1.0.1",
        "backend": "cpu",
        "processingSampleRateHz": 22050,
        "thresholds": {
          "onset": 0.25,
          "frame": 0.25,
          "minimumFrames": 5
        },
        "output": "/assets/best-mp3-to-midi-converter/solo-melody/basic-pitch.mid",
        "notes": [
          {
            "pitch": 60,
            "start": 0.209,
            "duration": 0.418
          },
          {
            "pitch": 60,
            "start": 0.627,
            "duration": 0.081
          },
          {
            "pitch": 64,
            "start": 0.917,
            "duration": 0.406
          },
          {
            "pitch": 64,
            "start": 1.324,
            "duration": 0.07
          },
          {
            "pitch": 67,
            "start": 1.614,
            "duration": 0.408
          },
          {
            "pitch": 67,
            "start": 2.021,
            "duration": 0.07
          },
          {
            "pitch": 72,
            "start": 2.312,
            "duration": 0.406
          },
          {
            "pitch": 72,
            "start": 2.718,
            "duration": 0.07
          },
          {
            "pitch": 69,
            "start": 2.997,
            "duration": 0.43
          },
          {
            "pitch": 69,
            "start": 3.426,
            "duration": 0.07
          }
        ],
        "score": {
          "matchingRule": "greedy same-pitch match, nearest onset, maximum absolute onset difference 0.35 s",
          "matched": [
            {
              "pitch": 60,
              "targetStart": 0.2,
              "detectedStart": 0.209,
              "absoluteOnsetErrorSeconds": 0.009
            },
            {
              "pitch": 64,
              "targetStart": 0.9,
              "detectedStart": 0.917,
              "absoluteOnsetErrorSeconds": 0.017
            },
            {
              "pitch": 67,
              "targetStart": 1.6,
              "detectedStart": 1.614,
              "absoluteOnsetErrorSeconds": 0.014
            },
            {
              "pitch": 72,
              "targetStart": 2.3,
              "detectedStart": 2.312,
              "absoluteOnsetErrorSeconds": 0.012
            },
            {
              "pitch": 69,
              "targetStart": 3,
              "detectedStart": 2.997,
              "absoluteOnsetErrorSeconds": 0.003
            }
          ],
          "missed": [],
          "unmatchedOutputEvents": [
            {
              "pitch": 60,
              "start": 0.627,
              "duration": 0.081
            },
            {
              "pitch": 64,
              "start": 1.324,
              "duration": 0.07
            },
            {
              "pitch": 67,
              "start": 2.021,
              "duration": 0.07
            },
            {
              "pitch": 72,
              "start": 2.718,
              "duration": 0.07
            },
            {
              "pitch": 69,
              "start": 3.426,
              "duration": 0.07
            }
          ],
          "meanAbsoluteOnsetErrorSeconds": 0.011
        }
      }
    },
    {
      "id": "three-note-chords",
      "description": "Three sequential triads; each chord contains three simultaneous pure sine notes.",
      "input": {
        "wav": "/assets/best-mp3-to-midi-converter/three-note-chords/three-note-chords.wav",
        "mp3": "/assets/best-mp3-to-midi-converter/three-note-chords/three-note-chords-192k.mp3",
        "mp3Sha256": "962909cc89a74fa837602279f201560857bdbf2c42cc199f52e985af70d6c67b",
        "wavSha256": "85bbf1e290b19d3aeff5c70c387046d8f1e54e1ca5b345e4ffa8551227806a6d",
        "durationSeconds": 4,
        "sampleRateHz": 44100,
        "channels": 1,
        "mp3BitrateKbps": 192
      },
      "expectedNotes": [
        {
          "pitch": 48,
          "start": 0.2,
          "duration": 0.62
        },
        {
          "pitch": 60,
          "start": 0.2,
          "duration": 0.62
        },
        {
          "pitch": 67,
          "start": 0.2,
          "duration": 0.62
        },
        {
          "pitch": 50,
          "start": 1.25,
          "duration": 0.62
        },
        {
          "pitch": 62,
          "start": 1.25,
          "duration": 0.62
        },
        {
          "pitch": 69,
          "start": 1.25,
          "duration": 0.62
        },
        {
          "pitch": 53,
          "start": 2.3,
          "duration": 0.62
        },
        {
          "pitch": 65,
          "start": 2.3,
          "duration": 0.62
        },
        {
          "pitch": 72,
          "start": 2.3,
          "duration": 0.62
        }
      ],
      "siteDetector": {
        "mode": "Balanced (2)",
        "processingSampleRateHz": 11025,
        "output": "/assets/best-mp3-to-midi-converter/three-note-chords/site-detector.mid",
        "notes": [
          {
            "pitch": 48,
            "start": 0.046,
            "duration": 0.789
          },
          {
            "pitch": 50,
            "start": 1.115,
            "duration": 0.743
          },
          {
            "pitch": 53,
            "start": 2.136,
            "duration": 0.789
          }
        ],
        "score": {
          "matchingRule": "greedy same-pitch match, nearest onset, maximum absolute onset difference 0.35 s",
          "matched": [
            {
              "pitch": 48,
              "targetStart": 0.2,
              "detectedStart": 0.046,
              "absoluteOnsetErrorSeconds": 0.154
            },
            {
              "pitch": 50,
              "targetStart": 1.25,
              "detectedStart": 1.115,
              "absoluteOnsetErrorSeconds": 0.135
            },
            {
              "pitch": 53,
              "targetStart": 2.3,
              "detectedStart": 2.136,
              "absoluteOnsetErrorSeconds": 0.164
            }
          ],
          "missed": [
            {
              "pitch": 60,
              "start": 0.2,
              "duration": 0.62
            },
            {
              "pitch": 67,
              "start": 0.2,
              "duration": 0.62
            },
            {
              "pitch": 62,
              "start": 1.25,
              "duration": 0.62
            },
            {
              "pitch": 69,
              "start": 1.25,
              "duration": 0.62
            },
            {
              "pitch": 65,
              "start": 2.3,
              "duration": 0.62
            },
            {
              "pitch": 72,
              "start": 2.3,
              "duration": 0.62
            }
          ],
          "unmatchedOutputEvents": [],
          "meanAbsoluteOnsetErrorSeconds": 0.151
        }
      },
      "spotifyBasicPitch": {
        "package": "@spotify/basic-pitch",
        "version": "1.0.1",
        "backend": "cpu",
        "processingSampleRateHz": 22050,
        "thresholds": {
          "onset": 0.25,
          "frame": 0.25,
          "minimumFrames": 5
        },
        "output": "/assets/best-mp3-to-midi-converter/three-note-chords/basic-pitch.mid",
        "notes": [
          {
            "pitch": 48,
            "start": 0.07,
            "duration": 0.116
          },
          {
            "pitch": 48,
            "start": 0.186,
            "duration": 0.488
          },
          {
            "pitch": 67,
            "start": 0.197,
            "duration": 0.58
          },
          {
            "pitch": 48,
            "start": 0.673,
            "duration": 0.093
          },
          {
            "pitch": 48,
            "start": 0.766,
            "duration": 0.151
          },
          {
            "pitch": 50,
            "start": 1.126,
            "duration": 0.116
          },
          {
            "pitch": 50,
            "start": 1.242,
            "duration": 0.499
          },
          {
            "pitch": 69,
            "start": 1.242,
            "duration": 0.604
          },
          {
            "pitch": 50,
            "start": 1.741,
            "duration": 0.128
          },
          {
            "pitch": 50,
            "start": 1.869,
            "duration": 0.093
          },
          {
            "pitch": 53,
            "start": 2.254,
            "duration": 0.639
          },
          {
            "pitch": 72,
            "start": 2.288,
            "duration": 0.58
          },
          {
            "pitch": 53,
            "start": 2.904,
            "duration": 0.081
          }
        ],
        "score": {
          "matchingRule": "greedy same-pitch match, nearest onset, maximum absolute onset difference 0.35 s",
          "matched": [
            {
              "pitch": 48,
              "targetStart": 0.2,
              "detectedStart": 0.186,
              "absoluteOnsetErrorSeconds": 0.014
            },
            {
              "pitch": 67,
              "targetStart": 0.2,
              "detectedStart": 0.197,
              "absoluteOnsetErrorSeconds": 0.003
            },
            {
              "pitch": 50,
              "targetStart": 1.25,
              "detectedStart": 1.242,
              "absoluteOnsetErrorSeconds": 0.008
            },
            {
              "pitch": 69,
              "targetStart": 1.25,
              "detectedStart": 1.242,
              "absoluteOnsetErrorSeconds": 0.008
            },
            {
              "pitch": 53,
              "targetStart": 2.3,
              "detectedStart": 2.254,
              "absoluteOnsetErrorSeconds": 0.046
            },
            {
              "pitch": 72,
              "targetStart": 2.3,
              "detectedStart": 2.288,
              "absoluteOnsetErrorSeconds": 0.012
            }
          ],
          "missed": [
            {
              "pitch": 60,
              "start": 0.2,
              "duration": 0.62
            },
            {
              "pitch": 62,
              "start": 1.25,
              "duration": 0.62
            },
            {
              "pitch": 65,
              "start": 2.3,
              "duration": 0.62
            }
          ],
          "unmatchedOutputEvents": [
            {
              "pitch": 48,
              "start": 0.07,
              "duration": 0.116
            },
            {
              "pitch": 48,
              "start": 0.673,
              "duration": 0.093
            },
            {
              "pitch": 48,
              "start": 0.766,
              "duration": 0.151
            },
            {
              "pitch": 50,
              "start": 1.126,
              "duration": 0.116
            },
            {
              "pitch": 50,
              "start": 1.741,
              "duration": 0.128
            },
            {
              "pitch": 50,
              "start": 1.869,
              "duration": 0.093
            },
            {
              "pitch": 53,
              "start": 2.904,
              "duration": 0.081
            }
          ],
          "meanAbsoluteOnsetErrorSeconds": 0.015
        }
      }
    }
  ],
  "limitations": [
    "Only two deliberately synthetic sine fixtures; they do not represent recorded songs, instruments, voice, production mixes, browser upload paths, or every converter.",
    "The comparison is between this site’s current detector and one documented open-source model, not a comprehensive test of commercial online converters.",
    "Different model preprocessing and note extraction are part of each workflow; this is not a controlled architecture-only comparison.",
    "The onset matching window is an explicit analysis choice and can affect which same-pitch events are paired.",
    "No universal best-tool claim follows from these fixtures."
  ]
}
