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
685 stars 185 forks source link

Custos collision with following note #1780

Open craigsapp opened 4 years ago

craigsapp commented 4 years ago

Custodes that are placed before notes collide with those notes (custodes that are marked in red):

Screen Shot 2020-10-22 at 10 38 17 PM

These should be moved before the note that they precede, or the notes should be pushed further to the right to get out of the way of them. For the clef-change case, the custos should be placed before the clef and the vertical position should be in relation to the previously active clef.

Placing a custos in the middle of a staff is non-sensical in general, but there are two usage cases that need correct handling of such placement: (1) when the layout is automatic rather than encoded, the custodes may no longer be at the end of a system. If the custos is not at the end of a measure, then it will overlap with the following notes in such cases. (2) Custodes can appear before a clef changes within a system to indicate the pitch after the clef change, but displayed in the old clef. This can be seen in a chant book in the Stanford Libraries which is online here:

https://searchworks.stanford.edu/view/hj504pg5511 page 34, left side:

Screen Shot 2020-10-22 at 10 23 25 PM

Somewhere I believe there is also a custos in the middle of a staff with no clef change following it, and the meaning is that there is a repetition to the start of the music, and the custos gives the first note of the repetition (I will ask the student studying the manuscript on what page that might be).

There are several of the new <divLine> elements present in this example as well...

craigsapp commented 4 years ago

Note that multiple custodes may be needed for a chord at the start of the next system, so adjacent <custos> should still stack on themselves, as is currently being done:

Screen Shot 2020-10-23 at 8 21 45 AM
<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="https://music-encoding.org/schema/4.0.0/mei-all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?>
<?xml-model href="https://music-encoding.org/schema/4.0.0/mei-all.rng" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>
<mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="4.0.0">
 <meiHead>
  <fileDesc>
   <titleStmt>
    <title />
   </titleStmt>
   <pubStmt />
  </fileDesc>
  <encodingDesc>
   <appInfo>
    <application isodate="2020-10-23T08:21:25" version="3.1.0-dev-341f642-dirty">
     <name>Verovio</name>
     <p>Transcoded from Humdrum</p>
    </application>
   </appInfo>
  </encodingDesc>
  <workList>
   <work>
    <title />
   </work>
  </workList>
 </meiHead>
 <music>
  <body>
   <mdiv xml:id="mdiv-0000001066121427">
    <score xml:id="score-0000001846756668">
     <scoreDef xml:id="scoredef-0000001889956372" midi.bpm="400">
      <staffGrp xml:id="staffgrp-0000001173600030">
       <staffDef xml:id="staffdef-0000000745957643" n="1" lines="5">
        <clef xml:id="clef-L2F1" shape="C" line="3" />
       </staffDef>
      </staffGrp>
     </scoreDef>
     <section xml:id="section-L1F1">
      <measure xml:id="measure-L1" n="1">
       <staff xml:id="staff-0000001539621600" n="1">
        <layer xml:id="layer-L1F1N1" n="1">
         <note xml:id="note-L4F1" dur="1" oct="4" pname="c" accid.ges="n" />
         <custos oct="3" pname="g" xml:id="custos-L5F1" color="skyblue" />
         <custos oct="3" pname="b" xml:id="custos-L6F1" color="orange" />
         <custos oct="4" pname="d" xml:id="custos-L7F1" color="dodgerblue" />
         <custos oct="4" pname="f" xml:id="custos-L8F1" color="gold" />
        </layer>
       </staff>
      </measure>
      <measure xml:id="measure-L9" n="2">
       <staff xml:id="staff-L9F1N1" n="1">
        <layer xml:id="layer-L9F1N1" n="1">
         <clef xml:id="clef-L10F1" shape="F" line="4" />
         <note xml:id="note-L11F1" dur="1" oct="3" pname="c" accid.ges="n" />
         <custos oct="2" pname="a" xml:id="custos-L12F1" color="purple" />
         <custos oct="3" pname="c" xml:id="custos-L13F1" color="limegreen" />
         <custos oct="3" pname="e" xml:id="custos-L14F1" color="red" />
         <custos oct="3" pname="g" xml:id="custos-L15F1" color="skyblue" />
        </layer>
       </staff>
      </measure>
      <measure xml:id="measure-L16" n="3">
       <staff xml:id="staff-L16F1N1" n="1">
        <layer xml:id="layer-L16F1N1" n="1">
         <clef xml:id="clef-L17F1" shape="G" line="2" />
         <note xml:id="note-L18F1" dur="1" oct="5" pname="c" accid.ges="n" />
         <custos oct="4" pname="f" xml:id="custos-L19F1" color="gold" />
         <custos oct="4" pname="a" xml:id="custos-L20F1" color="purple" />
         <custos oct="5" pname="c" xml:id="custos-L21F1" color="limegreen" />
         <custos oct="5" pname="e" xml:id="custos-L22F1" color="red" />
        </layer>
       </staff>
      </measure>
     </section>
    </score>
   </mdiv>
  </body>
 </music>
</mei>
lpugin commented 1 month ago

This has been fixed in https://github.com/rism-digital/verovio/commit/022d1a5b09795c827d9659da29de551bc0cc358a