Ga naar inhoud

Canonieke checklists (.mxl / .mscz / PDF)

Doel: vastleggen wat wij als normale vorm zien in gegenereerde of genormaliseerde .mxl / .mscz (en afgeleide PDF’s). Dat zijn de targets voor export én voor eventuele diagonaal-normalisatie (zelfde formaat → ons profiel). PDF’s zijn canoniek A4 staand (zie checklist PDF P6).

Geen herdefinitie van MusicXML of MuseScore — alleen onze conventies. Normatieve eenstemmige MusicXML-details: rendering — MusicXML-export. Partituur-valkuilen: vsa-templates — rendering-pitfalls. Oefenhoek-bronnen (VSA-demo; later hierheen):

  • VSA-demo/scripts/mscz-partituur-contract.md — A4, typografie, maatstrepen, recite-print
  • VSA-demo/scripts/mscz-product-transforms.md — PDF- en Coria-.mxl-transforms

Gemeenschappelijke kern (MXL én MSCZ)

Zoveel mogelijk gelijk houden; layout (aantal balken, partijnamen) hoort niet hier — die divergeert bewust (Coria vs leespartituur).

# Eis Toelichting
K1 SATB-inhoud Vier stemmen S/A/T/B zijn aanwezig (semantiek). Hoe ze op balken/parts liggen: zie checklist MXL vs MSCZ.
K2 Sync tekst ↔ toon Elke gezongen lettergreep/positie heeft minstens één klinkende noot in elke stem die meezingt; melisma = meerdere noten op één tekstpositie.
K3 Melisma-lyrics Tekst (lyric) op de eerste noot van het melisma; vervolgnoten zonder nieuwe woordtekst; canonieke export zet <extend/> (lyric-streep) op die eerste noot.
K4 Streepjes / syllabic Lettergreepgrenzen via MusicXML syllabic begin/middle/end/single — consistent met - in de brontekst.
K5 Recite vs gewone duur Reciteertoon herkenbaar (encoding per kanaal); geen normale kwart vermomd als recite zonder reden.
K6 Geen spookrusten Geen layout-truc-rusten die als zingbare stilte of foute pauzes klinken (tenzij bewust blad-aanwijzing → pauze in playback).
K7 Toonsoort / do-context Key/fifths (en waar van toepassing MIDI-instrumentatie) sluiten aan op @do / blokmetadata.

Checklist MXL (Coria / playback)

Primair profiel: playback. Zie ook MusicXML-exportprofielen en Oefenhoek VSA-demo/scripts/mscz-product-transforms.md (Coria-kolom).

