rism-digital / verovio

🎵 Music notation engraving library for MEI with MusicXML and Humdrum support and various toolkits (JavaScript, Python)
https://www.verovio.org
GNU Lesser General Public License v3.0
649 stars 177 forks source link

Rendering of neumes (that look like ligatures) #3724

Open martha-thomae opened 4 days ago

martha-thomae commented 4 days ago

The rules for "ligatures"—neumes consisting of more than one neume component—are relatively simple in my opinion. I am using the following real piece for illustrating this (see the manuscript image and encoding):

Screenshot 2024-07-03 at 17 25 46

The file for this can be seen in the ECHOES project repo: https://github.com/ECHOES-from-the-Past/GABCtoMEI/blob/main/MEI_outfiles/antiphonae_ad_communionem/002_C02_benedicite-omnes_pem85041_square_SQUARE.mei. I am providing a cleaner version here:

<?xml version="1.0" ?>
<?xml-model href="https://music-encoding.org/schema/5.0/mei-Neumes.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?>
<?xml-model href="https://music-encoding.org/schema/5.0/mei-Neumes.rng" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>
<mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="5.0">
   <meiHead>
      <fileDesc>
         <titleStmt>
            <title>Benedicite omnes</title>
         </titleStmt>
         <pubStmt/>
      </fileDesc>
   </meiHead>
   <music>
      <body>
         <mdiv xml:id="m-a89893d2-2fec-11ef-a1ac-3645f29ecd15">
            <score xml:id="m-a8989454-2fec-11ef-a1ac-3645f29ecd15">
               <scoreDef xml:id="m-a8989486-2fec-11ef-a1ac-3645f29ecd15">
                  <staffGrp xml:id="m-a89894ae-2fec-11ef-a1ac-3645f29ecd15">
                     <staffDef n="1" lines="5" notationtype="neume" xml:id="m-a89894ea-2fec-11ef-a1ac-3645f29ecd15"/>
                  </staffGrp>
               </scoreDef>
               <section xml:id="m-a8989512-2fec-11ef-a1ac-3645f29ecd15">
                  <staff n="1" xml:id="m-a898953a-2fec-11ef-a1ac-3645f29ecd15">
                     <layer n="1" xml:id="m-a898956c-2fec-11ef-a1ac-3645f29ecd15">
                        <clef shape="C" line="4" xml:id="m-a8989594-2fec-11ef-a1ac-3645f29ecd15"/>
                        <syllable xml:id="m-a89895bc-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="i" con="d" xml:id="m-a89895da-2fec-11ef-a1ac-3645f29ecd15">Be</syl>
                           <neume xml:id="m-a8989602-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a8989620-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                              <nc xml:id="m-a8989648-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                              <nc tilt="s" xml:id="m-a8989666-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898968e-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a89896ac-2fec-11ef-a1ac-3645f29ecd15">ne</syl>
                           <neume xml:id="m-a89896d4-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a89896f2-2fec-11ef-a1ac-3645f29ecd15" pname="d" oct="2"/>
                              <nc tilt="s" xml:id="m-a898971a-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989738-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a8989756-2fec-11ef-a1ac-3645f29ecd15">di</syl>
                           <neume xml:id="m-a898977e-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898979c-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                              <nc tilt="s" xml:id="m-a89897ba-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a89897e2-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a8989800-2fec-11ef-a1ac-3645f29ecd15">ci</syl>
                           <neume xml:id="m-a898981e-2fec-11ef-a1ac-3645f29ecd15">
                              <nc tilt="n" xml:id="m-a898983c-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                              <nc xml:id="m-a8989864-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989882-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="t" xml:id="m-a89898a0-2fec-11ef-a1ac-3645f29ecd15">te</syl>
                           <neume xml:id="m-a89898c8-2fec-11ef-a1ac-3645f29ecd15">
                              <nc curve="c" xml:id="m-a89898e6-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2">
                                 <liquescent xml:id="m-a898990e-2fec-11ef-a1ac-3645f29ecd15"/>
                              </nc>
                           </neume>
                           <neume xml:id="m-a898992c-2fec-11ef-a1ac-3645f29ecd15">
                              <nc ligated="true" tilt="n" xml:id="m-a898994a-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                              <nc ligated="true" xml:id="m-a8989972-2fec-11ef-a1ac-3645f29ecd15" pname="d" oct="2"/>
                              <nc xml:id="m-a8989990-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                              <nc xml:id="m-a8989ac6-2fec-11ef-a1ac-3645f29ecd15" pname="d" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989ae4-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="i" con="d" xml:id="m-a8989b0c-2fec-11ef-a1ac-3645f29ecd15">om</syl>
                           <neume xml:id="m-a8989b2a-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a8989b48-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989b70-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="t" xml:id="m-a8989b8e-2fec-11ef-a1ac-3645f29ecd15">nes</syl>
                           <neume xml:id="m-a8989bac-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a8989bd4-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989c06-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="i" con="d" xml:id="m-a8989c2e-2fec-11ef-a1ac-3645f29ecd15">an</syl>
                           <neume xml:id="m-a8989c4c-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a8989c6a-2fec-11ef-a1ac-3645f29ecd15" pname="b" oct="2"/>
                              <nc tilt="s" xml:id="m-a8989c92-2fec-11ef-a1ac-3645f29ecd15" pname="c" oct="3"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989cb0-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a8989cce-2fec-11ef-a1ac-3645f29ecd15">ge</syl>
                           <neume xml:id="m-a8989cf6-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a8989d14-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989d32-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="t" xml:id="m-a8989d5a-2fec-11ef-a1ac-3645f29ecd15">li</syl>
                           <neume xml:id="m-a8989d78-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a8989d96-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989dc8-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="i" con="d" xml:id="m-a8989df0-2fec-11ef-a1ac-3645f29ecd15">do</syl>
                           <neume xml:id="m-a8989e0e-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a8989e2c-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989e54-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a8989e72-2fec-11ef-a1ac-3645f29ecd15">mi</syl>
                           <neume xml:id="m-a8989e90-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a8989eb8-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989ed6-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="t" xml:id="m-a8989ef4-2fec-11ef-a1ac-3645f29ecd15">ni</syl>
                           <neume xml:id="m-a8989f1c-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a8989f3a-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a8989f62-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="i" con="d" xml:id="m-a8989f80-2fec-11ef-a1ac-3645f29ecd15">do</syl>
                           <neume xml:id="m-a8989f9e-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a8989fc6-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                              <nc tilt="s" xml:id="m-a8989fee-2fec-11ef-a1ac-3645f29ecd15" pname="b" oct="2"/>
                              <nc xml:id="m-a898a00c-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a034-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a898a052-2fec-11ef-a1ac-3645f29ecd15">mi</syl>
                           <neume xml:id="m-a898a070-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a098-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                              <nc xml:id="m-a898a0b6-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                              <nc tilt="n" xml:id="m-a898a0d4-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a0fc-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="t" xml:id="m-a898a11a-2fec-11ef-a1ac-3645f29ecd15">num</syl>
                           <neume xml:id="m-a898a138-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a160-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a17e-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="i" con="d" xml:id="m-a898a1a6-2fec-11ef-a1ac-3645f29ecd15">hym</syl>
                           <neume xml:id="m-a898a1c4-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a1e2-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a20a-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="t" xml:id="m-a898a228-2fec-11ef-a1ac-3645f29ecd15">num</syl>
                           <neume xml:id="m-a898a246-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a26e-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a28c-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="i" con="d" xml:id="m-a898a2aa-2fec-11ef-a1ac-3645f29ecd15">di</syl>
                           <neume xml:id="m-a898a2d2-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a2f0-2fec-11ef-a1ac-3645f29ecd15" pname="b" oct="2"/>
                              <nc tilt="s" xml:id="m-a898a30e-2fec-11ef-a1ac-3645f29ecd15" pname="c" oct="3"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a336-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a898a354-2fec-11ef-a1ac-3645f29ecd15">ci</syl>
                           <neume xml:id="m-a898a372-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a39a-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a3b8-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="t" xml:id="m-a898a3d6-2fec-11ef-a1ac-3645f29ecd15">te</syl>
                           <neume xml:id="m-a898a3f4-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a41c-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                              <nc xml:id="m-a898a43a-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                              <nc xml:id="m-a898a458-2fec-11ef-a1ac-3645f29ecd15" pname="b" oct="2"/>
                              <nc xml:id="m-a898a480-2fec-11ef-a1ac-3645f29ecd15" pname="c" oct="3"/>
                              <nc xml:id="m-a898a49e-2fec-11ef-a1ac-3645f29ecd15" pname="b" oct="2"/>
                           </neume>
                           <neume xml:id="m-a898a4c6-2fec-11ef-a1ac-3645f29ecd15">
                              <nc tilt="n" xml:id="m-a898a4ee-2fec-11ef-a1ac-3645f29ecd15" pname="b" oct="2"/>
                              <nc xml:id="m-a898a50c-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a52a-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="s" xml:id="m-a898a552-2fec-11ef-a1ac-3645f29ecd15">et</syl>
                           <neume xml:id="m-a898a570-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a58e-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a5ac-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="i" con="d" xml:id="m-a898a5d4-2fec-11ef-a1ac-3645f29ecd15">su</syl>
                           <neume xml:id="m-a898a5f2-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a610-2fec-11ef-a1ac-3645f29ecd15" pname="b" oct="2"/>
                              <nc xml:id="m-a898a638-2fec-11ef-a1ac-3645f29ecd15" pname="c" oct="3"/>
                              <nc xml:id="m-a898a656-2fec-11ef-a1ac-3645f29ecd15" pname="b" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a674-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a898a692-2fec-11ef-a1ac-3645f29ecd15">pe</syl>
                           <neume xml:id="m-a898a6ba-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a6e2-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a70a-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a898a728-2fec-11ef-a1ac-3645f29ecd15">re</syl>
                           <neume xml:id="m-a898a746-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a76e-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a78c-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a898a7aa-2fec-11ef-a1ac-3645f29ecd15">xal</syl>
                           <neume xml:id="m-a898a7d2-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a7f0-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a80e-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a898a82c-2fec-11ef-a1ac-3645f29ecd15">ta</syl>
                           <neume xml:id="m-a898a854-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a872-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                              <nc xml:id="m-a898a890-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                              <nc tilt="s" xml:id="m-a898a8b8-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a8d6-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="t" xml:id="m-a898a8fe-2fec-11ef-a1ac-3645f29ecd15">te</syl>
                           <neume xml:id="m-a898a91c-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a944-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898a962-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="i" con="d" xml:id="m-a898a980-2fec-11ef-a1ac-3645f29ecd15">e</syl>
                           <neume xml:id="m-a898a9a8-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898a9c6-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                              <nc tilt="s" xml:id="m-a898a9e4-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                              <nc tilt="se" xml:id="m-a898aa0c-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                              <nc tilt="se" xml:id="m-a898aa2a-2fec-11ef-a1ac-3645f29ecd15" pname="d" oct="2"/>
                              <nc tilt="s" xml:id="m-a898aa48-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898aa70-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="t" xml:id="m-a898aa8e-2fec-11ef-a1ac-3645f29ecd15">um</syl>
                           <neume xml:id="m-a898aaac-2fec-11ef-a1ac-3645f29ecd15">
                              <nc tilt="n" xml:id="m-a898aaca-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                              <nc xml:id="m-a898aaf2-2fec-11ef-a1ac-3645f29ecd15" pname="d" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898ab10-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="s" xml:id="m-a898ab2e-2fec-11ef-a1ac-3645f29ecd15">in</syl>
                           <neume xml:id="m-a898ab56-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898ab74-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                              <nc tilt="s" xml:id="m-a898ab92-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                           </neume>
                           <neume xml:id="m-a898abba-2fec-11ef-a1ac-3645f29ecd15">
                              <nc tilt="n" xml:id="m-a898abe2-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                              <nc xml:id="m-a898ac00-2fec-11ef-a1ac-3645f29ecd15" pname="d" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898ac1e-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="i" con="d" xml:id="m-a898ac46-2fec-11ef-a1ac-3645f29ecd15">sae</syl>
                           <neume xml:id="m-a898ac64-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898ac82-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                              <nc tilt="s" xml:id="m-a898acaa-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                              <nc tilt="se" xml:id="m-a898acc8-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                              <nc tilt="se" xml:id="m-a898ace6-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                           </neume>
                           <neume xml:id="m-a898ad0e-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898ad2c-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                              <nc tilt="s" xml:id="m-a898ad4a-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                           </neume>
                           <neume xml:id="m-a898ad68-2fec-11ef-a1ac-3645f29ecd15">
                              <nc tilt="n" xml:id="m-a898ad90-2fec-11ef-a1ac-3645f29ecd15" pname="a" oct="2"/>
                              <nc xml:id="m-a898adb8-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898ade0-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="m" con="d" xml:id="m-a898adfe-2fec-11ef-a1ac-3645f29ecd15">cu</syl>
                           <neume xml:id="m-a898aef8-2fec-11ef-a1ac-3645f29ecd15">
                              <nc xml:id="m-a898af20-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                              <nc tilt="n" xml:id="m-a898af3e-2fec-11ef-a1ac-3645f29ecd15" pname="g" oct="2"/>
                              <nc xml:id="m-a898af5c-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                              <nc xml:id="m-a898af7a-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                           </neume>
                        </syllable>
                        <syllable xml:id="m-a898afa2-2fec-11ef-a1ac-3645f29ecd15">
                           <syl wordpos="t" xml:id="m-a898afc0-2fec-11ef-a1ac-3645f29ecd15">la</syl>
                           <neume xml:id="m-a898afde-2fec-11ef-a1ac-3645f29ecd15">
                              <nc tilt="n" xml:id="m-a898affc-2fec-11ef-a1ac-3645f29ecd15" pname="f" oct="2"/>
                              <nc xml:id="m-a898b024-2fec-11ef-a1ac-3645f29ecd15" pname="e" oct="2"/>
                           </neume>
                        </syllable>
                     </layer>
                  </staff>
               </section>
            </score>
         </mdiv>
      </body>
   </music>
</mei>
martha-thomae commented 4 days ago

Basically, anything that starts with a clivis or porrectus shape should have an initial stem on the starting note.

Basically, anything that starts with:

<nc tilt="n"/>

should have the stem rendered next to the note (not separated with a space as it currently is). This initial nc with @tilt = n usually appears as the first component of neumes that start with a clivis or porrectus shape (the shapes shown above).


And all neumes that have more than one neume component, should have all their neume components connected to one another (with the exception of the rhombuses and repeated notes). See the example of a torculus with the highest neume component being more than a second apart:

image

An example of the encoding of the torculus in the middle would be:

<neume>
  <nc loc="4"/>
  <nc loc="6"/>
  <nc loc="3"/>
</neume>
lpugin commented 2 days ago

It would be helpful to have more "atomic" examples, with just one of each. I would also suggest to add some comments in the MEI for names you are using but that are not given in the MEI elements and attributes. For example, rhombuses appears nowhere. Something like:

<neume>
   <!-- clivis -->
   <nc tilt="n"/>
   <nc/>
</neume>