# WAV to MIDI and MIDI to WAV — measured 2026-11-13

For WAV to MIDI, use the existing browser converter with a clear single-note recording, inspect its editable note draft and save MIDI. For MIDI to WAV, choose a sound source and render the saved note events. This page's oscillator examples are explicitly synthetic outputs, not the original microphone sound and not a new website MIDI-upload feature.

## Real source and declared selection

Qingyang Xi, Rachel M. Bittner, Johan Pauwels, Xuzhou Ye and Juan P. Bello, GuitarSet1.1.0, https://doi.org/10.5281/zenodo.3371780, CC BY4.0 https://creativecommons.org/licenses/by/4.0/ . The recording is a human acoustic-guitar microphone performance, 00_BN1-129-Eb_solo_mic.wav. Original recording and annotation are unchanged at https://audiotomidinow.com/guitar-to-midi/files/00_BN1-129-Eb_solo_mic.wav and https://audiotomidinow.com/guitar-to-midi/files/00_BN1-129-Eb_solo.jams . Their pinned SHA256 values and reference source are in reference.json.

The predeclared fixed consecutive five-second windows are E2–7s, F7–12s, G12–17s. We reuse an existing performance and overlap previously used source intervals; these are not three new independent performances. An initial20–35s plan failed the source-length check before a crop or detector output: the whole file lasts22.32439909297052s. The documented amendment selected the above windows before any detector outputs, not after inspecting results. Cropping, note measurements, rendering and generated plots are our modifications without implied endorsement. Labels are inherited and partly automated, with overlapping intervals; they are not a new manual gold standard.

## Fixed forward conversion

Source crops:44100Hz, mono signed PCM16. The snapshot in detector-snapshot.js exactly matches the unchanged live production downsample/detectNotes/buildMidi code. convert.mjs uses Balanced2 and downsampling to11025Hz, without algorithm or threshold edits. Offline harness output is not called a browser test. Three actual browser file-chooser/conversion/download operations produced10,11,5events; their saved MIDI files are byte-identical to the corresponding three offline forward outputs, as checked in browser-conversions.json. The six reverse render/re-detection cases are offline controls, not browser-render claims.

Stored SMF output is format0, one track,480PPQ,500000microseconds/quarter. Parse stored bytes with midi_reader.py rather than assuming the detector's in-memory floating times survived quantization. Seconds=ticks×microseconds-per-quarter÷PPQ÷1000000. MIDI file context: https://midi.org/standard-midi-files . The table is a file check, not an estimate of performance BPM.

## Explicit reverse render

render.py is our own small deterministic offline educational renderer, using Python3.13.15 standard-library math and wave. It reads stored MIDI note pitch, start, duration and velocity; it ignores program changes, CC, sustain pedals, pitch bends and other orchestration. It is not a general MIDI player or DAW recommendation. No SoundFont or sampled instrument is used. This synthetic output is openly labeled and never substitutes for the real forward-input recording.

For frequency f=440×2^((pitch−69)/12) and time t since each note starts, the sine voice is sin(2πft). The harmonic voice is [sin(2πft)+0.5sin(4πft)+0.25sin(6πft)]/1.75. Both use gain0.35×velocity/127, a linear5ms attack and20ms release inside the stored interval, phase0 at each note onset,44100Hz mono PCM16, rounding to the nearest signed16bit integer. Output length is5.25s (five-second source window plus a declared250ms tail), not the detected arrangement length. This velocity-to-gain mapping is our chosen model, not mandated acoustic MIDI behavior.

The exact same saved MIDI is passed to both voices. Separate WAV hashes prove byte differences only; the independent manual RIFF/formula checker and re-detection event ledgers inspect the meaningful fields. Waveform sample differences are an expected constructed control, not credited as a novel finding or evidence of subjective sound quality. PCM RMS is normalized by32768 and is not perceived loudness. verify-render.py checks manual RIFF fields and372 independently computed selected sample values within one PCM16 LSB; reproduction.json gives separate full-file fresh-run hashes.

## Distinct comparison targets

analyze.py reads saved MIDI independently and matches exact integer pitch to the nearest unused onset within150ms in reference order. Carried-in recording notes are excluded as new-attack targets. No fitted offset, transposition, time stretching or duration acceptance is used. Original source-reference agreement and agreement with the generating MIDI are different checks and denominators. The latter does not validate the first transcription. We do not call these a general accuracy percentage, a listening test, a competitor benchmark, or proof of a universally correct pipeline. Generated SVG Piano Rolls are plots, not DAW screenshots. No new investigation of the sealed high-lag cause was performed.

For each window keep the real *-recorded.wav, untouched *-forward.mid, both *-render.wav files, both *-redetected.mid files, CSV note/time tables and SVG plots. Original source and stored notes must remain available before editing or choosing a renderer. A high match count against self-generated MIDI can coexist with poor match count against the recording references. Report onsets, endings, velocities and source coverage separately.

## Reproduce

Download the scripts, experiment-plan.json and detector-snapshot.js into one directory. Python3.13 and Node24 were used. generate.py downloads the two existing licensed original source files into ./originals if needed, pins their SHA, and saves exact crops and labels; alternatively pass --source-dir with those original files already present. No dependencies are installed by these scripts.

```text
python generate.py
node convert.mjs
python render.py
node convert.mjs . render-inputs.json
python analyze.py
python source-check.py
python verify-render.py
python verify-claims.py
```

For the sentence arithmetic check also download claim-bindings.json. verify-claims.py re-parses saved MIDI and checks each credited factual statement. The offline numerical pipeline was rerun in a fresh directory and all44 declared output files matched full SHA256. The extra finding/claim bookkeeping is separate from those44 numerical outputs. Public download manifest.json excludes itself to avoid a recursive hash.

The article's internal sentence audit is not a Google metric or independent proof of uniqueness. research-review.json records ten readable bodies from the actual US-parameter Google results and the substantive differences. Original ordinary ordinal9 Reddit returned403 and remains unknown; ordinal11 is an explicit supplement, not a replaced rank9. PureMIDI already presents real source/output demos, so we do not claim to be the only page with examples. The added evidence is the declared fixed-MIDI/two-render/re-detection panel and separately named recording/self-consistency targets.

## Related checks

Use /convert-wav-to-midi/ for decode compatibility, /wav-to-midi-sample-rate/ for a mislabelled source clock, /convert-wav-file-to-midi-short-clip/ for too-short analysis windows and /midi-to-wav/ for rendered WAV handoff format. “Convert WAV file to MIDI”, “convert WAV into MIDI” and “turn WAV into MIDI” use the same forward workflow. These are not additional pages or new tool capabilities.
