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

Humdrum file R714_Cop-w32p117-118m110-112.krn fails to render (crashes in Rest::GetRestOffsetFromOptions) #3706

Closed gregchapman-dev closed 5 months ago

gregchapman-dev commented 5 months ago

Describe the problem A particular Copland score fails to render, both on verovio.humdrum.org, and on the command line with develop-humdrum.

To Reproduce Steps to reproduce the behavior:

  1. Go to https://verovio.humdrum.org/?file=poly/R714_Cop-w32p117-118m110-112.krn
  2. See failure to render

I ran it in Xcode (develop-humdrum), and it crashes in Rest::GetRestOffsetFromOptions because duration is DURATION_NONE, and g_defaultRests doesn't have a (leaf) entry for that value:

.at(duration) crashes with out-of-range error.

Expected behavior I expected it to render. This exact score rendered fine before I updated to latest develop-humdrum today (I had been running the version which I submitted as PR #3642).

Input data https://verovio.humdrum.org/?file=poly/R714_Cop-w32p117-118m110-112.krn

Verovio information

Environment information (as appropriate)

craigsapp commented 5 months ago

Interestingly the command-line rendering does not show a crash:

verovio copeland.krn -s 60 --page-width=2500 --page-height=4200
Screenshot 2024-06-16 at 7 40 24 PM

Using Verovio 3.15.0-dev-5260bd2-dirty

craigsapp commented 5 months ago

Error messages in console when rendering in VHV:

Screenshot 2024-06-16 at 7 42 37 PM
craigsapp commented 5 months ago

Here is a smaller sample demonstrating the problem:

**kern
*part9
*staff9
*ICbras
*Itromp
*I"Trumpet in Bb 3
*I'tp
*clefG2
*ITrd1c2
*k[b-e-]
*M2/2
=110
4.ff
8aa
4.gg
8c
=111
*Xtuplet
*^
*rscale:1/2 *rscale:1/2
*M6/8   *M6/8
3cc 3cc
6cc 6cc
3b- 3b-
6g  6g
=112    =112
3f  3f
6dd 6r
3cc 3r
6r  6r
*v  *v
=
*-

With the command-line version of verovio this renders as expected (and no warnings or crashes):

Screenshot 2024-06-16 at 8 08 19 PM

The problem is related to two time signatures: 2/2 and 6/8, and I am adjusting the visual rhythms of the notes in 6/8 since they are encoded as triplets in 2/2 to align with parallel 2/2 measures.

When I convert the above Humdrum to MEI on the command-line with verovio, I get the expected notation of the MEI when rendering in VHV:

Screenshot 2024-06-16 at 8 14 57 PM
Click to view MEI data for above example (created from Humdrum with the command-line version of verovio). ```xml </titleStmt> <pubStmt /> </fileDesc> <encodingDesc> <appInfo> <application isodate="2024-06-16T20:12:32" version="3.15.0-dev-5260bd2-dirty"> <name>Verovio</name> <p>Transcoded from Humdrum</p> </application> </appInfo> </encodingDesc> <workList> <work> <title /> </work> </workList> </meiHead> <music> <body> <mdiv xml:id="mb3zys2"> <score xml:id="sn2npt9"> <scoreDef xml:id="s18kknto"> <staffGrp xml:id="s1qdofnq"> <staffDef xml:id="staffdef-L1F1" n="1" lines="5" trans.diat="-1" trans.semi="-2"> <label xml:id="label-L6F1">Trumpet in B<rend xml:id="r1a917we" fontfam="smufl"></rend> 3</label> <clef xml:id="clef-L8F1" shape="G" line="2" /> <keySig xml:id="keysig-L10F1" sig="0" /> <meterSig xml:id="metersig-L11F1" count="2" unit="2" /> <instrDef xml:id="i1t8fnxl" midi.instrnum="56" midi.instrname="Trumpet" /> </staffDef> </staffGrp> </scoreDef> <section xml:id="section-L1F1"> <measure xml:id="measure-L1" n="110"> <staff xml:id="staff-L1F1" n="1"> <layer xml:id="layer-L1F1N1" n="1"> <note xml:id="note-L13F1" dots="1" dur="4" oct="5" pname="g" accid.ges="n" /> <note xml:id="note-L14F1" dur="8" oct="5" pname="b" accid.ges="n" /> <note xml:id="note-L15F1" dots="1" dur="4" oct="5" pname="a" accid.ges="n" /> <note xml:id="note-L16F1" dur="8" oct="4" pname="d" accid.ges="n" /> </layer> </staff> </measure> <scoreDef xml:id="spe45tt"> <staffGrp xml:id="s1jsdmv5"> <staffDef xml:id="shmvfq6" n="1"> <meterSig xml:id="mkbd7hk" count="6" unit="8" /> </staffDef> </staffGrp> </scoreDef> <measure xml:id="measure-L17" n="111"> <staff xml:id="staff-L17F1N1" n="1"> <layer xml:id="layer-L17F1N1" n="1"> <tuplet xml:id="tuplet-L22F1-L23F1" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L22F1" dur.ges="2" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L23F1" dur.ges="4" dur="8" oct="5" pname="d" accid.ges="n" /> </tuplet> <tuplet xml:id="tuplet-L24F1-L25F1" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L24F1" dur.ges="2" dur="4" oct="5" pname="c" accid.ges="n" /> <note xml:id="note-L25F1" dur.ges="4" dur="8" oct="4" pname="a" accid.ges="n" /> </tuplet> </layer> <layer xml:id="layer-L17F2N2" n="2"> <tuplet xml:id="tuplet-L22F2-L23F2" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L22F2" dur.ges="2" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L23F2" dur.ges="4" dur="8" oct="5" pname="d" accid.ges="n" /> </tuplet> <tuplet xml:id="tuplet-L24F2-L25F2" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L24F2" dur.ges="2" dur="4" oct="5" pname="c" accid.ges="n" /> <note xml:id="note-L25F2" dur.ges="4" dur="8" oct="4" pname="a" accid.ges="n" /> </tuplet> </layer> </staff> </measure> <measure xml:id="measure-L26" n="112"> <staff xml:id="staff-L26F1N1" n="1"> <layer xml:id="layer-L26F1N1" n="1"> <tuplet xml:id="tuplet-L27F1-L28F1" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L27F1" dur.ges="2" dur="4" oct="4" pname="g" accid.ges="n" /> <note xml:id="note-L28F1" dur.ges="4" dur="8" oct="5" pname="e" accid.ges="n" /> </tuplet> <tuplet xml:id="tuplet-L29F1-L30F1" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L29F1" dur.ges="2" dur="4" oct="5" pname="d" accid.ges="n" /> <rest xml:id="rest-L30F1" dur.ges="4" dur="8" ploc="b" oloc="4" /> </tuplet> </layer> <layer xml:id="layer-L26F2N2" n="2"> <tuplet xml:id="tuplet-L27F2-L28F2" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L27F2" dur.ges="2" dur="4" oct="4" pname="g" accid.ges="n" /> <rest xml:id="rest-L28F2" dur.ges="4" dur="8" ploc="g" oloc="4" /> </tuplet> <tuplet xml:id="tuplet-L29F2-L30F2" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <rest xml:id="rest-L29F2" dur.ges="2" dur="4" ploc="e" oloc="4" /> <rest xml:id="rest-L30F2" dur.ges="4" dur="8" ploc="b" oloc="4" /> </tuplet> </layer> </staff> </measure> </section> </score> </mdiv> </body> </music> </mei> ``` </details> <p>VHV is curretly using 4.3.0-dev-a9c89e9-dirty</p> <p>on the command line verovio reports this version <code>Verovio 3.15.0-dev-5260bd2-dirty</code></p> <p>So there could be some regression between 3.15.0 and 4.3.0.</p> <p>When I install version Verovio 4.3.0-dev-a9c89e9-dirty on the command line, I am no getting this error with the short example:</p> <pre><code>libc++abi: terminating with uncaught exception of type std::out_of_range: map::at: key not found Abort trap: 6</code></pre> <p>Here is the backtrace (from bottom to top):</p> <img width="860" alt="Screenshot 2024-06-16 at 8 33 59 PM" src="https://github.com/rism-digital/verovio/assets/3487289/b579353b-f0a4-4818-8391-0c175b7dcb6b"> <p>out of range problem occurred in:</p> <pre><code>vrv::Rest::GetRestOffsetFromOptions(vrv::RestLayer, std::__1::pair<int, vrv::RestAccidental> const&, bool) const + 395</code></pre> <p>Maybe the rest-aligner is not considering <code>@dur.ges</code></p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/lpugin"><img src="https://avatars.githubusercontent.com/u/689412?v=4" />lpugin</a> commented <strong> 5 months ago</strong> </div> <div class="markdown-body"> <p>There is something not clear for me. When running the minimal example posted by @craigsapp I obtain a different output. This is what I get with default options:</p> <img width="714" alt="image" src="https://github.com/rism-digital/verovio/assets/689412/7fd516a4-74e3-46ce-b8ba-d85802a0b8c9"> <p>When looking that the MEI output <code>-t mei</code>, I can see that <code>note</code> and <code>rest</code> elements in the second and third measure have no <code>dur</code>. I am not sure what the intention is, but a note or a rest with no visual duration does not really make sense.</p> <pre><code class="language-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-06-17T12:10:34" version="4.3.0-dev-ab7a0b9"> <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="mgsb59u"> <score xml:id="s1yeqi1p"> <scoreDef xml:id="s1it0619"> <staffGrp xml:id="sk66qea"> <staffDef xml:id="staffdef-L1F1" n="1" lines="5" trans.diat="-1" trans.semi="-2"> <label xml:id="label-L6F1">Trumpet in B<rend xml:id="r4m88sj" glyph.auth="smufl"></rend> 3</label> <clef xml:id="clef-L8F1" shape="G" line="2" /> <keySig xml:id="keysig-L10F1" sig="0" /> <meterSig xml:id="metersig-L11F1" count="2" unit="2" /> <instrDef xml:id="i2gsemx" midi.instrnum="56" midi.instrname="Trumpet" /> </staffDef> </staffGrp> </scoreDef> <section xml:id="section-L1F1"> <measure xml:id="measure-L1" n="110"> <staff xml:id="staff-L1F1" n="1"> <layer xml:id="layer-L1F1N1" n="1"> <note xml:id="note-L13F1" dots="1" dur="4" oct="5" pname="g" accid.ges="n" /> <note xml:id="note-L14F1" dur="8" oct="5" pname="b" accid.ges="n" /> <note xml:id="note-L15F1" dots="1" dur="4" oct="5" pname="a" accid.ges="n" /> <note xml:id="note-L16F1" dur="8" oct="4" pname="d" accid.ges="n" /> </layer> </staff> </measure> <scoreDef xml:id="s1d1g2cz"> <staffGrp xml:id="sp69j9c"> <staffDef xml:id="sero4q0" n="1"> <meterSig xml:id="m1t07bb4" count="6" unit="8" /> </staffDef> </staffGrp> </scoreDef> <measure xml:id="measure-L17" n="111"> <staff xml:id="staff-L17F1N1" n="1"> <layer xml:id="layer-L17F1N1" n="1"> <tuplet xml:id="tuplet-L22F1-L23F1" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L22F1" dur.ges="2" dots.ges="0" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L23F1" dur.ges="4" dots.ges="0" oct="5" pname="d" accid.ges="n" /> </tuplet> <tuplet xml:id="tuplet-L24F1-L25F1" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L24F1" dur.ges="2" dots.ges="0" oct="5" pname="c" accid.ges="n" /> <note xml:id="note-L25F1" dur.ges="4" dots.ges="0" oct="4" pname="a" accid.ges="n" /> </tuplet> </layer> <layer xml:id="layer-L17F2N2" n="2"> <tuplet xml:id="tuplet-L22F2-L23F2" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L22F2" dur.ges="2" dots.ges="0" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L23F2" dur.ges="4" dots.ges="0" oct="5" pname="d" accid.ges="n" /> </tuplet> <tuplet xml:id="tuplet-L24F2-L25F2" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L24F2" dur.ges="2" dots.ges="0" oct="5" pname="c" accid.ges="n" /> <note xml:id="note-L25F2" dur.ges="4" dots.ges="0" oct="4" pname="a" accid.ges="n" /> </tuplet> </layer> </staff> </measure> <measure xml:id="measure-L26" n="112"> <staff xml:id="staff-L26F1N1" n="1"> <layer xml:id="layer-L26F1N1" n="1"> <tuplet xml:id="tuplet-L27F1-L28F1" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L27F1" dur.ges="2" dots.ges="0" oct="4" pname="g" accid.ges="n" /> <note xml:id="note-L28F1" dur.ges="4" dots.ges="0" oct="5" pname="e" accid.ges="n" /> </tuplet> <tuplet xml:id="tuplet-L29F1-L30F1" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L29F1" dur.ges="2" dots.ges="0" oct="5" pname="d" accid.ges="n" /> <rest xml:id="rest-L30F1" dur.ges="4" dots.ges="0" ploc="b" oloc="4" /> </tuplet> </layer> <layer xml:id="layer-L26F2N2" n="2"> <tuplet xml:id="tuplet-L27F2-L28F2" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L27F2" dur.ges="2" dots.ges="0" oct="4" pname="g" accid.ges="n" /> <rest xml:id="rest-L28F2" dur.ges="4" dots.ges="0" ploc="g" oloc="4" /> </tuplet> <tuplet xml:id="tuplet-L29F2-L30F2" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <rest xml:id="rest-L29F2" dur.ges="2" dots.ges="0" ploc="e" oloc="4" /> <rest xml:id="rest-L30F2" dur.ges="4" dots.ges="0" ploc="b" oloc="4" /> </tuplet> </layer> </staff> </measure> </section> </score> </mdiv> </body> </music> </mei></code></pre> <p>I assume this is causing the crash. I will look at what is happening in the rendering, but the MEI produced looks problematic to me. </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> 5 months ago</strong> </div> <div class="markdown-body"> <p>It seems to be a regression in <code>iohumdrum.cpp</code> code related to <code>@dots.ges="0"</code> being added, while at the same time the <code>@dur</code> disappears.</p> <p>version 3.15.0 had the <code>@dur</code>:</p> <pre><code class="language-xml"><tuplet xml:id="tuplet-L22F1-L23F1" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L22F1" dur.ges="2" dur="4" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L23F1" dur.ges="4" dur="8" oct="5" pname="d" accid.ges="n" /> </tuplet></code></pre> <p>But your conversion (which I cannot get in version 4.3.0) does not have <code>@dur</code>:</p> <pre><code class="language-xml"><tuplet xml:id="tuplet-L22F1-L23F1" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L22F1" dur.ges="2" dots.ges="0" oct="5" pname="d" accid.ges="n" /> <note xml:id="note-L23F1" dur.ges="4" dots.ges="0" oct="5" pname="d" accid.ges="n" /> </tuplet></code></pre> <p>How did you get that conversion? Probably with implementatino of #3707I am getting a crash when trying to convert to MEI:</p> <pre><code>verovio -t mei test.krn</code></pre> <pre><code>libc++abi: terminating with uncaught exception of type std::out_of_range: map::at: key not found Abort trap: 6</code></pre> <img width="871" alt="Screenshot 2024-06-17 at 6 56 04 AM" src="https://github.com/rism-digital/verovio/assets/3487289/381689ea-493f-4a68-aefe-055bc9ab1f91"> <p>(crashing at the same spot for the same reason as when generating SVG).</p> <p>I am wondering why casting-off is being done for conversion between Humdrum to MEI, which I am not expecting casting-off to be a part of the conversion process.</p> <p>I will fix the lack of <code>@dur</code> now that #3707 is merged into <code>develop</code>.</p> <hr /> <p>This is indirectly related to issue <a href="https://github.com/rism-digital/verovio/issues/3639">https://github.com/rism-digital/verovio/issues/3639</a> (March 25th), which is probably around the same time as the addition of <code>@dots.ges</code> and deletion of <code>@dur</code> in <code>iohumdrum.cpp</code> for cases of tuplets with gestural durations.</p> <p>The problem in #3639 is that this MEI data:</p> <pre><code class="language-xml"><tuplet xml:id="tuplet-L29F2" num="3" numbase="2" num.visible="false" bracket.visible="false" num.format="count"> <note xml:id="note-L29F2" type="color-marked" dots="1" dur="4" oct="4" pname="c" color="red" accid.ges="n" /> </tuplet></code></pre> <p>Should be a triplet dotted quarter note, but is instead a regular dotted quarter note:</p> <img width="346" alt="Screenshot 2024-06-17 at 6 44 50 AM" src="https://github.com/rism-digital/verovio/assets/3487289/99c53bbb-31e6-4c32-b8f6-eb494939162f"> <p>(the next note in the top staff after the red note should align with the third beamed group in the bottom 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> 5 months ago</strong> </div> <div class="markdown-body"> <p>I'll keep this open until I fix the regression.</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/lpugin"><img src="https://avatars.githubusercontent.com/u/689412?v=4" />lpugin</a> commented <strong> 5 months ago</strong> </div> <div class="markdown-body"> <p>It seems that the command-line call does not crash for me because of the <code>rest@loc</code> value that prevents the <code>Rest::GetRestOffsetFromOptions</code> to be called. </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> 5 months ago</strong> </div> <div class="markdown-body"> <p>Commit <a href="https://github.com/rism-digital/verovio/commit/99e7bc0f5c4ec668e810c6438b5edebce395e7ab">https://github.com/rism-digital/verovio/commit/99e7bc0f5c4ec668e810c6438b5edebce395e7ab</a> fixes the issue and now the original example renders as expected:</p> <img width="405" alt="Screenshot 2024-06-17 at 8 50 39 AM" src="https://github.com/rism-digital/verovio/assets/3487289/56d4884c-7303-45e7-b994-56a9e6f2b436"> <p>I will update the JavaScript toolkit for VHV and then close if it is working there.</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> 5 months ago</strong> </div> <div class="markdown-body"> <p>Original example now working in VHV:</p> <p><a href="https://verovio.humdrum.org/?file=poly/R714_Cop-w32p117-118m110-112.krn">https://verovio.humdrum.org/?file=poly/R714_Cop-w32p117-118m110-112.krn</a></p> <img width="822" alt="Screenshot 2024-06-17 at 9 00 47 AM" src="https://github.com/rism-digital/verovio/assets/3487289/fac90b05-e09b-4156-b1c1-c679d2c83ef6"> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/lpugin"><img src="https://avatars.githubusercontent.com/u/689412?v=4" />lpugin</a> commented <strong> 5 months ago</strong> </div> <div class="markdown-body"> <p>Any ideas why the conversion I had with the latest develop was different?</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> 5 months ago</strong> </div> <div class="markdown-body"> <p>I think you were using the latest <code>develop</code> which is a few months behind <code>develop-humdrum</code> so you were using a version of the Humdrum converter that used to automatically assign rest positions when there were two voices on the staff. </p> <p>I had removed those calculations and use the verovio default positions (unless I want the resets moved), so your version had <code>@ploc</code>/<code>@oloc</code> data, where the version I was using did not have them (and my default-positioned rests triggered <code>Rest:: GetRestOffsetFromOptions</code> while yours did not).</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/lpugin"><img src="https://avatars.githubusercontent.com/u/689412?v=4" />lpugin</a> commented <strong> 5 months ago</strong> </div> <div class="markdown-body"> <p>OK. Yes, I was using latest <code>develop</code>. Can we merge <code>develop-humdrum</code> into <code>develop</code> now?</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> 5 months ago</strong> </div> <div class="markdown-body"> <p>Yes, it is in a reasonably stable state at the moment.</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> 5 months ago</strong> </div> <div class="markdown-body"> <p>PR just submitted (but Humdrum code does not seem to be compiled with the current checks).</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>