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
650 stars 178 forks source link

Too many dots on unisons #3705

Open axgeertinger opened 1 month ago

axgeertinger commented 1 month ago

Not sure whether this qualifies as a feature request or a bug report: Dotted unisons in double stem notation sharing the same notehead should only have one dot, not two (cf. Behind Bars, p. 58). This:

<staff n="2">
    <layer n="1">
        <note dots="1" dur.ppq="6" dur="4" oct="3" pname="a" stem.dir="up"/>
    </layer>
    <layer n="2">
        <note dots="1" dur.ppq="6" dur="4" oct="3" pname="a" stem.dir="down"/>
    </layer>
</staff>

currently produces this: dotted_unison The lower dot should be omitted. The problem only occurs when the notehead is placed on a staff or ledger line, not between lines.

derkveen commented 3 weeks ago

"The lower dot should be omitted." Do you mean according to certain guidelines?

craigsapp commented 3 weeks ago

In Behind Bars by Elaine Gould, page 58-59, unisons in different layers are preferred to have a single augmentation dot (in modern styles):

Screenshot 2024-07-02 at 16 35 44

However if there are no stems on the notes, the double dots are required:

Screenshot 2024-07-02 at 16 36 04
rettinghaus commented 3 weeks ago

@axgeertinger which version are you using? Looking at the test suite this is already working for some time.

axgeertinger commented 3 weeks ago

@rettinghaus That is peculiar. I didn't see the test suite example as I was looking for it in the "dot" section, not "unison"... I am using version 4.1.0 and testing in 4.2.0 as well, but I am having the same issue in the online verovio editor. So, is it something in my encoding? Here is a screenshot: unison_issue

And here my MEI file (bar 11 only):

<mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="5.0">
    <meiHead xml:id="moakt96">
        <fileDesc xml:id="f12ouey2">
            <titleStmt xml:id="t160d0ks">
                <title>Aftensang</title>
            </titleStmt>
        </fileDesc>
    </meiHead>
    <music>
        <body>
            <mdiv xml:id="m49j6zm">
                <score xml:id="s13iq279">
                    <scoreDef xml:id="s1lzepi8">
                        <staffGrp xml:id="su2mfk9">
                            <staffGrp xml:id="s1ufjl2c">
                                <grpSym xml:id="glqhrx4" symbol="bracket"/>
                                <staffDef xml:id="P1" n="1" lines="5" ppq="2">
                                    <clef xml:id="c1cjsqit" shape="G" line="2"/>
                                    <keySig xml:id="k17lf8pi" sig="2s"/>
                                    <meterSig xml:id="mtnktsg" count="4" sym="common" unit="4"/>
                                </staffDef>
                                <staffDef xml:id="P2" n="2" lines="5" ppq="2">
                                    <clef xml:id="cq2i1pi" shape="F" line="4"/>
                                    <keySig xml:id="k12off3m" sig="2s"/>
                                    <meterSig xml:id="m10nk5cx" count="4" sym="common" unit="4"/>
                                </staffDef>
                            </staffGrp>
                        </staffGrp>
                    </scoreDef>
                    <section xml:id="s1et4tnk">
                        <pb xml:id="p9abi3r"/>
                        <measure xml:id="mdhsxr1" n="11">
                            <staff xml:id="s1y1wo7j" n="1">
                                <layer xml:id="lkgngov" n="1">
                                    <note xml:id="ncuuggu" dots="1" dur.ppq="3" dur="4" oct="4" pname="f" stem.dir="up" accid.ges="s">
                                        <verse xml:id="vrpe4f6" n="1">
                                            <syl xml:id="s1uyp1sw" con="d" wordpos="i">Stjer</syl>
                                        </verse>
                                        <verse xml:id="vh4572l" n="2">
                                            <syl xml:id="s1aa13q1" con="d" wordpos="i">Flygt</syl>
                                        </verse>
                                        <verse xml:id="vk22rpz" n="3">
                                            <syl xml:id="s1l3asrd" con="d" wordpos="m">skil</syl>
                                        </verse>
                                    </note>
                                    <note xml:id="n2kit0d" dur.ppq="1" dur="8" oct="4" pname="f" stem.dir="up" accid.ges="s">
                                        <verse xml:id="vu640pm" n="1">
                                            <syl xml:id="sa3stcn" con="s" wordpos="t">ne</syl>
                                        </verse>
                                        <verse xml:id="vpahf2" n="2">
                                            <syl xml:id="s29v3o3" con="s" wordpos="t">ning</syl>
                                        </verse>
                                        <verse xml:id="v1bsqcap" n="3">
                                            <syl xml:id="sbf2zlg" con="s" wordpos="t">les</syl>
                                        </verse>
                                    </note>
                                    <note xml:id="nir3syb" dur.ppq="2" dur="4" oct="4" pname="e" stem.dir="up">
                                        <verse xml:id="vjf52n7" n="1">
                                            <syl xml:id="s2d7eno" con="d" wordpos="i">Stjer</syl>
                                        </verse>
                                        <verse xml:id="v1uzqwhd" n="2">
                                            <syl xml:id="skg0exf" con="s" wordpos="s">som</syl>
                                        </verse>
                                        <verse xml:id="v1ah0x66" n="3">
                                            <syl xml:id="s1pw5uyf" con="s" wordpos="s">end</syl>
                                        </verse>
                                    </note>
                                    <note xml:id="nuzzcpp" dur.ppq="2" dur="4" oct="4" pname="e" stem.dir="up">
                                        <verse xml:id="vd0npy8" n="1">
                                            <syl xml:id="sdvdqn" con="s" wordpos="t">ne</syl>
                                        </verse>
                                        <verse xml:id="v1qk7u9c" n="2">
                                            <syl xml:id="s1kl43yw" con="s" wordpos="s">der</syl>
                                        </verse>
                                        <verse xml:id="v1ra57jd" n="3">
                                            <syl xml:id="soa2e5k" con="s" wordpos="s">vort</syl>
                                        </verse>
                                    </note>
                                </layer>
                                <layer xml:id="l1r2kf4l" n="2">
                                    <note xml:id="n1u5nav1" dots="1" dur.ppq="3" dur="4" oct="4" pname="d" stem.dir="down"/>
                                    <note xml:id="no0ucjy" dur.ppq="1" dur="8" oct="4" pname="d" stem.dir="down"/>
                                    <note xml:id="n49gzox" dur.ppq="2" dur="4" oct="4" pname="d" stem.dir="down"/>
                                    <note xml:id="n9391aj" dur.ppq="2" dur="4" oct="4" pname="c" stem.dir="down" accid.ges="s"/>
                                </layer>
                            </staff>
                            <staff xml:id="s1xiccjh" n="2">
                                <layer xml:id="l16v2d50" n="1">
                                    <note xml:id="n1o4uzgj" dots="1" dur.ppq="3" dur="4" oct="3" pname="a" stem.dir="up"/>
                                    <note xml:id="n1wj4dpg" dur.ppq="1" dur="8" oct="3" pname="a" stem.dir="up"/>
                                    <note xml:id="n155ttfj" dur.ppq="2" dur="4" oct="3" pname="g" stem.dir="up"/>
                                    <note xml:id="n12rqd79" dur.ppq="2" dur="4" oct="3" pname="g" stem.dir="up"/>
                                </layer>
                                <layer xml:id="lo70lob" n="2">
                                    <note xml:id="nsp94nv" dots="1" dur.ppq="3" dur="4" oct="3" pname="a" stem.dir="down"/>
                                    <note xml:id="n44qb4r" dur.ppq="1" dur="8" oct="3" pname="a" stem.dir="down"/>
                                    <note xml:id="nqesh7j" dur.ppq="2" dur="4" oct="2" pname="a" stem.dir="down"/>
                                    <note xml:id="n9i7nzp" dur.ppq="2" dur="4" oct="2" pname="a" stem.dir="down"/>
                                </layer>
                            </staff>
                            <hairpin xml:id="h1k1gl43" staff="1" tstamp="1" tstamp2="0m+4" form="dim" place="above" vgrp="4000"/>
                            <hairpin xml:id="h1udjad4" staff="2" tstamp="1" tstamp2="0m+4" form="dim" place="above" vgrp="5000"/>
                        </measure>
                    </section>
                </score>
            </mdiv>
        </body>
    </music>
</mei>
rettinghaus commented 3 weeks ago

@axgeertinger I finally figured it out! You're encoding is just fine, but apparently you are not allowed to use it on the second staff! 🥴 So it is implemented, but weirdly only works for the first staff.

image

