From 93c2d155b0a081a8a5c7c0d051b0e643c54ef7e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20B=C3=B3rik?= Date: Fri, 6 Jan 2023 18:22:22 +0100 Subject: [PATCH] Players finishing improvements (#33) - Update export data format description according to latest player improvements - Optimization for only note changes as part of improvements in #28 - Updated players --- assets/data/saa-player-i0-pp.bin | Bin 1393 -> 1437 bytes assets/data/saa-player-i0-pp.rtb | Bin 378 -> 388 bytes assets/data/saa-player-i0.bin | Bin 1368 -> 1412 bytes assets/data/saa-player-i0.rtb | Bin 368 -> 378 bytes assets/data/saa-player-i1-pp.bin | Bin 1468 -> 1598 bytes assets/data/saa-player-i1-pp.rtb | Bin 396 -> 426 bytes assets/data/saa-player-i1.bin | Bin 1443 -> 1573 bytes assets/data/saa-player-i1.rtb | Bin 386 -> 416 bytes assets/data/saa-player-i2-pp.bin | Bin 1468 -> 1598 bytes assets/data/saa-player-i2-pp.rtb | Bin 396 -> 426 bytes assets/data/saa-player-i2.bin | Bin 1443 -> 1573 bytes assets/data/saa-player-i2.rtb | Bin 386 -> 416 bytes assets/data/saa-player-i3-pp.bin | Bin 2492 -> 2622 bytes assets/data/saa-player-i3-pp.rtb | Bin 396 -> 426 bytes assets/data/saa-player-i3.bin | Bin 2467 -> 2597 bytes assets/data/saa-player-i3.rtb | Bin 386 -> 416 bytes assets/data/saa-player-z0.bin | Bin 1300 -> 1320 bytes assets/data/saa-player-z0.rtb | Bin 226 -> 228 bytes assets/data/saa-player-z1.bin | Bin 1369 -> 1389 bytes assets/data/saa-player-z1.rtb | Bin 232 -> 234 bytes assets/data/saa-player-z2.bin | Bin 1369 -> 1389 bytes assets/data/saa-player-z2.rtb | Bin 232 -> 234 bytes assets/data/saa-player-z3.bin | Bin 2393 -> 2413 bytes assets/data/saa-player-z3.rtb | Bin 232 -> 234 bytes doc/export_data_format.txt | 11 +++++--- src/compiler/optimizer.ts | 45 ++++++++++++++++++++++++------- src/compiler/renderer.ts | 31 ++++++++++++--------- 27 files changed, 61 insertions(+), 26 deletions(-) diff --git a/assets/data/saa-player-i0-pp.bin b/assets/data/saa-player-i0-pp.bin index 4ba85c50430d67405bce7075999df7b47b881e38..96504abe4a7859a71fa5532eb25b16450a59c440 100644 GIT binary patch literal 1437 zcmd5+?Q2_A7(Z_}S-LH0jFdJVZElZoiUU#E(5A2tacvphxmuPhsWxR3;tP(ki{s+#x~-1E5}%Vg{1-eQe$R8x z?|FXb{ZT(r?CY#iN2v#50)f#&NE|>Ip$1wITLJep^j{FqqSSr6Rf(TcTDEVqqX?oJ zs5Xw&9jv5a^^H0X)$wQ@Kdj>y68G)xXhwOh!1CHROogFltO5-Pp@5JE2oiuG2UuX6 zbySU2zCsx*WR}mP5HvT$k85j?dXC{(L|01Ni24!3jS-zm_XNXhB081sI}9_V6Y0Lm zFhM$&?oNg=%1iGT=4;87_9<3rKv5nf?7v|vH^T^(MwRPB{9ps++$iqmySSBl$gxq3 z7M3^Tt}E_v%1A^GCWeZfJ1^pE!%jDz8#W@*bomv$63gV=n6nF;ZY-m3)y`up%?r*T z^xMTrIVz4}&h5{!<<2@MancSpB%2#vY`ktm_kM*aTsmt;k^&k^^s-%rU}VB`&O{#gDB$O~rwMk))$%YdE-N$u@0 zwi;)_#4^_Fm}MTf3Qm^t>N@cPwF-jJgkfjtwWZ1i>O3MTk)`T1>*c&>Fp0O7zOMv! z$1kxKFFp%!$o2Pk&M>&sY1%nMf&Yn3oSiT_r&z{i&OFU=*)_rci+1j(1=B~JTh#ZQ zAKKYEr+&}i`T|2{dq!PkZJ|Tu0Bc*4d|=|U38M+A7g?|AhDP^rZk>7f468O)HZncr z%csrN{r}6nB$=0iY0As-N!4bssTQM%{zt86`_8_OQ%d-E=3~)IdTq9qE8-Tjs^L$& z?(>qVbc|t7n)0d%teR#h8BpM4vDpE~H8u!YPbu*-E}c-W#>b>l`&n?k?t>5N-SD{l zY+wT^p(_je2B*)B`v*jCiYySYd0>*^^ literal 1393 zcmd5+-D@0G6u)1y+fCzc){&Z>h9O}oCNWmz+yJVC#BK+DQ9J@Z!bf>G!uRVTrweNps_jryTcTO*2p#18KkNk+~FLG1Sf^-w6}<5{M7BVqxBDjtBW5Gte+43;mF z9o?BH-mPGelD*&&C(Zdo_7z}XU`~Nlt`k24d_E+#x5M0SoCSqNtRJ6eKDYAj5aqRI zTcuXs{+%QYXNYc8D~!6EBxMg#b&d^k-and1jDV+5<2FB+dWLZ;60|zGVo-)7Q2r^Vbco-)24TB<=#~E3PX=No8(qDZ=a;_sB+F_ z8f`vtZtFCi5|mr-(Wx61lYX+V{@6nK1NvbmfYg&x=y>Nv7V|sj0mi-HQ1SwU3%yK} zOBDQHvE@t4Msk*AJm!8+vs{=a=o>V7gyzivb#K$avq2b_8b0-N2A3BaGut!jm+U}f zyj-ORs=^;yURpL_UFr-QGf$Xemhvnn_YBZK3RSKN uTrc#j7j&{-C~g9gzb4DYcb`NDWAGeRgkpYCQhScR^U>nf)$-jx>;D2mKB~>w-ctd-kV4lY^_im7>?U*>drkc}gOBvz5aHqzLKha=>1hFjdDfFepL;}tc0 z;s;F_I~in%gA8+oV~jD*8P0Km>r8QzY3?$^94~pzBA-~|3oEShgLQthL7z-5YEy@L z6w-i(vWjRzlZt6t2`wtA6>Vupd-8OsW1T3kb6x04H@ee<3VPJD%Btv1Rn^rHT)_3Z zeiwC9Zr0V@yZdr~uIXfcYqfR@SeJEM(E2QF!!~LW8@H&<+mbEYn)x@(GoSAt$9F!d delta 258 zcmV~$Pbh zf8uCq7mA|PtJDs!)SH@iP?}bJK5P2r_G)$zBN#;*6PU&<7Li2`yEwox&TxeS9^k=8 zfG^bGSkFdA*vu%q7-J9nnBWkHnc_Ipoa7wWxyd7*@Ra8)@Se|nWr^<$SZ0Oa{2>)q zgCdHmRqe~_RJY#XNhnlKJ*wpH{YtRjp=!CRgXeuFZA0nCo?Mmvo`fKLZv-EC2ui diff --git a/assets/data/saa-player-i0.bin b/assets/data/saa-player-i0.bin index 0a8ea37e43ff8520d9bb36b9be34733c2abf14dd..4724694942a4540d6fc29de82d5b24bbbd149c1d 100644 GIT binary patch literal 1412 zcmd5+-D@0G6u)1y(@ooK;!5aFOS6*;)n=)&Lp2bxV-(4P&RmesyxDhxGY6=*;R1%xy}kN^ZZz#Hs@ zjw70&GDT84$ z?+0wP`CZ-$PWusOMM&FDL1_Psv;V2oa=8W5_>k3Ra!86hWo&XY!PEYhBN0*5af1J< zx;hctn~Ew%y0X_fL|~dA9Jt3xWxw+@vEa~zA8}5AKO=5NmJjkFZsP4~*gb}|ZK}P( zENz~qwLaRzyT9Yz95zs?j5z}&tIe~dmSb2(VK*S9abiT%GMIxws2UE313b$Ve^69F zsNw@e6+(qoWV!e`+0or=#9xwSO7;RHPJr{r^2;E<$lPB@=|>V6pcg<=b2E(X#@R5j zhz(j6SitR^*H3w6pVLn5oP%h>bo=S8t&&2$M1yRq7$$hAVoCR#v@J)R#AzHp_r9{08R@Dwb^d^>WJc$FFZrH2%cU z6Ye9jl+HQtQMheccaAph>m4so(g~qi{(w%*mp-DGo2pMv7cbLEBZO2_3ZHAe$znn4 z0>A}dKHD+R;7sRe$2|OX)d}J_*^ANMa9fK`X9CKlc!&68I~G7mp2WIO%js zYx<$}dpcR)Os;Ph%4j=(2f~B3Xf!`?1RagRT~uM8g1n@5o_Xiu%-4&>+kaO70iW8w A0ssI2 literal 1368 zcmd5+-)kII6u!S^r<BM39PNeqd)O z50f-XY*I^T`xIYH6?~|=8z^=q50cK<;ts5uU0Y;*lF&gM*rsV4ix0b=yP^0mcptv= zoqNvt&YgSjTxwVuxOK zRRmdWR9`?^f|V)Oo^Rnm3y-w$trmVD@Z^cE-Ke0?u!8n^fGO(bWVT=lbeZ@ktT=kA!txFG+?%(hsx1$J^Q_>&fe5{RfZkCSmqufsYqhYh8 z7B_U<|D!*dGLy0xUc|P) z;+?|#{V70ubIQ!PZ@^sKy!oi5+V9LkgSpJ1F02BkOjQ}isEsY+sd<{vB(X&=2^h)qBlf&quq&9 zyXgE$lBPREZ>`q|_0~wr8KT-88{|AanoN#By3 z?p+u0aQ=(D3G33%ut95co%5L*V}-elCBAyg-wD3(mb42jW|q+ZXrvFlcBCsUMGGv% z)bEYv${sE`-!Z!p{jC21FZW1Y6F3lNdCSOKW;eV5@Lq|xBLN%p$tYCaW8KTRJRsfd zo)AXc$2!`L5d49`TEN9W#e17T!zpKnv}!z2yrbD6tMHI;1)z>b7(kiA1LkjhIQA z^hX_=bSa7=-iRIE#4DCbWV}S5PsDHTW;cd0hH+#tjX5k}1?$LR9|auY6qhLD0X_nR z_(BA+flZ9Fg$Z`Di#_aPiX$9lnv=|MhKtQ=u}8q|=|n$VPHHLoQtYgJk0w51*GDX#++Rnobxb)!4^3KXg?ShKa- mg3ZFO^Spmorb6cc diff --git a/assets/data/saa-player-i1-pp.bin b/assets/data/saa-player-i1-pp.bin index 4467173f1a9c5b2a386ac573602542dd5f6c0911..88db42d51066d251a98b658b1e164c90b7409815 100644 GIT binary patch literal 1598 zcmd5+-)|H}9G}^l+3g+JZ8=iuL1?#=80`@cmtRS9x1y3>gwT6HTLk$Pd@-qkf?;=2 zw&hepOnp#ZBr!l@d;#s%@NkA0Qg)@`HaWE0z{3$ELfDY3Y1#^u^x@9$v=aXXXOqwO zJKrClnfcD_S2JX-N5W0%oeuNQPEb^*5te1Ct(3RKj0vZDSD)4;R>Yv2ZiP(Vln1PVZ) z1Ki2h8>rS^{T}5V)ebHq6-KD?Q+fl^atya83|84HY3mqnN*GkAZ45Ug3?kGe3{zxC zLY<>nLIxJ}J9SYHpPb zgsP($7V|6EPKTTQo7f6f_okqB++PLv@3{CM%R(-KmPCPbiDcfYEpb;%uuK$-ymeCTIk!`?;o5|*x*I`1E8a$tALaubxWtF2 z>M<{k^#axJP+Q+dEq$I8^>eg`cVFk-97>t24Y?mlMSTy;>bn?LP|TZ?s$WR?gr$I3 z8OilnEEeJ2EEygadyz;o1V|($B4kogf*++PhId&CuPF+VmVigx1?SJ`1E4?1yoXZt zjuhpAFM_1DHn1(mIk2#ZjXDmnh&v^}PIxWuE2Kt(0?Bvt4YSV^OROELS<`)k*x=nk zQmK^s>iIq^SPL6TXK<+IU++!rjbefZ?#HVy1fCFq!VYFAuL7^3!FCUjbmr9jAyR9q z9wUb89V4}w0JIqsssowa@k~-%>fRtu$^DX~Ot9Uau3jSkFv+@gqP@#{IPV@vr4EB< ze420Yuaem-WTOPr#jR=w*(s4$YlL_Q{+WBE_M3l?gvu1vcQf$h!zTAHBI<63jY`fA zPmWF%nm=Y}nKw+XStWNVg~wm?w$kRM`%lg;rvb0KoB3>Fe6V;E8ReUE3)5EjDst#O&J5@*(y2P>YMH4Z1_S=1IwxiEmMP ztpel1f=}yb@S0*r?Y6x3AzQ5;55A_Wr-eT@^6iM(g0x+%#}3uPKF*yp^Cb$E{D~T> zT+G>v=l|C;Av^(iT8hFxs=deHP_1Se{jW#&_P2I)tdW~fGMOf?8uhW2oVlMfr?%{T z<}t4%<&I$-2@x!c*rHegJqpJTUaOFk$R_Cw~T1Xq43>jW%bU)&v z8-R>u-9Olbu?m_W^hZU8&Zx+hSu|5_Y;10frzd~0C&x3B9(L^FqKJ)^5 asTKYl4GJ2SnU;C`gHO-?Fc#eZyZ#T{-t%z) literal 1468 zcmd5+|7%-S6u~pKIh*1&O6GoX#GP&NtDIM0c%PJ{T)jf^9w|wJaG>z}zjU z+@Ui(trmcI1NwS~)PA&Qh~wR)v2_Zbw6o8gC2$Ab33yYwGr6=m6?#a~eyfXI*Rp1Y zK!0YednD9!aQzi?=x?j^1_;L_>|u%^nq_okEE49 z=z-wb;xqI>h5LPrR~A(`m$F6&^z8~`Gv(tn^Fd1Ix8Ai+fz7QY6m+{||_0&Q2CCpdF)nqG-9+*zkBFv>}u~0?#^MODp y;O{Km&`Y^^DVG#Vx%>tYxvP?tfBPUh6o$@L5DL3_QHj4i{NCIbE5*AH>i+_28rppT diff --git a/assets/data/saa-player-i1-pp.rtb b/assets/data/saa-player-i1-pp.rtb index d924674f3b62dd1f3386212550f915f0ae0c566d..4e8bc9795458fbaeeb8ed63dd961381a45c067bd 100644 GIT binary patch delta 307 zcmV~$O(??w7zg10`}@7`4swwcCFMYr9k?hb4ziLJiCS?Xp?tJbL~XS=EU`ikq8*gX zXOlt+7g{4Ei-W?!fs#`4k$9eQ#uy0(s>LhK(kkuJEqyW|!xEB7nUPhA%dQ;Au_WbM z9_3ZOQHD9mY0h$v3tZ+Vx46S29y7^Hrg+DDKJl5K{3SI_ zGc-$cG*1iFtz}xSm0GPHtYqAQ7c)rC0ns| gi`%yC*}ffG!cOhnt}JD@_GTaUV~&fiT$khg114EgMgRZ+ delta 277 zcmV~$O(+9!90uV1-uM3|(n?B;!)i$_ZP8jyJ1DJ0ZBeV$5;?4dIN-p+tSHIK83&~Z z5k)zu<+yU-AaZc9%cA7O#n9$tzy7%v;{`i4|7)#t(k+ zhqbQWHM)Qcxrj@+lpA(q?$?>T@~K6B1=OaXLh4XdF~yZoulkkJpwjYAX;$-ER6(2a Gc>V#LBtY8$ diff --git a/assets/data/saa-player-i1.bin b/assets/data/saa-player-i1.bin index f99fe84d83260507d31e986b28120edce052d862..22abb9b737cdbb7656ac39d8eeb7f4feb15426f2 100644 GIT binary patch literal 1573 zcmd5+|8EpU6rb6d+3Oz2wyZXELE7y^qrKS51|(_j79`k%AK+rdmfF~Yzeyytfb1=p z?NLl)>JKK8nA8{{;TJX7!x%k7jDg)qyp@aXHIQ&d0zvi%H!0<`wISi^n^xk#;B4}F zZ{C;B%)EI!##6GNV+|HcEqD_MgsCF$Erbz@lY+Mya3J3EwbzbPbN)rvrpZmaw);AQ zs5mjlk#Uoj2sWxqC^Mn!OW3}I+XTM3uXPQ|o82sL_AmoXjo1J;AcO)!8X!;r0v%vC z+i0O$OXWPuxT;hB0;w=Um5-Wr$asn27R_R%9g?wu;d;%YLVc3qI?W zO`QBG98TE@?Qr5qk@H{+zCIjS_{y-Y>FIJB&$ncbVi;J@*xgf;=?nGivJuo zbJV;+9djqmnhPXvenNNit{-_9hf?aboaab+vyY|By$r{Y;?GHy_oa-Mje%Gj$%~4j zM7Wpf;h@-yMD!3q(b& zq~>O@EyuaAu!xOX2Ux`2Lhz9AT0CH+M#?#o>EfHJPmruwJ5*D)_abq?`!Y!+66%&S zJ=tY%gY*eJxRzbWAf6OgXn+$G|Fg8QYUIv~_SnvHoMBSZmRV?jWTzvd=*`TK~GBVc4N`Kqy ztSM?605~4TdOG_UwAc>Xxs!tb7@IgdVR!bjOh|)1n&o2Zfc_5cTp$HUCc!Z(KOci} zcFAWPV9-s<5vMt09A@j)U&`dQ&uCeBURjmX%`b~~XuGQhce`oT98D)}w7R5_n^ zme2pM=NI9b1W#jL*e@7wFgR3`T}1!u(Y0&OE3KN`FwA7C|6na%TFaUD9&>A}&m`w~ z3CpcxI1*xVS;Usb8hFv*{S|NFO^VT{Ly+aOwn@h2))A07qJeesH=_a>wlvJI{;p!Pi|G zK~xLT7Lam^77129ZsL3sziwi#iOU>Mj&>YIIckwAJ4G5utkOl}8fItVh zLSNQVy}j}sGVG{T`W8iD`B65f?L&%7al538MO9F~r}%)RQ?7nP@jgi>T>XM#igbai zQxpqG$6Wo8VvKTJ+ohp+rhMNnSH*{_`!^h9Glo#{Q}K@pcDjWyW)_Co31%lBDcCH? z`I?6NfAXi2rYfCQCkl*t19*MP)A5}tQ<6(5yxVTrX_og!u;nM5Gl1>R1ZK>=fNg)- zJA=FZX+V2-+DyCez+S>!dt6fPcg}(5m?<%+zG49vlQMZZ?OnrGw|~sLjx&DLxz0&# zC(l`LL-(y;mjZA&NBMOq7 z4kCdo3-u?Qm|(%z;d<108uSG|0&I+pvtER^8xi*ftTCz$P)oZ(kDVkki(wR;DWx69#c42sI*+NPt(V?2qvV1S0zYk}MD|<#4z(FYM~> z=YoGT945kk@bH^v>@j;5*zZ#JmQcwHfdPC0Bqb8Cw-;waVICWFRA|8LythbLy~W!Q z>ZJ4xF;c9j_CUz++I}=?I*UYARSNMM!Ng4A2nV(p$-QTP6J=V<$(b8 zR_8rp=be{`YJ$1GRT(5+7fAw-s!{I+n~^3Pta&ct>oI_P$ho0+_Gg}{8~+^xuQVQXRsbgb@KE16h1m#5-#r5U zZJJ%ontiL(@TpfP8OBWu^aSm@Nb**QcyStfF$`<5=~Ff-%t2(rN*KzY^k{Ul^eR2N z#r=`&<*W&PDP?-x+TCJou42&KxwOSky=RYr&8@4-?=)@}(En(q2H$+6;d0Sl3pDN$ig>p4nt`=)(yRZov!HOgmK6(~CABPcE W5Q+x{QR#o{gV}{E%cYG6jeh~#JJMDF diff --git a/assets/data/saa-player-i1.rtb b/assets/data/saa-player-i1.rtb index 17f53dd515b35b01ad3e7054bec3f064253c6065..c4e05d1ac515f5236f78d5c492f3383b1a41adce 100644 GIT binary patch delta 301 zcmV~$O(+8Z7zW^d@B4j{i=-&69B2+Za8XViWF;#SrMQq-`Dvwyu!h49COEGNEO0P&hbHQZ6V>o@azhoE!|4i&yHUNm|4wUD6}{5|psa$c9AZK#nCU7ji4l z@-E+!6e0sT$VDDpaH9|&RKklI)S&@Bbi$853?PVctYI7HxWqN$c)}Y#@q<5*Y0RRN z1uS71D_9+1Bb(XA4*J>4ehzb#A%;24Sp%hjV*TB{A(s_ojXLmJWvUDQpD=$Xd!PJ=dPQ#Nml=32HDTemHX a*q$BQk)7DN#q7%Bmau#Ku%t1?;rItAX;A0@ delta 271 zcmWO0&qsp+7zgk@-|zEiG7_0Oj7dy3WyZ2YOwev*YMchm;N-+GUD#s!KmqpTFR<%T;bJ`Hr~aNnXaJAX73Y%d#fhvL}afDi>0g zE4h;=smrT;3K2vIO=v+YI*~v(Qs}_|vKT@Rd5mKk>nP#?M>xS5%BbQ7_jp7N&v?fV zjA2ID&KMI+GR=(7UiL9dk2#L8z)8+>o(uHgwT6HTLk$Pd@-qkf?;=2 zw&hepOnp#ZBr!l@d;#s%@NkA0Qg)@`HaWE0z{3$ELfDY3Y1#^u^x@9$v=aXXXOqwO zJKrClnfcD_S2JXH7_72Y($+EDlrX4J+Zb+07(}Q`7^cXO zggQsDgbXay`xIkT6xs{Jw)JxzIYaFhql2vxZJ=TUwnPB=HqdwDN+vhy69 zaU^xL%(?#>zCGw~#^Zx#BAE-`#82AuR@m63M((TjH*kV3{ZudF!Owb8e?(!?g)rbvJ^3R=kZOKgaET93 z)ni^7>jkRcp|-w_TKYUG>gQ+=@4n8vIg~P48*)FAiuxXw)ps$hpqMu&Rlkt(2}=R7 zGLq}DSS-T3Su#8<_9BsF2#`ohM98F~1V2ho4DYfOUQ-kzEdh_X3(lX>2S9(2c@L%P z9VyBKUj#{QZD3oBb6{Z+8+9CD5qC;{o$y-RS4fQn1(NUP8)ly;mRLJfv!?q7vBA58 zq*5vM)$@H;uogCw&frkZzuueL8^r_-+>cjZ2s|MIg&oXLUIku5gY6z5>CCD5L!{PJ zJw^=GJ4R|V0cbNOR0lG-pLscQ7AmiqED0jHnjWu(0# z$M$yaW35r=0f6J7($}?z!4um`yS7pATWsXQh}pH9;5EgL+HHC5L$+Ey9(+w#PYZu+p=^ga{TzY*DO$o(3IQbi=z8qjLk0b)9tvxbmWWt8-WgEu@W2h72z>x*u`T z4M4`S?jLNzSOv`w`lBL4XH?|MESf1dHa0iL)04m0ljE7maYLFMFFyd5Xd;m)A9?}3 a)Czx&1_h1EOv}9e!KY_`7z^(IUH=E;z4LPb literal 1468 zcmd5+|7#pY6rb6dz3W}$UDFlGZ9BbcWWw=^Oxo*YJ(!N^*6D>q(OGK zl+71S5Ge#Jg888|w%`vza}kAWC1|?ap5DTNxihgGwIU_!4@=|qYSJKj=bH<~f5G|T z^WK~H-sjECzJ1EFX#Yd^t0=K!Eg}%HFtSb~j8KqdtRsN02M52ho<@l+`-s@FAV!Wo zZ_5axf+RMFlwq0|v0~P7wvO|4{IZS~$2U*5H=%T_NYk;Or~+F}SOGU6gaSeuAW#4T z9bl0jR#COB^f^kIVWY5s!m!*hn~Ci~%1w&fBvs5mB`9B0yiZaoSFcdKM^Xt_FHlU8 zDsXj@Vgad`t0NR+l;+wF^+ojj`=Xhj7R8;Y{SdCQ(TGs~Q}MSkb|y#|({e-X1TzzV zF|6g}Oyw|+|KN@%w5W6@I+kP1If~cEoj#l$*Ce^{0^V**nMsy$PGQ4swRFHX>mAIP z{V_J(6-URN?gXH@J)tG-*I=(zTYFSej$7x!)2B%cs;?Tr#Uwo=C!Gv7I^90!D%Rbw zb(NEv)-}%hJx>3ZU(aF&6j;TQtTD)Gvwp!E)1pjw%T~F5nic{7S+frb{3Vl;oYJd% zEx#biNiX2pEkgA%OA-wDK3or5t)S2GCSW6Ml=UEdzZS4NaqLMNJ4%h%CedRT$pGuW z$@&?*lw6&#UJ=r6+lBfX{=Z)>hctjWeMzkM-JbQ;(S$ z=Q3f{ptB)VN#P(#^|S8EmZ0<6ZaAS?mq|1lH6TDC;b$)m>V*&-q%)4)aO$}e(IGFu zY2a(vJP@GTV4Wsr#_A?f4b1g&DMg$vk^my*XF9-G|7bKi0-kJ{bvtj6$`I)hz}zjU z+@Ui(tr~)O6Z(3FRDX14i0j{^v2_Zbl)KNGC2$AB4f&IXJGrzu)%cL2{dO0*u4k+? zf&NU}_ef*I$;nEFOmWJ}cVz0D(hYLqiQ3~I6|&^rln*IsF)-9oq7kp-Ho#feKiGSV zLT}t7y_*F559s3jqSm`kQ!aH7)fqPp&=uNykz@=Xahj>G%MWY5?o)oJ&LhK(kkuJEqyW|!xEB7nUPhA%dQ;Au_WbM z9_3ZOQHD9mY0h$v3tZ+Vx46S29y7^Hrg+DDKJl5K{3SI_ zGc-$cG*1iFtz}xSm0GPHtYqAQ7c)rC0ns| gi`%yC*}ffG!cOhnt}JD@_GTaUV~&fiT$khg114EgMgRZ+ delta 277 zcmV~$O(+9!90uV1-uM3|(n?B;!)i$_ZP8jyJ1DJ0ZBeV$5;?4dIN-p+tSHIK83&~Z z5k)zu<+yU-AaZc9%cA7O#n9$tzy7%v;{`i4|7)#t(k+ zhqbQWHM)Qcxrj@+lpA(q?$?>T@~K6B1=OaXLh4XdF~yZoulkkJpwjYAX;$-ER6(2a Gc>V#LBtY8$ diff --git a/assets/data/saa-player-i2.bin b/assets/data/saa-player-i2.bin index 7dbbcfc4e927ea9511c084d5ab0d9d7b222013b6..e443db9ba109b7c17bd48285b30d7973003e658d 100644 GIT binary patch literal 1573 zcmd5+|8EpU6rb6d+3Oz2wyZXELE7y^qrKS51|(_j79`k%AK+rdmfA?c-y{-RK=u~Q zwiMHt`h$riCKw|m{GtZ$Fhn^xk#;B4}F zZ{C;B%)EI!##6FC%vM_{HSgsR2vbGgTL>c*Ck1aaV1K;lYp)%pX8p^oO_Q5;ZTEEq zQE_6PMaFGfBG{-dq0EG?FJb!y0EtQKXi3#7sbRX%FgA>$>6TQrN6c1XqshU+zp3iU~b>oki9RbiMSOA_iV z#S*fxQ14QVQC?^#ncS3}eBe$_vH67mHyq@C145;^eD^3n5+|J7#eKY+yQzl;wu^e9 zYU1Qi;ZVv>Xh#x9i<}2r@XevX!qRiq6RM0Y1oqOMG~0QSqO{ z<}fvHQODd#v*tX>o1f6#yz58a#i5jXZP;_9yxGT6=3a(lNbzT-%KK7A%f>*gjpRi| zQ6k*S^l(7zMIw3#py?73Qjf*Td1=n_zmmeMu^5q7fJfW~=a1;ef&KvVL#c90iZZ|# zK~i%w*p}m5SXjhHt^F+GZXsA8ycQ1_sgd$9$#n5e)h9?+tR1Q;+k25X;C-1S5(#z7 zxt?sf9X8UD#G#tm)}7cFDS`&>$6r_qJShT&9n4VP7<5CO}BA|g!SGZMAY30SH;p!cL0alnr`1BO_yttn6!h zoi#;m{QxJzSWjmkgBIICJ9kp>A7{DqIlHr$WkMSC(JU8J2lRJn=R7GmG6{}T`S}=( z^GiPCAcJmFjyla5;|N=?o+y7r*G~(-lDm+z8?RG+Sq@Q#5%)@UeRPtMDsd7H; zET8{h&o9C=4xYxmuwOFXU~s4=yNLeRqiffmS6Vf>VTj38|G`?kvX(RNJ?7T5bIDm= z!gA{vj)WLr7O`cq23|CHf5lsPn_~3oAY}QhZ5)?W`9|BA5XSFxRlOxcher1zE?xtW zO3M3=iWJUmCK_04?U=(#3LtzKxk3qe1I@QO(f^M1~}3*^rO>>5<70U*l}Kr4ZP{f z2%?&Zwt$pVv_P=(NdxB__)P<|4P54UasUkj7-M`@=o2>{HJ`?|#V5gf1V`hGs9cOmpv4YLK zoU3ZM?`MB1VXD$;bt2E0*N@kyJRRSeG9|f~#Jg>Vonkp}1Y3UGIRn_{Okl>`3)uFT zy)(GWp9Zvdr_Gdm0`}tO+LMxUpK}g8$4rSq^%V=an3T@RDeoG#y8L6_b)5F2&UH>| zJ2}pJ8)yH^Z)7nG3f#q#Y%<7cbAH1nGgX%Mx136&8(F}A)!i2aevc_hHqy2IjwncS zDu@KGEYzNIS_KQf4%eg3v!E~V5ny9%ob@2QU5~ggVU1C(pIX{|lGZMgL6*GDk_>K2 zu1z~bLRMR+T8ZK?int}Ad{Qu^bQr{uAXJY;A^~2dvOmTf5QyvpNU}hqV82J*TS7S}1P1U0kQ9%@-d>yyg?VhyUZw%FbKW9hwI**v zsFC7x#7MI4>O&#TYx~iJ=`0deRV@gJlW6~?p>(ks8tLl8e$;s5xH=p}I1PLamj?pW znw|HFopW9xstM-$R(XJUog@K7${HPHEIF>KW8k^7#k##wQhkr~2w?6NRPNC^o>pst zcpIjAmehXnW{DrJP;Hfh$M6q0^90Ud`7Pm;<)6J;nQ7gj=%Cw4Zl-h26$0~_bpz7c zJbJczjm&V$>J2ipRCdT$hw4vXDBdEU8X=^7Ek=erexWODWMoYj=yWxw1jC=Ta6w^`1QfHn*-SztfnRNB^Uh9C-V!_VZ%vV;Z9J zPkMd%2ooJ5+BNA?-wrEGiS3g(;9_Y{g!jZ@cue5wEGNEO0P&hbHQZ6V>o@azhoE!|4i&yHUNm|4wUD6}{5|psa$c9AZK#nCU7ji4l z@-E+!6e0sT$VDDpaH9|&RKklI)S&@Bbi$853?PVctYI7HxWqN$c)}Y#@q<5*Y0RRN z1uS71D_9+1Bb(XA4*J>4ehzb#A%;24Sp%hjV*TB{A(s_ojXLmJWvUDQpD=$Xd!PJ=dPQ#Nml=32HDTemHX a*q$BQk)7DN#q7%Bmau#Ku%t1?;rItAX;A0@ delta 271 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 delta 277 zcmV~$O(+9!90uV1-uM3|(n?B;!)i$_ZP8jyJ1DJ0ZBeV$5;?4dIN-p+tSHIK83&~Z z5k)zu<+yU-AaZc9%cA7O#n9$tzy7%v;{`i4|7)#t(k+ zhqbQWHM)Qcxrj@+lpA(q?$?>T@~K6B1=OaXLh4XdF~yZoulkkJpwjYAX;$-ER6(2a Gc>V#LBtY8$ diff --git a/assets/data/saa-player-i3.bin b/assets/data/saa-player-i3.bin index 35872048eed78c2a7a1a80a364f305f40380c102..bd938e5bc9c2bca101a0b59fd96b744cd2824967 100644 GIT binary patch delta 1287 zcmYLJVQ3sh6yDjH*~^|WoAhExF12@?L6ICbW@!{cver^_>5pa+OVSu@8vj`oo1}Jk zQ@Oh)5F`qs2SP<`AqXmxtB9Tyk-Ce8u02dIROpGNMY}&-xF&~*A&`r2E`s~xd*8h8 zy*E2=-tJ=L(`HG1EbM0J`_kj-E3`8rwH-a|Mg>g~!dSZ?sCP&KBehaPiERKqvtS>v zIzfG&qIg87g+Wp6rl>KZ6HXtcs4k*oPGyRSpo^TY6C?^c;`AOtNXT(^j!JFT%7fHO znQkWBf8Zqdn*^Z{ma_GzC!H)N(MH^`{J3`v*?!#6pV2-;sU*vLZ@@a{%yX|ZhZu7g zQOdvS&7&?q1DM*#m`V2(_+sX*|4QDA_BkJca?p&hX*PA!hSJQ+>w-{PLXl|F`x)6? z{z2~svV6t4f$X#&PdNo%{5O>Qzf3Ke*|3ifXd-y^0(?1(ce4n zVUag18HpNJ^&w}k2>S$b;C74Ehn*)x8?J$K#W?`{f`9}e$4;|J2DO-JFcXz`WcNv= zWr%j0*xC_dX`48weN2Yfz)x&|onXV!YR0j}oHj=Lwc`|p1le5|OYewA#0r6F52PJg zmIE|Ov#*I!DJO2|?pN7&#kTY^WKB@l7fZLrz<{tI8Vbc?;EPNprWs2?J-$QGF-`-P z%6r?GRl^>|Rb0$qV}SKk9>G>^Ae4U7c@Ep4zJL>ng!1gg5v#Z#`$|_I@)hIIaN#Hi>u4tUF?U-L>r|LX!woJUzj)4_8US;+dqG~Jlixwg+1;9{?W=iVFGiS za|cON{mJu{J!F;_twhP}l~Rm+(6ZBYt>cQI}vKf+g5K6&Df`3HsiqakgDsi_JdT?m&k|JmQQA+mD)@u@N6oozCTmE8r&FmN5OKMDClKp>RA@*#(U+P_u5+kqpnqVrzUTR(z^wUtKM1QZ1^KJaBjiolO za6C29b5JOmt57m)pySj5qGK2lQxUNY5hV~&4sjJ;w1gE}T9s21h)V;~?{BByyEqF@nD-vvU15@$OQOXTX0+W| z{5NqfnO*-+;=VTIUBt-otjea?*;NO%n3^kVnaXwI^aaN&H%Kl}yc=B9^~zlJHYxpI zpKq5j2Uqx!s9Kg`QOf&;WLef=xnR?4wm(M`$saBMIgy`CM%C*ap?@&UQTp;Yt4}{XSRDdtXz$N+my}T^$qWx3AM#uDN}a&Mr4R`pJP- zccFHRzHi3_{ZmOE@BJAPVQ&LrI*5-A-UaM>NCzKMjBi14v6vlP13Q39M01S04)P=n zUZG_tMk@)3Js-!h*pBHN@G7=go^q15{u>-trfV<3;Z2?(7nh1z{4l)^qt4DIV{;7~ zN*6N@-}kP65`FGn(|?6T_D$)l1RbzdEN%&K{* zXPSiEEbp55t~rP=4u25*t)2!VT$;oxOX^)F)p=>XcbXf05;{Aq7`85a5Hfz{*+2`a hJnX$8ty)jjA6a63Uvs$LtZoZicQ&x(TPc=;e*vs7rn~?E diff --git a/assets/data/saa-player-i3.rtb b/assets/data/saa-player-i3.rtb index 17f53dd515b35b01ad3e7054bec3f064253c6065..c4e05d1ac515f5236f78d5c492f3383b1a41adce 100644 GIT binary patch delta 301 zcmV~$O(+8Z7zW^d@B4j{i=-&69B2+Za8XViWF;#SrMQq-`Dvwyu!h49COEGNEO0P&hbHQZ6V>o@azhoE!|4i&yHUNm|4wUD6}{5|psa$c9AZK#nCU7ji4l z@-E+!6e0sT$VDDpaH9|&RKklI)S&@Bbi$853?PVctYI7HxWqN$c)}Y#@q<5*Y0RRN z1uS71D_9+1Bb(XA4*J>4ehzb#A%;24Sp%hjV*TB{A(s_ojXLmJWvUDQpD=$Xd!PJ=dPQ#Nml=32HDTemHX a*q$BQk)7DN#q7%Bmau#Ku%t1?;rItAX;A0@ delta 271 zcmWO0&qsp+7zgk@-|zEiG7_0Oj7dy3WyZ2YOwev*YMchm;N-+GUD#s!KmqpTFR<%T;bJ`Hr~aNnXaJAX73Y%d#fhvL}afDi>0g zE4h;=smrT;3K2vIO=v+YI*~v(Qs}_|vKT@Rd5mKk>nP#?M>xS5%BbQ7_jp7N&v?fV zjA2ID&KMI+GR=(7UiL9dk2#L8z)8+>o(uHn>Mp8$Y^2CwJo<-`I#wX924rgI2l(tsihp$N*1X0^Afbh$q_s12P0p62Jm7uqW#T zV^s3g65vy8L~3^J)zDv1{`knxAVQU9>QLO*mQ4yrs%g1uOtf9qG_LB;urq{vyPD~K zbWo+mqicl_TVV6wY(B@VvVl-a2sw|jCUA>wd=pPN2l&F^OQP=)TVEuWo*<(vv&S+l z$0njDE2_VwPlG-QSVHpd2O;G*Lza|k>a2>VvMg8el#>+(5_wReF~JQ>9(kZyV|Z_%G&Pgn}fBW4X9Ol{?RI{BLAO~G7vnU zU#(v!Yo1emgsiqdfqOki1}bo7$Z7f`sv;^Ok7z9z+VC zoqe+I91>B^+`2v1(@uj$XBNT+&>jm{D?F9Y5;{vA{08`8>P_BRV)SH=QT1QEj4Q45 Vd))HU{ts=~*@a%Al{&vc{SS3a(HQ^$ delta 782 zcmXAnO=uHA6vt6E!+YXf zaq?<4zj1q+KY8;pggD+e5R*;KjhsYVLF!kM-$&|?1O7Xp3+znbfMJ`(?pl=9Iw7ld zfyy#&Y*!iCNk-Pi$Q&4%8)N74vVXW4u;PvKc_*hf0Iu>z!ImDt4sVp$5&;Gjzq8>1A~;tCmS0ls$V;Q4^WZCv^ntH1V~Uqs z<6zDON$VI9ka`U=tC?hL3=$>;af;eIoynTkT9VTR5)_26$kysXMZE~@Po-%+kWjBc zy?Z7s)R*kClv&Fp*@e_@7}U!pN*5zIyVR>2Ux=3<0AKRGu|t+d5sD977;4~n&n*zZ z|2kTEQ%8BFoVGlV+JDh}2^z+6!47MO0Ud@~HZyFHHHSUM7~P#@O@BjcIB&t{(6}A8 QzNum33p8;S7!F?f4}z)aegFUf diff --git a/assets/data/saa-player-z0.rtb b/assets/data/saa-player-z0.rtb index 0ca5112b229588d9a2ba9666e3767caabef46bd2..2c95f8ba01740953c255d3c4f2f9c0939f159994 100644 GIT binary patch delta 129 zcmV-{0Dk}C0ptOYYI;fmdjYxu0RjsG90DH#A_67?Dgr$MKmtbsS^|~=r~{UISwTYy)!xcmsa}k^`p$vIEEi>H~lTg9MoboCKf* jqXee}ssyeCu>`gRxdglf#{|j*&IHi})&u|r1_b~B48$RM delta 127 zcmV-_0D%AG0pbCWYItk`rUC5%_W=k33jz)T5&{+iDFQ44GXh2ef&!ERo&u%;&=z0008^A&>w7 diff --git a/assets/data/saa-player-z1.bin b/assets/data/saa-player-z1.bin index f6ba64b2e3fd4a397fd6404b33b1a11591b1daa1..7962d50830905abf7ddfcefad530237421f704b2 100644 GIT binary patch delta 808 zcmXAnTSyd97{||<`DXS~x$0`puB3B3JuDiy44R9&Ls0EjpaU9;Na9-&1m0k04Ax6z zSVGv;i;eo($nDCSZpi`Buw+ebP#$12jB6{} zgiU|5EW~$D#k_Qo4tz3L9o17RLLts;-oymAnNM&8&zf8KSo2R_af6|(^19N;x6;Tv z8lgS3!=D?K3zEtLD06@v$hH203l(Ty-4Sw@XT*J%%ay_NW|V7+E`wAW5;GbLX8aCE zWu>wV-hrAyO5?28o|SE10vb zq0F;;4XeNrHLS5`TjND*fQqHL*Lq48+5aV_rlP~WV>`F_aeLCvU4DEegzp{QFEN9A zH#8BAkY2&nQ~d~h+3qFqWri(BXX64`qXE8gl@}3Nfy81W);JHE1p%y6`(!X#+StdZ z43Q6rV$i{CF`pp`zzDepjY^F?hYHVdP^{Rt)2_r)BE}v>=AhNs-KKORgp;?UhUo;a z@EClt4U@o~ODNKEvAwEWC|U;*{A=p|t8yyHyYXD{Lh~=0J}*@1IAgoifkOwbjI9&f kam8tGI7Ua zQy_!F_GVT%dHp+t5`ypY1+S&LIVV;ha72N^0Y^^Pc)rHI8n4zkWwX@X#O2jF$gA@} z*oqqw<}$LKj4X?hRbXV*80WHC|6m%B;?abHlPA{z)q6CsWj`Q?N5i(f2naZhw`DsZ zp3{&mDImno~0r z<6atnN8@ya_WLU{iYu=!fw}-l;^gh;e8i=D(o)3HTokLaEEmzDImDkyWWn1Q5sNxo zEczuW5Kyz=nQTo`nqj$ity14I(9G7yQA{h&AXIQTrpIZ={s%toX2WvFQg27i9X^1T z&3`;0ccGWk_(W^#xcAcgJ=zhh+o!mb_r?x)ldO3bH~AL9>({M%1+!BO%OxcY>-Of4 z*@hS94cvGuiDyX`=Js#m*_RQta;$pP3?JOlMUM0c@<`}D_)0^|;44mB(m-?xteGH= zu486DgWPH^6a@9y^6Sd6D;X(Xbly*h0mceJM8X|Df76{hPurjf&2%l_1$g& diff --git a/assets/data/saa-player-z1.rtb b/assets/data/saa-player-z1.rtb index 541dc72628a1a64eef52efbcba774349d484c355..ccf868ac13b4374a48d6e17627e946fc801f0d2c 100644 GIT binary patch delta 136 zcmV;30C)fB0qOyeYJW-rdjYxu0RjsG90DH#A_67?Dgr$MKmtbsS^|~=r~;v}$4FoR)#RSL% q-UQ(U;&%w^91$;`vm?30R;>N4+Rqi76lsxMFmR*00982^CVFK delta 133 zcmV;00DAxG0q6mcYJO}1rUC5%_W=k33jz)T5&{+iDFQ44GXh2ef&!ERo&u%>Z|)CAZB+XUYP;soae>ICfs_yqd|{{#XB2L&+&Hw6FyeN-kY diff --git a/assets/data/saa-player-z2.bin b/assets/data/saa-player-z2.bin index 14d9cf102dd67b6cb4d11ab64a67201de2883ea2..b90a61892111546180e15e7c47a1c609914d521a 100644 GIT binary patch delta 808 zcmXAnO=uHA6vtbWvI&fA8sp@|MC8OcU`;WFd_6}l0N$vW;LEds1B%J}@&sT&Cg;n8fH`Dh zU$z3qDC?^ifGgMx7oFn6_#aSz2l?-{2<5w6z`N^`F|MRpwx>l!$I~pcRlkkhIBu@* z5*8yJnvgE-O(}Gc4t#Q09kp{NLI$U}modRz?gN~_Q|=Pp-tm*ygW%{-d0X$}J89xA zP0&;Hc%(e6)nxTq(5C@QNM3lx88wz-OGaQ@L9EEKT);DKl50=SgSy!e3l<9&B9he5 zpwELc&@@PCn)Uj#ibv;wrgI;Lcv=odq0GnPR)V&yeC6yAGcOcRy&iJka}9XT{lSro zcc7EfM1NCLpL+P+GHr>jTWRI@aB6(5n#{vkN{y9kv|Z`4W^5>bjLM$01o{l95zE`C z@$6p5tC5n9H}Ys{wDvimP3rV3JEw{4|FUX(?fTx4l`H(HKWXI#Kl;SLH@8&k+}P?R zOGFn*uOOdlya(Z8&m4pc=RK*rZ5F)YDBt#!7ZG^^nY)=(+YDG9M6pf%lf&fZwmv@R zhO<#aV*Rq8mNRpi6nhYvhEAunOzD_`v)7W28vsSP z58>2%m%#OtC~@T2(H%WP?E;7pd2Uu-Zli)$N|%+{j$br?NZ4WHg70!`4z0PZY@OJS k>j8hmF&gh@O@AA6INvRNZnS;3_>Ek3141+Ib`6322X4sscK`qY delta 754 zcmXAnO=uHA6vuaV-tJ~oNGxk@l1j7Vh=laexU?n2W)-UmNbMd9Ew!ceAZSnagOY58 zSS$3yDkWV#=*42eqJ^Zlf`W)e1tA9y9z=TR!37DCS}+RM#MyKXzxSW{&wInnypsEi zTOb3%_GVT%dHp+tlY;;91)r^XIXBiGa72Z|0Y^^Pc)rHo8n4zk<*?M%$mO*;$ZPXJ z*oqes<}$LKj4X?hRbXV*80WItz(5+1s^~(&&68_@jwm`fvJa3;(Xk^h0s>Cw9oYtm z=XB&q3J7s|M{NMABHdpyOB?Y&;QQ^y-|9K8pj&|2ga}_&4XYcq`gLJ9(5VWU^0|~k zC+Wl|lQ~pLZ&{BJLAvz{C9cea&sFiNlF4q2IF63daoWM5pH+GL6w)PC;e%+| z`o|M;7kVg7jJLFm`7XWRqwS%(eTqAHU;J=4$y#S|qkj>60mD9`Vs?sYd!(dk-`@N& zTmQnkfg5g3;#rb~x&51X_GJ{U9IGC+A_sR2kt5xLJRH6c{?gzw_>0rF)E`>{dnSZq z>zLWkAh()J#TLP^A%xP@nVC#B#D?&eDdLbQMkF>?YYuq~>`CQGGiZ>f(CnR#h|PP< zt&`;3S}w)Dj4W6lAZW#kz{CEeP@e}80;v}$4FoR)#RSL% q-UQ(U;&%w^91$;`vm?30R;>N4+Rqi76lsxMFmR*00982^CVFK delta 133 zcmV;00DAxG0q6mcYJO}1rUC5%_W=k33jz)T5&{+iDFQ44GXh2ef&!ERo&u%>Z|)CAZB+XUYP;soae>ICfs_yqd|{{#XB2L&+&Hw6FyeN-kY diff --git a/assets/data/saa-player-z3.bin b/assets/data/saa-player-z3.bin index c0466863f25c235c78c94ee444c6ef965795a2d9..af7bf7d5663d15db54740cc0083f7c46091a1ee2 100644 GIT binary patch delta 809 zcmXAnT}TvB6vywKIWxPnm8-7i>`FSf+rzR3E`#Qx?hsVF736?M5>oV51c9coGY0EN zWLQGj)QcZ!i1iTc20;r+_F)AE3-!=LL=QbQ5X+h@WI?ueXFU(U^S|foUM}ZzWxi4% zm!y?9lfu3W{~**O_)i>`ZPklBym|+bCdh6ga-_slC7v(QC~@3j{!k4{t5c9xr-87D z7Za9cWR;Api;+!WWYZX@CMN@@CjcuxO~}@9pF#Rfp$emZX8VbXg|ID(PVYh$Y=;fIG=S56WnP%#4$W=t>HcGKY7&yrnhXg0 zgCj%tpo7v_UqeH$eEi)yZ4T}zwD1QwIl5g<7GW$Qhl^#({$x>!>?(c;O15ha)LD=N zx?QgD>|WC@bHz=2b$-;DRJg^DK8xVnySJ*W z@a9!rL__49Ae{}}2YJ@qHmGwlnXGQ@ zgUAeYm>cVqjzw_#M%=XA z;1eEzKe1{NxOoP}PMqx8+apx0fCzzQZR=$%6_kx+v1+dU7tJ0M_8K_nxXiXg+pdPK n6Wejs?QA$k6Md}dZzzMa-NL7k;ka*K$++bf8gciNh(O>!raAYp delta 755 zcmXAnUr19?9LMju=XdYjov@|T+-A6YIuT<&xGpMVxm#py5axXl6jQ{9pnOUlvR#8^ z2L8!H=BgJqSz0VN^3I`lHRpq%Vd#k)s<)qD0S0k5KXCbf7 z0bwg{M3~FSb~3UoMpl85Rb!mZX8i+cK#E5b3QnF}1$4xtfi3$0IXoJ+Pc^!4-r9{`3l7^&wZj3mNj?r=2!J(fOdFv!nzhZSC8|oTP zt3$Yl#^2F69j1N$^0ea0tBat{1Cls->lq($>7KL{aWoahiY&`Tv|tYMrxRK5Hblgt z&K8S)NeTqiEO;hbl9Xmxu3f9ty96||`Edl(vNH%}9FFO6+P?RJPrKQ$+_BW#5p$al zpe6GkPsknUp)@|;(lX|~_xhEcDTd{e5{7ka z($t6_ou;v}$4FoR)#RSL% q-UQ(U;&%w^91$;`vm?30R;>N4+Rqi76lsxMFmR*00982^CVFK delta 133 zcmV;00DAxG0q6mcYJO}1rUC5%_W=k33jz)T5&{+iDFQ44GXh2ef&!ERo&u%>Z|)CAZB+XUYP;soae>ICfs_yqd|{{#XB2L&+&Hw6FyeN-kY diff --git a/doc/export_data_format.txt b/doc/export_data_format.txt index 4dbc89c..985c0f6 100644 --- a/doc/export_data_format.txt +++ b/doc/export_data_format.txt @@ -64,13 +64,13 @@ focusing on shortest data length. All pointers in header are offsets from the |---|---|---|---|---|---|---|---| 1. | 0 | T | T | T | T | T | T | T | # bit.7 not set for pattern data |---|---|---|---|---|---|---|---| - 2. | V | P | | S | S | S | S | S | - |---|---|---|---|---|---|---|---| - 3. | C | C | C | C | O | O | O | O | + 2. | V | P | N | S | S | S | S | S | |---|---|---|---|---|---|---|---| ... |---|---|---|---|---|---|---|---| -(4) | L | L | L | L | R | R | R | R | +(3) | C | C | C | C | O | O | O | O | + |---|---|---|---|---|---|---|---| +(4) | R | R | R | R | L | L | L | L | |---|---|---|---|---|---|---|---| (5) | D | D | D | D | D | D | D | D | |---|---|---|---|---|---|---|---| @@ -88,6 +88,9 @@ S - sample number: [0] - no change [1 - 31] - samples (1 - V) +N - no changing sample/ornament/command: + [1] - nothing more than note was changed (S = 0) + O - ornament number: [0] - no change [1 - 15] - ornaments (1 - F) diff --git a/src/compiler/optimizer.ts b/src/compiler/optimizer.ts index ff91c3f..2ea8500 100644 --- a/src/compiler/optimizer.ts +++ b/src/compiler/optimizer.ts @@ -47,11 +47,16 @@ export class CompilerOptimizer { return this.patList.reduce>( (set, patData) => { for (let i = 0; i < patData.length; i++) { - const v = patData[i]; - if ((v & 0x80) > 0) { + const t = patData[i]; + if ((t & 0x80) > 0) { + // omit empty lines continue; } let s = patData[++i]; + if ((s & 0x20) > 0) { + // omit only tone changes + continue; + } let o = patData[++i]; if ((s & 0x80) > 0) { i++; @@ -208,11 +213,16 @@ export class CompilerOptimizer { private replaceSampleInPatterns(oldSmpNum: number, newSmpNum: number) { this.patList?.forEach(patData => { for (let i = 0; i < patData.length; i++) { - const v = patData[i]; - if ((v & 0x80) > 0) { + const t = patData[i]; + if ((t & 0x80) > 0) { + // omit empty lines continue; } const s = patData[++i]; + if ((s & 0x20) > 0) { + // omit only tone changes + continue; + } const si = i; const o = patData[++i]; if ((s & 0x80) > 0) { @@ -238,11 +248,16 @@ export class CompilerOptimizer { private renumberSamplesInPatterns(smpNum: number): void { this.patList?.forEach(patData => { for (let i = 0; i < patData.length; i++) { - const v = patData[i]; - if ((v & 0x80) > 0) { + const t = patData[i]; + if ((t & 0x80) > 0) { + // omit empty lines continue; } const s = patData[++i]; + if ((s & 0x20) > 0) { + // omit only tone changes + continue; + } const si = i; const o = patData[++i]; if ((s & 0x80) > 0) { @@ -377,11 +392,16 @@ export class CompilerOptimizer { private replaceOrnamentInPatterns(oldOrnNum: number, newOrnNum: number): void { this.patList?.forEach(patData => { for (let i = 0; i < patData.length; i++) { - const v = patData[i]; - if ((v & 0x80) > 0) { + const t = patData[i]; + if ((t & 0x80) > 0) { + // omit empty lines continue; } const s = patData[++i]; + if ((s & 0x20) > 0) { + // omit only tone changes + continue; + } const o = patData[++i]; const oi = i; if ((s & 0x80) > 0) { @@ -407,11 +427,16 @@ export class CompilerOptimizer { private renumberOrnamentsInPatterns(ornNum: number): void { this.patList?.forEach(patData => { for (let i = 0; i < patData.length; i++) { - const v = patData[i]; - if ((v & 0x80) > 0) { + const t = patData[i]; + if ((t & 0x80) > 0) { + // omit empty lines continue; } const s = patData[++i]; + if ((s & 0x20) > 0) { + // omit only tone changes + continue; + } const o = patData[++i]; const oi = i; if ((s & 0x80) > 0) { diff --git a/src/compiler/renderer.ts b/src/compiler/renderer.ts index 88f6f03..814eb77 100644 --- a/src/compiler/renderer.ts +++ b/src/compiler/renderer.ts @@ -310,20 +310,27 @@ export default class CompilerRender extends CompilerOptimizer { else { lastEmptyLines = 0; data[offY++] = b1; - data[offY++] = b2; - data[offY++] = b3; - if (vol > 0) { - data[offY++] = vol; - } - if (cmd > 0) { - if (cmd === 0xB) { // Cmd-B - const backOffset = offY - breakToLineOffset + 2; - writeWordLE(data, offY, -backOffset); - offY += 2; - break; + + if (b2 > 0 || b3 > 0) { + data[offY++] = b2; + data[offY++] = b3; + if (vol > 0) { + data[offY++] = vol; } + if (cmd > 0) { + if (cmd === 0xB) { // Cmd-B + const backOffset = offY - breakToLineOffset + 2; + writeWordLE(data, offY, -backOffset); + offY += 2; + break; + } - data[offY++] = dat; + data[offY++] = dat; + } + } + else { + // optimization for only note changed + data[offY++] = 0x20; } } }