Version v0.4.0 build 849bb84

OMR of scanned sheet music → MusicXML: research notes (Nov 2026)

Scope: what current (2023–2026) work says about turning scanned/image sheet-music PDFs into MusicXML 4.0, with particular attention to (a) lyrics, (b) splitting multi-voice staves (closed-score SATB) into separate parts, and (c) running everything client-side in a claude.ai Artifact (CSP: no CDN fetch/WASM/worker loads; each binary asset ≤ 15 MB, total ≤ 64 MB). Every number below is sourced; numbers the source reports about itself (not independently reproduced) are marked self-reported. Sizes and versions were checked directly against npm / GitHub / Hugging Face APIs on 2026-11-08.


0. TL;DR


1. Problem framing for this project


2. Classical (rule-based) pipeline: stage by stage

Classical OMR is still the backbone of Audiveris (5.11.0, Jul 2026) and of the front ends of oemer, homr and copisteria. Even copisteria, the strongest recent open system, decides staves, systems and bars with hand-written geometry rules over the ink and uses ML only for symbols and musical context (copisteria ARCHITECTURE.md).

2.1 Ingest and resolution normalisation

2.2 Grayscale and binarisation

2.3 Deskew and dewarp

2.4 Staff metrics (line thickness t, space s)

2.5 Staff and system detection

2.6 Staff removal

2.7 Connected components and segmentation

2.8 Symbol classification

Options, from cheapest to most capable:

  1. Template matching with normalised cross-correlation on gray at the normalised s.
    • Use it for filled, hollow and whole noteheads, clefs (G, F, C), accidentals (♯ ♭ ♮), rests and digits. Render templates from an open SMuFL font: Bravura and Leland are SIL OFL-1.1, so templates or synthetic data derived from them can be shipped.
    • Restrict head search to staff positions: y = line or space, which gives 1/2-s quantisation.
    • Hymnals are engraved in a small number of house styles, so templates do well there. Keep 2–3 template variants per class.
  2. Hand-crafted features + kNN/SVM. oemer classifies clefs, accidentals and rests with three SVMs trained on DeepScores-extended. Audiveris uses its own glyph classifier, and 5.11 added L2 regularisation to it.
    • Features: 16×16 or 20×20 zoned density, aspect ratio, area/s², hole count, and Hu moments.
    • Easy to do in pure JS; small enough to inline as JSON weights.
  3. Small CNN classifier on CC crops (e.g., 32×32, 50–200k params, int8 ONNX ≈ 0.1 MB). Train it on crops rendered by LilyPond/Verovio from synthetic hymns with scan degradation, plus DeepScoresV2 crops (CC BY 4.0).
  4. Full-page detector (YOLO/DETR family) on DeepScoresV2 or synthetic pages. Copisteria's detectors predict 270 classes, with staff-position, stem-direction, dots, grace and voice attributes on every note and rest.
    • DeepScoresV2 notes: orthogonal boxes suit long, thin, possibly rotated objects badly (Tuggener et al., ICPR 2020). Most papers use its dense subset (1,714 images).
    • Licence trap: Ultralytics YOLOv8/YOLO11 code and trained weights are AGPL-3.0. Use Apache-2.0 detectors: YOLOX, RT-DETR/RT-DETRv2, D-FINE, or RF-DETR base sizes (RF-DETR XL/2XL use a non-OSI licence).

2.9 Notation assembly

2.10 Rhythm reconstruction and measure-timing repair

This is where classical OMR usually breaks: one missed dot or beam desynchronises every voice after it. Current practice:

2.11 Pitch


3. State-of-the-art systems (2023–2026)

3.1 Comparison table

