# Real piano to MIDI: three separate acceptance checks

Measurement date: 2026-11-08, Asia/Seoul. These are outputs of the unchanged site's detector/exporter functions run in a local JavaScript harness, not a commercial converter comparison, browser audio-decoding test, DAW import or listening evaluation. All audio inputs are cuts of an actual human acoustic-piano microphone recording, not synthesized piano.

Original source: Werner Goebl, The Vienna 4x22 Piano Corpus, doi:10.21939/4X22, CC BY 4.0. Official corpus and distribution metadata: https://datasets.mdw.ac.at/datasets/dataset/98ea25fa-2468-43ff-929b-3c926e163583 . Selected files are Mozart_K331_1st-mov_p01.wav and the matching original .mid. Human performances were captured on the acoustic Boesendorfer Imperial SE290; microphone audio was recorded onto DAT with AKG CK91 microphones. Reference notes come from the hardware MIDI key events, not inferred audio labels. See ATTRIBUTION.md and source-provenance.json for original archives and hashes. Cropping, mono averaging, amplitude control, analysis and plots are our modifications; no endorsement is implied.

## Fixed measurement contract

Keep original PCM16 stereo 44100Hz audio and original performance MIDI. Find the first sustained10ms stereo RMS bin >=0.004 and subtract the first MIDI onset to estimate one global audio-minus-MIDI offset; do this before judging output pitches. In this file the offset is -0.63375s. The next eight onset clusters only validate the offset and never refit it. The threshold/bin estimate has uncertainty; note attacks and hardware key events are not identical. This is not millisecond-level ground truth.

Crop original audio2.20–8.20s and average signed left/right samples with round((L+R)/2). No peak normalization, synthesis or instrument rendering. One control halves the resulting PCM16 samples with rounding. Map original key-on/key-off intervals into the crop with the same offset, clipping any crop-crossing event. Key-held overlap excludes sustain-pedal tails and acoustic decay; it is not the number of simultaneously sounding spectral components. Keep pedal/controller values in reference.json for inspection.

Use unchanged downsample, detectNotes and buildMidi from detector-snapshot.js. Decode the PCM16 WAV directly, downsample to11025Hz, and run modes1,2,3 on the same crop; mode2 is the predeclared baseline. Write the actual MIDI bytes before independent checking. The mode2 half-amplitude control uses identical timing. Do not reinterpret sensitivity as a polyphonic model.

The Python MIDI reader independently integrates MIDI tempo/tick events and parses exported note-on/off pairs. Exact match: equal integer pitch plus nearest eligible onset within150ms, one-to-one greedy reference order; no duration condition. Compare time-overlap same-pitch-class candidates separately, allowing different octave offsets, without turning them into exact matches or a full-harmony claim. Key-off before key-on at identical time controls maximum overlap. The sole mode3 exact/onset match is147.5ms early, only2.5ms inside tolerance, making its classification sensitive to reference alignment uncertainty.

Trace only a read-only instrumented copy: record each autocorrelation result after the existing RMS gate; there are no trace rows for below-gate windows. Preserve output MIDI byte equality to the uninstrumented run. Count short integer lag<=8, frame MIDI values above reference maximum76, confidence-qualified high frames and exported high events separately. Zero such candidates in this excerpt does not validate general freedom from high false events. The lag7/8 arithmetic is a disclosed numerical control, not a recreated physical piano event or a new acoustic-cause claim; do not reopen the sealed guitar lag audit.

## From a clean directory

Download the original selected WAV and MID, detector-snapshot.js, midi_reader.py, crop.py, convert.mjs, analyze.py, trace.mjs and verify-diagnostics.py into one new directory. Python3 standard library and Node22+ are sufficient; the recorded run used Python3.13.15 and Node24.19.0. Run, in order:

```text
python crop.py
node convert.mjs
python analyze.py
node trace.mjs
python verify-diagnostics.py
```

The article download manifest gives SHA256 for every distributed input, script and output. Compare generated WAV/MIDI/JSON/CSV/SVG bytes to manifest.json. A fresh-directory rerun compared21 deterministic output files in reproduction.json; scripts/source hashes are checked separately in the download manifest. PASS means reproduction/parsing succeeded, not that the transcription is accurate. Production equivalence is checked against the live script during local publication validation; optional SITE_SCRIPT can point convert.mjs at a downloaded production script for another containment check.

## Boundaries

One player, one Mozart excerpt, one room/recording chain and one mono conversion are not a piano-wide benchmark. This is a piano comparison under the same detector and rules as the guitar work, but performance, room, dynamics, pedal behavior and reference generation differ. Changing instruments does not isolate causality. Partial time-overlap pitch-class candidates do not prove correct harmony; no high export here does not explain or eliminate guitar high artifacts. The method remains single-note pitch detection, one estimate at a time; simultaneous transcription needs a different processing path. Hardware MIDI capture is distinct from audio inference. We did not run a competing piano transcriber and make no ranking or guaranteed-accuracy claim.
