From 4f42fb0d8229fc26f60d43c0e3d7b85f8142471d Mon Sep 17 00:00:00 2001 From: Marc Sabatella Date: Sat, 7 Jun 2014 20:23:50 -0600 Subject: [PATCH] fix #24735: correct layout of fret diagrams & chord symbols --- libmscore/harmony.cpp | 22 +++++++++++++++------- libmscore/layout.cpp | 6 ++++-- vtest/gen | 2 +- vtest/gen.bat | 2 +- vtest/harmony-2-ref.png | Bin 0 -> 11093 bytes vtest/harmony-2.mscz | Bin 0 -> 1785 bytes 6 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 vtest/harmony-2-ref.png create mode 100644 vtest/harmony-2.mscz diff --git a/libmscore/harmony.cpp b/libmscore/harmony.cpp index 959acaea051c3..f47d29e2102c5 100644 --- a/libmscore/harmony.cpp +++ b/libmscore/harmony.cpp @@ -143,6 +143,7 @@ Harmony::Harmony(Score* s) _parsedForm = 0; _leftParen = false; _rightParen = false; + setFlags(ElementFlag::MOVABLE | ElementFlag::SELECTABLE | ElementFlag::ON_STAFF); setTextStyleType(TextStyleType::HARMONY); // call after setting of _id } @@ -872,23 +873,28 @@ void Harmony::layout() qreal yy = 0.0; qreal _spatium = spatium(); + if (parent()->type() == ElementType::SEGMENT) { - Measure* m = static_cast(parent()->parent()); - yy = track() < 0 ? 0.0 : m->system()->staff(staffIdx())->y(); - yy -= score()->styleP(StyleIdx::harmonyY); Segment* s = static_cast(parent()); + // look for fret diagram + bool fretsFound = false; for (Element* e : s->annotations()) { - if (e != this && e->type() == ElementType::FRET_DIAGRAM && e->track() == track()) { - yy += score()->styleP(StyleIdx::harmonyY); + if (e->type() == ElementType::FRET_DIAGRAM && e->track() == track()) { yy -= score()->styleP(StyleIdx::fretY); - yy -= _spatium * 2; + e->layout(); + yy -= e->height(); yy -= score()->styleP(StyleIdx::harmonyFretDist); + fretsFound = true; break; } } + if (!fretsFound) + yy -= score()->styleP(StyleIdx::harmonyY); } - else if (parent()->type() == ElementType::FRET_DIAGRAM) + else if (parent()->type() == ElementType::FRET_DIAGRAM) { + qDebug("Harmony %s with fret diagram as parent", qPrintable(_textName)); // not possible? yy = score()->styleP(StyleIdx::harmonyFretDist); + } yy += textStyle().offset(_spatium).y(); if (!editMode()) { qreal hb = lineHeight() - Text::baseLine(); @@ -930,7 +936,9 @@ void Harmony::layout() setUserOff(readPos() - ipos()); setReadPos(QPointF()); } + if (parent()->type() == ElementType::FRET_DIAGRAM && parent()->parent()->type() == ElementType::SEGMENT) { + qDebug("Harmony %s with fret diagram as parent and segment as grandparent", qPrintable(_textName)); MStaff* mstaff = static_cast(parent()->parent())->measure()->mstaff(staffIdx()); qreal dist = -(bbox().top()); mstaff->distanceUp = qMax(mstaff->distanceUp, dist + _spatium); diff --git a/libmscore/layout.cpp b/libmscore/layout.cpp index 2bd910e6b2bcd..41a9be5d13d6f 100644 --- a/libmscore/layout.cpp +++ b/libmscore/layout.cpp @@ -3517,8 +3517,10 @@ qreal Score::computeMinWidth(Segment* fs) if (e->type() != ElementType::HARMONY || e->track() < track || e->track() >= track+VOICES) continue; Harmony* h = static_cast(e); - //h->layout(); - h->calculateBoundingRect(); + // call full layout here + // which also triggers layout of associated fret diagram if present + // otherwise the vertical position of the chord symbols cannot be known + h->layout(); // h->calculateBoundingRect(); QRectF b(h->bboxtight().translated(h->pos())); if (hFound) hBbox |= b; diff --git a/vtest/gen b/vtest/gen index 55e2b6e90c5a0..2f7d9e6a1eaae 100755 --- a/vtest/gen +++ b/vtest/gen @@ -34,7 +34,7 @@ else chord-layout-7 chord-layout-8 chord-layout-9 chord-layout-10 chord-layout-11 chord-layout-12\ accidental-1 accidental-2 accidental-3 accidental-4\ accidental-5 accidental-6 accidental-7 accidental-8\ - tie-1 grace-1 grace-2 grace-3 harmony-1 beams-1 beams-2 user-offset-1 user-offset-2\ + tie-1 grace-1 grace-2 grace-3 harmony-1 harmony-2 beams-1 beams-2 user-offset-1 user-offset-2\ chord-space-1 tablature-1" fi diff --git a/vtest/gen.bat b/vtest/gen.bat index 3a7a50ac57d70..af7c3ff04a23c 100644 --- a/vtest/gen.bat +++ b/vtest/gen.bat @@ -13,7 +13,7 @@ set SRC=mmrest-1,bravura-mmrest,mmrest-2,mmrest-4,mmrest-5,mmrest-6,mmrest-7,mmr chord-layout-7,chord-layout-8,chord-layout-9,chord-layout-10,chord-layout-11,chord-layout-12, ^ accidental-1,accidental-2,accidental-3,accidental-4, ^ accidental-5,accidental-6,accidental-7,accidental-8, ^ - tie-1,grace-1,grace-2,grace-3,harmony-1,beams-1,beams-2,user-offset-1,user-offset-2, ^ + tie-1,grace-1,grace-2,grace-3,harmony-1,harmony-2,beams-1,beams-2,user-offset-1,user-offset-2, ^ chord-space-1,tablature-1 set MSCORE=..\win32install\bin\mscore.exe diff --git a/vtest/harmony-2-ref.png b/vtest/harmony-2-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..04a0a9ab1fb53ed8efc1ba891fe083bb2735e4b8 GIT binary patch literal 11093 zcmcJ#XH-*B*Dkt~5PIl6bftr!K}<~I#35BCRs!4H;T%S#~uz#z{(ZF|%ZiG@r#}m$evRr3LAd|#kG@xR z7S6_I&-!D?`o%D93GM2X*aE~ohA7xBbRvpE185K`%pa>d7R(O*i4{?ZtVlkE#vo`< z+48yf_V2i;4NpwBQ-jG^k<4QwwN08$Q0WmzcUUe&3G3`n8ajtIAulsw{fH6dKI44@ zV P@d2rp*|IPLTn8~pWM@lS&0u3ogDj&=d?G4e1ZlDBx@mSfw+Ec$&;)6R+5$~5 zBSwyn9+=~zbfwmFqYYH>bLTkyu!VRwwo|t7@r!Q$pm2TpVZ|PnkrHT^f)!APQJAE( z6_N!rOI!?x#$(98&CSd%kGv#23@&LK_rAbnUV2YFqZ*s4Q4mKAAhzdk;)qPR>C^6S z1vkRU1}|fjR*#Op+U|3qT{~<37_E!>+f-h@o0@8A!vW7^Rghr2V!xpIn72@iEJP;X z-|QoDn)a(Q=6ZFQ)ue0k`*}WNl$ZXz@RjI`$0h1PwKVE9%vjO_wp{F1op05?#GeR<7!}XIzu+y>&wkGPuW+w z960Knu&Iv4pwJ?I&SYIQP?tJ<8KYQ~T6!)KFfV;zm{M@iF)sV`?#N#HXfhPw_AB+r zn?$1r80XU+{?E`IY%Ep~7X+h!CH+c$$B_X6FZ}66#MyZ@wCMO6HAkj-0p^$Q|65fCqMTRK zuR&WlpA3UCrGk=MxdxH1vVNsmKzuc-b)})8V~)rAV;{qeYTyDIuTDrW{Il$KFjp8g zo@E10p2(=mOuf!k3`)qS_CbM$3fA4|y}!%|dx$-fqFv&zJuD|xLhD5_zm1()@GPzCM>0;QmaRVdbIOGoWjJLtPjv5sqZA= zfV8x<%0GvtTCzEShLRph&|tPR8wpm!Ke~Y8B8l(We%zUcEkmg~6m|R z-uun;r@xa1&(BVQ6IE;{Ezv^37eDSSVm+Wix)cc}Cuq1XCC@7o-npY`2nu{T`=7JA z{D}{3CvTzsEOp%X-x4cq_eIHv_a`bLa|(o-i#L^&M$-RlrO=?;aI?~%Eo?1N<&gdf z$X)CN7~w(@!qzn8yP4^UX50PCK^}LlSN)~%QnqEFLCnmaxtBx%nGCX!A&nn)od@$}!I7qY4FU;>~q6t)j2 z`Pamc{d4OD0|yB8`@w+%c^6ky1dIBjDGxgR0pHj$;0e#(kq9|zd7mDUCGq;S8#q1b zF9UG8rB{>q*t9TyK6<8&BlKV1|HTXZ`6C`w9`X7-)?{w+>N|Y`D6`w>F<`@ax2dsv z>tRc8;dRO4{|>sW85lY&>`&sT(J!wEg6BUsgb-P&zpL&qmplA`0IoDw@LCQ6%Z0Qh zB2h8(%RuzZvjyIRW$1kS=?P(&l`uogN=^pRN8)yAu>J$5I`Iq&m>9HJB!Zle4>E-s zhMl5Yf9k)tExrt~hEfi(iBKa|xS@E+{G)penY{^j%Uq;ic)Cc2G&;*lzejScA`V1c zf4Q1vhihy|Za5aNs<8@A0pWn0Y%IAMH}CYj$qmm-jkDd)`teL^qx9Jg!9dRR35g#7 z$GLAV(p8ufJNqNI-5>nH0EX0@eZl&p3C9%E@1q=L6$ZXPXsR?_`{FJNvu!Xvj|gtPx8I z-W7qam*VJP1P0H8qDo6QIt&45F_g5?4?&mk7!eNm6m|mth_N0f0Ps5K7J?269QAKo zS3~nBheCkDvK3?E@om7imr-#2u8mO(@8|OZ+}x0b0xlZbDzxriB5DFAlZM^g-ZYQ5nr`9;zhhhOy0kP+7mXAyMIL-i^4G4tAFg8S5tgn zMnILXL^d>U#n4~rrSk&p5JuRUo(P+8GMcpy8xv1lVtaYgx4|e_bi-GfSvz|}lW~W^ z=XlKOO_GEUZ;iM=?gO!vRF$f4hpd$f3J_W|SU>xFHSbjl^etY}iz{q1o@q~R<7yRu zCR}g-Pe<;}c$Vg>XFWpI8kDuS{G%yVMZE0y zqIIV4SuPUCjzgO=7tHiIWv{4C*bu`DYIp8Ot>%zVYV`!3Z0Ox+ANQmSy*(H3F{P#M zd9ImpD`C%#Fn_a1Rfg(zB4lb zd4P|eFy9^5=V#NQCv3gB$Psu>9e9#ro>eyIcr>BHBBqMCaT@i#5i!OHz;My8W|k=5 z7fT~gKAIk}+HO6*eOqmZ-sIpq!|NbG*?-HQa~-%pUfd9itI@eu?ehWMJzpjP6$+z8@Vc8_j7sjM&KH*$SY$_?D>WjutJY~R8AMXul<>_=zE0C?sG zE>h}3w6rIL2(TK!Vk`8Qc2jrCp#v#T%t1XgP9qm|IY=rCb*c~69?~5bX3O`&FY{X& zbCMNb6dXv=sJ%`H7?~6ODp-{AN>Oyy_1ow?SHi}WC7fy%8kQrB z(PNN!_Lv%`{-dPNtWUBx2m>t5{iMd8*uSqcN*ef(p3gKTr0D^qjDvbl&dvFh8)mJX zNAe$F(QlXTr%tyr1h-1p1|5tD&R)W&z& zK%=Y|Bo+Cy^?blru5h+VU(y8PsuskabgM7YziaM$JA(Frj&l488#bY!jI8$F6kd9p z+8=PqcBe+I!^x*=G?zm;BYIrS?8wN~1c78AA(5#Ue)S(lG=*&&rNi0RcaZppRD#Pe zo?(Es;kbp{3!!_nv`K*#XcS{!^6<~GkmIO3+n%d)v(_hfshR4*Rg7(%S8SxL&W>wX zBXt!FO!ZX*eiYx%x*|S>f4$qlQU|@xx1tamI-X|p^Nls*Gxbd3NbFZ7Ivk z`hn{6w$`Gt2w3#cw!-g&JYqa7UXB*Y{AOr#^kMx;uY%bVLNx^IoEsuEtLCe z@jK6u1ahwp=89cTGQK3CEJ4?(NtllEKuhd=ARZD2PX2Q2b9Eut_Uj#$llZzJ#P=?e zBTUE~l5oiU>DFEvehk6nx#pe@=go@j4HGo#=ZWuLfhvDFBR)+YG8qg(T6j_0_3J&o zsW;D~dxdJ6IakV%DTl|RIV0c^q7iu!X}uzT@*500^;-`qmEBPiMNs$dsESRrz)pLJ zPHv7LfC9Eu$dQ%KK8$^G4%S`QS6^(!ZPF%LZ*)aXC%~p>P1cbQ6K>T5jEu0zL zng(iks+5*Q6g{3=@Q;6(g@`^Ow!Ms^ZIyhFQmM=-6~2v#*(9YrbxEQQcq8jRRGY;_ zVoqz;15SV*L)>7OKHVV@Hpp?1-`oD2im5bc)33iK*R*3vX;iuY#RS_yyIkNh(Hz8! z8C`jjO4EflJpFOOuAikjJVGE>S>7*lKu*j8Of^2&PirphbY8opeux;$m3`z0sGZz6 zG;j%jOg%%IiJ3ozQ6w`e?++&O(d~B_+MXJ>&e-=nhRk>5N){FpkHAgHErr*BWW><7 za^h~D=dt{bCcmMc>i*r{^<%A!pE|Oc4!b9p1qp#Wml>jE*8y8t7?Yt%)X!A#%u}l1 znIyOP^JH36H^$ z0&{a6fsK^iy%WhwF?iYm`a!~E_r)39dJJw+BeIZpS^_muC&;HsqMwVWvAnHRU*7oJ8}_7p`a^;wTI553 z7}DXT_CdGY!;d@CGL*f5k0I!HX}eE$QSTm5QQ&Uk3~#I0?5o3&C;W#5wp^d<18S89 zpNDe^BwD5L)WURX_1bG|>EaB$R?knVq0p}C0~*xVL0f94BMM^39Fx274@})_-Jr{>R5XU$KZ_|xCT_~($l`3!aHk*Px>L2Br62=52BJ9`61jO{NfP24l{ znB}u(%#0(y%R>8)X>r?$%RFF~ANn`41dgbKBXieIadQ#rUe0@R+LXA#A3+db?ID9? zbEU-mTSf_y1=UI{PPb~E@2GpXSb&`Z<#^-YFCi|fL@SbhbbCEoB^bzE*!8NcSPhvA zIUk+nIvgrWJk#2{l2+L07qZ$PZ-~0DCSU2g&Y=9wjtNCWdv-5^o7eB|BLfm~;v~4< z^EPZ17LH<#55g4EJBd4SfLgLCpvKayx_9Da(<%HFsGyfO|IB-aPAC?_7l<$u*N_66 z1@>$XzzMpAZHLAadte7L8wckL)&#wr$#II`I$VZKg2-R_d<4x1ta~@omdnut{7i0a z2Pb;|ManY^5v5}WxNT@9(@|;$Lg=#BbSOy?$BR=T6npxUt@)VP-jh^Hm4l9Dh07TY zq@|}?_Q=e_$k9AV#KCEd@thS=#l?8z)Of2AUtZ^Xjy<7Z?K*+IFT^3<$^kR-fD}az zs%4j-C|MD9dXW$8m!xh&vF^r3tbN`uw8d6NjM($SggodQp7B z!RdPw4BN!@-@9Fk4ID^yHU8$a^h=Lu+uNOS3S9+76o zMQe|m4OZ~uHT zquSC`7D9*QGWE+2Ycg*HwaUG5kS@MaaAqy-N*ngjw6LRGXg%fd^kIr~n}}YdY~Oi? zQI;#0DTbNF+9viJN)fe25(6Q2eR5!X7WlF5EJF_B^L^%5BH$OBvkarsBO);JN}5~R zzZSg$`vIJjIcXeqKc7>hH z*Hmcd#MLJG5bR%HX+W{-B>sIr(&6t3g8gAx)83)}-!TTjquciAynW2(u1Zf+szhfX zZ&JX8yU17TzXDDLAN$tGA&YKrZh#Qa;4cY1zGyE2W>6`=bFda@1GZB!pafT;aCJ9i z-zs{c@L*cu-a1{Da(*=ny=(sWgTBSH!k4#Slq3>P3f`p36{e}g{Rv&5TonYH_=mRv zHMSKV&Jg#s&9K$)Vp;%60x3KXnGx}%EfPB7(9ZL|Ub72&z%(S>Q=My_vB$GL?*g_L zZ;~|Osf1`c!El20Kp(+&PP`*fPc#K_FA9cKBKs(?t7q*w)79~h_35uWXT8_Y zfK8_H2!#0Q)R2vmy`k^`g6px-t2O=?hz(aWsgF-mW(7zP*THaAvM5;@^ZJ7lPQv>w zvte?En$f-LyXIDMnAzwI?&OnrU_$d_y@|=~n#Fp*krhd{?oZ z6Lp?0L)N+|I$$K6b==*whDHYT1 zu;U}z$7hj5o1FFJjaYVTmPp>Pf#UoyDnZyG2TYr$Bg_DC-I*pwsUX<@z1z|oO(=^u zG7s2KclKhrL$ug@oQER^sW+x9mIdfjn(47H++9Mqg*~(=3$4R+bAGw47+O{X^$_z{)r}wkyT|1cil2Ge$79u{wfjAcEH+9SwP}!-1O5AmIuIa zVzlxUJmM57i0j~Y~E+ZulCHvF(Zlh?l zA9mUrBPT7*V=WHF`h;qhMup=4JLDv74KfnwRM?+hvzMY)?%+Zt?#F z*%*r}a6}oGolZA`{kEWUV@(_>r$dvJdSESIN-;pXb`@*o3iY|2vji)b`sHf^#5PhY z&BHGLxO`@aeC6nbSi>MK?nJN!x>>@j;~#uC`$NE(FpaN_nebKuocz_vC#f`q%TC+6 zOaB5Kw5R?(AeiQ`+mgE0=9BUIOpECvXtsgjNS3j6%Bk4jL zLhVs!j-khSvOj6mXoAIM<4@4bm=kJ@dl?rDMUl}UDw!<;2fpQcCho3>^hd*D3EvF@ z_w}SGKr|!^#;HSDbBUvq{ZU;}mr`IuXp_#7y)h5~Q#k(>cw2(lJE_JxAgBi4i#qKO zN@rsYF%G*8tthD7McRWXnO__$P)oV4Y(K1snK6E^!wkyX?*QCavBpl4`r-vKQc|Ez zy8XD&4PoSI60xoL+gwOU!Db*)l-zSa)&>^V%_zW_(Rm88{wrsfA?ia-E$EHgtU#v< zQyX-KnnO*nfwz2Apdt=9wDqrgct8T50nDjzD z`5+bioC1|?h64jX5Ygsx5sZk7eHvTEra)a3^8oFwDFU-=mVikRooLg7HnY6k4@B(% zyF3);it+Fh3rA4=;~a3{{m_^DIKh&1X25VsKmdA8(Drh9Fst{fw~3kYfZ2R)Sf7 z0y!YYH8Zy>yMg%_QbI6E3XIh22jr!t6}}2#e+U56utl66z9JmF*cAtW>$AqH;=C5$ zN+;;bJ{dUhML)T0b6fpSE4J(i1l;>%G9anzYMA$J!bHgTWy8ZvqO26fpKy~+)zg~G zxmFOx@gm0v7WARIAT?DZ35pGlCGgJq*zTVqYoaAywlIZd8z^4&aP`!oztp3+!j74` zf91?$xu3I)f5cSN>m(Ax-T=v~(`IoczY?s={-~(v~PO$6Gi)k~ve%lbjYOC)8ef}-Vv{7JR>oHuE-qgcmfw;hD>ABc`f5`ztJD)P3~8=^E*YRi6p8)pdWy5zQ5J>wY4`d<}k9A44cz{t9w0sih|1QlE2yiiKZn`%Pkr z^?2E$S7&+Ol_S?04O7!8jbTpyvfpNCOebmDW*Y5L%UGvB!>Z3Uf)IW-510m=04;7q zM6heqUVMH8pjnrvK z`P5a*Xqaybay6y4VC?vJSuE~?*~|L^Lsx(Eot(u0j~gDXru{UB#%9Az*Or>nE2h7R z=HS8>29;!lfgpSS<~P!4Yd}7jYcS+xDcZBl&)Xiqaph4dckf69=-Y^kKVO#elgetyYpc6)MUmxqq-l?>LiXQQ$Nlg zzskPx&B9r_;<5sN@CXOA(C@a)job1YW+h7YCC9L5kZx%rv8;Q(;7{L0oGscoapggd zGcFb!PrAaEKM(%H_p4-TMzxv2Yo`A%#%(*5u%?EV3_jbv)(pvm@M2AjneaS&oEtnF zVfVZzUKEAT6o;X8P_+%>K9Rlm{x;Xi{0RjBR@%RN0R~$R-Ux3dXr6sAaFCc8CS?WlU7ifC=2QJlsLMP!LFdk z)<8&!1=r|z_iPC9IS8j;To6>kG=H2d*BWnDo1#UEhL!E`uEtrA()7~<@{3fv0$C0i zpSV*D!4-WAgwKkZHf*RgSKN8P)iL7pdtwN#hzXeAY@5$D4WH*i`#jqIYfPr;VZY+_ ze-&-)fMszcJDU|SycbG=<--m{nuq8iXE`-iyA!a*k;W3_AU;N~7UqMJblr?jfj2+| zyEX&zK&w4H7UT{!9+g6|Svm4XJlZv%R@TGf*6-MS*y98{cCN7P_Lg*Av2>e^2n30V zjZpwyGWjp&E;~So4X1|0JeC^ePWK-)5(Wr`*xfg;&U2D)qv5EjFc#Es@GX8CNJaYT z-rNM(KP-ue3vOO%q#Yi!Zei?%-EVyrJ4>C#7k@uP#8f(W1gx|Xb40Ru$1rHMvUtu& zH72CigJskzwl!;OCPfUF@zEVA8<`dD)f#R!^)XsMeaVtxloNT^agDsB{1k-1FSLm% z#JBY)pfGO&@R@-NRrdDb0&)NeD`S62U~^`Rm@DJH8Z7siiL#$4{e zuYsuEBbUy)%KB^kZYw{0-nkX^m<-53Mc^$~H%AI=$xlwv@`Y++tE{2|p=~QU@9&8E zz68~~!vndN$O9=mlZJh9LAn?NLJ^9sxX`!sr=}XUQ0u0Ui%%zPSQWPDCY(K|7&z|P zXFVh+t^E&D*4+rV>w8OT-F;3nXny=UrhUC+aA?T$>k$en4(W+98iLMM;cGqMyO;9&768{HJ=S>Px?F%{Fvw4`iW2^^K3xrMyS&h-z<2&ki@=^+ zcN4hQ!DS=}OJBUQyv&C0U`N+;`gqB$T_OQpmsbTG>OwO9p}T!m7H~k$bE`l0JZwI^ zE)tU0Uytwcw&`|~y@!j-Y>!WvVHy{->BF~52|3LNUfVC zH}sc+$w*w$1TcYK0gk^m3RXmE2g5d4lYjDb;XBgV@S=>)kh{FvOSdb1Jrz-RJ^4|o zzvqdPH|Votr(dJ=?_@mv7=kS9o$HMZ?6M}&wEP1$-eT5mw^`~?JtOHu#GcLD=%Rt> z)@4pPqe$Sdw?Wo4x*~t4`&9OcjY68*j*&cPleg8aCA6U9AwHk|e8l`Rg`Q9|>g&&~ zmVl`*L%1rdx||9BG@bfN?=CN}7sB3^{mV=f*n`%QIZ0{zJR`!mcJ>B@HZre#kHd-n zg=9r;ZwX+G8VVf^t_;JlE;!jn8m$&hYAEl$qJ%%LlMiq)J(}J??FV(`U9CZ^z_MfC2;#?0(W6B!Ra6I-Wxb67Xh_QUow6W46c5hCQUJbR2u60%twz%ejH?)R+(js6d2{sY1pZ_w;a-g3{* z2JBxbQ4~5oIy9bbaZ&As882kaUw~+d5t$#K8@fx-a-O>Mxbs#(5lD0oADux59mzL7 zZkD_KsT8DvL9Q;f0+E--tEu#IdhDs@GWTJ3;WpX_y!Yot>qM<#hVGzmg>QdoU)7Ch zpxhhw_u$8O)zKjCdv||`2p^J^=o!v6m))!>sU!3z1KeVnlr1uDzF603{#h)bR)W7rFi_h0e-sHetI)GW%N{&c2Sip(y{jy&l)7PgFiQ`|A*6^BuE*z!vakM)(*pP8=mD=} z0T;`E)Z$^F@c6uINSc*$*W$!HfEk@G^O%mH1Z7#VEgibWl6Et$YrozEca`v zWAu92eI=sE#$OMYP6jP+3772DE&}bK9v!rEd1-9o z1}A21m+Co7Kg13c1hi$!{CI7Cel>1#kR&>fAfe07;HSke72aC90FwLE022Ei>&85( z@7NnLynE+K61Pa_hq-YiB|NXT*q*R7w!s^v&VNxCU6fP0( zG3uQ(G3o3tHsM`j5wyKC_EW#;&MSxikZ*~qwr}k}?e+PKG1(8feB*`VangQb`X9uAIK8 zCJ@MxzLa~%KFdBJ(`|oD^@gftO~(U(I*nxklK${xTsYn&{xm)mB7jcQU4qqU zl|PfV@eHBf^hJNQa55`Rdk=B_x~;!@!n4IbzrZ{c$Tjziy*HsTWrx8K-|!6W_CS-% zG*BVWE$7~Q(o>!8A0|heZN3o<<5&;wPbegw2n1#R|NF5?p#!i71$~^KRt>=WWC1I4 LTeE6Ybi)4vC|Z*$ literal 0 HcmV?d00001 diff --git a/vtest/harmony-2.mscz b/vtest/harmony-2.mscz new file mode 100644 index 0000000000000000000000000000000000000000..37e7cf6bbb0b85ad2896638dd092aaf4b2aa6aba GIT binary patch literal 1785 zcmZ`)X*3&%77mH@3BhOtsTL)nA{2uL)mlfS(%5ON#nEb#61ys;l&Gj>m{%UPrnEG~ zSfasH#TwLBW7JYqlqz|cL3tfB@7K(E@7{CIcfWJb`Of$2endPF1Oos7{{R$}_FA*r z1X-cStoV4~$Kzn*Vu8UCY;^-}QzQIuQiEtZF%)uR1FLVyQ4^2R8s?8Qy6R6D5S{FX z@WWU8`S=!B2sCWGiO6nQV&jHK&^SIHk6|x45$n$ljOgM9`8W(%n7s$NS%t;6iP4dY z&Gw3P8_s@gew%F^hu1G>FOz?{>EJw%*nXh-V0u+;8U!Hz#bZqVQ<*$50Knrc03dbj z@rFN*a+?~9(bu7b2gGb#BRMY_!4d@SfrkX8w98$YLa85cgD?eV62VvQOZR9khQpQ& zOguW%Z``kU>Q~Dd%67``$MI3ls?zD8txMd>{snPs0@gH~`@T;RAQ5Zr8NXs?&X*1z zPFwit>O&>Cs=Obq_oT)J1F-|WY(^39@0pr8GAu5D^|ujJgR;Ij z)7{j0<3QkIQa2D$jIAzLul5F^oz%y~<6BBttNyB>^EIOY*M=TsP=h}Wial~sOXrYE z6K&88l)?AonOcgpyvvOyKLj?#@%3foy{t9;S6-4l9DGJwWn{dw&7Op#1nO1&sMbj% zU#|n|*ZB50arO49PhgJ)=%b#FTL6?GOINleiI#*Vf9ta?AgN$KN4QrGj=9hHSzX2D zz6%p?SzR3s&G0%|b5o&DM!PW8V+=lUsks%b-}J9=ui0vMMo1TsYlnuV*WoM!;3*1` zG94u7%>GkZk6b0$fuEwEv`Kbc`=Fw1w8}D5%Z1l$B0TVc>ZuDfhVZnu(Z^hkj^||s z4O$h(@&E~$h}8E@i#3_u2J$fqxFi3isr_=71&F@iH-)emWJ561dyTr!8?lp26QADd zQV)rMe(N*nXJ(2Z5VG{tp!HUFnK@o3dNnj&j|*?|v>T-KkY}0N%61VyKW<#6ZTtvR zN7m=co!i<{Q63`1Pk|iR#AoCN%tR%=Wb%9oA|NoAi0pU19}GlI8e;U@-z_v;wu@AXyvV*nMA0n_$_g&@+CyT8YHT-lC_z@m>r7k% zB)8h+IbrLuRf>u>xXhkxI6f#5TPQrlaLE;F&3T#t@1AM7oCVNQPISZtlZ!h{U!VNa zt?U)ks;7tIPFD)p9qsu?mxDxK_IX+^XFQw`|IZHhw2PFf;ZUq6b?c!#$ zaG{XmhF(F#=a=Z67RJT`PZ3*tZ6i*~#Bhnu%FC5<+Qfi0y{iuuskT})AI_)1YD0u7 zaBkn5GM5Lp(mx?8@On<3*47hs{2(2->yo2*ZoPSOEo7=pAh`wcd$t|waB^qtjA3tL zUg2r6%CQ4N9rtNUSZy4X=={P{$0p|&c`-K;RXNH%Ty3W0XGP_;HR2*T`nNM{>W)#Y zOs;f~)``NLS1P)4D~x)FkhB@gVT`KaqUA6}74^Z(4gsgXKo(qjqVirf|CCooWWD0! z?-g#10Bv3~`)+{UhzC5<%eQoGoWk`7CiAttQBUD?7dcwK_~2fgCGHtQ-dJ0Ynmuci`X7mye{pVFx{vx0hDGqCT=LUpz*~Re0zJ_ok&uoZhGr0 zjpxPR@SJwFL|(tmTLAuehNMLHk9bzy`BsV~d$&ak&nh_gocAiNj$3Z+>U`%rI_o4^ zlS9=aTM3c7jz_lTy40iTFl)}9VXTk4Pj^sgir(VC*FlUgAV#Ofn^82JaJ6%&t6#bx z`dx7KZ*Eqza|&O{HI44kEGjU*CQJ0;Tv>YIX49NtF*@r0Hfs|s_(Ba$Ogu{5WckwV zu#Hb1C!=4*jP0ahD-!c@=ZbV5eMu;vmi;wLE=>PUTEt7>*h!+F@aTh)Ad&d~?C;J^aOd^~B literal 0 HcmV?d00001