System (latest) Approach Code / weights licence Weights (size) Lyrics? Voices→parts? Browser feasibility
Audiveris 5.11.0 (2026-07-11) Classical + glyph classifier, Java AGPL-3.0 n/a (bundled) Yes: Tesseract; lyric lines; verse numbers filtered since 5.10 Voices per staff, not split into parts No (Java). Use only as an offline baseline in the harness
oemer 0.1.8 (2024-11; last push 2025-04) 2 UNets (staff/symbols; heads/clefs/stems) + SVMs + rules MIT 1st_model.onnx 70.8 MB, 2nd_model.onnx 38.4 MB (fp32) No Groups chords by stem direction; no part split Possible only after int8/fp16 quantisation and chunking to ≤ 15 MB per file; single-thread WASM UNet on a full page is slow
homr (0.7 + unreleased; push 2026-11) oemer-style segnet + Polyphonic-TrOMR-style transformer per staff AGPL-3.0 code and weights; transformer data includes Camera-PrIMuS (HF mirror says CC BY-NC) ONNX: segnet 53 MB (fp16 26.5), encoder 48 MB (fp16 24), decoder 37–47 MB No (title OCR via RapidOCR) "Multiple voices per staff" (unreleased) Licence-blocked for permissive shipping
copisteria 1.3.4 / copista (Oct 2026) Detector (270 classes + per-head attributes: staff pos, stem dir incl. both, dots, grace, voice slot) → geometric front end → 2.03M evidence transformer → Viterbi rhythm writer Apache-2.0 code and weights (NOTICE file must be kept); trained on PDMX renders copista-2m detector 7.8 MB (.pt fp32) + evidence 8.15 MB; copista-28m detector 115 MB No ("Lyrics are not written"; text needs external OCR boxes) Voice slots per note; parts = staves/braced pairs Most promising ML option (about 4M params in total). Needs ONNX export of PyTorch; front end and writer would need porting to JS
Polyphonic-TrOMR (NetEase; push 2023-01) Patch-embedding transformer, single staff Apache-2.0 img2score_epoch47.pth 86.3 MB No Polyphonic tokens Stale; training code never released
SMT / SMT++ (Ríos-Vila et al.; IJCV 2025) CNN/ConvNeXt encoder + 8-layer transformer decoder → **bekern, full page MIT code; MIT weights on HF PRAIG/smt-fp-grandstaff 43.7 MB; antoniorv6/smt-grandstaff 85.5 MB No Piano spines Autoregressive; piano-only training; weak on real scans (see LEGATO table)
Zeus / OLiMPiC (Mayer et al., ICDAR 2024) ResNet-ish CNN + 2×BiLSTM + attention LSTM decoder → Linearised MusicXML (LMX), per system MIT code; data CC BY-SA not checked No Piano voices (LMX encodes voice/staff changes) Small RNN; per-system; piano-only
LEGATO (ICLR 2026) Frozen Llama-3.2-11B-Vision encoder (836M) + 101M decoder → ABC, multi-page MIT code and weights, but the encoder is under the Llama 3.2 Community Licence legato decoder 429.5 MB; legato-small 43.7 MB (plus encoder) **Text replaced by `< text >`**
LEGATO 2 (arXiv 2607.05769, Jul 2026) System-level segmentation + autoregressive VLM; embeds text (titles, annotations) not released not released Embedded text claimed n/a n/a
Transcoda (arXiv 2605.10835, May 2026) 59M-param model; synthetic data + normalised **kern + grammar-constrained decoding release promised "upon publication" n/a No kern spines n/a
Bottleneck-ResNet + BiGRU + CTC (arXiv 2604.16446, Apr 2026) Monophonic CRNN-CTC no code n/a No Monophonic Illustrates small CTC models for monophonic staves

3.2 Reported accuracy (all lower = better)

LEGATO, Table 1 (TEDn / OMR-NED, %). Source: arXiv 2506.19065.

Test set GPT-5 SMT++ Legato Legato-small
Camera OpenScore String Quartets (252 pp.) 90.5 / 97.6 98.6 / 94.7 60.4 / 58.2 84.1 / 93.5
Camera OpenScore Lieder (64 pp.) 91.6 / 97.6 98.4 / 84.1 36.4 / 44.9 82.6 / 83.5
IMSLP piano scans (32 pp.) 96.7 / 98.7 97.7 / 91.9 29.7 / 44.3 76.9 / 86.7

The takeaways: frontier VLMs (GPT-5) are useless as OMR today (~97 % OMR-NED), and SMT++ collapses on real scans.

copisteria README / model card (OMR-NED via efficient-musicdiff, %, self-reported, scans):

Quartet scans (252) Lieder scans (55) Polish piano scans (112)
copista-28m 8.6–8.7 16.9–17.7 31.5–34.4
copista-2m 11.1–11.2 17.0–17.8 34.3–38.7
Legato 2 (paper) 31.6 n/a n/a
Legato 58.2 n/a n/a
homr 0.7 piano only 42.3 48.3
Audiveris 5.11 66.9 (no output on 54/252) 51.8 62.6
Transcoda piano only 48.4 55.1

