From 139f246282da5dfd8c71bb22f9899d1a91d016ea Mon Sep 17 00:00:00 2001 From: ashduino101 Date: Wed, 28 Jun 2023 20:05:01 -0700 Subject: [PATCH 1/4] Fruity Slicer plugin parser --- docs/img/plugin/generators/fruity-slicer.png | Bin 0 -> 37460 bytes pyflp/plugin.py | 122 +++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 docs/img/plugin/generators/fruity-slicer.png diff --git a/docs/img/plugin/generators/fruity-slicer.png b/docs/img/plugin/generators/fruity-slicer.png new file mode 100644 index 0000000000000000000000000000000000000000..030f78f93c748c627d10758e353be78e258c6f1d GIT binary patch literal 37460 zcmaI71ymeS(>6E|2rj`18W;!=++7mfU4py2JAnYf!vxm=!GpUyg9LXE4DRl-op--? zcfWJ~vwfH|bknrls=8J6JkO0#R+Pd(eTxbLfiPsG#Z^HdIA7o+hYSxKX{2pA1HMq4 zq;*_DAk5x>AGpL1m?R(&B}hhGOx-Kvu+1}JbHJaL=v354clBYvO)ISb#=>W+uYNBGBN_Z=-;U9DCBO#HFQSpN~0XApKu_dS2rgf9Kf#A zjp^p1?WRLRS1=-)FERn_-x)5IL{MNiF{F=|fKj`Ml(E0csO#gF=s_SA^2We=k5F41 zf*AP6Acy5@YI=Hw-|&Af)D`6XIV~OOHBxxk=yEIH`EFj^vg=qIOY7-J{>*Ye7;vSJ z*a#C76YYU7aLL1o(!FEZ0wTg}a3CjM()WrPMWvQ5G7!trRt|pt`}P~5Vdsooy8RP5IXRZLO9-td(d+1`#YKk5jrsXT#$i)aQ!K$# zBY*#u%S-t!63ecS__+;*g@p|_F+2u_hHJc)fq_z%JJXk(5-M>**Sn98-L@5N49MNE zIFX6DIp3|JnaDbZENQ=&hqbxhtmEV3tgOKZneY{{smqHo5sCGvMtY|Mc2ofE{BFA5+bjst2s@rIS`1DMPD^=ts_twk7H*v^M|<( z9yRdjT}Dm~Z*_3dG0`!fuNx}BYQ@d>&FTz^(qNBLHloYuS9Fn@d#^#?(qJ+J?G9$YAVsY&b>0*W9APLBIf`bdi&@v%>5yYDwmGDOAH?W9+1bxwXLE({(4_ zKhDehLqq9~ZF?8@t5>(McBW1Jh#1V z!Jf+NYO%XHh^ttL2CA&AJRKD{*|q1%ki|okPDLMfUg+UO1Py#kJz6e7MDyf94lZ)E za%x)1GtK*CImXSyv*LT=KRhgVaB$$!;_q$Er;83sA0dc>qJLOeUiLfdBedsUno<%W zLw}tgogkZU5U@v+wL{@M*J5F5IfKU4z!|3`50bF9wtk0f^1vkMcB>4=QCUC*iN;T# zpP%PP5$09R$5V&LQHWGEHsWE1V<;JZ)_XiEt$6+FOE`tM+2%Gfh>{?t{dOZNRXzz$ z8e(T}kBg8~RpsnvcW5c{;%#q#^a^mrQo|>PMA@rLx22>RsBnr;SeTogok3<2co{H`bIS^OoD}4j)2PZv z)dc>-bS;`;7xvWYfCbcW2^Bm9I1n~w_^U6J&?-jg>)TW7!=){f{ii zGJUURv>LjNWgubU;cy`GxTRK{Fmv|Y6mA#ahbLh%Y=`B>iN#q-2rrf-wMx>KpKwJk zU1;m}>+Q+SX)|9bDNoP27!sbA7GIO9`HcU<*P4Gv1W zkzBrNn#`6*lb4t_!|BYeUwh%&lSA^7kg#xjT^;@@()1c&Fsn4o(2sRob!T3rp!}Si zcRvQj^VrgI>!$=E;G2^*5g{QB=}==L0?>DPFh(3aXn+48+k2ZhdD#7GAAjb`)RQ;M z?;J$}?guVz&s;@AU42k=X}<1XgJV6@$qwa z#|L3YNd}%p{nqGXbyIV#0h`B?3&>8n*~$$kmP)fKsw5N_@9piSzIwP>^L%*{xf@jC zjH`V8s$T_ftGh3XklA2)RN-@FrRR6q{O)xpPpzBB$KW1g5$BEG-rHMEUU>+3>|$hO zWNM0ojO+;5SUN5t1?NOmKjO_KjCC~2uJZv;C5Y=mw6L&z{rWXnr`c(J!-FUs^s}u^ zsJ01(BeQ3H_u#X zE?(C0$whv@Cw{#k^96ZY>R}f!jxo{V_>&o84x{!wGgyY4-*r37_xSEFl1Pd?t)!%6 zxj|bA-O%>-HV}VG8NA*nZ8!D~cCF__jAnz#mre+SST)GEXKTRNKP?8TnXPtaS#>9eh!8w6$I7coC)j@lNJ^qc1A0 zgZTA&g=4+uW;Kuu5sk_Q%)5d^BfCvV(FhpTG5>ewe1!p;PZ4TZ8mTnu>dpcId!DzO z4m>?TR`nDycsg=qEFJnkWLP8CVPjiYe;+?_`9g-Zx1U%U=N1=W*Y{s$>Q$WzYe%}X zg5hBDadD5MNY8(-OKFjF^-6hOc74|boenuG7d5Glzt!u^tFao9vSmWdz5V_5k92L` zbDY>Lf>r8%T?_a{YGUc(v?FNdXi{P$TZPoj)VEaF6I|m(@5IVMz{AyxeA5AW?u=zq zo%*Q9y7!9FGkGk1nU&Y1ytK+jFAEc#4l~NnDA*nf7-{ zg0(efQ9IM>8HYtxED8$q;*lwlvv$&TKX>cu#!Dj{*w1T67H@?yb!l=l)Y&hpWUq}~ zJU%XyieWEWbsX565*5^xeyD9)n4Fa?wWXvVx|~j!J8*B-o3L{8@ZrZp)o8b`&czm` zA%zDag5W`v!_`^!4juMe9|N#(@)C7QYPQdF@3VtaHS!};s4zYZeuhH~k_K1fqZW5e zaSD0;71gv3zqeyZZ1!4jO(9rcM7K7mt>g17G#m9%%(!nv~L$TP|1EH*w3YRZUeo>-Bx6RqM8MIA>n`nftr@<)x*s zuyu+Y>mApGJJu@bh7#qHyVp;d8p@)TJrU+n4Cb5ChNBn);rpZWFwN)V7FmeqHd_d% ze^^*rXliNIIV-Aw#6ZczE6bC)bOTkf6)mvHHFVMLh2sAgfChqMv`DuJ5MjykWcD*9|*H5Zi_ykcpx-;E1aK%Slc zGd6PPCmi0B!@T!4Mm%V=PGzuuu)4Ljall!xvcST{kvj=n>~)SkM_SiOn8 zYm*)l7Da!G^atu&u10U|OG#$j?^FDDNR3*!LcAA?5OvVDsM&ukn*BNu+G zM5OH=Oho9isecat$lL2@0#DE}DO*4C9gmZXpj_NPr(ud4%@?Up2wHhuhCeKYfp(%d$+yXupGqg zqCW=6oUd(dKp^yC4-faIWd~7gRPm`qYhBK_Z5~$)a3IQWVf~U7bLmXK=&BikQD^5Y zduv!};%jSPQ|YO!2c_o}-Q$z^qBwo9Pgx4vL>ja=$W=~g_*Gv#qSjG!R#ml-nwqwl z*7XXBBiHM0qfeR6Ok1gM@ihf-`I4UXQzUp$P}<_>va|a%&suv@C?9ET=-r(-6;POJ z^c(YCPYc~tGLit9J>Y;zCt1_g)_#eP=w9K~bI^(fG$6Xq)b_ykzI$dHi5`FE8sU#1 z^!`lNF@yRO!E~W9E~Vq@FsgD8Jl^~Ra`MC{5%Q$PdcUVgc+j^#6SRwq$lTwI72@6N zWy)5ru4;iM`Ae^7em2{s>*|i%4!#Z1DzMl6&&Dr;xkxK*4cPgJwEm@T-rnO$%8T&l zVpdRUtSNgDP7|2F@!(YO#EJhZB;5m*1=+>|Q;$!xhCIyl>Uycbe`$X`acj$szbvWM z=gx&cv;UF0WswMXRC+KIrR`R*g(FjE3!Cr?W0f!JT51w}O^|!w_#LLsGRt4^bA4wIJ%PYcD zsIM;A9|T zKuG3zt`ZA6{cLX+PLwSkTu!u0x9RKp^o{DnXVti8W`{x`9bwj+YZ&);XucLkbVaf< z|7)y=+n}cXFtN-(AFwo?nm@C^-7}o8T8y?cs^BG9Wu=bShuUE8Z-2BS@?>qkS{&LI zLd6GVsGKNPww%G57EM0Rp}@L=`Q^a-R@z7A+WoE|F>sh$((K=)EE^$XlQOQZdt6G)4WpekI0!Nkv`vSHXEv{d=QM-m*-g zxzRR#A-URO+l`VyUHc{B9t#+|Esfh{yh{N+VX0K zptxADj?UaX+;6Vkl*UHGKHjE&x1n z9>>3fWfTitPsejglbPK;Jb@^8;?Il!2A1j3s^BM$jV)(}fMpIFMI35Dob;((bw_5F<|SJJU;UjO_3 ze7Qk0$j)8X^KldPDUT_n*E+zbLlu02#2-+5N7SKksv{f&mNF>I2CL+Cnsku z8kQ>bTCFBV$iIHs;Uz-Oa zAp`Mf(dQ!l{#KkVRk~6y-mj*l`M~8J5xR8gaI#^*9S2ft;6>TkOWcmZL%O5?Gq4XF z)?sg^$FF8oQj+J*P<)cKQcRB8x!W5=NwktzXKLv&u30L4|6b$sgzW3!uEpl&gSqmE zTCj!>~sHHfm>myh^eb={U*6X0uO zCu@t#m-kQOV%-)ErTS~FG8!&(ipdA3XE30EEyN%V$nV~B`;Fe_nyoARG*Gp1!?Hck)+DeGzx zVutrE2fq`D$qksw)g{x;f@NlJiE`-Xd~ZI1AG;uhzCm~gbh<9OIoO}54co^~3ay*- z%VKir(?>>G(UtM+ot3`pdy+}%_Pu2}+?le7!Cm51UF^{#4oD!cRs*)o*%tDTBq~pRr1Ao?5RC%#%(u#;;?rBNO;w6T6IVdpj*|dYxB~o z>YNRIsLD^gS``_-JDGP23%OXiCCANr*c`bdFdfAqgyE`8A$d=hl?4nh2R`~GH=g`2 zxka&~qo=c)?5Vw&5>#(g@Y0t)N4*WHvf@mXudl7o{cs3U!IN@a{asdi;jr|!&WQ)` z&GE%e1d7VU)%w-_`l9HD&WA@Zm?i`OIZe%Nw_ktVnqsqfyDAU+@9%qe z0UYy#oE&rV!S3LX$XxKonX}b*bVqv`NNrPlz%a>YtwH@{!g%T0g3^bp8q2u0(~VaY zu2W3*8`GNyEUmZq1l~$oHw12K3_4!J?q1 zaA&f~HHpWv;>+nAkI3oYo>L`3=+(7bk4m~5f8saEnWB-A_=y(wL|Az%Fdu%`)=&-b zj}koH%{vyjE|6yx5;*c`fdc_m+7?%`M>){N4P|$hc09#=iTxp;UtnqJdvk<^VA~Is ztowr(Sn1*8am{>?_x5#v~*@CN*7LWV;HFcRH?hfn!ln=bG zSn(ERX(3%ke+SOgKIiVQ@PJJkKb(ASDKpXn z*9!svJDVPT?>Wyc1)auE#v^16|Dbjwwpc_o0tTcgX8>AP<{JkEt)rbB0*L*g%AtUs zQ-OqzvVDBoP~PG{Y@z7HyE2*!fPNGhV;?;VSycY#PeFCBe})Q>s7h{HsjgTykDeG4 z6M!hk$zPj+DDgn5#HkE|A$D3etHX2yyuqEG^$iG5!m*}m#h3f{{kNO)R9}>8tBi~Z z;|ISK)gU;tU^fvL5m(JzaNBsvkGv z7v-q}hWkyXu*dpjUEP(!Z`Pi1eKPxE^|xj`Dr(yVNvg$e05Ik)l$(+{PWRz_^4vyO zZfaouSG~z6eFYG9@8o&Crf;Qks8vzL!#L8~iAxg*1fb@I&--%{D(J5t#{{3IqdNTd z*2BqfM{fd7Cqy2dOiiglo$F5MSXhBiBx}rbGx#$5yHg4piiF0ZFG zQNjS4fYt?hI2;TaKJfN$=lt#Erkh9Bx+ZURZR_Idq91VVz%jFrlPt;nNAdLZ?*{0~P%Qx;?I)$lcyp*l5<;s00@J zv4Hn^Z*u$j*!)-b!l|=`j>kWflanF=>vB?96py=7BJ3O-uR!0;?{wFmkI!Yh&N>}x z{2xszywCa!vpT$FR6srB`ykj^BXxYy*bYW$Jy_;`UnKAqNEEwQO62?@nb~k*6?c(< zoj88S8w7$n&wJ!CAP4{DW&ZJoIJN?kcEgKKR9Mqy?&>P1gz#gkCLkNw+uA=xeiRsH z%}trOuLR40SP|fe!d6kKIYRIyWN6ibJ4>TsH{RXx1J}uiZMNgHi|6B?u*%EKJIo|h z0`5u;+s-Ud-t?>iKwd@Q1q0}B4~5@#=W|!h4s&fir~hsU1<+%8gg%^ym)PtWgHuLhzz?&~D^(G_00!bKXZs&by#MMPda178dq zYN91QwV(ic7%G=MQ=Oag4te9*S1DWAUsfd{E9=;dy{WO*?YWxzAW5i3i%%A z8+L5C@VyjvJf%k^GYgPjCmZba1o{*$bomW|`$}>d&{EgRr@BjM7<8;&|D7KjCb~;dzJMeG0G)fL$*dl}#P7 zRUk!8i`Rc#DsF1Msm5)5Wuid}CD=EM5Qo4{uflYa@V!Qj8-C!);Pjpkedc_dM;~dN zQV`a>oTf9>J?X-b82cU~oE=Vy+%eXIAFKX?tzuBgc=14S-g&A9=(ZJZ5qN%Fn04EQ^-?!}1h`{+y8(o#b<+6c* zu->cXW#fv%n6qY6fPkS@isAk)KIOk}T#$a2)zM%hlk&R(&0UDQySq}yL$MqG%EYS2 z@uLJNNcIveQyfYobH9ETHupb_8mZQ zwLkYSA>Clr)^8*6Q#DXA^squ>$&HD&m7Z^Lg|o-DT-qK6Jx4}ZDjD^S z83Rr1{LWJ?v&c!8J@1CNu9C&6&bBK2j&4LAyC~XED>^RzOc_4h^JtWsy*z)}O2nTp z)*_%2)zSaAA@UJ)QptX<+Aju@$xo58az{?CY2yC4w72`3b7zPl#A%x0YvSyw1XJV< zwx%4t)poQ$CUlXie*?VfqLI-D(x$De`(wT6=-8LSmq$Yo2v6qu%JOBSP~_om{?-hj zP_hHg1OLr2El-JB2C3z|jgvI5t915Y}ip9IHP zn3%@=UYcy@%7rffhP-;X4y~`B+`IgtBpC2?ej!eloco!R^;i@)_}lj-)L+ z4b=;BB!HDz4Lqd3eJ}R+M8F?CR-@R;(f)YfuFpgRT>(%IM8_(WoOBvDa81v}D#$;y zk$0@25yKBno|o*iV!j5bK2JLn8!Yx%M4~9_jIrH|~pt6f(&8A2Qs5H18T2bZLL z2M=EODOAoLF;yedZSw%g&Aj5s!McrQhCt7M&V_@3r0sr5NG19( zc93+G^^B-89!+Mvwqj99+6_B8Q8-v8eS|#DQf>Oxm%k5d7de4XgII(FW%{#>>V(L_ z%6Q*#YDQP;#*bJrv>z{P!J(Y}TAnC#>Qs^sp6p}8@1P2D4 z3v#I}XL9e|s`jkshE?yWBv@1PqR$Z>)WUu)Pb&6h(-JY+s@f>0n^I=d!n4TV;{$yr?nn|Rc3%eT#gyg)v!4o^GlS$FJrPFYrpA%;ZpCpHJ9Z-&CCVjM!aQI zvFYkA&s(J8N|dS-`oh@p9cuUJ_XIr^QP2rn&6WJ=R^+=Mum{bo!q zwg<#NjZ5E6Nv~&#!*h$ezJ!24VwL`zJroTKhlI?T4+|^-cGZbxz?)su4*i66D!($2 z!X!JeI{0J8et}jaa(5T^TZn}5kRbA20RyeGQV=Sz!N*JpvpV%^1qF#x&QH&?b8*zQ zwl)$kW~7jQc!-rCU`+YBJLgh}E32ZOzN2kQy4t$T)N_J$`viA&GBVzOdR59J<=`c> zsx8RPX5HG-^lw--6T0GR{Jn(QeU(Iu20*i zG3h<{RuRCzcp&QZJM-(~xBTM2i=jjg?^#&m8DHc1Nw$AN^4*;8#~bPiX}VhL27$R* zEgBVh%U(~Q+6`}Dn3V=hb%;n**~Cn90Urcgnu?7{;-0=OFFum)xMe~tRYW}tE-z+ z7ju=ExOG7|)^9SKq)ULVY#%W7KP_J6!r>}Fqo|X38T|Fmsjmzl{Rpoax(D0{Sn4l33HFBZ~xL#^LI5_}VT}kK)B}3LkV3r3{2Fa?p$_ zRTe<-Yf}oORUyBW={P%BNg~AAT_ho!(q2pALIc!tEPG5kYuWObGC`{=cm z-`hz4gO=$EXk;Mfe5vxXk-r8ao2l#Q3e@)8B<0^j2F2OmMds!X6a#M~FPS&t1YAv? z=(yUVtD77F1LV{s)Up!I5c+oDy$r-S1s=VQsc88ZU1Y{9P$XEc`nTCj5?BH*GIyXF zpsM=&)E^=lY4MD*BKI4L?12NNqfI!uZQN${mW_;B2qAGPHDtP8Picz^K zZ}4T3)Xk-nz%szkpKq$P)PvPja@AC?hzBC6EEC`9zyUUjXD8MfWe_VFqK?P~mnM%E zJwnPr+7}NeUed(zc`_R5zb|~X!w^Bpwc&8YAY{ZKb;$y&0$G~^IFMF_emxNs8v-_G zH<5${0T1=7ITc?*F@F-0FlfdOVSK-FrY)Ez4TcPU1 z4(1td{A5bKlY4Hwt@v?Jpm$$f90CHPe>)6cq}r*F`p27@l-E$_lKn6El*qxbMtMmy zSv?AqaGTN5(nzR@@JVLdNiyTGH5*x!$TYFnud&}TWwX8^@&4k)SO&=lvW#8D2+7yZC=;j2F?AXcU=3d)o_Cbs) z-(xSJ+81uC>ZVUQZ&ay{{RT~%@MkJQO(tSSVj>2sY(nYqcP@xf&5TYsr zx&UAki$$#b2GRU2Ycu=1L>9puxL2yQGUte^pWqv`P;NjHSGWFwBt0E7-QL`uFHt(5 z!+JQ!wyT>vUa_G4GM@#GjJ`;UYvQQFylJvP=~#J0r(fo%vJMB;J~n#gv5zINIZvy~ z2=3EF+1tq6At7i$%j0kyzNew^U0>baf|Cpv(%q#%pib*HmdN|$T4wnqXGk%bjsh(~ zlzzL9vz?!rv9oX;M{=bRoFrqI7kGGpPn-sCXj;U>HxOtXuFNsS+sN$s= z3DjyVj0}`BTks?#sN$p5&l6V2O88Fr2qfZ-|7=T{u@k#jAQFA}FdPv0cZcQK&D*^A z7n*LRvIlbTIGA%q=ij4rI%musFx9SN%Roq>5^50)#eBn*)@*I9)zj1ScB*dn{xf@S z3kXa7{b|4HxS>Ta*2zg%o8g)PLB=t`NE_O@Q>yD4Dluu3~VE_V&)R z7(PoB+t&fuX& zCFW!NgJp|MPJ;lq}|?oxQCvXz69W47@pBdj-<#2pCz6p9~JQdHw&X zI}P2$^t&Z1SGu1i1k`Kb!T|yRBnp7?9x$8YvRdHrL&YG!MvmtruFyPlEk5<5yaLhE zLT6)={OgQz7As!>nwtGmQp3J1`N5O}utG%#2Zz|z#);L1y{kKfbOn_JGb%u9 zw0`Yl73sm7880oK^lQCTtD%Nj!QS8BF))zvtvMg_+lc7Z#&~&JlC(7bmKM_qI*^gS zy}ggiq(#lu<;_JfU@cA@;&vBvfe*UGY>J%KRaF3(P_feeq+40}K|3QmJ1gUGrJ(|V z8$5g#DUdTnTxnC~Rq^}o9MRS{mgf+&LX&0r$i6}}^_qDWiwLRFpz3spEA+D&d zY6q0QvrB6gpS4?BuiZtegh1Su0GQP&15m&fW*)dCUhMJ{gV4%@h4DTR{yi=!XL2M$UMj>rOBim;b|cCdpd{SZ?z_;R;h3GfRWJ z+a(5i1_gg9T}!XLup>d$lMZ%q+0x7U|qp6H?MyAs{ezT3>CeNg9UeLV`AuA z)SUYE_NIIZ2n{^88Vr^nduk4FNaPhalf4K7)&^X4b#iE1&K-+(^?C0VSs7dKQDgKv z%3UHYG>WTA)<0-9`}*4M?}KF)7nez!oJ|F|aG&qDgGy`dX&ANX2(QV6o0b#+I;Hh~ zX>GjI=iuMs20RauoK9dO@J0IH3eNwoeE{m{(@;;37GmJ!d0b%WMEiE$snQy`??sRP zjdm^#0e)#AO_KH#70Bpl(e}0G%=B~u&F2k|-hJx`8qJQP?(_e@B^6Fc9GJr{Eh`8> zTageZ5aK-T|3d14#K=9(b8L}*O!av7UbwiNK5wH+iv0aIKj`hP)Uz+-4@FspW04h% zaT$kyQNXyWtj@pTbMShsNyc*6?*7gA@-%9)@kAS3rXnGukI&T&s1h=u`2Wx&MHl~rX%3EmQrA(NlhwazB!H`SL;&l&(__&?l(rdf52nsB1tn{A*o>J42Fa+HH$nJ_w zqGi`n@tOCXUWijpnF;VS_;Ya}zV>H2%V0 zompApn)OPEvoW37xWicfUwg_VGkHp_(&H4*VG7z%0g5u6O-`fC4f~ zg?P5E(lRo0z+Hc=Qs~v066zx%Ni(Wy9j;#mZUOoB-jcYOA?{j!CJ$)RN{WOjG0jP{ zJ`qWY^2qhOjXoSVQ4nAqinz7#RFVWeEWf%DioW8rL+|Ac%^eXx9JE~_B-DU6am;i^ zJ^ShNF6XkX_6CzkjSTvjkA8{Oy+MuDRvL}b!a*cO#^lY+<5i-sLt;IXCum}3>_7(G ziCn{*HILA=RA5?SBqi1*e~(vN!@FP1jgj4)oj3*L91ZC%-?5FFyYUdEi)A(LvbPe;Vy7g0n3t3psT z8A_s@QA4$=P3eazsY1RnuAazMmbl@$da}kA$C{S(*{S`BLHMQ-+T?zYAWjAQDl3G? zFqyI%$rh_`N-77XhY#yo6}F|?A7#pMDxT-+?^1W@mS&sK3o)A&>+GiDo;1-&^^IjK z9nyQZ$hT&xpm2magB}^<()Prd%Ll-M6vyQQ0T zuKc54xS&_wz6i2`@* z?3Abf0-kiQa}QgH>5kF8-qM6kw(Smk)84HB!M4Pw_Nz4-FVZ>?U5ghF5U?9`~sU|&S zrGn9|m$*1Hq+56$Qh>!BxSi>slHX2*>ueYc_l}3t5eb#$t@@Ivu z66dRLtPV$M2{{EQ9y8oO12aJ_mYfgsKob)Qa+`NYufFWNFRYFJI`}7E%1%%!2PQct z6!{yynFjG2?2>aU4P#l1a@cop(DEMyNl`FWw>js$-9XQD>u6XT-i=-g|4RCV%C9=& zL4PPGOPBgGpHaN*g*N`SS*Jrst3jx)F)8EEpm=1{AztOysezIW>_jQt7$K;)`RY&0 zSDD74XZ!`Q&Zk5e@AURZMZws&vLg!8FTRgeg+^~+c!g7lo(}c}DX0Qz-t#LfNKwp% zBnj~P(o5>lCK@T1SQBOQA3zOtM8Z)UdO^>fG9pp*g-INmb54bVjqwd(yhmLC>)Jpu zix)#H-!(SP2BF9bSDE<}6eS%apGe)ma)ANQa7t$c{rCA4r-GR4mX{usP3@ZlZay34 zwqMtB8$w#Fu^)4|GJ2F&=;@oN5<$S~H>7z6A1yWc7zh-s;7)o(fu1!?W{9pYgv^*Bz^owDq@wP)*+Hh|C-#Yp2ShllryT_ev^@hK2QV7G!RPvf;@5)(4Y-4BhvX zf~7=t9$ax;+^m~!r1H~vX0@zeXixrX;-gR|N-v3l)xyH-XsypnrOC7OtgMXxH#F4eM`6b zThUk5_g8^>>71%>y@&OY*Z~pr4@H>et_cNL?Yr|~V+SbvhlcnJ`v|w0LSmq+k@f6+ za?sAN+_}Cyn3Xa4)nAhc6|VqF`*N6361#=QJATXveh3@RM5DoxwYTt4-z5K|}QdcZhg9j{l&{`4a zsQC)QjF~mo*t3Gy@E*^*i`WhWOmI$G8d|3$P4gzXCp069UOXi>r2o*lbVz;6SO>Gf zD45bHzQ9_W28`S-*krvEl&(@#q~?7tg%aGU)-%kL%3&MFoB3@nMv5=LxQdv7k1;HU zp#Qv!G8Fj?qx6aLFIs0Pmq_VnjZTWMalv|818VY`#qZGLN(|#Y)C*xh#e>4%qXJUS z>hD!OtmsL5A;gT^uCz`XXoP6ou-$mv(;OrU(Q{!@Hhe6(?g9nxN@Y4Eo{Sim*sAWv z*bv{?_!6i7cQK|K3kc?Ld)6t*;lHAvc*E8)UEl25t4?`Wa+XkbDps8<4)+Hg@D_lB z@eAY^_C3D0p&Je;Q_+J&_3a%#b8oNpp&(z?7j1?LIABj~x$Klsf&TCUE8Mty`dk=0jX!GJ85)~^iOKaObuY5@0=sWq3*{uRD%cwQpSlpDsG>z zBTS_wckN9cWMjU3!&TOCCk5$lr}#>kW00dr{$)Fa*TmP<#^H3u;)wUKuJ(a)SO_F-EkYw4V-hM?d!5gju~214om`su4Ng~ z6ME>%mjZ^YVy^J`Z_JuTf;ED2N{HR-VY%B74!7l9zn*UrVJ)dDRo^L)TBv)%U%9nO z>{v;C@@>>e6p1XZg%g2L+;%=Su71XeRF0-E+(kVBY{7=aAfDSbL6v1n9rfqP zrPMIkXWH1as6tAhM6dnct*6WKrc9zW$mQoK*~pMm%t71eoa)75ci(uNA6Ji?FuInGn$oZuiOV5>}f%xY8J|FG6D;F~q=femY@jU{A zb}xTqQ-ImA68(fLI?aiZH-!hV9D!b4%WT8&OZX2BY}96V^v9ukzmJsLb82y@P8$5B zs5$TTqQqVufgOV5os1#inmn!1%!HX_*Jr!iObA$Ka@pr1+CC*n-laF_7$XTagX@nF zmzU9SbdUp5KR>3fG_>nA)z#HcR2yN~hr;?z@etA11K!14!{5eKqpQB@Y8378TAIB% zZF=hsv)yniun4`YO;E+@C*73})p4Cy5oBww4D7O~dB?`inT&*|6vP?z)1HF{So(@! zPWne9S^~$*3}Fb%Vm<-6M_c0yo|z!5pH3I);v7`QV!h81Q#7`a7Zel+ukhPBnlq9hR1nKmupIW&uQz3>vuH6Rn=di{y_qb+fDR8r$+VS} zt0q3MQYGPSqBCbY+B-_F3VK8QQQnl;PwC&5NH1J-ov&rD^;~C6mjXy*Ve8~F*y3-F ziWB51GO2qwHA5AUpeV?x&BfkzPGm@#3%a6EG2T#dnXlY)LCR6+yZ1OT`@=f$x!Ca^ zB`~)4PN4lt>!=U3Gc2!&RZ8b3@p|9lS*)ain6`_|uZGKP?=d^=5> z(EaO14c2SdhBrg0Vrc&EIG+%7`V&F83Uk64{leMlQ}K6QD4mBQ1TY^sH-xzSoQQNp z1ltv!fsvr9#6b&6-{)+a#w?wv4~1(g|5^OAq^&HqZhr(Oi(x&zUP&H?i|vB9sj1)1 z8Q*FSHqyk$h}!1IWI;v{>(<179IqPF*wNzV;y*nU`~709NZ}e7xo2Wjv_oVQCsOcV zEr2apGVT7|8w<%WW8(=wh}4@>29bWVwZ{9HEp`W@E8Dqf#`)VBdM-u=s#Jo|Z4F{t zgl$s|9X63Pcxp1FxR2v0v3Zf|iodQ*p7+)-M&LRG|M}OiCMV7V{Sbr${(%%huHG(11jsk@VG)@07H#ifg!% zb=Zg@$h(p_T_A+!a96^4zg=x-s zJn`D;xMx6c;61r_v=Nt?g5Y4AcSXQ_mR@3Mr;$^|@ICz`PajBnFTLe|C!%EVG`^lQ1-4qqjeo)J1!Rc%?G6EEz(ypCaBsP zI%MxXHD^nIM$m~7qA8|s!8*r?btPjz^{E<{7w)Q)b5uQMnf~14Z6f?$SAzVhUu*{z z_TeEf=Y#y##2&8=E82d`H`_1?44Q@|3_?v;RZf*FpH4LkZ_L2Z(~%yE4(~%fo}&SI zXxDq0G-x!@W|6}i3XZaLs5@z!hIxsfSmG4tNDc$m=x9+&4C}Um+U)LV9IkX0-tTi! zW96?wtQbY#c8G=>*&3Rpdk4C!8{8}sEGpCQoMm;F^G@GRzV+O}R5=ys4!)fKEGJ>i z?v9&KG_7oYL;7kZ1Jo7P8(poL_$FdJG@3CnX#OKD(U(~}L9TZ^T53}!>i_!I>YyUc z*n0=m{r`)ruZ)VLiMGYv-Q6L$4DONy4}&`d3-0bN10=!SEqHKuf`$OWb#Msodi#6p zzO~+Z{DGMkx~u9)RqeAk@gBMUVJhQL=af=fzm;v;cVY`ia7raKz3gFYIrU*xHQNnr zKth@H+e3z1UOi6h-9#`pARO1Xs~aNh-}{F`~Vbl4Dw!`jsC>)NkbMFj!mo< zZKwQQkmHv0wpX4H7fXCu-XrA+v0E%pV$j)rCtH4FrI;g^6bbW26q+9dGm$P;I5h|M zGKX+}x_*Xt0Yd#0m}E^*5VrOBKyDs#nf39+6$b zBaq+iOt4XCn29y?l~m;fMfgB8_+oj9E@JLWnc5t!skBCTa_Hc{MNe8q)vm10g?ccY zco6?;WgXfJU8<~UHty-&yiKkhJ-!*x37uqt30_Ij@ga%4D1Tkcwh1%tG#=5Qt|zjY zUY2MR%0X8xP*t>dWf}yDap9z|eP>tJ;0J0is?h$pOgw|&+7A%0pTZ_yK)TrHH_!ADuIFPXo_av|;D*F}0@*5kK|GpDY zL$wgbYV*35d8C9+R9Dhvn^!`eZB)a2!}buu{d_KK7Y*e`tE589m$7I3v*E_;j_GVj zV9l(wXnS}S5LjR{@IoGjQCm^1>`=143=Xjj$A6lbewPS={-pmRYAON|c~Lw*HBKA@ zEu}3iE@I&Ly3$86jF`h{2wdZ~~M$R2g$#HpR<uWxX^hXGo?#Ay99x}b z1L%PQ3p#F~E{;6{aSCng4-ZStvzEeQcUibcel4xM+7o8X z`WVu-a``Hd5B5}w_L3%mglu;T7E>GxIfLgtv0Ly?_K7cjTs#yO=rmj6H z{U;TKGE_drh6f;bS$NkB2dNmd&?gzM=R`$;qWl(vp$ec@jS4d(feWD4jhY?wO-Xb$ zcTjm3EMnM89h?a4v$w2lv37cPgpFb|aSU+RY0@v+mxCjm1R@9&tOZTmBS*qc(xL+_ zNL)6nWTn8UoiJCp(^u)YJMuy+*H6hek9AfD{Q04N@C1NEt^QbdSsrb)@K5Gin%Gy% z8cd1@`zMWCweK0!zLR4(nT<&kA2#tcRQT*ALX9Nm%sxz&1$ z`FL9jcR_9R%w*;4y(uHfhF^tt(Cz<& zZ9*tMOXDD1S(#Kr+~%Rb^vSGmAFUI{LJXPhvk|iZwRQoWCiA=%*FmHTnjc?egyN=RE>^CI5s}#Xy+GGKwkHD; zR;#RKn);(a7cfS1aOqX$hZ&a%Vg`0pr7mu0IhDzMzo%a=itABTDU^oJD%59{ifTJz zIFc!C7BNf4GmBDN`M(u;5lYo`xo2Z)*SW(;d7_)T19u9`4aBrrOoL)3ZNlGY{#Nbp zG~OHZZMP$}yVOm+5C3<8!bACf%a1uj-|Zf=a7F%d@rOoHlLR*<@)35qU?06=LZioT z(-I~t2XVMvUiT8%YAX&z0=G%iZ{fo9aQ$@5K5#Pc8dff#1S>9!S{x3)aKnjXZFu$y zu5->Q;9)3mpfE6<#*|P3GG%+g%+e;~(14zZjMEG~Z1nUl@dB9l>o$R#2;WN3~ z#d#XZX{CVtaYx}?IQ=sS;$1)H)qKxlg@C0amrNI{j>c+x7KYl0MBQw zWRim`4vYxnT$K04?Gs-=C<*+zW$EP=M$C6^ZqANt`p{WmPKd4(2c@HfD}-dL%}?tdB3Kk5uApotk({=@h+6Am`aJgWhPpyF6v0$84=VhGPuVb~ zF+XOi>m!Ltb}k9FdF5_Ks~LlxGyeL_DKUOOaU@`Pw>k1l&k~?ZvI?XCa>Y{HWu9X~ z@z{h=PG%xfsRhBU$)8#iDy->t*J6p>MoaG5zSp0y@5AZ<Gi?3~MjhR~?UmpzgRfr*=9GxA#gRDhyDivg z-k=Wth3@v~{adP|xhWNm>ju}g z0*iK$Q1!9Bp~XjXM%a0mRpWG&RYz>IuQ-?Q!I@VyPGdxAIxzj{*RMT@|U_xN}5yM`9=9^hBdHHwsXr_PR z^K#BUNP>({enf6s-;ISU3<-nRq!{UI{z|iGN>vXf2#eOOt*ox#!ws48f}bUwMz2gX ziBPGdy&gob8y<8KJ2BlB&Xw2EuUkr*R5Cjwm)B5DW3Po1HDY+b2anDvG`&9y%F%-x zI|iLkp|$dn2sGFq95LEG(caO~;UR3fw$r3q8gU8{u$dXD5{o5|?Yi4yX~h;&ct)l2 zewgL&)TbY)Q+i|>=%*<5bJUgVH{@@Ok9F{I6eJulEE$rkG!%i1{0qU9Ph3IgGf}A{ z+M5H0_u_*V{*N#>Pk_=XyYuW0(KPnPx09h#qBk#lWjBOt$J1}~EWFel;zk`|I!;JR9aW{MU^ zqoxf*n2kM-II2G_)9IKDbYeRo&ta(fhURnYKD->AFC*uHn5EX5Gz7x;_&1?W4 z%s`|tZvIX{YQ$630(3|hURA?PkLbyj8;nmMh~@j8K;CRNj(Y)VuW+Q3Asq=e$Q5IN zUr69fAq|Q^(#Ii3uinU%4dULDAE~88z~%*x7e;p6D7UhkTQ~QJ3+%xbN+^sZdk+^( z2e!B)cIs%9t$6ycy_@_Nr^*pCwLgb)hE@PS)j6`B!6)RP6)K@^y6dOsbB(+OY^TVm zj4RJ9*(@DIm~)>1ePCVaMO_`3D~r-nxi98~Cgnx!JA?F6Bcj?LmwmsR<6wCRuQ_Wi z?z;CO>^OtAXo>tlt+s}XntwlgXC8qB8?pPC(pi}R)`(K*qB5EVIAszj;Vf6IhCgZS zlh`xG8xCP5q{=a0Ea>?FPxy#PpCVZ%7 z%2DeibVy|GSA@9dNu!If5jS*hUa;33$h@8%yncH1EBg68Z50IsJZ+|s1NYkO?=yXu zt+>8A2S@DaXdm)NF~c-pK{O58YMPG(aYA^OPCq0g&)UrF5NS6Xwsmj_8v+7qdhjYI z_I8R;2??;Z46Ia-;G6Xn16JxGTLwirPY?O*WX9*=+(N0KW;6LY4h*~Yt)B#$Y6liZ zp!|L4jZVA(_e&4#3!byXM#2GTv2=NHF>WFLQT>C=7j_wh$%N4t^R|8?%F+Ghg}A!m ziy~$-jg<}~M1@R}8H*n?vup5iPmjpJt`TB<&;@z{HnN+m$4{?(I^VDWl>|PTm zZgqIio%qPb{{d0nUAAer5*sn+^c(7PAb|#4rSr zly9{@dwj98Gb3!pnh(w-OaATfm8g^BUq(k#ZX4RV4!!M1a}6+pw|8Gy5a=hibNUw?lV8?>eY;FWA%@{b zT1txqFK{lThyNpjOH0Q9Te3@v2BivvB&DUrv)^1zhl|7W=WZT@G|qXif(F5AEkFR5 z*?xqBx8-e5GolX;v-0lk$}vkP8-=m9L2^VIZ#dVm&u2pgK~E@9_`}^rr^;esq0%Qr z6B?Rk7<*sF%&M-;d}Jrf8EvqBB=2=5T6cfaQWLV$p-UUqD#p@cw6~K(vp`rwV$DL3 z?j@s>pQ)Sw#f`!7=pWb$7U)~9fpkVL{{9_(Vf6*QaNg5nr&=|(uwCS8pBH0xCU+kf z@C#Y@@5q6MsatAG%!+d~-}C?5=fH`tSn# z@^i~!8|(h$oz^?<&!5u9Yy<_gT40e|5>ipM9^~gWlP~{(iX{n{*W(Sle?gBG8;EZUCRVlE?p^y{>)5ZaZf!^lFArs} zXwT==;QFrWtH!(siu;Q+t@@U-Gq=2#yUqQ#AF-1v?}Ae!$$LgWUkw^JE^mJ2%X{VUmhf|w4S<@wK5PV22k>|myiNz)1|dnl zWwPDgVP4;y&er&uz7@QLA@_aUK!9mA%AF3}bApB0EOB~?3cAa?R2wuz*u;L@qy?~a zt0I~e3}Syi^OD||r{iuF9l9?Ub9?fqeCRXhCyGF?t*!0j0Qe*e>!S-p5VQt$_o&)p=SAxxZ{?*gGKCNJ2+E{=|SSsO2pZ(s38n1{Px)`A|UgCChuS89r?u1?Je2+Rd-Xc9ukCw-TdaiDICSw3d=Em!Kk3VP7X}?$ZT|!VA zz7u5K|25+5WhC3%;eHHV^0n_R6`#wb?Y<~atX7boVEK7l=Zz;>>6selx%REY)5Vmt zvOF97xxi4VrYdL{8iXca*e4U7>xNdqR&^H{&WPV9bNWh54I!I*;GJGFSMITdNd3K~5<656P&$<4LJ zfN>PZwcO09teL7A^S|^-oCuvPpJ#iJIkRcfj*#rpWR<;I4->7dY~Q;v=$ZFe6L8w- zvK4Lqvfdt0G-KbohkfVB9{Wf1Vaj9eAmH}2Yvt?QiP6K}oyyd+L)BVno(wrxMaWFs&zZeV5nt9p31j_u58h4ZN_t2I zdEXz<@}I4D{0p9`szhU$v})9-xK#rF$-;4$s0r}I*7_BxpW7DV?Q;ASniLZF9*TxE zVKXD(?xfhkr-wyTb*QcB-rk+s``upF)>%*M0jGZB`3rifU?dYc)-|p>$B5F3y2+A& znhq?)2~c$V?@^}<0{9g<6kGn|-*S=?c^hF&CpqCs3Ss0S;K2BTEGlKSXyjzN-`=10 zBs-?C7yQkLGyQxlU9rihxBP|JE^_Q^d)E@gU-!P>3VQ_Kqf8BiCy51BSRbnu9QuUf z@e3sQtujgWEqdaV{5=)`nMoJ~E!*92c6YSEKWWzMa`&zp0I$`p#X-0kw#b#nQgUuN z;$nC;H11&|5pau;DcZ3j$PLuu@{gwkfF!|{gx<)NO=#J!Z1cQgK0TdIVZv5Do!ErZ zxbK_AtWPid?Wn~}KG-(>wGdaCWlPDeC`V(UsbKsUHp4mYpoCvp+51uB!&Wa3MiJV< zJh!{|XE1n^qr4K$e>JvHic1$$3#P9(KCINdVkz9JX$)67$J&vf1{YUGqJab5SWJoewy3npf2Dv2G4MBpV!W@7FS7iP(ARRzP_bf8$D z?^H9(U{&na+=4PQDVSp=bfU(Vto@&8$0~;oi|b(2UOa5^uZ>05&l_-E=Y0cy&i*yx zzA!^W%h0GK;@A>6exVk@{I>cBJho)tA_Wx71U#`e?b`N@FZxzZ+8#YR3pXE{PBLTZ zbl5)M>kYC#n8RiotYi^wu2xrLdjHg7lk$~$X=6oXHMC)?#8{&PgE^|s79E>fFIe8I zfZhXDBw59WWY=}>Mo@?yS+R#$9C9X8?P(O8RW`3=PO6V0rK)*lX+JshxWj02dyQ;$ z!C@xdokBN*z!rgZrk0&cKY|3j(ZUQo`$fX){zLitW-*bb+UV+{H>}D*4+sLkk3Y*V z)GSOVMOKET&6xM+t6C6-;oiP9U$4%XQh7E4EvXDQuIN zClF4`LC-*v2@4nr&K9~OD+`m@*RGn=bBGX@-`ndXPbSk{&NW_grr!e#f-aB zYioPE@M1ft63%p5UqLZ!O-a8laJBDP4*JFoJks-{h7@0b=Ac-#`H&#U)xWh?vG9ev zd)}@k|J3dS=0VS#9T@Ys!zVkLp>?~aP57ekt|oKkwwv9ekg#0p9o`SDBFmeoC_X|y z-1{Fj@$o|D>|`9~ZRV0$BAByEQ8QFiSGc8U#vRI?R$R$7vls+4ijh!xP?gi09R?hu z9@&o$!pj6@lp?IH354VaTPCUHPYp^mJ(1ly)+*=ywhQ02u+KMGcmcIXfMr->RxnB< z&e;fV&S-yht+iiiu4FmY_)sxt-_I^Y=5eQavfrWDQTkB|jTV77hofcf+fr?C_Mg-h zb!dJO+BB#kzL74-p>KKORXrb7{DXSqKtO>3VWxq*3Pp6yyL6v!xWR;q6*&9G2K)T-!GlYpBzI zr!&B9+A24zH98eL7Pa`0OZ#5s0EN9Wbah^YdNW*n(S^dh!C{4kd%;GKW(Y^dFa+R7 zpcrwP)HW#mz8v5iC!N6bn>E$peKpg0Jip4q>Ni69J!Np@2K&{dsTX`k9d+}{zu-U= z)?t@y?G8j#C2dQRkr2Z(5Y`Dyq?y!+$%26JCMs5uOJ;f8B?7>?=2Qu5RYx9S)llRO zHWZ(VOFL#V*-=Mi0Z9aB&{I5_qD{xz@Y4bt8wDO=j1_hdZXNe%ag zjbt#WCbH*43$Do2ub$u30KLl}74prVM`I>ZKS#-WCWu1vtRBudh+`>9S`tu+cood7 z2o>;Y(hgY~etDrgtFgn}tYwYGaN~)s?4|m_!b`2El{JY(c2r|*>NOycv9T{fJn)-w z^U0>tjwI4g>k}9;n(Wq(7K)SqNlTtqqL67cyh|%}rN&l|sF>t~t$|}lfw|Gb=Qc&P z)X%K3C#SgDCGP45Z2Ld_taK(`Xj4U4TesCA>8Qu0^62dfDo+)CK8KMCgUY?7SE-GM)>_2HU)xQ513()qx#?8O@yg~lZCYy6;?)cmW`^7w+K_(;x?#>Vd%h5}?Btlf{j>hkHN<>sL(glejWRhAik-GXNdM*Hcd~J4;9Q|zv5X`+L4tVe-+M{amblM_O$%`W!krEmd@GhIql7T%9 z!C;Wz&y{xzbMBMe?w~m^_#fgM2Ka!; zUISwQOX;27dpgtdM$x5l(gG>oB4&!df1dA(T}Ytkf!{<8>hTcd96ZnbKHJd6O7rA% z4!L(QIz8eiO$z*pU}hmd0ADZ_q9%IbYh5Qo=-?WD417~M|Fu`%00mt2L&zFaOBx6= zkc=X*`D>2bv{DA#cAi^WQEJ;h{Z(`Mt8e_kSGZ1YjkfqwI$5|s?g?ciki^V)oG5FK zEt`B_Ev6o`8|eDddbtt2E&uh4tcd=D6az&~v5_!?bzmV5I`Tp+&R=2i*r5 z5ZrcT`ye`<-WEgR$p|`DpMZ`#)`rb78aR^7{M)KwZdnU;X0a?<`P8LPTjR0x!Y z&;ql>9FFj}4L{_wL1pO;6GGr$b1%#f>MF;mbbnKxGS*HQ zb|(2#^eccat~Y24iLaPsrTOzZ;<06eH=JvtXDFBW!w-BMVTDJfe@W4@DD@nTMb+uH z2HccW4IdHClV>g}pBb^~X{yqywneIc6+O zpcGKV8_}>_;`T+%q(U8IWcA1mW~p^qG;&KCcG+hvErczT`ZTbu-RQ9L4^sL*Id;Y! z(-@61VhLF$nyA%IdBhkzZQruecR`R%43pR7fbJ=+=ZK6PCcZ-mz_CI%bnB5P^JG=h zyWw)z3|5-;G*JDvOKtlL95YKH!_9qh=#$nv^oLtBpiXqFm2jL7DhfC`XC+Ke@+V_+ z#V0mgS|^G;R2oo86{L~Zm5_?hKU|Q?N!-%E`6Teg>+GTu(*NS)O_;43k)9=}Vv!~* zGm$)qCR;z*-}xd2MW|Y;X+D}Psq+lODTFm*V&^R(;K7R5rI!!p?M5P50rFKXT}rzU~~-J66#4WFSHI>@sI0wUk+RwX-jHbbPp>2*P^56VR}9 zzDc`e7cjKf9@_TXZj0TbaG`E zQ{L9#i8f#5iH9Q{;DHE)4~NKcvGaBke8d?T$BKq-E}pBC?Gw&H`58HbqsB_e638yZ z-rp`WH z9TNT?zE-y{5NDYPM#5ezGAb^`M}jVl1R1HWzU~sFlH~H+3ei%j7EM&oiVG4J-Fsq7 zft)EdcTT1_8vt3xg2k^5qhvfCYp#7S3|A;d-L@~)7 zIUlCOe?{xB)n&?MYu2uc;9Kq6<8~zAryQwQ&~$tDe_@54mfd4iOAGeiASc-D{l-fD zcjloE(#K3Do@{|h_0MwmLD^0X%1?f76UIy<6OF_VvCT|kRhK*uPY46{gAa(mGvTVm z5YyF)(SH5p zQ6*;@Zz@0*qN#XE)3|^^EkQR(ZzmG?iAzzsm!-*DLgec(Y^iN#T?gGaZ+ghGKku7vi$}+9Vb^;zNx_Ib0CgM>dzki9tff zP&0g(iD_(@Uow!>uihn$M1pX;*0(`^B z5m&lRnpf)_;x-=^KtPpBui#N zdxO5TBeyv&*NItt+QFZ`yb0HgG(r%I3&n@W@35-cNyDh1+5GP&0}~n(cS7A^d$aqi z#$N`@;z@?gPkO&S{lPz~A1E9Leb2&KH9kE8w@ngPhK;fRS>uN}iR#b!aYcq4L&k(P zLnf?lH}osDz>cMSwXpt@cvegYDLGgc94fQJ1`6&RFRECGM^V8g<;^K6t77EAp2riDZjnb0m-+#n5%_ z2r7ZV3s6c0M$#t1j@#5p^nNbg{MH7V($Js3s@yCI8NQ$e45{*Vj1GlMd9j}bu8U0q zGbTJ{qC-Oo%EGHNkA+Vfj$^d{#RsDsFEg*nIS^J6;-^LoM*SxJRMr$(!83%$l4LG+ z=uo3L7V?Fwei+q0#ag}`4LPjRwY1dMXnJ(S4A#dc3dj7S8~Yy=Z7EPuy65g93&%&p z-gWZ4bV5Y3z=Q(1WZ*@aIEsm8S`;yif2xi|b%>%>iuC4}*_IuJqYSq<;8$RA)k1g; zM}RFx48Bhv>U9uZ!I`C=p876aB{z2M1oBw7l}TZd{UW-|cX@X9E0JU){3@dtbH!xF z;=O)C-g%#{A2SOW)SOe!agx)B)_+JSMPurch7*N)q~#VCoU(IrQ{TMT_p*@6js=|c ztNkuM`KeAW^cNVhq-OQTusg((xOS{cWOv?w?Tc3Lm~dfN7Cat;wxMf2jxyv<$yUo zLmnGbI-b8uE-T{HtA26Lmce|DV^LH)ofk7s2?FzsLHv$fLfycy@%Y7&@kMso16*s@ z*8~;_Wi}mZsy65vFSV|;=b)l8>c8j zF_P`c2u4uX6XMBNYI=rqo^lEJtrY%JKB_@*zF5Y!fha&S0cdQrY(9(zwBh{$rB|ox z>}tjju+ywCnSyco*5C}S+LJX}K6(%{dhPvDwO_1#OP0uOL!UjG2BoW?hf)9BL#grH znzuE@rk60_y2>s@-fxW3eNI3t66c~qUEV6$2YUpVS<&H{O_wlpJ{!^+%E`Xm;O0(H z?63&0PltZSJn&1_*~L>=pTm{_F=$o1-*UcD`ltm~F32SLPDx!oOlr>Brieq?JxWqA z020qx&1eECqK*|d7v9Z7sX&b_*Ka>Ppe!nW=u8yS$~yoW3%yXMj^?U z3%%=z?DMC<+RV$&8{X2#>x5@r|1RoW1kaE6o7~>+Ig9PLYM2dcWEMf=gBBALjU+bZ z(5J^MxM@ZE6nHfUM;5e-bko^1^CVSiCOoF^nz|2^>IzawHzk{y&>6ezO?hnC5b|x> z{G#5^6soB3W}%&IS;6&V?GXmqKo*ouzKisA%jv)e3{mOLs?Lbvhm>V@175hk*R&SR zswnc1as3K@!c+q~@>%v;Nln)prPj_m&441YnMkgdMDgjHPiBXjdI%GJ`4sY7x4|CZZwPeJyMgfInq~^ySy)?+I?bch}3iW;~`r6zA{` zD_EWlKW2DTtrcsGMOK~u!ewvcgnnsXC7mvE@s2fvs}lQIFI&lVjt9n_N43%!H98iRaGh-x+Q(lt==f-50_PnmVp-uh?#EtOSWb5mB z$_s+NuHcVs`BN9WoTwTm3O&@6++LoFi_lQUz>`MVI!v7`U~u@rd9|CKt0Z)g{7h8D z5ickLxHKa6CRchGiw0m6QE_nCQk*G9uBf7uhg?MBWglWj4_0jNy{T&KyimMhYnYvF z@YNW$gU^+7yIm-LxafP6iul_4J83H(!Q9n_kd?iSQsazV$U(4;mo8d@?sV#w-p_2%$I7&vtM8^YX9oF#%)KSp*W>)}AtDaWI@QV*86yd+BweS#$n$K&1Ml|K>}BoO^MCxHW!Lh+v#j_3 zTJ%EDf1aR#Uj`E7W{`sWy1kn8LzquaPo*Bt{a;AYM39Uhl#-#Q@q!my=p$+7k3Z6- zFP9b&Wowcqzfj-^Hy7AGdFUG+&U*b~5#r*-h=yWBQy@pg9=h04oV_O18Q9spo%Lcq zbUkHLAg+(rn{aJ07p_ymv4kGqTXH^vOM#8MWQ!hlQOLmGoDQ3dGu){7tK+lo$f!^q zVXb?)%MD@AQmepc^pMa?k(QlqC| z>|9S`dR|WyLN~IC-=dBzbyVS0rE5Y)*G)u`Ny?_>?{5q?Wwky37~oUVd4k)uMx%zw7R-z)0`3`_*N{yP0e+2T_>rtmmA-Er2k`rWL2 zMPlynXPb6j6WFt-?M){H+I5`*RcVW@8Pu?r;Q;_BbGdUCViD<5=7|CPm{`|1K)$?FX9ff$u*aOC5X~c2` zOSn)F5Xjae-8CvfxiRE<;OR!-*fG`B;X>0@zBRIXPZ}`5ZX=GF`S8e# zMLi-cSB2CnL*zBr??Q3PvV1NEa(1&<``v3m;5YQqp|qe)11Uwhv!;uP`uI z7bB07x%_%gaR)1+$R_)&_6;d><24c;?(|Z4utf$+lb^5F)+yN^DIbbm6!<%)>>Qh_ z=PR!Dh!3JW0%T)#IoQhi{k;bN6pG7!)XHx;<9P=)@6TE;*+Mwo*?+i@EWOrsc57Wk zNaN`{1yG+PUKSkirX8@OVen+ABm)p8k+IKYKZ({NHrrLg~+$_J# z>V<<9MQ0vE-UqL`9W&z;@>bfxPnQ1Qg=Ddsx>1GoWMQk-pB`6Cs2(+CVN<>oY;B%? z+>JYKQFzaTGE*>hI{c{>IZ-xjvFb8yQgH;^KLXTGli;TO3A10Q=M~&L^Y$wFN_KlA z`GWn1MD;Rxx6wTxA9gpP5KF?XEoM;NQ?ZA-t^ZK&8YO0j+toJco@u zIK7>KG^J|E`p#TM1Z&Y~Th9v9a_IdZ<|Px_g==A7ct3QP-AqER&QgUDaBk8*WE(5^ z$-JSE?61Fw{+~M?gI!)5tp@_Ix@&VJx_uFhp{uRGs*|5CtAZqQt-?VRn}2@}TBpFL z^??w6Pk6m;VgHsRED&-ulDsC4kRpM&kgQ^!B4_WlC}4G4oTtEj#yP^|%;nWG7Z|)K zn!Y7?-K&bcL+qf%N*Lgtf(_x-8;Re1Hi>RQf32c`Y=R@ajl3h`XNN|$b0Y64M^JRQ zqr8nkNW-YObaK&HGXMP^yr8wr#-Wv=p#J|ph95?hWGFv+2+_+$<46W-F))5W@i`l_ zuI*r?l?lJUfM(V9pmkOLzn7Y|HbH@7-uQL?dlSDtl{o^ku1qE7{Evs$dE!Br#oE@I<9?AxgL2zdjYRtlz)-tu#+(i{71< z+?}nq3iqcuP~jBl5Yi1E59ax|-Z4{SU3lWiC^3D*Et=`d$!UA=k;cKgOt#?{NtrzT zccPoR3z}M=Ql(3#$V(^jSwU(k-UzXz;}I48mXRK3lFAL@IW`~v7Ve{J75{Yx`?23wCyCo%dZSMPf zPFV@VJ9Bew^H;>{!aYrmvo`!QzhoF(Z?2|~n~tuS)lg}d3{MBxb#i}Hr^F5^0Y~Dv zfWIp$eSuSgS_3}f(B&C+G`Dngyk4`?GUTWRT`pOtxISDAM1?2CDDREUS7D#7JGAH% zZ}@TLD#fcQv&5QfKDq`3-1JA-@PEJ@aLKk#q%K;BMTTzn*f<8hZai8k?GYw`6!T3_F5MaKhR10`=L5yjogNY0Fge za)^UiA?4PA^qRT#lnjQ4C0akM^yqM@xo=vdoK=VJEbF*xK%B%C|_4P~` zAeZym&R>j5?SwF{#cAy^E$BXqc>PK0lRz;#Z-%l+4w3xD?v+P#1h92GZaqC$IUh)F zvRhgv&ts=&<>)Iy_OHq8bP$yXFGJF$(6~yx)r*TLE&yop={zypx#JTFM<;uNOWCtU zkrOUW@Xc)kInaAA*pjPvSKj~yJh6=IoV<;drKOdn?#o|g_!-K)83aYBkSv0y)U}%PFFioTVx&H|9R=~A`Kgax{SCG5fOce zfFs^=%TD7mN&Q%2&w00A@-ee?{yyhU_PI5Aa@T(4b?eq)oIhX%44h_$tKzDe$HWXu#cxlhu=xi7C$gl1sPJnOM$Esk7cy^IN~yEyrcD^%Ll&xGg^ zja60HXKPnf)eA>Az5$+&oR--wWPT6gGNaqS!YX6h@R{vW(ENHP11sE*t`9BQZnht; zu86q;Z@=ZCgcID}lHG_reusj%a>Yf1F1DMvx=q_EN4|W49~l1M5fl@1(IHe@Has$& zBiYl{1yIHU%#zbJHQMaE#K+UMhP!Crp!xRpNl3zsG$Iz|EgD_ zaI=FZ+5RC1pRmvF5qKN4Vvwa-^d5zE@9M1k?R8=`dxMcub|GVdNJQHS7r+nXrO}|A z1P~r1!d{q`rjcsNKTIyfBT@RzXhF@1%bG<3@IN1T>k+YQi;?O*CLU8 zjg96EuBXorx?&Q765ThKC6$#4zDA$sVT|@bSS7#+GqqyCiy1bL<}b0r_XUUJtTZ$W z3Qql~@!bfaMFCvYoQHUERtsWHX|$ZL@OH(o_x*{ME6q!M5oIqn%X?Qmc7J|VunznN zdM`U0;AsYkZwcfFelwSq{{ASiPfT>{>2Y{CMN%b?QBD%Yc`W zleOY~vAv!n3WTK?Il6D3KG_r1!7Bo=p?TNOuRFiI>7-Er??Q)%+qrO8s9$lADJUQi z@hTzC$CojA%RYi~q0k3JlV(I964KfHuwvrPh{1S97gfYTxUHbpTk+>tt(uo;@qN9m zHb|rve>}L{y|}p0uDZFOp>J9P4s_2S$!Bd}+-nJTTx=uK4!UH&Xxg3*#^h8_eFWfX z23c9e>j4YSDN3A`!?L7 zbZsu(RF0K=eOjR$S@OOxXUp<9>tC9mZ`_|+YVLZyK9mNr4}L*#d!MiDOi}i(1q_~- z5giDHfx-RzUQSxeBPX-eK`%Thnq|0fMve{;G^H=vnO_HtstaVU8!B5l47m(Y^=hBkLVj2(gd^$PxgVFQ7}> z3^}s^Y@*&CvK$@m0QV7~rf_=tc(tFQY-MN1Ms+;u?}_W#*V66)(C??D=cXGP3&X$J z>8Cm#>}yX0LUT-HG0~xQ?niSy_e;}h+Eb4IPJTvJg!;&yL!abn*PVenP!>Xm6)I|K z>!1p)sv%8VJG-ORqoeKZ?VTM^33ToaDl3vUe%M~a63Y_Hu`oba zoBCP&hf4k9rMH-bghZ|~Q`}G?!~4wA!}jim26K|(wGJ<}cbvl(7fKBMNVh91fiv9pM7){@eH)HU>2A_KJ~NUS2J@KyqJ^9Pk#D>0MTdBj4oi#R(k2c)*278wY|ME zPB`H5e@zrW^$jFXeQ`2K0`f??=z$Q-whv8YxI@2wy$1t7p9MIQmBQ!0HzYghrP^lx z_yIYL*00vC(BfB_<*%N%(@SNH-CkWa1bR-Zif?vSk%K4bp9A{c2r90*rSlqE7yu)3 zu(BHFpY-gQJlajK>aVOk{$pc;)+gg`!@pkQHV_klnjkgc`Ndl@idG1Vh7a2SZR5y{aeDADC; zAaUqe0~DjVF+Nn(93Q&-Iy%N9OO{>z%>B(5i|4au zo0I;#6OR^Hh3Ok`3LKH(TtP?Q90K`{vRry;#`HcRFr$x000fL>r8 zMm|w{W@>r&-$X_M!)RfInJIl*rk&QnYpK|eEH0%kXtZI~h96_VRFndx02dw$ODFzQ&D}8EaDNC%qbNgjTgz1v7vUE~SE4Rx3v~=b1P;P&?-^~qo5}_d@ zvV%%LSX9iOe}<%k=-=Ofu0J zIl5_c;p`XJT)wM?R#xJJOF^ocpsxCwBW~t+A76^!!mP><51&Hc4>^ zhSTMV_kc>waKf~+rC~p=+=7C5kNluXu~5m@=ni+Sj=;ly(&>RNkxV23^nuUGAbZ!e zGy+?S`uciCmm-AJ?p}FKQ51xBzmK6zpQrZh>}wW408PGBbjU>T zMt}D+q&O|4G_!mDBc*|WgB({jPOyqG-yOq}r~ZPcW^{SZa11hpLE?udn_F1)(&?u} z1+xy}>q(lw8Pu+1GGwibpMU_BuYQw|*SeO*RjT=Szz$JbPRS(q(R(Gfw?NJXi;ik$ z5~{G+#t)BwjI-*kLatiB&AHv7cMvwUx_6e~7wjLB-&jpsQtt-qI#e5kv%(=*wz9?Z zzl9ndPp5%k{3rnHgFqnI0DfEBo5WxLxbR25DS$0X8Tisu#<60`7LODJp6kE*cQTvQ zqGLqx5#e5ucdG4*0ldNL<#x|A>T#`_HxB%q^`#zigz-B_L@=1g<@(9T78>Oh&9W9B z8_wgneYT+Lc3e0MFy{Al#%#pQe<=E$j!OJaFc23sL9;G=1ySsgFOUHgZ+^W!rq0ZFN5?glen@JO6 zWP)!Fz;0zn9K~sXv2t!GFp%eZKWz`6jgG*(y{~!$Jn1@FTeABz z5@4ETc~#Cx+@H>T=oM#d<+POC@1C&@N1{qs&usdfRFqDzl)_==rKZ2<@^9wM9O^R!2nQ=b@ zH6;$ldp|!IQ=DJ7vjdo(NgXz4!B|NL5PX5|)wK~IB56G!7;SwAeh7K_$K-*D#q_X6GTUaTa^t5ua1|H3SdI%A}lP1hnK^x<&P`fwHwc9&kM z)}H$Lw#*kQc-1?DgC1gHceq?23~a1dsU)GR9Ui9ViO8j%xXlMh0M`EklmKvGSC1!k zxWrcN33{+f8mb0dLSITI(;g=phv3m7u|W}7Lmff>{%fBXNEF;gicTiIN+{db_QVdY z(TC(XkM?y7<4b87KMoAoQ1b85`6brWiFw z0Y5t%2K(*w9Ph4rS;?5{?Oo`8Dwf?dZ;5D(($e{jr`kd!=<*!1QnG1 z^m&949OIP5GQe!JS8@PD{tgb6W}uPR3SFY>nl47qv{9d`lbEb9!>O{-0>oV@rA{QD zf>iPq4=ruI{d(BU1N%wvyw<8vwcXv%X?QAYKNmeq;|6!@Dx`O24-W(1K}t0M_+y`) zq!K1stev>HFvGRn-aa#neClmC)>NY(v1K6gpoWS-3tU3O%*C+ zL=J>(zmb+XH{OZDC%4|;VQ&W}b^o~3d3CbT(HU0Dfp#m;aD*lw#vz30>^;WuR1IF3 zsM`^PP?_+zro#bqf_dLj2U|7G0ClZ>sp5jm%*`JWC)&LcMXC__>s%wSSa1Keu5qbd zIsU}!R(?R^80_wLH?AquG>6K^3Zv>iym-{NQV%2mAe!L6e-0`=_6ZdqDEyVLR(MoHD zLkG>2Maz82hk={beKHf&(Z{cVZJuVf*;G>?KrQ#a?JQc3j4YGJOEFH`*}S=N5|tA0 zk7jwXE`-%pcs1$Ft-YCKS^w!QCM(g*dowR|CNXx_K#3^Kp0*^S*)H`#yX``Ll1r79 z-Llb9+aqsYsIpPbPPD0Ba1M@RJmaaK2=A#^cSzMJe7F2kM z-^YCM-E?I2)B$lbmDVC0gRZOvdjBdf$}NE1Nk7a{h!sh!*k0Doz)4CII)K;>2>!%I z%@9_#>Umy1l<&oukM!kVcBSVhbm|FOuODZ)1tvx5i4s)uqPUJKEFSR3H!u_ zzX$}b$rkyJRcF$9b|w0ordZv>+S}pBfG214HAyzslU^uM>ICo*4UH}W0@|7Bv3$kB{=6b zfj~G16C(Qn0yKgVnh`-R4=;Zht5&wi-yj4_OErt7R5#X<8tdZr8INC;H}gdIIJvj> z2lgmlIejvS@U5?chVOUN(UqSgT(5*hh_%c@ljE&38Vv02#F6 zM91Ho9m29zHV=ldN$CkCDrB4~-P=$`KkZaJ?0~Ip!NrImu(lHCy`TwyJ`CJA>+@r; zs9=vLj2dVI`$4e+@ASd8EJ_-*0;2?e;A)YM_#e~`{1tgEk>wH!18oj9=DYAb8@C6U STxT5s*YztF#&40XG5-g%DHT)z literal 0 HcmV?d00001 diff --git a/pyflp/plugin.py b/pyflp/plugin.py index 6afba1d..e59ed1d 100644 --- a/pyflp/plugin.py +++ b/pyflp/plugin.py @@ -47,6 +47,7 @@ "FruityFastDist", "FruityNotebook2", "FruitySend", + "FruitySlicer", "FruitySoftClipper", "FruityStereoEnhancer", "Plucked", @@ -155,6 +156,49 @@ class FruitySendEvent(StructEventBase): ).compile() +class FruitySlicerEvent(StructEventBase): + STRUCT = c.Struct( + "_u1" / c.Bytes(8), + "bpm" / c.Float32l, + "pitch_shift" / c.Int32sl, + "time_stretch" / c.Int32sl, + "stretching_method" + / c.Enum( + c.Int32ul, + fill_gaps=0, + alt_fill_gaps=1, + pro_default=2, + pro_transient=3, + transient=4, + tonal=5, + monophonic=6, + speech=7, + ), + "fade_in" / c.Int32ul, + "fade_out" / c.Int32ul, + "file_path" / c.PascalString(c.Int8ul, "utf-8"), + "slices" + / c.PrefixedArray( + c.Int32ul, + c.Struct( + "name" / c.PascalString(c.Int8ul, "utf-8"), + "sample_offset" / c.Int32ul, + "key" / c.Int32sl, + "_u1" / c.Float32l, + "reversed" / c.Flag, + ), + ), + "animate" / c.Flag, + "starting_note" / c.Int32ul, + "play_to_end" / c.Flag, + "bitrate" / c.Int32ul, + "auto_dump" / c.Flag, + "declick" / c.Flag, + "auto_fit" / c.Flag, + "view_spectrum" / FourByteBool, + ).compile() + + class FruitySoftClipperEvent(StructEventBase): STRUCT = c.Struct("threshold" / c.Int32ul, "post" / c.Int32ul).compile() @@ -1007,6 +1051,84 @@ class FruitySend(_PluginBase[FruitySendEvent], _IPlugin, ModelReprMixin): """ +class FruitySlicer(_PluginBase[FruitySlicerEvent], _IPlugin, ModelReprMixin): + """![](https://bit.ly/46mngih)""" + + INTERNAL_NAME = "Fruity Slicer" + bpm = _NativePluginProp[float]() + """The BPM (beats per minute) of the sample.""" + + pitch_shift = _NativePluginProp[int]() + """Pitch shift, in cents. Linear, 1:1. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | -1200 | -1200 cents | + | Max | 1200 | +1200 cents | + | Default | 0 | +0 cent | + """ + + time_stretch = _NativePluginProp[int]() + """Logarithmic. + + | Type | Value | Representation | + |---------|--------|--------------------------| + | Min | -20000 | 25% / 60 bpm to 240 bpm | + | Max | 20000 | 400% / 60 bpm to 15 bpm | + | Default | 0 | 100% / 0 bpm to 0 bpm | + """ + + stretching_method = _NativePluginProp[ + Literal[ + "fill_gaps", + "alt_fill_gaps", + "pro_default", + "pro_transient", + "transient", + "tonal", + "monophonic", + "speech", + ] + ]() + """The stretching method to use on the sample when `time_stretch` is not 0.""" + + fade_in = _NativePluginProp[int]() + """Slice fade in, in milliseconds.""" + + fade_out = _NativePluginProp[int]() + """Slice fade out, in milliseconds.""" + + file_path = _NativePluginProp[str]() + """The file path of the sample.""" + + slices = _NativePluginProp[list[dict]]() + """A list of slices.""" + + animate = _NativePluginProp[bool]() + """Whether to highlight the slices as they are played.""" + + starting_note = _NativePluginProp[int]() + """The MIDI note for slicing to start on. Default 60.""" + + play_to_end = _NativePluginProp[bool]() + """Whether to play slices to the end of the sample.""" + + bitrate = _NativePluginProp[int]() + """The bitrate of the sample.""" + + auto_dump = _NativePluginProp[bool]() + """Whether to automatically dump slices to the piano roll.""" + + declick = _NativePluginProp[bool]() + """Whether to prevent clicking on slices.""" + + auto_fit = _NativePluginProp[bool]() + """Whether to automatically fit the beat to the project tempo on load.""" + + view_spectrum = _NativePluginProp[bool]() + """Whether to view the slices as a spectrum instead of a waveform.""" + + class FruitySoftClipper(_PluginBase[FruitySoftClipperEvent], _IPlugin, ModelReprMixin): """![](https://bit.ly/3BCWfJX)""" From 6bf361bec6b5218e56451963c38356a3c874b44b Mon Sep 17 00:00:00 2001 From: ashduino101 Date: Tue, 4 Jul 2023 16:43:17 -0700 Subject: [PATCH 2/4] Correct docstrings, shorten names, add FruitySlicer to Instrument class --- pyflp/channel.py | 4 ++-- pyflp/plugin.py | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pyflp/channel.py b/pyflp/channel.py index ae0c53f..8e48e1a 100644 --- a/pyflp/channel.py +++ b/pyflp/channel.py @@ -42,7 +42,7 @@ ) from pyflp._models import EventModel, ItemModel, ModelCollection, ModelReprMixin, supports_slice from pyflp.exceptions import ModelNotFound, NoModelsFound, PropertyCannotBeSet -from pyflp.plugin import BooBass, FruitKick, Plucked, PluginID, PluginProp, VSTPlugin +from pyflp.plugin import BooBass, FruitKick, FruitySlicer, Plucked, PluginID, PluginProp, VSTPlugin from pyflp.types import RGBA, MusicalTime __all__ = [ @@ -1442,7 +1442,7 @@ def tracking(self) -> dict[str, Tracking] | None: class Instrument(_SamplerInstrument): """Represents a native or a 3rd party plugin loaded in a channel.""" - plugin = PluginProp(VSTPlugin, BooBass, FruitKick, Plucked) + plugin = PluginProp(VSTPlugin, BooBass, FruitKick, FruitySlicer, Plucked) """The plugin loaded into the channel.""" diff --git a/pyflp/plugin.py b/pyflp/plugin.py index e59ed1d..2499330 100644 --- a/pyflp/plugin.py +++ b/pyflp/plugin.py @@ -181,7 +181,7 @@ class FruitySlicerEvent(StructEventBase): / c.PrefixedArray( c.Int32ul, c.Struct( - "name" / c.PascalString(c.Int8ul, "utf-8"), + "name" / c.PascalString(c.Int8ul, "utf-8"), # TODO: This is a special format "sample_offset" / c.Int32ul, "key" / c.Int32sl, "_u1" / c.Float32l, @@ -189,7 +189,7 @@ class FruitySlicerEvent(StructEventBase): ), ), "animate" / c.Flag, - "starting_note" / c.Int32ul, + "start_note" / c.Int32ul, "play_to_end" / c.Flag, "bitrate" / c.Int32ul, "auto_dump" / c.Flag, @@ -1059,7 +1059,7 @@ class FruitySlicer(_PluginBase[FruitySlicerEvent], _IPlugin, ModelReprMixin): """The BPM (beats per minute) of the sample.""" pitch_shift = _NativePluginProp[int]() - """Pitch shift, in cents. Linear, 1:1. + """Pitch shift, in cents. Linear. | Type | Value | Representation | |---------|-------|----------------| @@ -1071,11 +1071,11 @@ class FruitySlicer(_PluginBase[FruitySlicerEvent], _IPlugin, ModelReprMixin): time_stretch = _NativePluginProp[int]() """Logarithmic. - | Type | Value | Representation | - |---------|--------|--------------------------| - | Min | -20000 | 25% / 60 bpm to 240 bpm | - | Max | 20000 | 400% / 60 bpm to 15 bpm | - | Default | 0 | 100% / 0 bpm to 0 bpm | + | Type | Value | Representation | + |---------|--------|-------------------| + | Min | -20000 | 25% / 60-240 bpm | + | Max | 20000 | 400% / 60-15 bpm | + | Default | 0 | 100% / 0-0 bpm | """ stretching_method = _NativePluginProp[ @@ -1107,7 +1107,7 @@ class FruitySlicer(_PluginBase[FruitySlicerEvent], _IPlugin, ModelReprMixin): animate = _NativePluginProp[bool]() """Whether to highlight the slices as they are played.""" - starting_note = _NativePluginProp[int]() + start_note = _NativePluginProp[int]() """The MIDI note for slicing to start on. Default 60.""" play_to_end = _NativePluginProp[bool]() From 3c194242a6608fd970b45f163b81108558e535a3 Mon Sep 17 00:00:00 2001 From: ashduino101 Date: Tue, 4 Jul 2023 18:02:51 -0700 Subject: [PATCH 3/4] Add test --- tests/test_plugin.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 0750646..703aaaa 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -11,6 +11,7 @@ FruityCenter, FruityFastDist, FruitySend, + FruitySlicer, FruitySoftClipper, FruityStereoEnhancer, Plucked, @@ -81,6 +82,32 @@ def test_fruity_send(): assert fruity_send.volume == 256 +def test_fruity_slicer(): + fruity_slicer = get_plugin("fruity-slicer.fst", FruitySlicer) + assert fruity_slicer.bpm == 60 + assert fruity_slicer.pitch_shift == 100 + assert fruity_slicer.time_stretch == 4300 + assert fruity_slicer.stretching_method == "transient" + assert fruity_slicer.fade_in == 56 + assert fruity_slicer.fade_out == 5 + assert fruity_slicer.file_path == r"Z:\home\user\Music\audio.wav" + + test_slice = fruity_slicer.slices[0] + assert test_slice.name == "1 - Beat 1" + assert test_slice.sample_offset == 0 + assert test_slice.key == -1 + assert test_slice.reversed == False + + assert fruity_slicer.animate == False + assert fruity_slicer.start_note == 0 + assert fruity_slicer.play_to_end == False + assert fruity_slicer.bitrate == 44100 + assert fruity_slicer.auto_dump == False + assert fruity_slicer.declick == True + assert fruity_slicer.auto_fit == False + assert fruity_slicer.view_spectrum == False + + def test_fruity_soft_clipper(): fruity_soft_clipper = get_plugin("fruity-soft-clipper.fst", FruitySoftClipper) assert fruity_soft_clipper.threshold == 100 From 76bf0b5372f087770de696468054b2cd643d073b Mon Sep 17 00:00:00 2001 From: ashduino101 Date: Tue, 4 Jul 2023 18:04:34 -0700 Subject: [PATCH 4/4] oops --- tests/assets/plugins/fruity-slicer.fst | Bin 0 -> 8458 bytes tests/test_plugin.py | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 tests/assets/plugins/fruity-slicer.fst diff --git a/tests/assets/plugins/fruity-slicer.fst b/tests/assets/plugins/fruity-slicer.fst new file mode 100644 index 0000000000000000000000000000000000000000..d42446959ca36f2bebf2eb9692f6fc7175a5e9f5 GIT binary patch literal 8458 zcmY+~4{+b}9mnx+Nr^71rO1d03(`sB`}zO*SVm}6SUN2kp+Q;+DWTCOL{|hsOp$d# zO-4)+UC>Tg&}!F(wkLDl)buQy_SU)F)akiwt6OLL+R6Lq!TACx3XnoLaUl37*tEn|gAvN=zR(zH~SDkEI-#LH6>~4~5*V%9Xe>>pok8>w{eGz^5QxQl7_{#vs;%eysCD7YyHASr8m#NX-4*EOcI4N3eRqs-%=>DmnZ+t-m=}S&M zJT7D)L-Pl5QDmUffxC`~Hi`_C*mv5rxR8O8Wg}3?K&kf5BjXJjC_SW)iVGPile-HF z87N!zz|rxB43z5%`Eelw<+uM03K^)7zv7$GMw5X~YtJ|)E@YrZ@86-2ftI@;IX2#q zfmX#c3*tfsS~qaS{S^us1Tp$hS-c^GAWO==7Z)-Js(BO&83aAh zeMY^`(x$th75uqI_IpokUXUS*9K zvdgaXXF?+gk;?7=#6}b%Rrya>z>Y9Ps%tMe2O4pR)b#!v8-a+_?tX3-?1)69uDJSK zXoMnC-;`8BBNmZ{HT}?{!=p&YYR-#yf?b606VHdnE(g3j?4m;72sA!;3Z3rhygc4%cG20t_$#2Xi|$K=7ueXv_|$O105*29zP7FzcI;w9Z{Ce@<3p=(>Fz;n?BYam!(!O6i<3=Lmq23| zr`D{;#x72eEo^}uyEx;IYK6uw&Mw=8ja{7Ec*9MwV;ARhj=dQgySPxf85$pCg-@3+ zX^VHBUA)+K{4LPf#mi~K*x1FZnzp5|V;8S`ihcx*UA)=34I8_7TXgF(*s+Uujni+1 z#xCCXzmJVweAs)(ZSjr|w<4sv^mb_M5=7gF*w`h=b@#Nxj$MLE)E&^+CFqKeu(3-p zo%i1fJ9Y_n*xdzU)|LKJ9Y_SW!c?PlYHLIE=NYOk&DcZz7O96J93e! ztUv2sXyhVO)%Phja*?Ut^H?YB$VH|mopm2Ha*?TR`5YU$$kYu!@nhJLi%k9g^Y4d7 zE;0?}|ANNnT`AIzr`1zx zv5T+;FJNOA;p#5^3GCQK_*D~EKw}pXM%O~)^RAR>$rV41cas0UNYOm08ydSvIq)hr zc9Ck|f`?(pE>f2r_6Rg~k*56(Z0sWK&^3?3j$Ne7owgDhyGUQP5gWV6(AD%U7zA*w{sjjkiAqJ9g1Br{ovV*hQ<#9oX1K>*XC! z!;W3F*_N(?#xB}U`!hCn(XQscXJE%J+V_}ep|Oh&J9k0j^R6^$(Sy&$JHswUG@jlE zja`iF{}>y)7`1oB^RQzVqxG4qp|OiGZJ%Ic7h~5w`b*fci*ZRsKQwkRzG5#nb}^x| z=Y@F3=Ur*j;mQ}Gv5OT`{(+5MtgL?OCD^fxRV!z&fyORYk9>iRU92g5b}j7K#oGD{ ze+7+Qtn2#{8@pJ)XZ6dlV;39JO9tY`=UwU2mIGgb#x70_zJ!fkoZLU}RoJnMQ{}n8 zhQ=;VcMM=-7iYHA4Z@CHoXtD*HE8VO+??02v5WKF4X?wFU0m2P^^Lgkc~|tM$&UamT7Jv4UlYIGAecJaDo(VMVi7jK%6-2jbUydBt#ja|Ikw`3#i*v0#@ z!rwq+7a!V(q49ZFhIFWHQ@ji85=8DvzlFvwL00`98@mM6b?Xr9*d^%g)8B%|F2Usg z5gWS%TYKl*uw$3tdP_G$W0&A}e~67;LMXm>OSDsb-pwwX)K+NZqEfNuqo{rLg8<1_ N-{F!Z`w4;U?SJ^frjq~w literal 0 HcmV?d00001 diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 703aaaa..ee33765 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -96,16 +96,16 @@ def test_fruity_slicer(): assert test_slice.name == "1 - Beat 1" assert test_slice.sample_offset == 0 assert test_slice.key == -1 - assert test_slice.reversed == False + assert test_slice.reversed is False - assert fruity_slicer.animate == False + assert fruity_slicer.animate is False assert fruity_slicer.start_note == 0 - assert fruity_slicer.play_to_end == False + assert fruity_slicer.play_to_end is False assert fruity_slicer.bitrate == 44100 - assert fruity_slicer.auto_dump == False - assert fruity_slicer.declick == True - assert fruity_slicer.auto_fit == False - assert fruity_slicer.view_spectrum == False + assert fruity_slicer.auto_dump is False + assert fruity_slicer.declick is True + assert fruity_slicer.auto_fit is False + assert fruity_slicer.view_spectrum is False def test_fruity_soft_clipper():