verovio
verovio copied to clipboard
Avoid `<harm>` collisions
Recent changes by @lpugin fix the wrong spacing between notes that have key labels and harm labels attached to it:
vs.
I'm experimenting with a different default style for key labels (with humdrum). Typically I would draw boxes around key labels when analyzing and writing them by hand.
Could we improve this further so key labels and harm labels to not collide with each other?
In MEI key labels hand harm labels are currently encoded like this:
<harm xml:id="harm-L8F2" type="deg" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="rcvq86" rend="circle">1</rend>
</harm>
<harm xml:id="hp3ufnq" type="key-label" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r1wu87tj" halign="right">
<rend xml:id="r8xf3qx" rend="box" fontname="sans-serif" fontweight="bold">C:</rend>
</rend>
</harm>
Humdrum test data:
**kern **deg
* *arr
* *circ
= =
*C-: *C-:
4c 1+
*C: *C:
4c 1
*C#: *C#:
4c 1-
= =
*D-: *D-:
4c 7
*D: *D:
4c 7-
*D#: *D#:
4c 7--
= =
*E-: *E-:
4c 6
*E: *E:
4c 6-
*E#: *E#:
4c 6--
= =
*F-: *F-:
4c 5+
*F: *F:
4c 5
*F#: *F#:
4c 5-
= =
*G-: *G-:
4c 4+
*G: *G:
4c 4
*G#: *G#:
4c 4-
= =
*A-: *A-:
4c 3
*A: *A:
4c 3-
*A#: *A#:
4c 3--
= =
*B-: *B-:
4c 2
*B: *B:
4c 2-
*B#: *B#:
4c 2--
= =
*- *-
Click to expand MEI data
<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="https://music-encoding.org/schema/dev/mei-all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?>
<?xml-model href="https://music-encoding.org/schema/dev/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.0-dev">
<meiHead>
<fileDesc>
<titleStmt>
<title />
</titleStmt>
<pubStmt />
</fileDesc>
<encodingDesc>
<appInfo>
<application isodate="2023-06-19T20:14:44" version="3.16.0-dev-d9bced0-dirty">
<name>Verovio</name>
<p>Transcoded from Humdrum</p>
</application>
</appInfo>
</encodingDesc>
<workList>
<work>
<title />
</work>
</workList>
</meiHead>
<music>
<body>
<mdiv xml:id="m1bnl0u8">
<score xml:id="s1vothu0">
<scoreDef xml:id="s11rqof9">
<staffGrp xml:id="s16mfz01">
<staffDef xml:id="staffdef-L1F1" n="1" lines="5">
<clef xml:id="c1seixkz" shape="G" line="2" />
</staffDef>
</staffGrp>
</scoreDef>
<section xml:id="section-L1F1">
<measure xml:id="measure-L1">
<staff xml:id="staff-L1F1" n="1">
<layer xml:id="layer-L1F1N1" n="1">
<note xml:id="note-L6F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L8F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L10F1" dur="4" oct="4" pname="c" accid.ges="n" />
</layer>
</staff>
<harm xml:id="harm-L6F2" type="deg" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="r1abi16j" rend="circle">1↑</rend>
</harm>
<harm xml:id="h1bgcfnl" type="key-label" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="r171dhig" halign="right">
<rend xml:id="r1xlpryb" rend="box" fontname="sans-serif" fontweight="bold">Câ™:</rend>Â </rend>
</harm>
<harm xml:id="harm-L8F2" type="deg" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="rcvq86" rend="circle">1</rend>
</harm>
<harm xml:id="hp3ufnq" type="key-label" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r1wu87tj" halign="right">
<rend xml:id="r8xf3qx" rend="box" fontname="sans-serif" fontweight="bold">C:</rend>Â </rend>
</harm>
<harm xml:id="harm-L10F2" type="deg" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="rfu0i89" rend="circle">1↓</rend>
</harm>
<harm xml:id="h1wkihag" type="key-label" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="rtsvxwe" halign="right">
<rend xml:id="rwezxvz" rend="box" fontname="sans-serif" fontweight="bold">C♯:</rend> </rend>
</harm>
</measure>
<measure xml:id="measure-L11">
<staff xml:id="staff-L11F1N1" n="1">
<layer xml:id="layer-L11F1N1" n="1">
<note xml:id="note-L13F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L15F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L17F1" dur="4" oct="4" pname="c" accid.ges="n" />
</layer>
</staff>
<harm xml:id="harm-L13F2" type="deg" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="rjeag5y" rend="circle">7</rend>
</harm>
<harm xml:id="h4h9gnp" type="key-label" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="rs0naiz" halign="right">
<rend xml:id="rh3x41k" rend="box" fontname="sans-serif" fontweight="bold">Dâ™:</rend>Â </rend>
</harm>
<harm xml:id="harm-L15F2" type="deg" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r1xgsu41" rend="circle">7↓</rend>
</harm>
<harm xml:id="h1ivh4bk" type="key-label" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r1os8sha" halign="right">
<rend xml:id="rl3xs1a" rend="box" fontname="sans-serif" fontweight="bold">D:</rend>Â </rend>
</harm>
<harm xml:id="harm-L17F2" type="deg" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="r19sjgfi" rend="circle">7⇓</rend>
</harm>
<harm xml:id="h1fucr8m" type="key-label" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="ricyoeg" halign="right">
<rend xml:id="rkvdrla" rend="box" fontname="sans-serif" fontweight="bold">D♯:</rend> </rend>
</harm>
</measure>
<measure xml:id="measure-L18">
<staff xml:id="staff-L18F1N1" n="1">
<layer xml:id="layer-L18F1N1" n="1">
<note xml:id="note-L20F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L22F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L24F1" dur="4" oct="4" pname="c" accid.ges="n" />
</layer>
</staff>
<harm xml:id="harm-L20F2" type="deg" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="r1j1gyxj" rend="circle">6</rend>
</harm>
<harm xml:id="hob33s3" type="key-label" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="r1is1gib" halign="right">
<rend xml:id="rks2bmz" rend="box" fontname="sans-serif" fontweight="bold">Eâ™:</rend>Â </rend>
</harm>
<harm xml:id="harm-L22F2" type="deg" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r1l31wn2" rend="circle">6↓</rend>
</harm>
<harm xml:id="h1sh2ych" type="key-label" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="rcbbqka" halign="right">
<rend xml:id="r1rktmfm" rend="box" fontname="sans-serif" fontweight="bold">E:</rend>Â </rend>
</harm>
<harm xml:id="harm-L24F2" type="deg" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="r1ravyy6" rend="circle">6⇓</rend>
</harm>
<harm xml:id="h154b6qo" type="key-label" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="r1u78rf7" halign="right">
<rend xml:id="rsye7p2" rend="box" fontname="sans-serif" fontweight="bold">E♯:</rend> </rend>
</harm>
</measure>
<measure xml:id="measure-L25">
<staff xml:id="staff-L25F1N1" n="1">
<layer xml:id="layer-L25F1N1" n="1">
<note xml:id="note-L27F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L29F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L31F1" dur="4" oct="4" pname="c" accid.ges="n" />
</layer>
</staff>
<harm xml:id="harm-L27F2" type="deg" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="r1vqfred" rend="circle">5↑</rend>
</harm>
<harm xml:id="h1hxad1y" type="key-label" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="rjnpn63" halign="right">
<rend xml:id="rxernw1" rend="box" fontname="sans-serif" fontweight="bold">Fâ™:</rend>Â </rend>
</harm>
<harm xml:id="harm-L29F2" type="deg" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r1gcnceb" rend="circle">5</rend>
</harm>
<harm xml:id="hr07ph8" type="key-label" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="rcw6jb5" halign="right">
<rend xml:id="r903hf7" rend="box" fontname="sans-serif" fontweight="bold">F:</rend>Â </rend>
</harm>
<harm xml:id="harm-L31F2" type="deg" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="rcjfbwk" rend="circle">5↓</rend>
</harm>
<harm xml:id="h1vig6ss" type="key-label" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="r9vi0t" halign="right">
<rend xml:id="r14jyrxn" rend="box" fontname="sans-serif" fontweight="bold">F♯:</rend> </rend>
</harm>
</measure>
<measure xml:id="measure-L32">
<staff xml:id="staff-L32F1N1" n="1">
<layer xml:id="layer-L32F1N1" n="1">
<note xml:id="note-L34F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L36F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L38F1" dur="4" oct="4" pname="c" accid.ges="n" />
</layer>
</staff>
<harm xml:id="harm-L34F2" type="deg" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="r1xbp66u" rend="circle">4↑</rend>
</harm>
<harm xml:id="h4i54em" type="key-label" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="r1xj7cbr" halign="right">
<rend xml:id="raqi5ad" rend="box" fontname="sans-serif" fontweight="bold">Gâ™:</rend>Â </rend>
</harm>
<harm xml:id="harm-L36F2" type="deg" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r6vsars" rend="circle">4</rend>
</harm>
<harm xml:id="hrp534f" type="key-label" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r18xzmvc" halign="right">
<rend xml:id="r1oihdh6" rend="box" fontname="sans-serif" fontweight="bold">G:</rend>Â </rend>
</harm>
<harm xml:id="harm-L38F2" type="deg" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="r1q9muo9" rend="circle">4↓</rend>
</harm>
<harm xml:id="h8qu2yv" type="key-label" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="r1umz2z3" halign="right">
<rend xml:id="r9bxns0" rend="box" fontname="sans-serif" fontweight="bold">G♯:</rend> </rend>
</harm>
</measure>
<measure xml:id="measure-L39">
<staff xml:id="staff-L39F1N1" n="1">
<layer xml:id="layer-L39F1N1" n="1">
<note xml:id="note-L41F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L43F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L45F1" dur="4" oct="4" pname="c" accid.ges="n" />
</layer>
</staff>
<harm xml:id="harm-L41F2" type="deg" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="r89u39l" rend="circle">3</rend>
</harm>
<harm xml:id="h7gdtch" type="key-label" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="r1kej7hq" halign="right">
<rend xml:id="r5dvdiw" rend="box" fontname="sans-serif" fontweight="bold">Aâ™:</rend>Â </rend>
</harm>
<harm xml:id="harm-L43F2" type="deg" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r92tu7b" rend="circle">3↓</rend>
</harm>
<harm xml:id="h1nlr9qp" type="key-label" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r129awjr" halign="right">
<rend xml:id="r1agcwvl" rend="box" fontname="sans-serif" fontweight="bold">A:</rend>Â </rend>
</harm>
<harm xml:id="harm-L45F2" type="deg" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="rmmzdht" rend="circle">3⇓</rend>
</harm>
<harm xml:id="h1jw94be" type="key-label" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="rm9mog8" halign="right">
<rend xml:id="r1oimzgi" rend="box" fontname="sans-serif" fontweight="bold">A♯:</rend> </rend>
</harm>
</measure>
<measure xml:id="measure-L46">
<staff xml:id="staff-L46F1N1" n="1">
<layer xml:id="layer-L46F1N1" n="1">
<note xml:id="note-L48F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L50F1" dur="4" oct="4" pname="c" accid.ges="n" />
<note xml:id="note-L52F1" dur="4" oct="4" pname="c" accid.ges="n" />
</layer>
</staff>
<harm xml:id="harm-L48F2" type="deg" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="r1jvhugs" rend="circle">2</rend>
</harm>
<harm xml:id="h1ajsefh" type="key-label" place="below" staff="1" tstamp="1.000000" n="2">
<rend xml:id="rpww6mk" halign="right">
<rend xml:id="ruzhjy8" rend="box" fontname="sans-serif" fontweight="bold">Bâ™:</rend>Â </rend>
</harm>
<harm xml:id="harm-L50F2" type="deg" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r10y5pzj" rend="circle">2↓</rend>
</harm>
<harm xml:id="h1i3i905" type="key-label" place="below" staff="1" tstamp="2.000000" n="2">
<rend xml:id="r19klahw" halign="right">
<rend xml:id="r120kwyw" rend="box" fontname="sans-serif" fontweight="bold">B:</rend>Â </rend>
</harm>
<harm xml:id="harm-L52F2" type="deg" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="r1gcnk0r" rend="circle">2⇓</rend>
</harm>
<harm xml:id="hro7jdn" type="key-label" place="below" staff="1" tstamp="3.000000" n="2">
<rend xml:id="r1bnj3iw" halign="right">
<rend xml:id="rpac0i" rend="box" fontname="sans-serif" fontweight="bold">B♯:</rend> </rend>
</harm>
</measure>
</section>
</score>
</mdiv>
</body>
</music>
</mei>
Reference: https://github.com/rism-digital/verovio/pull/3454
I had a look and this seems to be a complicated issue that requires some in-depth refactoring of text layout. I would recommend to think about finding another way to differentiate them. Why not use different colour?