The ranges are the README vs model-card numbers. Both are from the same authors.

Other reference points

3.3 What to take from each system


4. Datasets

Dataset Content Size Licence Use for us
DeepScoresV2 (Tuggener et al., ICPR 2020) Rendered pages with boxes (oriented and orthogonal) and segmentation 255,385 images, 151M instances, 135 classes; dense subset 1,714 CC BY 4.0 (Zenodo 4012193) Symbol detector / classifier training
MUSCIMA++ v2 Handwritten pages, MuNG graph 140 pages, ~91k symbols (v0.9) CC BY-NC-SA 4.0 Avoid for shipped weights
PrIMuS / Camera-PrIMuS (Calvo-Zaragoza & Rizo 2018) Monophonic RISM incipits (Verovio renders, plus camera distortions) 87,678 Not stated at source; HF mirror CC BY-NC Avoid for shipped weights
GrandStaff (Ríos-Vila et al., IJDAR 2023) Single-system piano renders, **kern 53,882 MIT (HF copy) Piano only
FP-GrandStaff Full-page piano 688 pages (SMT++ repo, MIT) Piano only
OLiMPiC (Mayer et al. 2024) Lieder systems (voice + piano), synthetic train; IMSLP scans for dev/test 17,945 systems; dev 1,438 / test 1,493 scanned CC BY-SA Real-scan evaluation including vocal staves
OpenScore Lieder MusicXML of 19th-c. songs ~1,356 scores CC0 Ground-truth MusicXML for synthetic rendering
PDMX MuseScore public-domain scores → MusicXML ~250k CC BY 4.0 (no_license_conflict subset) copisteria and homr training data; synthetic pages
Sheet Music Benchmark (SMB) KernScores scans, region + page, **kern 685 pages, 4,039 regions Gated HF (PRAIG/SMB) External evaluation
polish-scores (btrkeks/polish-scores) Historical Polish scans, kern + MusicXML 112 pages eval-only External evaluation
MusiCorpus (arXiv 2605.18436, 2026) Hand-annotated historical/handwritten pages, MusicXML at page and system level 1,309 pages CC BY-NC-SA (arXiv) Manuscripts; not our target
AMNLT (Martinez-Sevilla et al., ICDAR 2023; arXiv 2412.04217) Aligned music + lyrics (Gregorian chant) 4 datasets academic Only lyric+music aligned benchmark family
Smashcima (OMR-Research) Synthetic handwritten music generator tool Apache-2.0 Not needed (we target print)

No public dataset covers closed-score SATB hymns with lyrics. We should synthesise one:

  1. Take public-domain hymns and chorales, from OpenScore (CC0), PDMX's PD subset, or our own LilyPond transcriptions of PD hymn tunes.
  2. Render them with LilyPond 2.24. LilyPond is GPL as a tool, but its output is not encumbered. Engrave in closed and open score with 1–4 verses.
  3. Degrade the renders: rotate ±2°, add page curl, Gaussian blur, salt-and-pepper noise, JPEG compression, and threshold artefacts at 150–300 dpi.
  4. Add a few real PD hymnal scans (IMSLP / Internet Archive) that we transcribe ourselves.

5. Detecting multiple voices on one staff and splitting them into parts

5.1 What the literature and tools offer

5.2 Recommended rule-based voice/part logic (hymn-specific, deterministic)