# Eis Toelichting
M1 Kern K1–K7 —
M2 Vier aparte parts Soprano / Alto / Tenor / Bass (P1–P4). Coria kiest solo op part, niet op voice binnen één part. Geen canonieke “alles op twee balken” voor Coria-MXL.
M3 Lyrics per part Elke part heeft de gezongen tekst (lyric number 1) zodat muted/solo stemmen tekst tonen.
M4 Coria-vriendelijk Geen features die Coria stelselmatig breekt of negeert (volg playback-tabel in rendering.md).
M5 Melisma-extend Alleen op eerste noot: <extend/> zonder type; midden/eind geen <lyric>.
M5a Melisma same-pitch Zelfde hoogte binnen één lettergreep → één noot zolang de som ≤ dubbelgepunt whole (28 divisions; gestipte ELM behouden; Coria stript ties). Langer (bijv. 8 kwarten): I2-tie-keten (geen type/duration-mismatch — MuseScore heraanslaat anders elke kwart).
M6 Voice/stem Expliciete <voice> / <stem> zoals in playback (getest t.o.v. MuseScore-roundtrip + Coria).
M7 Blad-aanwijzing Scopeloze aanwijzingen → hele-nootrust zonder lyrics (pauze), geen “meegezongen” tekst.
M8 MIDI: piano op elke part Elke stempartij (P1–P4) heeft midi-device / midi-instrument met canonieke piano: instrument-sound = keyboard.piano.grand, midi-program = 1, kanalen 1–4. Geen koorklank (voice.choir.aahs) als canonieke vorm. Eenstemmig .vsa-playback: zelfde piano-default.
M9 Geen engraving-only extras Geen verplichte <defaults>-typografie, geen extend type="start/continue/stop" als canonieke playback-vorm.
M10 Recite-playback Geen print-collapse / breve: elke lettergreep een klinkende noot (kwart of ELM). Feathered \|\|O\|\| uit MSCZ wordt bij Coria-export geëxplodeerd.
M11 SATB uit mvsa Bij export uit .mvsa: vier parts P1–P4 zoals M2–M3.
M12 Dubbele maatstreep Sectie-einde (\|\|) → light-light; Coria mag daar een pauzemaat van maken (Oefenhoek-transform).
M13 Leidende gap-rusten Bij Coria-export uit MSCZ: wissen; maat korter (senza-misura) — zie product-transforms.
M14 Voortekens <accidental> aanwezig voor betrouwbare playback.
M15 @tekst-pauze Mid-flow @tekst (niet maat 1): zelfde [PAUZE]-maat als na \|\| (cue op de pauzemaat). Geen dubbele pauze als de vorige maat al sectie-einde is.
M16 Leidende \|: Forward-repeat links op de eerste inhoudsmaat; geen lege rustmaat vóór die inhoud (zelfde semantiek als MSCZ S16).
M17 Geen source+encoding Coria geeft translation failed als <identification> zowel <source> als <encoding> heeft. Playback-sanitize verwijdert <source>; bronvermelding in miscellaneous-field name="bron". Bij licentie in <rights> eist mxl validate die misc-bron.
M18 Monofone part Elke playback-part is één oefenlijn: geen <staves>≠1, geen tweede clef (number="2"), noten met staff/voice = 1 (of weggelaten), geen <backup>/<forward>/<chord/>. Partituur-restanten (TB op staff 2, MuseScore-voice 5/6, octaaf-akkoorden) worden bij export genormaliseerd. Divisi als aparte B2/S2-parts: later.
M19 encoding vóór miscellaneous Coria geeft translation failed als <miscellaneous> in <identification> vóór <encoding> staat (ook zonder <source>). Sanitize herschikt; mxl validate faalt bij verkeerde volgorde. <notehead> hoort niet in playback-MXL (M4 / Coria faalt o.a. op none).
M20 Note-kindvolgorde Binnen <note>: geen <lyric> vóór <staff>; geen <dot> ná <accidental> (MusicXML-kernvolgorde: o.a. type → dot → accidental → staff → lyric). Coria geeft anders translation failed. mxl normalize / sanitize herschikt; mxl validate faalt bij schending.

Normalize-target MXL → MXL: mxl normalize (zie mxl CLI) herschrijft naar deze checklist + playback-encoding. Lees-gate zonder schrijven: mxl validate (--profile satb of mono).

Checklist MSCZ (partituur / MuseScore)

Primair: leesbare SATB-partituur in MuseScore 4 (en afgeleide print-PDF). Bron van waarheid voor layout-pitfalls: rendering-pitfalls. Oefenhoek-detailnorm (A4, typografie, copyright, recite-print): VSA-demo/scripts/mscz-partituur-contract.md. Leesregels in deze repo: MSCZ-leesbaarheid.