<?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>Unisons in multiple staves</title>
         </titleStmt>
         <pubStmt>
            <respStmt>
               <persName role="encoder">Klaus Rettinghaus</persName>
            </respStmt>
            <date isodate="2024-07-03">03 Jul 2024</date>
            <pubPlace>
               <ref target="https://github.com/rism-digital/verovio/issues/655" />
            </pubPlace>
         </pubStmt>
      </fileDesc>
   </meiHead>
   <music>
      <body>
         <mdiv>
            <score>
               <scoreDef>
                  <staffGrp>
                     <staffDef n="1" lines="5" clef.shape="G" clef.line="2" />
                     <staffDef n="2" lines="5" clef.shape="C" clef.line="3" />
                     <staffDef n="3" lines="5" clef.shape="F" clef.line="4" />
                  </staffGrp>
               </scoreDef>
               <section>
                  <measure>
                     <staff n="1">
                        <layer n="1">
                           <note dots="1" dur="2" oct="4" pname="g" />
                        </layer>
                        <layer n="2">
                           <note dots="1" dur="2" oct="4" pname="g" />
                        </layer>
                     </staff>
                     <staff n="2">
                        <layer n="1">
                           <note dots="1" dur="2" oct="4" pname="c" />
                        </layer>
                        <layer n="2">
                           <note dots="1" dur="2" oct="4" pname="c" />
                        </layer>
                     </staff>
                     <staff n="3">
                        <layer n="1">
                           <note dots="1" dur="2" oct="3" pname="f" />
                        </layer>
                        <layer n="2">
                           <note dots="1" dur="2" oct="3" pname="f" />
                        </layer>
                     </staff>
                  </measure>
                  <measure>
                     <staff n="1">
                        <layer n="1">
                           <note dots="1" dur="4" oct="4" pname="g" />
                        </layer>
                        <layer n="2">
                           <note dots="1" dur="4" oct="4" pname="g" />
                        </layer>
                     </staff>
                     <staff n="2">
                        <layer n="1">
                           <note dots="1" dur="4" oct="4" pname="c" />
                        </layer>
                        <layer n="2">
                           <note dots="1" dur="4" oct="4" pname="c" />
                        </layer>
                     </staff>
                     <staff n="3">
                        <layer n="1">
                           <note dots="1" dur="4" oct="3" pname="f" />
                        </layer>
                        <layer n="2">
                           <note dots="1" dur="4" oct="3" pname="f" />
                        </layer>
                     </staff>
                  </measure>
               </section>
            </score>
         </mdiv>
      </body>
   </music>
</mei>
craigsapp commented 3 weeks ago

I finally figured it out! You're encoding is just fine, but apparently you are not allowed to use it on the second staff! 🥴 So it is implemented, but weirdly only works for the first staff.

Good work! I was trying to figure out the strange situation as well.

axgeertinger commented 3 weeks ago

OK, I did some testing. It seems the upper staff is affecting the lower in some unintended way: If any note in the upper staff coincides with the dotted unison in the lower staff, two dots are shown instead of one. The encoding below renders like this in the editor: dot-test

<?xml version="1.0" encoding="UTF-8"?>
<mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="5.0">
   <meiHead>
      <fileDesc>
         <titleStmt>
            <title>Dot test</title>
         </titleStmt>
      </fileDesc>
   </meiHead>
   <music>
      <body>
         <mdiv>
            <score>
               <scoreDef>
                  <staffGrp>
                     <staffGrp>
                        <staffGrp>
                           <grpSym symbol="bracket" />
                           <staffDef n="1" lines="5" ppq="2">
                              <clef shape="G" line="2" />
                           </staffDef>
                           <staffDef n="2" lines="5" ppq="2">
                              <clef shape="F" line="4" />
                           </staffDef>
                        </staffGrp>
                     </staffGrp>
                  </staffGrp>
               </scoreDef>
               <section>
                  <measure>
                     <staff n="1">
                        <layer n="1">
                           <note dots="1" dur="4" oct="4" pname="b" />
                           <rest dots="1" dur="4" />
                           <note dots="1" dur="4" oct="4" pname="b" />
                           <note dur="4" oct="4" pname="b" />
                           <note dur="4" oct="4" pname="b" />
                           <note dur="4" oct="4" pname="b" />
                           <note dur="4" oct="4" pname="b" />
                           <rest dur="4"/>
                           <rest dur="4"/>
                           <rest dur="4"/>
                        </layer>
                        <layer n="2">
                           <note dots="1" dur="4" oct="4" pname="b" />
                           <rest dots="1" dur="4" />
                           <space dots="1" dur="4" />
                           <note dur="4" oct="4" pname="b" />
                        </layer>
                     </staff>
                     <staff n="2">
                        <layer n="1">
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                        </layer>
                        <layer n="2">
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                           <note dots="1" dur="4" oct="3" pname="a" />
                        </layer>
                     </staff>
                  </measure>
               </section>
            </score>
         </mdiv>
      </body>
   </music>
</mei>
craigsapp commented 3 weeks ago

Here is a case where it is behaving on multiple staves:

Screenshot 2024-07-03 at 10 33 57
Click to view MEI data for above example ```xml </titleStmt> <pubStmt> <unpub></unpub> </pubStmt> </fileDesc> <encodingDesc> <appInfo> <application isodate="2024-07-03T10:31:13" version="4.3.0-dev-53d6495-dirty"> <name>Verovio</name> <p>Transcoded from Humdrum</p> </application> </appInfo> </encodingDesc> <extMeta> <frames xmlns="http://www.humdrum.org/ns/humxml" /> </extMeta> </meiHead> <music> <body> <mdiv xml:id="m8mnh4p"> <score xml:id="s1b33tyg"> <scoreDef xml:id="s1vwalp4" tempo.dist="3.0000vu"> <staffGrp xml:id="s1g5jw5z" symbol="bracket"> <staffDef xml:id="staffdef-L1F3" n="1" lines="5"> <clef xml:id="c1w9mztv" shape="G" line="2" /> </staffDef> <staffDef xml:id="staffdef-L1F2" n="2" lines="5"> <clef xml:id="c3jczvx" shape="G" line="2" /> </staffDef> <staffDef xml:id="staffdef-L1F1" n="3" lines="5"> <clef xml:id="c43kuk" shape="G" line="2" /> </staffDef> </staffGrp> </scoreDef> <section xml:id="section-L1F1"> <measure xml:id="measure-L1"> <staff xml:id="staff-L1F3" n="1"> <layer xml:id="layer-L1F3N1" n="1"> <note xml:id="note-L3F5" dots="1" dur="4" oct="5" pname="f" accid.ges="n"> <verse xml:id="verse-L3F7" n="1"> <syl xml:id="syl-L3F7"> a</syl> </verse> </note> <note xml:id="note-L4F5" dots="1" dur="4" oct="5" pname="f" accid.ges="n"> <verse xml:id="verse-L4F7" n="1"> <syl xml:id="syl-L4F7"> b</syl> </verse> </note> <note xml:id="note-L5F5" dots="1" dur="4" oct="5" pname="f" accid.ges="n"> <verse xml:id="verse-L5F7" n="1"> <syl xml:id="syl-L5F7"> c</syl> </verse> </note> </layer> <layer xml:id="layer-L1F6N2" n="2"> <note xml:id="note-L3F6" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> <note xml:id="note-L4F6" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> <note xml:id="note-L5F6" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F2" n="2"> <layer xml:id="layer-L1F2N1" n="1"> <note xml:id="note-L3F3" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> <note xml:id="note-L4F3" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> <note xml:id="note-L5F3" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> <layer xml:id="layer-L1F4N2" n="2"> <note xml:id="note-L3F4" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> <note xml:id="note-L4F4" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> <note xml:id="note-L5F4" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F1" n="3"> <layer xml:id="layer-L1F1N1" n="1"> <note xml:id="note-L3F1" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> <note xml:id="note-L4F1" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> <note xml:id="note-L5F1" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> <layer xml:id="layer-L1F2N2" n="2"> <note xml:id="note-L3F2" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> <note xml:id="note-L4F2" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> <note xml:id="note-L5F2" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> </staff> </measure> </section> </score> </mdiv> </body> </music> </mei> ``` </summary> Maybe staffDef or scoreDef might be involved? </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/axgeertinger"><img src="https://avatars.githubusercontent.com/u/3779074?v=4" />axgeertinger</a> commented <strong> 3 weeks ago</strong> </div> <div class="markdown-body"> <p>Thanks, @craigsapp and @rettinghaus . This is a tricky one. It also seems that the issue occurs only in octave 4 and below: <img src="https://github.com/rism-digital/verovio/assets/3779074/4c7b8eee-416e-432f-802f-a40a7bb81812" alt="dot-test2" /></p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/craigsapp"><img src="https://avatars.githubusercontent.com/u/3487289?v=4" />craigsapp</a> commented <strong> 3 weeks ago</strong> </div> <div class="markdown-body"> <p>The problem seems to be related to the algorithm only looking at the clef of the top staff. Any secondary staff with the same clef will also behave (as in my last example), but a different clef on secondary staves will cause a problem (as in @rettinghaus example). But this does not account for @axgeertinger last example...</p> <p>Test 1: bass clef on top staff and bottom staff (both with single dots):</p> <img width="330" alt="Screenshot 2024-07-03 at 10 46 36" src="https://github.com/rism-digital/verovio/assets/3487289/3312d4fc-a02f-42d4-adeb-7670a4e70695"> <details> <summary> Click for MEI data for above example</summary> ```xml <?xml version="1.0" encoding="UTF-8"?> <?xml-model href="https://music-encoding.org/schema/5.0/mei-all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?> <?xml-model href="https://music-encoding.org/schema/5.0/mei-all.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 /> </titleStmt> <pubStmt> <unpub>This MEI file was created by Verovio's Humdrum converter. When published, this unpub element should be removed, and the enclosing pubStmt element should be properly filled out.</unpub> </pubStmt> </fileDesc> <encodingDesc> <appInfo> <application isodate="2024-07-03T10:46:56" version="4.3.0-dev-53d6495-dirty"> <name>Verovio</name> <p>Transcoded from Humdrum</p> </application> </appInfo> </encodingDesc> <extMeta> <frames xmlns="http://www.humdrum.org/ns/humxml"> <metaFrame n="14" token="!!!Xfilter: extract -s 1,2,3,3,2,1" xml:id="L15"> <frameInfo> <startTime float="7.5" ratfrac="1/2" /> <frameType>reference</frameType> <referenceKey>Xfilter</referenceKey> <referenceValue>extract -s 1,2,3,3,2,1</referenceValue> </frameInfo> </metaFrame> </frames> </extMeta> </meiHead> <music> <body> <mdiv xml:id="maksgn2"> <score xml:id="sk8nmad"> <scoreDef xml:id="sqtmljs" tempo.dist="3.0000vu"> <staffGrp xml:id="s1qsq5d0" symbol="bracket"> <staffDef xml:id="staffdef-L1F6" n="1" lines="5"> <clef xml:id="clef-L2F6" shape="F" line="4" /> </staffDef> <staffDef xml:id="staffdef-L1F5" n="2" lines="5"> <clef xml:id="clef-L2F5" shape="C" line="3" /> </staffDef> <staffDef xml:id="staffdef-L1F4" n="3" lines="5"> <clef xml:id="clef-L2F4" shape="G" line="2" /> </staffDef> <staffDef xml:id="staffdef-L1F3" n="4" lines="5"> <clef xml:id="clef-L2F3" shape="G" line="2" /> </staffDef> <staffDef xml:id="staffdef-L1F2" n="5" lines="5"> <clef xml:id="clef-L2F2" shape="C" line="3" /> </staffDef> <staffDef xml:id="staffdef-L1F1" n="6" lines="5"> <clef xml:id="clef-L2F1" shape="F" line="4" /> </staffDef> </staffGrp> </scoreDef> <section xml:id="section-L1F1"> <measure xml:id="measure-L1"> <staff xml:id="staff-L1F6" n="1"> <layer xml:id="layer-L1F6N1" n="1"> <note xml:id="note-L4F11" dots="1" dur="4" oct="2" pname="g" accid.ges="n" /> <note xml:id="note-L5F11" dots="1" dur="4" oct="2" pname="b" accid.ges="n" /> <note xml:id="note-L6F11" dots="1" dur="4" oct="3" pname="d" accid.ges="n" /> <note xml:id="note-L7F11" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L8F11" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> </layer> <layer xml:id="layer-L1F6N2" n="2"> <note xml:id="note-L4F12" dots="1" dur="4" oct="2" pname="g" accid.ges="n" /> <note xml:id="note-L5F12" dots="1" dur="4" oct="2" pname="b" accid.ges="n" /> <note xml:id="note-L6F12" dots="1" dur="4" oct="3" pname="d" accid.ges="n" /> <note xml:id="note-L7F12" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L8F12" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F5" n="2"> <layer xml:id="layer-L1F5N1" n="1"> <note xml:id="note-L4F9" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L5F9" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> <note xml:id="note-L6F9" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> <note xml:id="note-L7F9" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L8F9" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> </layer> <layer xml:id="layer-L1F5N2" n="2"> <note xml:id="note-L4F10" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L5F10" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> <note xml:id="note-L6F10" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> <note xml:id="note-L7F10" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L8F10" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F4" n="3"> <layer xml:id="layer-L1F4N1" n="1"> <note xml:id="note-L4F7" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L5F7" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> <note xml:id="note-L6F7" dots="1" dur="4" oct="4" pname="b" accid.ges="n" /> <note xml:id="note-L7F7" dots="1" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L8F7" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> <layer xml:id="layer-L1F4N2" n="2"> <note xml:id="note-L4F8" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L5F8" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> <note xml:id="note-L6F8" dots="1" dur="4" oct="4" pname="b" accid.ges="n" /> <note xml:id="note-L7F8" dots="1" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L8F8" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F3" n="4"> <layer xml:id="layer-L1F3N1" n="1"> <note xml:id="note-L4F5" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L5F5" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> <note xml:id="note-L6F5" dots="1" dur="4" oct="4" pname="b" accid.ges="n" /> <note xml:id="note-L7F5" dots="1" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L8F5" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> <layer xml:id="layer-L1F3N2" n="2"> <note xml:id="note-L4F6" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L5F6" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> <note xml:id="note-L6F6" dots="1" dur="4" oct="4" pname="b" accid.ges="n" /> <note xml:id="note-L7F6" dots="1" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L8F6" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F2" n="5"> <layer xml:id="layer-L1F2N1" n="1"> <note xml:id="note-L4F3" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L5F3" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> <note xml:id="note-L6F3" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> <note xml:id="note-L7F3" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L8F3" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> </layer> <layer xml:id="layer-L1F2N2" n="2"> <note xml:id="note-L4F4" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L5F4" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> <note xml:id="note-L6F4" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> <note xml:id="note-L7F4" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L8F4" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F1" n="6"> <layer xml:id="layer-L1F1N1" n="1"> <note xml:id="note-L4F1" dots="1" dur="4" oct="2" pname="g" accid.ges="n" /> <note xml:id="note-L5F1" dots="1" dur="4" oct="2" pname="b" accid.ges="n" /> <note xml:id="note-L6F1" dots="1" dur="4" oct="3" pname="d" accid.ges="n" /> <note xml:id="note-L7F1" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L8F1" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> </layer> <layer xml:id="layer-L1F1N2" n="2"> <note xml:id="note-L4F2" dots="1" dur="4" oct="2" pname="g" accid.ges="n" /> <note xml:id="note-L5F2" dots="1" dur="4" oct="2" pname="b" accid.ges="n" /> <note xml:id="note-L6F2" dots="1" dur="4" oct="3" pname="d" accid.ges="n" /> <note xml:id="note-L7F2" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L8F2" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> </layer> </staff> </measure> </section> </score> </mdiv> </body> </music> </mei> ``` </details> <p>Moving the staves around, now the top staff is treble clef, and dots behave on all treble clef staves:</p> <img width="233" alt="Screenshot 2024-07-03 at 10 50 44" src="https://github.com/rism-digital/verovio/assets/3487289/586bf19d-4bce-468c-b702-e1db2b242122"> <details> <summary> Click to view MEI data for above example </summary> ```xml <?xml version="1.0" encoding="UTF-8"?> <?xml-model href="https://music-encoding.org/schema/5.0/mei-all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?> <?xml-model href="https://music-encoding.org/schema/5.0/mei-all.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 /> </titleStmt> <pubStmt> <unpub>This MEI file was created by Verovio's Humdrum converter. When published, this unpub element should be removed, and the enclosing pubStmt element should be properly filled out.</unpub> </pubStmt> </fileDesc> <encodingDesc> <appInfo> <application isodate="2024-07-03T10:51:54" version="4.3.0-dev-53d6495-dirty"> <name>Verovio</name> <p>Transcoded from Humdrum</p> </application> </appInfo> </encodingDesc> <extMeta> <frames xmlns="http://www.humdrum.org/ns/humxml"> <metaFrame n="11" token="!!!Xfilter: extract -s 1,2,3,1,2,3" xml:id="L12"> <frameInfo> <startTime float="4.5" ratfrac="1/2" /> <frameType>reference</frameType> <referenceKey>Xfilter</referenceKey> <referenceValue>extract -s 1,2,3,1,2,3</referenceValue> </frameInfo> </metaFrame> </frames> </extMeta> </meiHead> <music> <body> <mdiv xml:id="mkhw14i"> <score xml:id="s19gp51r"> <scoreDef xml:id="sz1daec" tempo.dist="3.0000vu"> <staffGrp xml:id="s1inxsy2" symbol="bracket"> <staffDef xml:id="staffdef-L1F6" n="1" lines="5"> <clef xml:id="clef-L2F6" shape="G" line="2" /> </staffDef> <staffDef xml:id="staffdef-L1F5" n="2" lines="5"> <clef xml:id="clef-L2F5" shape="C" line="3" /> </staffDef> <staffDef xml:id="staffdef-L1F4" n="3" lines="5"> <clef xml:id="clef-L2F4" shape="F" line="4" /> </staffDef> <staffDef xml:id="staffdef-L1F3" n="4" lines="5"> <clef xml:id="clef-L2F3" shape="G" line="2" /> </staffDef> <staffDef xml:id="staffdef-L1F2" n="5" lines="5"> <clef xml:id="clef-L2F2" shape="C" line="3" /> </staffDef> <staffDef xml:id="staffdef-L1F1" n="6" lines="5"> <clef xml:id="clef-L2F1" shape="F" line="4" /> </staffDef> </staffGrp> </scoreDef> <section xml:id="section-L1F1"> <measure xml:id="measure-L1"> <staff xml:id="staff-L1F6" n="1"> <layer xml:id="layer-L1F6N1" n="1"> <note xml:id="note-L4F11" dots="1" dur="4" oct="4" pname="b" accid.ges="n" /> <note xml:id="note-L5F11" dots="1" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L6F11" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> <layer xml:id="layer-L1F6N2" n="2"> <note xml:id="note-L4F12" dots="1" dur="4" oct="4" pname="b" accid.ges="n" /> <note xml:id="note-L5F12" dots="1" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L6F12" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F5" n="2"> <layer xml:id="layer-L1F5N1" n="1"> <note xml:id="note-L4F9" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L5F9" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> <note xml:id="note-L6F9" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> </layer> <layer xml:id="layer-L1F5N2" n="2"> <note xml:id="note-L4F10" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L5F10" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> <note xml:id="note-L6F10" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F4" n="3"> <layer xml:id="layer-L1F4N1" n="1"> <note xml:id="note-L4F7" dots="1" dur="4" oct="3" pname="d" accid.ges="n" /> <note xml:id="note-L5F7" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L6F7" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> </layer> <layer xml:id="layer-L1F4N2" n="2"> <note xml:id="note-L4F8" dots="1" dur="4" oct="3" pname="d" accid.ges="n" /> <note xml:id="note-L5F8" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L6F8" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F3" n="4"> <layer xml:id="layer-L1F3N1" n="1"> <note xml:id="note-L4F5" dots="1" dur="4" oct="4" pname="b" accid.ges="n" /> <note xml:id="note-L5F5" dots="1" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L6F5" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> <layer xml:id="layer-L1F3N2" n="2"> <note xml:id="note-L4F6" dots="1" dur="4" oct="4" pname="b" accid.ges="n" /> <note xml:id="note-L5F6" dots="1" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L6F6" dots="1" dur="4" oct="5" pname="f" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F2" n="5"> <layer xml:id="layer-L1F2N1" n="1"> <note xml:id="note-L4F3" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L5F3" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> <note xml:id="note-L6F3" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> </layer> <layer xml:id="layer-L1F2N2" n="2"> <note xml:id="note-L4F4" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L5F4" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> <note xml:id="note-L6F4" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F1" n="6"> <layer xml:id="layer-L1F1N1" n="1"> <note xml:id="note-L4F1" dots="1" dur="4" oct="3" pname="d" accid.ges="n" /> <note xml:id="note-L5F1" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L6F1" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> </layer> <layer xml:id="layer-L1F1N2" n="2"> <note xml:id="note-L4F2" dots="1" dur="4" oct="3" pname="d" accid.ges="n" /> <note xml:id="note-L5F2" dots="1" dur="4" oct="3" pname="f" accid.ges="n" /> <note xml:id="note-L6F2" dots="1" dur="4" oct="3" pname="a" accid.ges="n" /> </layer> </staff> </measure> </section> </score> </mdiv> </body> </music> </mei> ``` </details> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/axgeertinger"><img src="https://avatars.githubusercontent.com/u/3779074?v=4" />axgeertinger</a> commented <strong> 3 weeks ago</strong> </div> <div class="markdown-body"> <p>So apparently the dots behave only in the clef and octave used in the uppermost staff OR if there are no notes at the same timestamp in the top staff?</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/craigsapp"><img src="https://avatars.githubusercontent.com/u/3487289?v=4" />craigsapp</a> commented <strong> 3 weeks ago</strong> </div> <div class="markdown-body"> <p>I think the final solution is that the unison comparison is between a note on the current staff and (incorrectly) a note on the top staff:</p> <img width="573" alt="Screenshot 2024-07-03 at 10 59 02" src="https://github.com/rism-digital/verovio/assets/3487289/fb0ae4ad-74e3-4c59-9cc6-a32e3f43a267"> <details> <summary> Click to view MEI data for above example </summary> ```xml <?xml version="1.0" encoding="UTF-8"?> <?xml-model href="https://music-encoding.org/schema/5.0/mei-all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?> <?xml-model href="https://music-encoding.org/schema/5.0/mei-all.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 /> </titleStmt> <pubStmt> <unpub>This MEI file was created by Verovio's Humdrum converter. When published, this unpub element should be removed, and the enclosing pubStmt element should be properly filled out.</unpub> </pubStmt> </fileDesc> <encodingDesc> <appInfo> <application isodate="2024-07-03T10:59:05" version="4.3.0-dev-53d6495-dirty"> <name>Verovio</name> <p>Transcoded from Humdrum</p> </application> </appInfo> </encodingDesc> <extMeta> <frames xmlns="http://www.humdrum.org/ns/humxml" /> </extMeta> </meiHead> <music> <body> <mdiv xml:id="mzg5w8b"> <score xml:id="s8garhr"> <scoreDef xml:id="siqgu9n" tempo.dist="3.0000vu"> <staffGrp xml:id="ss4wrzv" bar.thru="true" symbol="brace"> <staffDef xml:id="staffdef-L1F2" n="1" lines="5"> <clef xml:id="clef-L2F2" shape="G" line="2" /> </staffDef> <staffDef xml:id="staffdef-L1F1" n="2" lines="5"> <clef xml:id="clef-L2F1" shape="C" line="3" /> </staffDef> </staffGrp> </scoreDef> <section xml:id="section-L1F1"> <measure xml:id="measure-L1"> <staff xml:id="staff-L1F2" n="1"> <layer xml:id="layer-L1F2N1" n="1"> <note xml:id="note-L4F3" dots="1" dur="4" oct="4" pname="c" accid.ges="n"> <verse xml:id="verse-L4F5" n="1"> <syl xml:id="syl-L4F5"> a</syl> </verse> </note> <note xml:id="note-L5F3" dots="1" dur="4" oct="4" pname="e" accid.ges="n"> <verse xml:id="verse-L5F5" n="1"> <syl xml:id="syl-L5F5"> b</syl> </verse> </note> <note xml:id="note-L6F3" dots="1" dur="4" oct="4" pname="g" accid.ges="n"> <verse xml:id="verse-L6F5" n="1"> <syl xml:id="syl-L6F5"> c</syl> </verse> </note> </layer> <layer xml:id="layer-L1F2N2" n="2"> <note xml:id="note-L4F4" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> <note xml:id="note-L5F4" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L6F4" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L1F1" n="2"> <layer xml:id="layer-L1F1N1" n="1"> <note xml:id="note-L4F1" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> <note xml:id="note-L5F1" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L6F1" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> </layer> <layer xml:id="layer-L1F1N2" n="2"> <note xml:id="note-L4F2" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> <note xml:id="note-L5F2" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L6F2" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> </layer> </staff> </measure> <measure xml:id="measure-L7"> <staff xml:id="staff-L7F3N1" n="1"> <layer xml:id="layer-L7F3N1" n="1"> <note xml:id="note-L8F3" dots="1" dur="4" oct="4" pname="e" accid.ges="n"> <verse xml:id="verse-L8F5" n="1"> <syl xml:id="syl-L8F5"> a</syl> </verse> </note> <note xml:id="note-L9F3" dots="1" dur="4" oct="4" pname="g" accid.ges="n"> <verse xml:id="verse-L9F5" n="1"> <syl xml:id="syl-L9F5"> b</syl> </verse> </note> <note xml:id="note-L10F3" dots="1" dur="4" oct="4" pname="b" accid.ges="n"> <verse xml:id="verse-L10F5" n="1"> <syl xml:id="syl-L10F5"> c</syl> </verse> </note> </layer> <layer xml:id="layer-L7F4N2" n="2"> <note xml:id="note-L8F4" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L9F4" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> <note xml:id="note-L10F4" dots="1" dur="4" oct="4" pname="b" accid.ges="n" /> </layer> </staff> <staff xml:id="staff-L7F1N1" n="2"> <layer xml:id="layer-L7F1N1" n="1"> <note xml:id="note-L8F1" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> <note xml:id="note-L9F1" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L10F1" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> </layer> <layer xml:id="layer-L7F2N2" n="2"> <note xml:id="note-L8F2" dots="1" dur="4" oct="4" pname="c" accid.ges="n" /> <note xml:id="note-L9F2" dots="1" dur="4" oct="4" pname="e" accid.ges="n" /> <note xml:id="note-L10F2" dots="1" dur="4" oct="4" pname="g" accid.ges="n" /> </layer> </staff> </measure> </section> </score> </mdiv> </body> </music> </mei> ``` </details> <p>In the first measure there are single dots in the bottom staff, but when the pitches are different from the top staff in the second measure, the double dots appear in the second staff.</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/axgeertinger"><img src="https://avatars.githubusercontent.com/u/3779074?v=4" />axgeertinger</a> commented <strong> 3 weeks ago</strong> </div> <div class="markdown-body"> <p>@craigsapp yes, that would explain it</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/ndubo"><img src="https://avatars.githubusercontent.com/u/33256891?v=4" />ndubo</a> commented <strong> 3 weeks ago</strong> </div> <div class="markdown-body"> <p>BTW It seems that the single dot unison was working fine with version 3.4.1. Check Verovio Version comparison.</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/axgeertinger"><img src="https://avatars.githubusercontent.com/u/3779074?v=4" />axgeertinger</a> commented <strong> 3 weeks ago</strong> </div> <div class="markdown-body"> <p>@ndubo indeed. Apparently the issue was introduced with version 3.5.0.</p> </div> </div> <div class="page-bar-simple"> </div> <div class="footer"> <ul class="body"> <li>© <script> document.write(new Date().getFullYear()) </script> Githubissues.</li> <li>Githubissues is a development platform for aggregating issues.</li> </ul> </div> <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script> <script src="/githubissues/assets/js.js"></script> <script src="/githubissues/assets/markdown.js"></script> <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/highlight.min.js"></script> <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/go.min.js"></script> <script> hljs.highlightAll(); </script> </body> </html>