For each staff and measure, after rhythm decoding:

  1. Stem-direction voices. Up stems → voice 1 (upper), down stems → voice 2 (lower).
    • A head with both stems, or with both, is a unison shared by both voices: copy it into both.
    • Stemless whole notes: two heads at one onset go upper → v1, lower → v2. A single whole note is shared. Heads a second apart are offset horizontally.
    • Shared-stem chords: older hymnals often print S and A on one stem when the rhythms match. Split a 2-note chord by pitch (top → v1, bottom → v2). A 3+-note chord means divisi or piano; flag it.
    • Rests: vertical position (above the middle line → v1, below → v2). One centred rest is shared by both.
  2. Rhythmic independence check. Each voice must sum to the measure length on its own (§2.10). If the split voices don't balance and the unsplit chordal reading does, treat the staff as chordal (single voice).
  3. Staff classification: "closed-score vocal" vs "keyboard". Score each braced pair; split only if the score is high:
    • + Lyrics text rows between the two staves, or under both.
    • + In ≥ 60–70 % of onsets, every staff has ≤ 2 heads per onset, with opposite stems when there are 2.
    • + Part labels found by OCR: S, A, T, B, Soprano, Alto, Tenor, Bass, S.A., T.B., Choir, SATB.
    • + Ranges: v1 above v2 on each staff. Treble-staff voices fit S (C4–A5) and A (G3–D5); bass-staff voices fit T (C3–G4) and B (E2–D4).
    • − Chords of 3+ heads, cross-staff beams, arpeggios, pedal marks, or Piano/Organ/Pno. labels.
    • − A second staff carrying a different, independent rhythm with no lyrics (accompaniment).
    • A choir + piano system (vocal staves + braced piano pair) gets these rules on the vocal staves only. The piano braced pair stays one part with 2 staves.
  4. Emit parts.
    • Closed SATB → P1 Soprano (treble clef), P2 Alto (treble), P3 Tenor (bass clef as printed, or optionally treble-8vb), P4 Bass (bass).
    • A two-voice single staff → two parts (e.g., "Soprano I/II" for divisi).
    • Record provenance for the UI: splitFrom: {system staff index, stem: 'up'|'down'}.
    • When splitting is ambiguous (low score), keep one part with <voice>1/2 + <backup> and warn.
  5. Consistency across systems. Decide the part layout once per page or movement, on the fullest system (as copisteria does). Then map every system's staves onto it, so a system where the alto drops out still yields 4 parts. The missing voice gets rests.

6. Lyrics OCR under and between staves

6.1 State of the art

6.2 Engines usable in the artifact

Engine Licence Files (self-hosted) Notes
tesseract.js 7.0.0 (Dec 2025; on cdnjs) Apache-2.0 worker.min.js 0.11 MB; core tesseract-core-{relaxedsimd-,simd-,}lstm.wasm.js ≈ 3.9 MB each (the .wasm alone is 2.86 MB); tessdata_fast eng 4.11 MB, lat 3.19, deu 1.53, fra 1.13, ita 2.70 v7 is 15–35 % faster than v6 (relaxed-SIMD build). Since v6 only text output is on by default, so request {blocks:true} to get word/line boxes. corePath must be a directory holding the variants. langPath + gzip:false serves raw .traineddata. Set workerBlobURL:false to load workerPath from our own origin. tessdata_best eng 15.4 MB is over the cap
PP-OCRv5 mobile via onnxruntime-web Apache-2.0 det 4.8 MB, Latin rec 8.0 MB (fp32 ONNX, nakamura196/ppocrv5-mobile-web-onnx) More robust on degraded scans. Needs DB post-processing + CTC decode in JS, and shares the ORT runtime. Use it as an upgrade path