# Eis Toelichting
S1 Kern K1–K7 Semantiek gelijk aan MXL; layout wijkt af (S2–S4).
S2 Twee balken: SA + TB Balk 1 = sopraan+alt (G-sleutel); balk 2 = tenor+bas (F-sleutel). Geen vier aparte notenbalken als canonieke partituur. Geen lege derde balk (na SAT+B-import weg).
S3 Geen stem-indicaties Geen partijnamen / instrumentnamen op de balken: niet S/A/T/B, niet Soprano, niet S/A, niet Women/Men als zichtbare balklabels. Stijl: partijnamen uit (firstSystemInstNameVisibility / subsSystemInstNameVisibility = 0).
S4 Stokrichting S/T↑ A/B↓ Per balk twee voices: S (voice 1) en T (voice 1) stok omhoog; A (voice 2) en B (voice 2) stok omlaag (zoals VSA-template / MuseScore-partituur). Geen Capella-achtige “één akkoordstok” als canonieke vorm.
S5 Lyrics tussen de balken Gezongen tekst onder de bovenste balk (niet vier keer herhaald, niet onder de bas als primaire plaats).
S6 Opent bruikbaar in MuseScore 4 SATB + lyrics zichtbaar/bewerkbaar voor de partituur-workflow.
S7 A4 + Style A4 staand, 15 mm marges; Source Sans 3 (lyrics 13 / word 12 / titel 18); geen eerste-systeem-inspring; laatste systeem vol; vaste systeemafstand (minSystemDistance/maxSystemDistance); geen vertical page-fill.
S8 Recite-print (spacers) Bij n ≥ 6: 1–(n−2)–1 — randnoten + één stokloze \|\|O\|\| (eerste midden-lettergreep; MuseScore headType breve, metrisch = randduur) + spacers voor overige midden-lyrics (visible=0 + play=0 op de nootkop; lyrics zichtbaar; geen print-object=no op hele noot). Geen MusicXML type=breve als maatbreedte (MuseScore rekt die tot 8/4). Kortere recite = één noot per lettergreep. Zie leesbaarheid.
S9 Maatstrepen Enkele streep = frase/adem; dubbele (light-light) = sectie-einde (\|\| in .mvsa) of scheiding vóór mid-flow @tekst (S15); slot = light-heavy. Eindstreep per systeem zichtbaar. Herhaalstrepen (\|: / :\| / :\|\|) blijven herhaalpunten tonen (S16).
S10 Maatnummers Eerste maat per systeem; interval 0.
S11 Geen Coria-eis Mag engraving-achtige encodes bevatten; hoeft niet Coria-playback-vriendelijk te zijn.
S12 Keten ok Gegenereerd via mvsa → partituur-mxl → MuseScore mag: na opslaan voldoet het bestand aan S1–S10 en S13–S19 (of wordt genormaliseerd).
S13 Melisma MXL en MSCZ (zie ook M5a). Lyric op eerste noot + <extend/>; bij toonwissels ook melisma-slur. Zelfde-hoogte: MusicXML-tussenbestand (partituur) blijft I1 — ongestipte standaardduuren ≤ whole of tie-keten (veilige MuseScore-import; geen gestipte MusicXML-collapse / geen type=breve). MSCZ-postprocess trekt die tie-ketens daarna samen tot één compacte noot, inclusief gestipt (bijv. half+kwart → gestipte half) — leesbaar blad. Pure same-pitch-hold: ties in het tussenbestand, geen slur; op het eindblad bij voorkeur één noot. Geen Capella-fraseslurs. Zie leesbaarheid R7.
S14 Geen mid-systeem-HBox Geen horizontale frame (HBox) tussen maten van hetzelfde MuseScore-systeem. MuseScore tekent dan een accolade/bracket middenin het systeem. HBox alleen aan systeem-/staff-einde waar templates dat bewust doen; trailing lege HBox vóór </Staff> / colofon weg.
S15 Mid-flow @tekst Cue als SystemText boven de ge-cue-de maat. Vorige maat: dubbele streep (light-light), tenzij daar al :\| / :\|\| / \|\| staat (die blijft). Geen spacermaat met notenbalklijnen en geen mid-systeem-HBox (S14). Wil je een regelsprong: @mscz-newline.
S16 Herhalingen zonder spookmaat Leidende \|: → linker forward-repeat op de eerste inhoudsmaat (start_bar); geen lege rustmaat vóór die inhoud. :\| → rechter backward-repeat (light-heavy + dots); niet “opwaarderen” naar alleen light-light (dan verdwijnen de herhaalpunten).
S17 Geen lege spacer-maten Geen korte rust-only maten (MusicXML-cue-spacers, print-object=no, lege \|:-restanten) in de canonieke partituur. Postprocess stript die maten; vervangt ze niet door mid-systeem-HBox.
S18 Accolade alleen bij systeembegin Bracket/accolade hoort alleen aan het begin van een MuseScore-systeem. Geen extra accolade vóór een mid-flow cue of na een gap/HBox.
S19 @tekst = SystemText Alle @tekst-cues zijn SystemText (niet StaffText). Match ook MuseScore-<br/> bij meerregelige cues (... op regel 2).

Normalize-target MSCZ → MSCZ: herschrijf/opnieuw genereren naar deze checklist (beperkt wat wij vastleggen; geen volledige MuseScore-spec).

Checklist PDF (afgeleide van MSCZ)

MuseScore-/basispartituur-PDF is geen apart bronformaat: dezelfde visuele afspraken als MSCZ (twee balken, geen stem-indicaties, lyrics tussen de balken). Geen lettergreep-explosie, geen vier Coria-parts in de PDF. Transforms: Oefenhoek mscz-product-transforms.md (PDF-kolom).

Canonieke pagina: elke door ons geproduceerde PDF is A4 staand (210×297 mm). US Letter is niet canoniek — noch voor partituur-PDF (mvsa pdf / MuseScore), noch voor Markdown-PDF (vsa pdf).