6.3 Recommended lyric pipeline

  1. Find lyric bands. After staff detection and music-symbol masking, look in each inter-staff gap and below the last staff. Find text rows by horizontal projection of the leftover small CCs: x-height ≈ 0.6–1.2 s, with a common baseline. Several stacked rows in one gap are verses 1..n, numbered top-down.
    • A leading 1., 2. etc. at the row start gives the verse number. Strip it, as Audiveris does since 5.10.
    • Text far below the last system (verses 4–6 printed as stanzas) is not underlay. Report it as unattached extra text and a warning.
  2. OCR each row. Crop with a margin of ~0.3 s, upscale so the x-height is ≥ 20 px, and binarise. Run tesseract.js with tessedit_pageseg_mode = 7 (single line) and request blocks for word boxes and confidence. Restrict the character set to letters, punctuation, hyphen, apostrophe and digits.
  3. Tokenise into syllables using the print.
    • Engravers separate syllables with centred hyphens ("glo - ry"), which OCR returns as - tokens or as glo-ry. Words are separated by wider gaps.
    • Extenders are thin horizontal lines at baseline height after a word's last syllable. They often vanish in OCR, so detect them geometrically in the band: a long thin horizontal CC with height ≤ t·1.5 and length ≥ 1 s.
    • If OCR merged a hyphenated word, split it at the hyphen. Use Liang/TeX hyphenation patterns only as a last resort, because the score already shows the splits.
  4. Assign syllabic from position in the word: no hyphens → single; first → begin; inner → middle; last → end. MusicXML 4.0 <lyric number="v"> per verse holds <syllabic>, <text>, optional <elision>, and <extend type="start|stop|continue"/>.
  5. Align syllables to notes. Run a monotonic DP (DTW-like) over the note onsets of the target voice in that system.
    • Cost = |syllable centre − notehead centre| in staff spaces. Allow skipping a note (melisma); a syllable may not be skipped without a penalty.
    • Lyrics are usually centred under the head. The first syllable of a word may be left-aligned.
    • Melisma cues: a slur or tie across notes, an extender after the syllable, or beamed notes with one syllable. Notes inside a melisma get no <text>. The syllable that starts the melisma gets <extend type="start"/> and its last note <extend type="stop"/> (MusicXML allows a standalone <extend>).
  6. Which voices get which lyric rows.
    • Closed SATB hymn (rows between the staves): attach to all four voices, aligning separately for each voice so rhythmic differences (e.g., an alto passing tone) become melismas or skips.
    • Open score: rows below a staff belong to that staff's part(s).
    • Rows above a staff: attach to the staff below, or above, by proximity. Audiveris treats "lyrics above staff" as a separate option.
    • Report per-part, per-verse coverage (syllables attached / syllables OCR'd) as a confidence signal.
  7. Hymn specifics: "A-men" codas; elisions (‿ ligature between two syllables on one note → <elision>); apostrophes ("pray'r"); italic refrains; small-caps or all-caps first words of a verse.

7. In-browser execution

7.1 onnxruntime-web (MIT)

7.2 Classical image processing: opencv.js vs plain JS

7.3 PDF and rendering libraries

7.4 Rough per-page budget (single-thread WASM, mid-range laptop; estimates to verify in the harness)


8. Evaluation metrics and harness

Metric Definition Where Notes for us
SER / CER / LER Edit distance ÷ reference length on symbols, characters, or lines of a sequence encoding PrIMuS, SMT, Zeus Depends on encoding (kern vs bekern vs LMX); not comparable across systems
TEDn Zhang–Shasha tree edit distance on MusicXML with note-level costs, normalised by the gold tree; correlates with editor effort Hajič jr. et al., ISMIR 2016 (human preference corpus of 1,230 judgments); Mayer et al. 2024; LEGATO O(m²n²); LEGATO truncates trees to < 6,000 nodes
OMR-NED (I + D) / (N_pred + N_ref) over visual symbols. A substitution counts as delete + insert. Broken down by category (heads, pitch, accidentals, beams, dots, … lyric) Martinez-Sevilla et al., "Sheet Music Benchmark", ISMIR 2025, built on musicdiff (MIT, v6.0) The de-facto cross-system metric in 2025–26: LEGATO, Transcoda, copisteria (efficient-musicdiff), homr (own token version)
MV2H Joint multi-pitch / voice separation / meter / note value / harmony, with disjoint penalties; non-aligned variant via DTW McLeod & Steedman, ISMIR 2018; apmcleod/MV2H (Java reference, MIT); pyMV2H The voice score directly measures SATB splitting quality

Project harness (node) recommendation

  1. Ground truth is MusicXML from our synthetic hymn set (§4) plus a handful of real scans.
  2. Our own JS metrics (fast, no Python):
    • Note F1 per part: match on (onset, pitch, duration) after part alignment.
    • Part-assignment accuracy: the fraction of GT notes landing in the right S/A/T/B part. This is the key metric for requirement 2.
    • Lyrics: syllable CER, syllabic accuracy, syllable→note attachment accuracy per verse, and verse-count correctness.
    • Measure validity: the share of measures whose voices sum to the time signature.
    • Token NED per staff, in homr style.
  3. Optional reference scores run offline with the Python and Java tools on the machine: musicdiff OMR-NED (MIT) and MV2H (MIT). Audiveris (AGPL, run as a separate process, never shipped) can serve as a lyric-capable baseline.

9. Recommended pure-browser architecture

9.1 Principles

9.2 Pipeline (core, environment-agnostic)

Page {w,h,data:Uint8ClampedArray gray}
 └─ preprocess: shading-normalise → Sauvola(int. images) [+Otsu check] → deskew (projection variance)
 └─ staffMetrics: run-length (t, s, t+s)
 └─ staves: per-strip projection peaks → 5-line groups → line tracking (polylines) → systems (brace/bracket/barline continuity)
 └─ scale-normalise to s≈20px (coordinates mapped back for overlay)
 └─ staffRemoval: run-length ≤ ~1.75t on tracked lines (keep original for matching)
 └─ components: union-find CC + hole CCs; text-row detection → lyric bands (masked from music)
 └─ symbols:
     heads (NCC templates from Bravura/Leland + optional tiny CNN), stems, beams (count), flags, dots,
     accidentals, clefs, key/time sigs (digits), rests, barlines (staff-/system-height), ties/slurs, fermatas
 └─ assembly: head↔stem↔beam graph, accidental/dot attachment, chords
 └─ rhythm: per voice/measure hypothesis search + time-slot alignment across voices; pickup/final; repair + flags
 └─ voices: stem-direction split, unisons, shared-stem chords, rests
 └─ parts: staff classifier (closed-score vocal vs keyboard vs single voice) → part plan per page/movement
 └─ lyrics: band→rows→tesseract(blocks)→syllables(hyphen/extender geometry)→verse numbers→DP alignment per voice
 └─ musicxml: score-partwise 4.0 writer (parts, staves, voices/backup, lyrics with syllabic/extend, implicit pickup)
 └─ report: per-stage timings, per-part summary (split provenance), per-measure confidence, warnings, overlay geometry

9.3 Browser shell and assets (all relative, ≤ 15 MB per file)

Asset Size Licence
assets/omr-worker.js (core bundle, module worker or classic) < 0.5 MB ours
tesseract.js worker.min.js 0.11 MB Apache-2.0
tesseract core tesseract-core-simd-lstm.wasm.js + tesseract-core-lstm.wasm.js (+ relaxedsimd optional) 2 × 3.9 MB (+3.9) Apache-2.0
eng.traineddata (tessdata_fast) (+ lat 3.19, deu 1.53 optional) 4.11 MB Apache-2.0
sample scanned SATB hymn PDF (PD) 0.3–2 MB PD
(phase 2) ORT ort-wasm-simd-threaded.wasm 1.30.0 (or .gz + wasmBinary) 14.24 MB (≈3.5 MB gz) MIT
(phase 2) tiny symbol CNN (int8) / copista-2m detector (fp16 ONNX ≈ 4 MB) 0.1–8 MB ours / Apache-2.0 (+NOTICE)
CDN <script>s: pdf.js 3.11.174 + worker (cdnjs), tesseract.js 7.0.0 (cdnjs), OSMD 2.3.0 (jsdelivr), ORT 1.30.0 JS (cdnjs, phase 2) n/a Apache/BSD/MIT

Phase 1 total ≈ 13–20 MB; phase 2 ≈ 30–40 MB. Both are well under 64 MB.

9.4 Phased plan

  1. Phase 1 (ship):
    • Classical core, tesseract lyrics, SATB splitting rules, MusicXML writer, and the harness on synthetic hymn scans.
    • Targets on clean synthetic closed-score hymns: note F1 ≥ 95 %, part assignment ≥ 97 %, lyric attachment ≥ 90 %.
  2. Phase 2 (ML assist):
    • (a) Tiny CNN for head/rest/accidental/clef crops, trained on LilyPond/Verovio-rendered synthetic crops + DeepScoresV2 (CC BY 4.0), exported to int8 ONNX.
    • (b) Spike: copista-2m (Apache-2.0):
      1. Export the 1.94M detector to ONNX in Python on this machine.
      2. Confirm that the detector source has no Ultralytics/AGPL code; export.py mentions ultralytics-format datasets and "custom loops".
      3. Use its stem_dir/voice_slot/staff_position attributes as an additional vote in our assembly.
      4. Port its Viterbi rhythm idea, not its Python code.
      5. Keep its NOTICE file (Apache-2.0 §4(d)).
    • (c) Optional PP-OCRv5 Latin recogniser for lyrics on degraded scans.
  3. Not recommended:
    • End-to-end image→sequence models (SMT/SMT++, Zeus, LEGATO, TrOMR, homr transformer) in the browser. Their weights are 40–430 MB plus a gated Llama encoder for LEGATO. Autoregressive decoding is slow on single-thread WASM. They are trained on piano/quartet/Lieder with no SATB part semantics, and they drop lyrics.
    • homr and Audiveris for licence reasons (AGPL).

9.5 Key risks and mitigations


10. References (URLs)

Systems / code / weights

Datasets

Classical methods

Metrics

Browser runtime

v0.4.0 · · page built from 849bb84