# Eis Toelichting
P1 Erft MSCZ S2–S5, S7–S10, S14–S19 SA/TB, geen partijnamen, lyrics tussen balken, Style/recite-spacers, maatstrepen; geen mid-systeem-HBox/spookmaten; cues als SystemText. (A4 via S7 én expliciet P6.)
P2 Recite blijft compact Printmodel (\|\|O\|\|); geen Coria-kwart-per-lettergreep.
P3 Geen Coria-links Oefenmateriaal hoort niet in papieren/PDF-uitgave (tenzij later bewust toegevoegd).
P4 Copyright-regel + colofon Later (nog niet verplicht in deze toolchain): korte copyright-regel op elke pagina (footer) én een colofon (zoals Oefenhoek mscz-partituur-contract). Niet vergeten bij PDF-producten.
P5 Provenance (Oefenhoek) Optioneel: partituur-hash / generator-meta zoals in product-transforms — nog niet verplicht in VSA-tooling-export.
P6 A4 staand Paginaformaat A4 (210×297 mm), niet US Letter. Partituur: MuseScore-Style (pageWidth/pageHeight, zie MSCZ S7). Markdown-PDF (vsa pdf): print-CSS @page 210×297 mm.

vsa pdf is een andere pipeline (Markdown + VSA-SVG, geen MuseScore-partituur) maar valt onder dezelfde A4-eis (P6).

Verschillen bewust hangende houden

Onderwerp .mxl (Coria) .mscz / MuseScore-PDF (partituur)
Balken / parts vier parts S/A/T/B; monofoon per part (M18) twee balken SA + TB
Stem-labels part-namen Soprano…Bass (Coria-UI) geen zichtbare stem-indicaties
Instrument / MIDI piano op elke part (keyboard.piano.grand, M8) geen Coria-MIDI-eis (leesblad); MuseScore kiest bij openen meestal piano
Lyrics op elke part één laag tussen de balken
Recite per lettergreep een noot 1–(n−2)–1 + spacers (zichtbare lyrics)
Melisma-extend <extend/>; slur bij toonwissels <extend/>; slur bij toonwissels; geen extender onder recite
Melisma same-pitch collapse tot één noot incl. gestipte ELM (M5a; Coria stript ties) MusicXML: I1 tie-keten ongestipt; MSCZ-postprocess: compacte noot incl. stip (S13/R7)
Stokrichting (per part, vaak auto) S/T omhoog, A/B omlaag (twee voices per balk)
Typografie / Style weglaten wel (MuseScore A4)
Blad-aanwijzing rust zonder lyric mag op blad zichtbaar blijven
Mid-flow @tekst [PAUZE]-maat + cue (M15) dubbele streep + SystemText; geen HBox/spacermaat (S14–S15, S17–S19)
Leidende \|: forward op eerste inhoudsmaat (M16) idem; geen lege rustmaat (S16)
Doel afspelen / Coria lezen / bewerken / PDF

Bestandsnaamgeving (conventie)

Traceerbaarheid van conversies. Expliciet -o mag nog steeds een korte naam zijn.

Regel Voorbeeld
CLI-default (zonder -o): stem.brontype.doeltype lied.mvsa → lied.mvsa.mscz; lied.mscz → lied.mscz.mxl
Bij voorkeur in generated/: zelfde patroon alleluia.mvsa.mxl, alleluia.mscz.mvsa, tropaar.vsa.mxl
Zoektekst in canonieke .vsa / .mvsa Veld zoektekst in YAML-frontmatter — zie zoektekst
Lyrics-product (optioneel; o.a. uit .mscz / .mxl) lied.mscz.lyrics.txt via vsa text -o
Laatste segment = echte extensie voor tools .mxl, .mvsa, .mscz, .mp3 / .ogg / .wav, of .txt bij lyrics-producten
Expliciet -o mag enkelvoudig blijven -o out.mxl of -o generated\lied.mscz
Geen fout als de naam “simpel” is normalize/export falen niet op ontbrekende dubbele extensie

Een sibling *.vsa.lyrics.txt / *.mvsa.lyrics.txt is niet verplicht naast een canonieke bron; editorzoeken loopt via zoektekst in het bronbestand.

In examples/mvsa/ worden conversieproducten niet gecommit (zie .gitignore); alleen bron-.mvsa (+ README / ISSUES).

Zie ook mvsa-conversies.