From 2dac2b53df71e22beb42df09cebf9973da76f555 Mon Sep 17 00:00:00 2001 From: Richard Ward Date: Fri, 19 Dec 2025 18:03:11 +0000 Subject: [PATCH] generate noises --- README.md | 12 + scripts/assets/audio/sfx/level_up.ogg | Bin 0 -> 5780 bytes scripts/assets/audio/sfx/menu_select.ogg | Bin 0 -> 5048 bytes scripts/assets/audio/sfx/power_up.ogg | Bin 0 -> 15335 bytes scripts/assets/audio/sfx/swish.ogg | Bin 0 -> 10181 bytes scripts/assets/audio/sfx/thud.ogg | Bin 0 -> 12934 bytes scripts/assets/audio/tts/continue.ogg | Bin 0 -> 7203 bytes scripts/assets/audio/tts/game_over.ogg | Bin 0 -> 7043 bytes scripts/assets/audio/tts/level_1.ogg | Bin 0 -> 8140 bytes scripts/assets/audio/tts/level_2.ogg | Bin 0 -> 7881 bytes scripts/assets/audio/tts/power_up.ogg | Bin 0 -> 6652 bytes scripts/generate_audio_assets.py | 359 +++++++++++++++++++++++ 12 files changed, 371 insertions(+) create mode 100644 scripts/assets/audio/sfx/level_up.ogg create mode 100644 scripts/assets/audio/sfx/menu_select.ogg create mode 100644 scripts/assets/audio/sfx/power_up.ogg create mode 100644 scripts/assets/audio/sfx/swish.ogg create mode 100644 scripts/assets/audio/sfx/thud.ogg create mode 100644 scripts/assets/audio/tts/continue.ogg create mode 100644 scripts/assets/audio/tts/game_over.ogg create mode 100644 scripts/assets/audio/tts/level_1.ogg create mode 100644 scripts/assets/audio/tts/level_2.ogg create mode 100644 scripts/assets/audio/tts/power_up.ogg create mode 100644 scripts/generate_audio_assets.py diff --git a/README.md b/README.md index cee5bed..632c77d 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,18 @@ Minimal SDL3 + Vulkan spinning cube demo. ### Run - `python scripts/dev_commands.py run [--build-dir ...]` (source `build/conanrun.sh` / `build\conanrun.bat` first if the Conan runtime exports env vars). +### Audio assets +Install the dependencies that power `scripts/generate_audio_assets.py`: +- `python -m pip install --user numpy soundfile pedalboard piper-tts` + +Before translating phrases, download a Piper voice (the script defaults to `en_US-lessac-medium`): + +``` +python -m piper.download_voices en_US-lessac-medium --download-dir scripts/assets/audio/tts/voices +``` + +Running the generator recreates procedural effects under `scripts/assets/audio/sfx/` and voice clips under `scripts/assets/audio/tts/`. Use `--force` to rebuild every file and `--skip-sfx` / `--skip-tts` if you only need one subset; add `--verbose` to see the internal logging as the files are created. Override the voice files with `--piper-voice-model ` and (optionally) `--piper-voice-config ` if you downloaded a different voice or location. Pass `--download-voice` to have the script invoke `piper.download_voices` automatically before rendering (requires `piper-tts` and network access). + ## Runtime configuration 1. `sdl3_app --json-file-in ` loads JSON configs (script path, window size, `lua_debug`, etc.). 2. `sdl3_app --create-seed-json config/seed_runtime.json` writes a starter file assuming `scripts/cube_logic.lua` sits beside the binary. diff --git a/scripts/assets/audio/sfx/level_up.ogg b/scripts/assets/audio/sfx/level_up.ogg new file mode 100644 index 0000000000000000000000000000000000000000..51936319a08182bcf408406b623e118360746470 GIT binary patch literal 5780 zcmb6-dpwj|*AKZT2}zPhQH@NDP@`y$OPGim#AvO~z{tR+pNC3h*BqA{UNC=e@LPx@C zmB63%K1)X{Yl0aNrG@w(3_MH`lN4#*XkqCp2FXBB^m==>y69)ALU@BSwCBFut9|&LzAo>f5 zux61yky{8T8iWF}yP)#4T%)C3qh(T~ZG{eANvGWq)k!dR-eyL0vF5uF-H0U8Q7S)z z%Fm>Bxe5_isz(L2=bw+zb%Yp{w*iy30hzWQnKrZ|O@bL$A`bb(A<5gEG_)h-jctlf zVA{dsnE{E}*DqziE6$Y@vOr>h1%`oRNh8Nn0*Q09IMg+Ibf*eOH^Z zaa*TRi?RdW$f5JUc$`&E3-bjyqILOTW>B=uwp3qXSfYViwR{;%dC^LMAtC<_BKukP zR0~ES`)yvaN>1m)M3(AvUcQ*>tHs@6xkuTC1IWHb;aVSIUtt zE$#rc)gx?$hSk1+FR&w9y13gN$a*}>9==|s0Nx(kD>FnzFK-+W)FHC#S}h)R+2Q_(8aO4p>HS4hu8HzEr( z&!z0a6~{OcR&V0a&j>w7KoC=LaTaUEsre;n6|uwRbgvhrCFwS8zSV5_R1Y3X9=Do~ zl|5Fpltp`5mgk}RD^%(Z&Is;^%0j94yq#W zjNIalo6v4sv9^8D(>AFAl3A3`!el18MNmC1GJ5XBl3p8_x7-HGz3i0YqN^mH*6R}Ltf^_Y|)+kaM0%Ih5|8|>1w zJ<>J`E2sEU?r8DV|5Z78hmwl2l8O?NMiNpsCuRmFX5Xl~dbsK4*xmp5{9QSqV8CNd z(6;_Z<K@sLA9y!d*N21jVGY^1Y}wtPAU2IfNx6ES&WF-bE%4l&?3AV^#cDMqP!zQzgsJB;vO?AsY;?R1h|r@gbXHIZ+H zCpx%ssqHQluMVTm=it>C??S{IQ@dS=J=6A`nGRiiDxS#js-XHFqxQ_0b>0TA)LuHt z>nOE*hT_$A&PJ%p4X9!`xbdmZ3@S<4x@#rTEz_ExL2=7u9LS*bc3HJEtobYwo34Uh4h-7?3sxT5L(qvG;VhxbrKn1 z-5vp~%8g3_l%VKVu~ zjjYI8sQ`=5b+?s`kad-4?wf@*$^sDMWREYd8qL)b=KO=TX_2kftsKFh3{$9xUMO6Q>lfK7tyDH8N zPDeEz9^13-#Ffv@ch7zN*%1EIbmVAC>x8^4NGLcr4D#hw)c;%$B`8Bais1@qNiBjr z=m#7H3)~8_qTxt^f3uw|r$7~Fhw_uR7|vofW03i*Oba9`R>^ZIr%n|YSju$`4nheO zal!d4HA^I_P!MEa%2!8AY0>uKhS{LIfeC@($aT5`;XMKz=RxHKD&)6pmb|I%S|$sp zi_T#A$rsnT5|X$DF67|yx2ojUe3t57-EuHNMZZ-eH)G(%*`mb-z!q1Kpg+-Wsc9`d3lOU=psKh&JGk{B zFN^Gm5@?W{&FV9QTdHQVy;4D`%kKaOQkIhxC|g-!*)liRt1+dt8rbR25OrBJf^Gvl zCKXqoMN`Bzv16QYxJv-DL$cCvxYAex4p+0ouC=!ao?Pp7Q# z#+2@I?KWlWPEeH*Fs0py$ge<&C?J7hiVKm?VDu`(7o#qa`7=Tu1}F!IPC88KnU3l- zB6cw-pwIg<&}9E2tz)NH3^}RdK#qFYk{3tk#$3P1rAiYLzvhXt~4gYX=Js z>6Hnsl7b*#c?&76Sa}O@D`Z*NB6T3hr&bI?)G`g74mIK+1h{D;>O6x>!C~oF3~Yx3#XxDpBI5x7s2L5`Y^Y8N~=c&o-F5bQV^ zd(a~YRvH0UN^G^W5&RL!Ij&Y~Ok2ai`>6!?{Jhr#W{jH^m6H6D3In}C^Hx#0HgR9f#I zd=n!*7%2w5TBZOg%9^y6rO{n?sP7ksNgImBCZHSGGzCz=RyZ_JBfJmWA{S`P)CF2T zi(n|C>9CwYiNbtWvDzxWCWxCIFy zCaWcsg@=45tOds4b%mHNM+JgH2f&f&BXQZ^#e;cnrOkue&D_DCixqZJ*Okgn>rbmbCon^lCbPU5GloY^{Vs%W8jMzQWS zBxhUuPiYcu(v>?ErU?Px^5Z(IW&qfIe;dh{fT#jfC{tkrcdUMlZNDUJd%0Pds zJ|3;Fk47698lll>LzDqp-^dVUXrOO^HrlogZEUd1%gC^8ej~!#L!(F*1PZFXb3Vtq zeulR?fbG2`+oSr0TX9r?l!lKiR%kg;|IprHw`3$8gyApKuQT%}v?i;#&kKioH~cGT z%QrSvi z1E`&*&NuI*Ew%XA;tkK3%k~}o)RFZev3}pu%mrTXb5lL^ENq0eE7z&>$X%u1cld!% zR$%yx-djhJvmZ*2?fAG@{f?SteVSn2LT{gw-KVg> zz}!Ypc}N@D0%60p|B9W0bK0RBZ~!E1PLHPY(pTjgc^jQlGY0~%3e4^tS|;2V>|fx7 z5Q4!m{KV*fIT-)oGkogOpW#n+*U4$hn#cEY%+FpH--$c367qQuu7N^Ob6oc{e$yHl zSN6cW{_EzO7UMZO2wr?Yr?)<&((#86xD_lw*}C#k3>8?$R0*$eQ!WW_*)($gB52J} z-#as@PaSR-2hRMwZ4S16cC3HPf(NzL`W5Z-99V_SP)^UCeY+{UY*c~${Cg~!$xpE} z-OSjP(7?t1Q@>n(^**LY;TkOP;$#S(7t#J~g$c-(C-?k^luisDkI47^ACqb+PD;jr z)5_JKI(fF$Tb1>A{7%y!sRE|lURa$7-lgL~dTDw0IrW$rOq(6Q zvb&>zeKH2#yFRttspZJt`l&}z(Xd-0z`AwQ?mI$IvUc60#5J$zA+yg8ev%%7&DBgG z#g7vl$wRR}tpb7H?`r0d3sPm|-;tm#@CB@a4W(VyL^pZkIo z6R(0(+I}Bqw*T^1&CwB2SAwELH@wER5CJ=ssM6lb*e0O&Nda@7c_qpJsCjr(Zjt?= z2li_bfvf8cZ})Bw{l=^EJ-CLq6SH8=MSqXkb+uBiQ1q?Hj4KPJj`iCzcZZ#233#G| z+})#k>`ztP$}q278*{OsxqfbGf4aIJ96S+JSp4z)xHyCmd*rlyN>^#?U(-ezyzIwB zOVCcek$t12&lPWW7gR4VTQD9-y^|ibO99i^A5ZrX1I||TGw?Nk)z-;?HIX4ZY8N7~S#;k-8g}kY+ z6$@tNF|O~wR}ys&y!wdy4s}g_I`>DBgr=-_yJb^@PX2`&=`2Yf*74zCuvH>Rs0DoHiYqL(XBU`8ZDZj+>^yAZf&tIBV z2O;_E8>ySr!D%|RtlxQ!ltLMO{=w&Un|_j6>o)#sqn+O570hpG`2N2Gi@uR68!az;JbhPP7t2!mnWP*GqmR22R|j8 z1Z^L?s%`Ym&l+WsHCWkQIYS%g;g_L1QI}1|r@vuhK$N}!AGGE@lxu9Pd{k>^*Dx>s zy%|?WM~k!XJv5aL9ZqShnTrkYw}R8h!2+t+FtzOu>Xo-B(^cQW$ zPJzoGprWc9dwWSt?3($w!pJK>@V;4+d0p|9@VO-frt3$J&1=71hnKurb=GZp?#Rb} zU^8fcPc0=*JABtnddq$}aY6(7__Ol;fj)oD@1S!CA^M&3dCJL+nH?z#AYRAJ8t=)7 zU%EOMF*dFo^o5!b*7Nnk*Mq1Qw18^49Rf)NLFFTBe!KqV0jKECeNR5k1*ktR&cE#< z1!-oUNI!e3*72Kh*ph&8_RbN_HDvM!yG;;I2M7(A9Vs>Wc(i5G;-={Vizkz5Cn#M* txwmv~>JhG#1<@+*U$YMOYCF5lm)_R9ztV_y(MGT3{;(M@+4;2+^lwUH8&&`S literal 0 HcmV?d00001 diff --git a/scripts/assets/audio/sfx/menu_select.ogg b/scripts/assets/audio/sfx/menu_select.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c3efb9c60c060c3eb7eb3782eb5633ad72e4d7e5 GIT binary patch literal 5048 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 literal 0 HcmV?d00001 diff --git a/scripts/assets/audio/sfx/power_up.ogg b/scripts/assets/audio/sfx/power_up.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f8f93bc97481da6a19f76fc54d3122a441f44c7d GIT binary patch literal 15335 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 Qu%lvUVua?^HwnQ10kX0{^#A|> literal 0 HcmV?d00001 diff --git a/scripts/assets/audio/sfx/thud.ogg b/scripts/assets/audio/sfx/thud.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4999dfcdcafcd02ba54a967791ae31ccc020b194 GIT binary patch literal 12934 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%0A_SqA2K)sfKVs3R)2N)D%|Hqu*$~pC zw5F`oWBWI4wRL;%!@j?p`P|e|!oG}NZ#t=F>-(6Qb}7eaq%iVw7zk*BWLW?{n}P*j z)ITZ2olH{9%o^NoMejPc-2D26Kbz+1{RChsk~twMun@GIZ|@)=0 z0;@L9UVE>KoD&$b9yo8&Ooh@VWEuuc0EvLFUuVajWMi3$t)bBDL20RSnA5Xm_Gwo3 zN5qQg7-^Pf`kJ@Q2m)|AcOhQOedScc;m%dR=e^ymFE%p*V6XZg2-l-e#bPEqhto*h z&l^R1i{C)2Dj(=Y`ErXW;rUo$`Q=MKjmp%Zeg2Z}*2=J|Xa}wfq)$a6i6OcII!#XJ znC>oh{R)SL!&tWCPXpZ3PmXQ!t~+*bkG#C&zCb2tu<_$86<08He_Yi;(t+`XC*jR% zs@Xe{x#tD5XnNshks8%Xb<&U@ftGUgy6Cl73=G${VdkN+frIzN+~K9>ju_Vqjv^%y zc?@*`Kkim7zr4oLl|7anAdvmKZ@At)_+4L6(llDT_Q`gtmhEIUd-%5`LMsYk5sWWL z9~+W<8(=)3SV2M_-A6)C+XBz*PPl7_67*|9kh?mA={J@%k;9n-6iOLJGWD)M|C z{9#jeFpXc(a#QQ&iel8A5|eknNn~ZdMX1Yz3#rpDTYd<%3fb_p3;|Osu6v75%XVjq zOWQ2UwcT~~zL!&T*c4{aQSzwNEpk3C`gP7BN}6WF7zZimO%C+k^AuESOMk&c?EmB( zs*HKUeiWMEV!)f!D&l_o-6+jrr6dWZ6qIAHpRN%7Ra*WfS4XWS0fOA z>)~y3F&DPP$Jc6GauBi-SqU9lz<*#dy<3JfBZ;+Kd8&|L!i{1^md8D>yZfV_Vpc$H z*|wi;s54OfNnM$~{^RkiyrGv|=PMlJd>UHolNT(qLh^NUr z+0$Pxmt&sRuDMT~^mL6oDVD+d>(9jn?<_%|*d9z-`3If(&7u9Ffq4YH`K%CWT5gql@!_LP;3Q4LW?mnDQk-}HIM+;5 zyd5uGM~JQUJJ-_@-M}m1js}Z`s29aQ(ihpvEXCRE^{g_rYVx6CB~hcw0fH8FWw@5@Vx_k>N`2bpKjgMM*i!_a^gnl}D7z=xeH1GRtSC7o0lN5r zBPO6*P%D+k#cqxd&EnWSAz8*@aIqg4SC~&#H5@6_p&i=LZYrp>JW+pG**zqa%}3Vs zX9-O%!qjP{N6K4UiB_?>_@E>C%YeU0^|X@jukHn#Imck0rSMU>|^$>gGzzpCdn@}PgY)A`tY>0=IP0Xr4KxI-dg=rx98px)Ru(4zm@vsvJnww)OCD<#HO~XL zYJ1xRqDtFZ^;=a4(W3pjn~7wTcW!xQk*XbquU3LH8^qRXqh`Fp zqf=V@9(l}}o+bUy^(RC(92d^3i{g{(r(MEA-&@Syu1hcudlG0902teJFRLXgiDYt`edlV&WnR| zJ_XprY3A;CVH1q7{sFY(%N&;T{uK%zwJyB1?iWvS@}J;q)c?>hakHY!FxpzSKck#G z`_wazIal}lb6so>vS+AbdOR&ZXT}8WQFofNKl!cwwS{}7g2acDxs0}R^362iLx!>9 zf~0be1US8I3EqNL;ti8CN6FOXj8U(6;M{!mrK5j#mj$a-vA!%O=>#1#3H`CIqkr1# z=+AhP#0ehgQ=Z6kkBD3Ak2mFNc6n80PZHmye|h*Ci_w#fWD2xMh1W9#3_2aTl(7=Fe@|)1EdOE*59_xocMx zQf4lP{YMd%!ODhD-%&`z`jayjV-hpP(Nmsg;|(>k7u@&ri5-k@J+uR^@PIMwS{$6V z9bKqK!bUuN$rR(8iPDDZaG`#%|4(a*Y4vYu@~&4l(=-{$*;GDR0mM^AyqMk5>RFGs z{7F+MWvY$h&@<~?cx+ei&kh#&X|xF@Ig2!NVui_Sq>!IwCLhr(YM7%yBj z=@ix~pJrA_VR7|FypU&2L`~kQAH!r1OS`Y7gWJ6+I~6$AI< zKFUnk$VjL>xGy@*5pnfl6O$Ag4q1Wjp;)_xj1tMRy9{$Wjcg?IRykei&?W zlt42&KT(n9hkPo+1O`$}qcsq1cX#i2(4>Fgt0>%SP$=_npds;JK5y#2 zY*0~qLL_C}tP6cvraCXC?5;s=&wF19w`P!WHPJ}jEL)ji%1WJ0(NNi9e$4*l&z%t7 zp5cIRYjS2ror1K5! z#-F%ytwJ551YOm~D#)nZ;zkN|CEVw5^O#?(f^VYwa@KigYPU{)HEh2~w|eR>^(#;8D+Vk{EaTgE*LU7; z*x%_Wp698Ot3e@wh6P@?wJIDJYd#5R&M~zz@(G*>!YUsX$KMY99{DTeOZv92^N?l9 zf#qa~1~oFIO6K*W$CL0hO7`s6eAEo~oPcwzr=nyPtWB0^;Ib3OaRD*QsOEy;WQT#4?t9>07Q>7%CkeIAn~BjOdlpmrEUouud> zf@tQusOQu?Jjsq?eqp_OfQ-nySP8F8y3>f?>KW2TSh}FQ;ZK4rayFPUJDg*rG}erF zZJtMm0HrbeghAB{_Q}kBF;;-|!0BbBy|lEh?}RDUKQ|A^|9$fSUY!6jbJ66tyZT2v zyFc`Fc6Zb@);7GaudSXoBq%;%*_SHZFAS(L9PN%RVr%zer^n01vX`v(0t zvE5=!(8NcKQc1%g&q^=>Dg;6?B;~Wf<3=0|4)%Sh5WSGS(qRL;qI<*eg`Z)Y>W|S+ za!-8qn^ADCNxndSS#32`*OWDu((E7d+}?q)P|xA0Sf+Yp-XNs zM@=4hW&{E57s{1TA(qp0jJfc0aDks&qf zGyX2OMD6#dFd6Kx)f)@co6A%a;n?4uW5w})Z^7sv0_-s2=Ood?5R{k7cDDP4p&cFG+Lr1{{As?EGY>Xy%bMP z53JRfSbo^yKGzX}d%xZd2rS=&wia@6TC+x^mdPsrejiiiO1d-9NUkEpU|8rMD(>OS z;ysmR|I6rAB7C;(QR>g01LgBqt9W@(AHNTS8j)uMKeIntGzQ<3AUONQ@A~OE3*0YsZOj)^;+vd~R@5VAxrp;S#QwzNBy74Y?X*H#lKXC@c*`GobG#0;)pumOhXKIPM_R0@A>0FP$i+kD=csBd z@0sjO8)fh981v0PKd`3)(jS)vvH~jx^gHyuRKN@cz%WTM*9RAiP;4pZ;{1Vu4%D5d z)$2rurArSjsAVV28qSU^A4-vHQqrHiV^1bXVw0q@HSW`{VtMxJS2@q1C?jq3ey;d3 zmIU4BH>vaU@Fh}XTt-`+BbE*ST;jull2*Z8i#P6HEEI?^nKS;`tC{Qa4Xr?uB};a%Jz}(o!#WhsFix)Eq5D2x}KsjSc{W#Y_WjT&d$SieUnnk0v2zS@H{gzt-n}2U_&CQ-zGw z=`$-O%lS*B()hE{G={Cck)5+-5zuj{@98b}Iqc81lAXHXPTo=1BMsxeo0J50{`$C;O9#^4vn;P(p5J=W~>s4=`Y(LcktcLSZrHA_xi`3o0VHNATT z4_~sF^n3dECWXU7RXYRZ?2_{g1z5~rI)=X#rZy9ma<2q&X{xBY2~`@TBsdu$M&2n^ z4GdqsiVrGwf)?e=BrEJAPbZZ(Xfc`W$qd^PX9e# zRyJZYKH}l9&}ehkgX;C3h|P*}!kwa6x{P0+gTFNKSUw9zMEIDADA)GHP0D(Ewn#gn zEk%SZMqe%$$J^Y;&gj;92Ks3-i3d>#pCJl1;o$74ksvD<7wnNL(iF|Z{_N&(CDp?^ zs#f_gq;yq&TftKiflxyfmo!$A{~%rd&!?4loQ>5XIgfIDRQRdQ0w{nyYtl{yE*+C- zQZZ?w=RoHn;dxHi<`YWUjjwJUzYX?ECxi|c*BADWoPUkcXnDgw*Eu%w#V#K|9gt{Z zAP9`oy|B|vNnXwwFBs&YG+~L}9h09b*FY2qaqK?JPLIb_JA;V0^VklE)TFvkG&P={ ztG2NAM?Eu0d`0faX2o>3#Zpsfr-7B4!4^mO+FkJKCWg zCcF=@2Q4`6oIg{^*h{;kp&)|>&_CimCQk?Zd$r$z7w4u0{&U5vX%36wlJzmR)>9#C zet0&EvvGFy9=qDtp}zxj^h9`xiCH(xf+H|uIYX~#)G=#9P^U#UHJF*JHvPpW?fJS( z%tUyG<5_x6&15jYDsrZGUbz&{*MuhiQAsynso9akg0@L0LeE=y-NNSe;c}Q0`?E*x zq;82oJu><{;VV&j&3FUGFyaJB5QA3nA1|o>z#*b!J=ZB@uQ4& zFWQ#GsgY-957uuy*q)qe75AeS4gMB55O&n|BQ@RCln}V0-k0L_y{R z73U#pFYT$XqC-8;Dfy&wg)te$`1C+mbUEmCI8_7{mpPjxjrvick}HlBu{OD0w#M=$t6&SaI*>D*lje&x7+~7>4h~D=QASVnjUO^R*j_h#GU_vgCUY<3jfHdp-E9@~Sx4p|dL2F=#^;7yNecMcoh+8ZhAEj_Pe^KcW%8FB zJA8W^-C$(h%nu(4(~g@wvuonl>k=1@C^TA^qPm(0jpV!Y#ZHrOQh)MNJD#UkV$vC% zfPO^$jF}Og|3fnxVE4d4S7IKPm`=qEd8?X7@(em{cG<(ao8u)&XTPx4)7xb+zZ*he zL9vg)ZKS30P`Mgghm7l^l2f<)q?pPfU5uyrDPkms{7|t|HcY|BvHRdo(nQ_xm44+L zlhlR$#S>a(7n%LSINn50zn)2d#`27Y+ zP}&PL45QVv1VMFru#&d|@!_a0W$w!;@mQe&^G=8-c$#`DDf@a{3GXv50YpGr1@G27 z$>1jrdQg|k3!V;Eq7ISe3o-FeZ+B6s0cxOGydUk?N2`Y-CG)0tSjYafGxdpU8~s|R z{^M)9Y4X*`(GZ8Ug}N|>Nu@V!Z>HcjNtg4RU-5G+t3k#MQhg#Q9u-Pp z#a4WlInb>0_WQG8W0y;jAJP@i=CI=L=|sOuzz^_^y02J-Xmrh;XU#}#SK_jWq+fZp zrQP&$+|9bFV4Qb5lQa5Vouh0h$HPyu8r%l{f9Rd|t;z zz4L>DI`zN88{NB{;;l7YIR6weuUM?g*t@+iIByYqFwx4X*ZgBlGuWZs)llN-F-?Eb zd#2xZBR^Qa3g|)}5;Hq9yv+Ee`Vo1{=pOxsdU49=e zzTIQ3Z{4rj6hQxQ{`=_HtYh;8|2G9JfnjX(nmN|Cg5^n>}4D3 z>lDa*8kdtaw?)Kjz5wXYvv=&DQsS(90+%@jo&|@XglMkDa?$`Fy8=mtz0(Vg{*W); zjPq|7g6;U_{cE*Pn%Ek3f*XBx$KT`zw|b{da10;>o-p>p(fcQp`1UA={ZS9{^MR8?s=*TI(Ri^<*K3evB8 zEM2Z7u6+xLC9{t~0yV?t1&=s&qZm@qqwRBt?_sJ>7LX;9Md1QDw&Ey*3VfOmvw$`b zp!;SXUD803bv%p{@RDPyl@MTCTG`RB)YI|z)Np+5X%O{!!{lV3?AJT$I-I@apP2Nm z0{O(&n+p#GFMA-x;d1T$*7EimVudOR``Wwuw3eG$+Vkssdj{l4mE ziSD%T=vNygWpBr$dN>CeEU7BrM^)5DW0)(gjR@KlIE}yg%a>rlxv~QeG@TjXdbOt(e^_+_VGb zb;0#`L`_#v77b~nwa8ww3q|cg#V3xjHOEqZ&iC4g-(I!C_(RiDxLv;9u4T4v_bf}=o_o~b+v-%j;r#)ht>M@^m{)bi7?FO(cL(u!HH;#tQB8|qSieXi^~FM)>;V&2?VVEpSl z`s?o`uD_y~%Ma?pj442-X8ZYwpLzyEX_mllJDJHi>P8@zQ%{s3z;6~>AU)mYpkvgM zf6%Vxv4)+n;Lj)rJ(8vUW`j~`r=1+MM@Ldq$EOFEQmpciv;|Z2Xg?+`pYsyOv>QZQ z$b~e0oYd>mvOBFPMi5UKpFX}~FvV{iiD}VWarj&TXZ}b@aw77yYhu~$n~hlHemqHE3Ev(Pk`C#jm&{kcDDV6Ih9S_~zjvCcKmWItloHX>&+x%)6}jJ! z#a=kzLEpAhEcT7iXb^}<)_%lu4kEnmXu(#JaYUw07&Zsug#hF?WTDw-`g0`cv!j^6qD}6 z4Fqc=yq2j4`SJv^?zzKWE9@h)XiOP$L?Y#I1v%9(aO-4wI!5FvbonTjKSxK>8#17F z?$LX@$)Et$49@U}p)f`L_8#tSl8ylkm@!9a7teq(wG2PwEiX5YyOw5h&mVb~)`@-F zoAPD{E@_O4b*6;L+GpY^foEC>CRTJHoe(JSDNJ>v=AGcwE3CON&Gi3eA0adP^>RnO z1toUgtVd>MSc8kie;>Ll9n{+wVBuMPH>aC5l{Y77A-l5><6s^sv!~g=98M2)H4_}y zGidUG)=H0LBvKB&^qHACwX8!sJ-?7-?I)5X={=E^Nm$U@`BJ_#j5h)ytZ*QQ0OF!; zIn9d2XoGQDf|*}w(|0nmcQWWrqag%h+S~|CApLpVWrKa$$$-yKKCN>Xf-BeHjfhbm zbIj4^cPn}>rlzJFxhi&@47I(TWK}N={d_if0xw6KdbH7#r>TJ7PfR}$PP^Zt`nW4Z zvu)rIX9<~X%)J8t($*MR${&?}8@L1H{&(Fb+zBJL=2sMfty$%X6Rm+`sO5&YaIVpZ7Vh^WM(;eLl}vdwbgfHt_EygzuCV zt9xN)r3)qnJ9jqNgG6S%fbDZ&Jpj;r_~%&+vu3UQS7EJ$K_gqfY9#@})_*F^?0;a? zA*v%O@QjLeus70=pz$46Tif@p{lwa)9S)lAjlB#~}7H%nkRCZ8td$X&Rnka1S-4EBhmgEcPyrI^P02cTgwM*tCt?uTYFb2R4YXog6_AXL z$XEmxngcaxIu&n*F39jmK(|VeyD+WD7(TVx+%zlgb~?pMyF)fV8Sjg(60$p1J|#kA zRt?k0Wd>+s5~fA;Kbrm9YJdbraEf`RKn%tTZG#3wcoKiaf{3gWB4Lb|H4T(hZr}ai4tc%(?)7HK%O%}wqRQW8*u`Ze^uN|^(W5v( zRPrZC>rgdIrkn9>8z%(@5Fjf5NWw=m$R5ckCyE>?-8($JFg&y9y43a*$S{!Bpb~X& z+ibE<=>?>mLYA@b-%ltgzJK2*vw-x!SGGKv5&*aXkZcW-Fb$Gu4Pr^PtzjfPKmuTB zD`6b0)JjpefMgsn>iPSm?cq?n6aN1g0h+=ptz=!OwnM6bI%&G*1L~Il$I4PH8-Sb- zk(Pq9DnDU@ZjpWDsz?_~8;mH*@HnQuSd8UFbJfJ-WEi;vlWL357xsbnjh zJSq)O;4Su|;CxX9kV)Ajpr2AK#0v+o1>hRS3{4lp<1mF8hB$O9m1u^Zq6J%NwPu7M z6lX+31aNd}aI#h*jV!3fb&D*3mCJ_A0JxwZZ(eVTFif8YjZ?@882BzC0?Un#v%%k| zrS%(_7spWW=Ecnve9|p4UYi>oDu`D^H#_1Jl`y2@uV$U7-yDg+gZCs;6tG6^LbY5fEevn7R) z$l5#+UP39fhh3spDpIG1HlZL<~egqgyCAKW1~Lv!B+#Z;taRA4(_smQN4jZ=kCn zLQMOf8gNsemHAS9MUZmEEJyuG<7wBoS{acABmM+k~8 zNQ8D1bxtm>B0z+KK@VotcM0bJJ%)&HV)-=W;Tj{8L`yAU094;W=iVJFrl9VL0thH~ zi8hH65qlXl=!nKp$=&AdG$`=nAlJZ}p~+TQoU&K9fmv~t4Gza_7QvYpSBdZfpb!Y9 zu7?J89zjvt!DRaY<1n0g7!&jiQoTi?nPu!2TAB?Sa%USg$X#r3(=;*y$1Ov}<8U&u zcnAtQuxzXYEUu0c;er@4{=*QFcBos1C!5iYmo3g8w)ItD?6pYBZgGg1uNl}I;a{Uk z#oZ_#PWJ7r8JZ+n>OGNw7}9|l(s_vB;dkN&pP)bvagago7K;;Q<#IlJ5-YVQK3bS4RO|CF-}F9ZMx7YH_9E z6E$WgV<1&##&qiqIj}+~&Eo;|jtm``u;(za&}fqSirXamUqZlH%Ig+mh?2XsW|Htp z7)XN&m=@@gV$du~?AGFvAwmRXYzm8jz|PX3un3n4VG&{x+B3P3uy9BSR>uCHgg63a zk?mam|KC8YLU#GDjXY?3@&eYl^}I#Qfzr)m8pF#nW-L1ZJO&C356BiM=wgA+PJ=9! z8iU7uhR!RF8wwye_;w>n#bY6JL5BOM(f+5`p@n9ou?R-p=4h4!q8Tg$|1PSb`iVH=Omz1 z1VyI~EjWWt#VX2#b{lY^;!^P3GPjboXBDV6ctsSoUrT`zD}=+LZ>3<(ibJS)1=KCp z08R`}S$CFLB$MF=??eXyJkQA&uicW!sX;f$}gNnnULhx8cGy^)h#Z&~&49&2D zavog>s~{5xiHl-Tpfh*N9?K1JfLF+aP#~Epcr*a-wj(uMyS=CaE^b-9421Sp2mE$n&FHkX3Z0CWIa3`ic-SNlU@RPyq9ZD!K;;&x`TUmAhrwVPjkK zWKe5Ivj{PAseBJ~Er7EDj#v&Lid4ve0ZuOXel9ji7>9sAh`Iv5!_CK&_uN1Z=;|Ap z?Eu%g6Z+#+;4;x6yF6DK<92K2RKJfE@c(n!LV#r$NU;ICcJ*}~cRcCtdB!g=D(cevwU{ z3FFv#?5xYP*OPMPO^4ev2c>+Z=cBx~o=z6{<8&U7V*S_l4(MQ?U*%6So)~p4Kfu$UALp3ASdpj?CTZ9?JKU8`1dxc$*BOmeHC_tLM1siiIEo}1hN-L6$yxJjlL4n96a z{9*j}W%Rd@TVSUyuGm;6Ij0>eZVNxO`_b{p=E1JLEB@Q}t`VVp#9*5&!)qcN>~R_kp@XvBDn( zuPD1J+RB|9U#;*2v~V@x*%o0B9vAXoJN4Ho&oytlEy-eii8pKD)(Z8@5##)$?M*AB zAH~)=oTqDtgzn+HsCLpn^xsEEuD-4`<;5NDYpg#SI$`#=`cnHq?Ec$&k96Kkh(3;d zsISsJ?oy-mMq_+W&DJf%?+d7lWtRYmNGhhEQ+&ARr+#VF-6!PBCbhS@u5>MCr9RFm zEcdD_P2iQ#Lv;ob#J^XBRTbw~)=B9^ap2FTXVb}sk|w_$P`g0v!P}g7o76{8%I?nv z+OBeIg6@+)x8B$5^p+QXi4IX7ko=2Ra_b_-AYLt0W!PVJ+5Ns{N8C)`@#4IrR|P&& z@;4~>IURWhD2q-%p=eq!Db599meq_r9y$rQ&PTy`8ee@T6@^V+N4!Lz$C$Bzwo0%fhN#F!OcrCar z4>wZI>zrM;h}h&?zS5lr0>$C*JQR8+_e|CaD3$1-dIBt85Amc#nf2Ka}s9tjnmwB~rxXlWqK;THDdNMjwPy~;$y zB*wcS$GQhO>cD$Ay2nY=;;Q8u8P_hJ1>>AQueXw}daiyy2mNV+h`2Vls=Y+u$H=*( z8Ha(xJ+lf9WWrk}&(W1F?%x|rc#Ejtl_rs*@zcBaNKb#qo%$)X{L+y|{S{Q@`>Dym zL?=dKLV8KSxit(sl*y*|^GZ=ote0{;L0v|zzM5fycIa6@Wp%)KL0P-A`tA>Nb|8DF zl$@!d|B6lDBt5_(ex&oDi@Rq}TesAHcr;S9WvJxK~8=;Jioig^!Of-_{ph+zcqJ?3Z8kAd4hDa#)oM3HQ-i*$UtV zb=RfQGe$Az?|pm{SK+1+)tk@pzUm8|Pbq&`<#qOY>lt(K@cID!aDLnsp3n)tz%A3o z9}^o>f`#-@a#zup5UXPg%W_6(zDqrel#Ke@t4)1tUp3p)p6)(=;xsXRIWWjIXQ9H` zOO{#`gq)NZ$Yz#`0`NL)zIzMbd7_1~R~dh5aN3Cp!oHgDLZ3Lh?D^0VTVpJ%7CoFnaYOtm%2d=&udr^$$6hHtu9ekx$Y;4kQ+^gQyv| zHMJFw)Nd%4ZycTEg|o0)ACEV=MU`wrfiW>l>V^klXD&x2v{rHgDtYna^z^&TP?IBEgEmo44R87C8Yn$wm*J*dFBbbHQJc$K z8I@-DCR}MkoOXx(UfiD_-Y;)0Qh5}_P_7Z=!J!_uf=tnI&(r(Y`F%1IuNAwPocwFz z8M@p zqiu9CS3_eXhs+MBhc1g>e2nIf-k~c{%?vsiC6qFgkVbtQhjTme$auna#b|HIbWe97 zdbHNJZma@GeO%u0SLxmLwak-(`KC9)y{9)j2U>3iSCC6f8eApSU~0O){7R`D>6!~$ zdZSlkP23q_h6g~fj$84jUvd40stRo^=dQfm7>DoStkiO`xPbSwYb2gpi$!?*@i5W_ zv-Z!Iwp1qV^6;ScgdDljXylI8$%CH|VtJl)$7s|S&QG{cv#)m87`U@3tv_gb8`FD^ z9VAt~7oV9DLi0B|a8>XD+PM?QT0d1ieK@A|MKQdNtn2gx7>F!>y;m>I@!7d0u8$AQ zHl5QxbLnU{NpMwn>FDds_oF_xVeUTU%a=Mag2zD8p_}6tX$2lpHznTfkKb_y{C*l- z|Kh_=Yh}uh8?AHo6CdW>F05rbGp9$NMH5RT?~ba=XY0uH8U!F1hbuEGzXe@iB=cDu zK78ess?~~o_-4@OEWa0x08q=uJZ5>}Yck2FpL6R;^J+f3vj=C#FRs z3*$})sCVa;?J2H&+WEEl^M|@;)my9n2c=a<&ffiQsm)tt(7Sp2S;T^7_1JC^kXs;k zwM~YYzow&2BM4kUN$te{th;%$SDP#K%uX9=lSaY;fP9iY5@)(PdDC{$!=l{T_Wofa z=_xreT>p69KAYa&+hI54FG@R`$80b@&RR|N89XXb=`LHNAC*gOh?gD;IeO*1uWsAA1nt+zoaZ>TI?=s(#`(u<%|9{3hTO9tD^0j_g~^ zy!^h)-?=DLYYdzWU(&6#U0*jilxvfSAxh}}7AHyCp9%U~Jo&Qu>qQuc|7r)({@#TR z*&i9ZeqZ=NQ+=t-AUK{VtC6wlvcFGjJ#c!<*Bbv&aehq2@BZe^1!?HB^BGPJRn!mm zJuSGa4QIxl<1FQgLd;nkk2DONzdU(kf6Qn?K+J8G{Ts{Qc?S>z_E)6nB40z3-sVd> zT~rC{E4n)(sUSMMQR|!KhRAdKtZ%_7REZ+IIn=cyhoY@{Rz(>GTnU1bHkoW~lQU1H ze4{d7EeawpuKah`C;Bg>0$RI0ihbJltuC){#{*YwoEo4TkvGI!_O z9go}xGN&x}IgE>h7%1>u4eQHDe)hq|ZcJ_{qc*mwGhhVvTWpR7)4y{5ZiAzM(z{a? z2f)s~@+DPSlCK863!#5Bwg#`9zx{D{!UMK~&JwmW?&RPXsZU%|A9x?guNYddJ|~x` z{Ki8}N5sVnDJeqN*u-8FK2=ut{^iRRBOrAheVr2--TN$T4n*}MavYGW@3PplipRRX zJuihD9@4A#kj++On-9`V|7>H?4Bz*2_%XxKx0tRg$ImL+gOYekW^Ph`3Dm`AT{5PNhE|VE`>Q1CH2>;{QZ?b!=0Cf ze!>Z6pKL~!rR50&gxHg(-@-x;bI!C5PBq`?%+q{r{(IMjbAMSlUXGMmxTO2Cyd<2d zJSa5$!31A$JyMDz>#s}f{JSdyCXoSsB6271Xf_Bx2G7E3=7rDPx^Dck6W2G50^Vh7 zcYQ4c*rl+-(KX(3ni&ld{2RUfvCm+(q!G!J_~X~V&YMu4O}J}zICP3heBSG0lQo{J zF|>#OEaT(n_+OWB{ExWC$0Z?lYZkqLqN(<%(pZjQl&RXKtmE-UW4O7x`-Cw=|h=?wl0)OrX09{}5K{QWOMS@T!^tMON&;8TvI?FI?z;(uy9!M`wD zAlHe0;@Bo@|D$*>y1T;?INltuqphQ@y-j-yUX9{$IFLs7If~!obCT}w>*MX=6M*nh zrQmOmm65ga9?DL*l;Lyu2;IvAwd^nQdXkX?3K#$&N5ZHtE2kytwMi=`uD+T}YDZev zl6n;Lm5gHbT6A0GXr{G?<4F%Ady?$|e?bAx(Z=6gb25vOFX!0lH-(4P1pa8JpQtjV zl8BQm|0Kd+u7p3rpBITWjrS{(gH!oqe zg^xGGM^4nO>Hj-#Y4XyL$cJB|dNYJcHv_%(K@7Km-6naGtnnCD!tz(xXrM zk3RqR{&!nE03b^3u$F9DnBg9ewBi_@gjRgCxXx5=s+Hcu0+y9tyHb7<#S`ITZ7nJ%WN78w z!7N6FAwo+ew8;I(uwlszP+^Sl>ch!UKqhtx)F0yE{;CC;{1bxPLs2sIS2ATOJ!EN^ zr|NgyXO@( z_NN!pbBg%RE-j5OEGaELo>@r$-@8DbVi^FU0IY5G!-Pp z>hcl~7THs|5V}+V2Y(t&D2ou-2S6;r3@N};$b_N{BQny;rkNoVS^ieU){Fp*`lMWd z1i66ipF}LmVo2$Tq%kB&D%sEtKm`7l=k+8@qYSd(b21~IfR?0TNTNuL4W%?Iwb#(R zB$`DrFX6E$iD?Xqo+uJ1MNvn1PLz1f0y`RAbEubcUb7|ZKw`sLw!3D@0F_!+%X4BR z=zeP>lC#-^dPq5E@VI69z_2-8vtZDjuGuo^-i5SeZAQvt(%mthsb#vUy;OR6OENWqzj*@T zD21v~!gHd=6L=Yn1kIry>UFq>Z33~C8qKPlccqr`q2kLSl=jxvoE_xa^ug1c%D=iY zHjxIOCmhq9>_5Izy(Ndy-Sp&nG^Tta>-f8!yeA=ZM7d{-59NcS2fFsOWkvVYE)<4n zn+yy`cXH8}7#O{&^#LCq2CkN5A7nNA5-U$mJ!>8hM}CxHyT6~sT~k1 zI-anQ$DOco@r;W}KgyK!*CTIb0@E!`_?=f|3j)wv1>NL6yU%P|?a<=(S5UicV_*Q;MptTrEYWm#}-O zY8-AlH4)*;7$GGw6zWD!bvm__z;&QCXRteo2wXu%%F`&+GF&Q)pjHx{OhynMg^~dM ztTR;{fFY}wG}}?=3*p%vNZ_93o4VP7a-6`0kA$IE0W7I8wGyDhS0X7^Eh03;U^>%3KIl$(G_n$?Ua+ zAwyOtz&$((Z!)O~1js;;78cp7oR@jPi}>%GlaE&pq|-br-}FGui6Ph6-d$GZgK~bO1Ma)-JgRax{!QCkr0Y zXf~tU{9zVM{A3s!Br}9zMIvi@bQ_wLaBaxsa-Iy?yo4*W900Wwuyoxpv~~B3SV|^K z2bfF{&Lfy0llUzyYCOKPTe4DZ5E#xjIxt*p$ZxV37_z7$n?fclGAR%W9#{eX0ba93 zSw;j3wCArtw5-kDielNEZi-S#{@^}OHIDq=#OxM_keS*(`4I2gZEW)SlEEa;j@p3{ zy5-Iq9295=6lli{jM$3(qF@{*awtItqkDCX9KV)}Qxf^5Jsy^Os2iUFOATbeU}V8^ z&%}_Y`0^o~0LaK=Q}ibBP(CCZii>dAup*1`bCnnNY1Tod;-2I*V4wg)T%6QxPA@;y zNknT7Jkf5!vDxkk@KjI|YE3!~&5)Md9clt4-~V{{TH6Df%VXu)_w3%sNl^5kgU zL=i}d$mjC|`P*mub|2n9G zwwn8>dy7pis~uR~Vy4l{`Oaht0w89n#&L(fP=*%^Bs&#)DkYjiehbelSrjG^GJ0uP z%chW^yP)I#8T9_4+KC7!mCrElHb?jYh;aB0{%77l)W0q_|BFEc!0k0SfS2;hI;8ye z+KDZ~gV;Br+OdCsT?ut|pNXq<}&elcaTY!gmJcWH3$F!e0U*Q_ z0&;k@3=|L+L2nQdSc?*p@CFf)=u4vFVtGx5DnQ@B*lZby6OHeU*@RY%3XnYf@m|cT zZ8^8cm=fN9FIyP!0R@t6fTZN(PJ1WkgNKiKod^gDjeywvh6bSkD6KazHr~RJmXVcP zEx!i0R$(1pk^k|s)C>#^mj3Z@G%#5Db`k>mORoU`+lha{47=aoqeQiKv2>-mxrPQa zygZHV?S0%mJ-vKR_91ldccw5U?n8`ni(jVsqs=Gg7a9_+IP5&mO}~V)-{nhFD`m_5F*y*PlO8+dJ~L#jMMI-wK%~c<0ni+E>5p zQ1EHAtQdID?VFuFx9y$0vq%G7#VI1F@9XuwedlU@DL$EH)&}dzR&(@kvxFX}cji5g zF&bxgyUu)8@~vA)uC!NcuF30Y57M~wNkwsS@o6~LRWN+~Pq$666{tG(eQHmlump8j zWYp*zlXrbJ_L3JYMZZj*g`Sb62KG2yCy- z^&i|-JTY-*$ZcJ6hlqmK_s2h;_Ld6d2F{OS)-gY0aeor}aJVbKOMCQ2Hf8_WFN@2c zi>-erv)!`m;EJh>gHFnR?cT}~r|I2SzE;2s7aGb9SXA6U0Pi|SHKI*9G7gTq?RB1bZ zTyfM#Rscu$a%ijYl zYNd+O#}^A9JP4|r+ZFk2SW8c$`Q&*)U?QA3OZpT3>*2AVsGtz9A~W}|^li7{jrVz^ zVDdm&jlk%yA9+TP<&VEBUA-19%1f!%syXWGTIIY>lTzX^)?-Sskmie)VT zTsz1ixkOi-N?L6h3JAzJ3Y0!z1OWr@M12?V9Bq+m(ROxE(=68A9i6o`R}4MEl@>ql ztQ7mt?gR; zJNCq!4GDAGYbR}eko_P43T6J>dt2{rFSgvau&cf>BJ#CJL?m(HEKG<*)x<7imzAB) z4!0?}-~C1h;_))Fzcht5jR{wsYRR4bcv4l{sNd{Zc}d#3^M+XsTB#xD7leMuNX^gI zXAiY++;J!+oPH#&g|TnC<93Q>T5ZPX1wjb}xX!5WL{-!#f9MZ;5WX_*imjjlLuJ+h z7(DE~e6LtLZwRCF%WHRvPC51uxIyeZIXPCA6!s%u0n5 z<3cq66L9^Q;H^S~VdjqpTvHA9*LXL$ohE$!Vl(%e)Qfe6rOD#&mxVh&mZjC{C;X8) zSY^3(WBCrbQ0H#h*q_tP0 z0ZKE|r&mR#52GrsImK%ozhXUZmdTvx7kqSGsV!+L;nig0zG?G=n2s>!+vn1|rAb|` z0-@!PqaMA#Dk2AJfpqf4xvPUBALVVWy@z9~AAh-bAka(Z3^i_X!9fjuyfXCG@TaD8 zqMJe+y`DT6z+YHA6TIt8sLbTKviyM1#>CC5ijSyIpSb{lSHNV2Qld@~G7Q?eQ(_Ld2&}J^seADjr5btd;D$+gBK5uC-2^t z9rDtf^~=wB?4#APl{&csH!v3(b%UP^`PhRwSs~o+l`0|f0Xv^AOq`(|T4xVdt?~u^ z8$3|Dki6?6Itay~qZao|zApIs{ReR>;r;4y=8A}f_BAirV;r5`Lb(-D z5!D))2(`}ainZ=MOUvR3H!o?hYvvW;&aDz(*tl@kHTAp%&R-Dr5iZL&EjLj->eCJ8WPtAB5bl<{9MldI4|-g@GQRYYW5+$ zEl3&?8npOj;Zx=Fgl?laMi-esGx{F3UfBW6H;d1LQPa=n zBV7_dqMJ3E{LcKb8~RzDYcAfPX&SeepmT9982kD_ce%Q^hrnsMMul}J=Q3*J&o68} zO8@A+;(~=q{MoLw6}D2=&C)(%E+NTr@jKw%+;#7I=76GR)Iy7Q->fjO`M8}m3vS#$ z+Tqtz8%KKDy`im%J`6 zaU$|dLeWY#XK}uYIHvfygtVfZ)?RZ$f6d)M=EkBu0EE9yS*?~Si+M4bV=16Ed`p%Z z8FA5mt*X3(+vD{!I^y5@-p00jMmZBp-)C=o+ryO)bZ%QGJH2KXQagWA(hlV^oHEHW zsqs`Cquj06SmtKoVw$M6!@3Fo!$W>c6L&Z1U;koC}8V#)x z%{<(FAG0fwYM}=uAs zeKN}$4Zc*}F}V4#%K?9^Ze@MIA)?&Vz6;_-t%&b{-Qkw})Xrx|q|cd)Pj7EFY1kmB zYSHl}>zVl^uQ<+o^YlP~yF}R)ugnjRXIKIFEu#>GftM{!I z%NH#L2OW3mRSBtWF_^6n?!poBL_Tztp8QsgLc2LyH5{0kZ5oN%Aadh`Ojy^0UmtJ2 zE4zH&yF)Hx1I9kcW>S>c)SEf}YpYn}&iDBWSCvBg+IdCGE{28a9FiL85{RPiB@3U7 z+A-%@n>w%W>UszTc9A~`O`ZQCa(bd`>!BZo)*ztHMMWW35Y%-M)?S`=zOvCvb#qTd zWJTL(u3vDlol&J?)P`d57emW7&KJWQBgu4#);)Axmg89>%)RP!fqfyeF3Rm`3h&Bv zWBPZM$#B|# zKZ1US`@U+U8?!B>SoUDr=&#cNG=Bexnre8BsylRLF{W`3sph~_<$Fa7@99VTO#|MTn1U_{h!!xNk_a1<*ya%{m)Udg2RH< zAGDXgWcP>E#oceLQZ?}Kl>y;TQ5#A;aR&ZZtOBKktKB&+0{zABMXK~%cTz`C$#jX4 ze22z|DU71Pnv27Fm*t{)J8EgHCpbJs% zHyu^Q?RRm0+}pE4!n6IgZXjcpogO9r@%j$#{_}#yA59ny4R=N;rstnG7Z3E_xT6S8 zfW~u*8hJOkta0*yx~C}KT2jF={NkUDwEVuGvZ=*6_CirVtF{(Nt$4Z~Y!CK5p%C%K zjq*9~Qs3Ok4u>$!IZ4?hC-s{bmc5QnQ5o^&kxWj{8r@RfvhLAT1%xI}N*RpDHfT6B zlfmTiJPnlG!6kRgqs8MFiYl|2*O~n|iG-2$sxrk|r27wny*w{$Wr2{iq<(a|m z_9};`748Ay6W3flnlHb~zA(K!CkO!}=V~i-K%^?mA)!hSO#9ufF0JMboA|~5xt&)n z?Pc-Bf=3j6dhgIcroK|qU8y@7e!Kc&&Npfad)A|#aM^gKPbuqc0zGE9>m`}EnD=82 z3RhE<5cGbMq=HDNC3vu~I- zV@{5Hy+{YnYj6LFI5`|5W7E@)H^g2u=#%Ilf#pSe85lYBeK@vntz^(+qP6J3`G%2Y zx8}|eW=^j&)yALWh3?w)^Zx1JJimkTcN4r`ZCen%7bGTUz4D?~&iy{e!-=mShFW=j PI=U*aD_^DJ`zG*j=vx&n literal 0 HcmV?d00001 diff --git a/scripts/assets/audio/tts/level_1.ogg b/scripts/assets/audio/tts/level_1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fd8fc8915b5ab466e24d1606c156c04b5c8723a5 GIT binary patch literal 8140 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 literal 0 HcmV?d00001 diff --git a/scripts/assets/audio/tts/level_2.ogg b/scripts/assets/audio/tts/level_2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7022b03eac0e8d1616bcec018da5ecf4f5153947 GIT binary patch literal 7881 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 literal 0 HcmV?d00001 diff --git a/scripts/generate_audio_assets.py b/scripts/generate_audio_assets.py new file mode 100644 index 0000000..5a183c2 --- /dev/null +++ b/scripts/generate_audio_assets.py @@ -0,0 +1,359 @@ +#!/usr/bin/env python3 +"""Create the demo's shared `.ogg` audio library via ``pedalboard`` + ``soundfile``.""" + +from __future__ import annotations + +import argparse +import logging +import shutil +from pathlib import Path +from typing import Optional + +logger = logging.getLogger(__name__) + +try: + import numpy as np + import soundfile as sf + from pedalboard import Chorus, Delay, Distortion, Pedalboard, Reverb +except ImportError as exc: # pragma: no cover - requires extra dependencies + raise SystemExit( + "Missing pedalboard or soundfile. Install them with " + "`python -m pip install pedalboard soundfile numpy`. " + f"ImportError: {exc}" + ) from exc + +try: + from piper import PiperVoice +except ImportError: + PiperVoice = None # type: ignore[assignment] + +try: + from piper.download_voices import download_voice +except ImportError: + download_voice = None # type: ignore[assignment] + +SAMPLE_RATE = 44100 + +TTS_PHRASES = [ + "Level 1", + "Level 2", + "Game Over", + "Continue", + "Power Up", +] + +DEFAULT_PIPER_VOICE_NAME = "en_US-lessac-medium" +DEFAULT_PIPER_VOICE_DIR = ( + Path(__file__).resolve().parent / "assets" / "audio" / "tts" / "voices" +) + + +def _num_samples(duration: float) -> int: + return max(1, int(round(duration * SAMPLE_RATE))) + + +def _apply_envelope( + signal: np.ndarray, + attack: float, + decay: float, + sustain_level: float, + release: float, +) -> np.ndarray: + total = signal.shape[0] + attack_samples = min(total, int(round(attack * SAMPLE_RATE))) + decay_samples = min(total - attack_samples, int(round(decay * SAMPLE_RATE))) + release_samples = min( + total - attack_samples - decay_samples, int(round(release * SAMPLE_RATE)) + ) + sustain_samples = total - (attack_samples + decay_samples + release_samples) + env = np.empty(total, dtype=np.float32) + idx = 0 + if attack_samples > 0: + env[idx : idx + attack_samples] = np.linspace(0.0, 1.0, attack_samples, False) + idx += attack_samples + if decay_samples > 0: + env[idx : idx + decay_samples] = np.linspace( + 1.0, sustain_level, decay_samples, False + ) + idx += decay_samples + if sustain_samples > 0: + env[idx : idx + sustain_samples] = sustain_level + idx += sustain_samples + if release_samples > 0: + env[-release_samples:] = np.linspace( + sustain_level, 0.0, release_samples, False + ) + if idx + sustain_samples < total - release_samples: + env[idx + sustain_samples : -release_samples] = sustain_level + if attack_samples + decay_samples + sustain_samples + release_samples == 0: + env[:] = 1.0 + return signal * env + + +def _download_piper_voice(voice_name: str, download_dir: Path) -> None: + if download_voice is None: + logger.warning( + "Automatic voice download requires `piper.download_voices`; install piper-tts to enable it." + ) + return + + download_dir.mkdir(parents=True, exist_ok=True) + logger.info("Downloading Piper voice %s into %s", voice_name, download_dir) + download_voice(voice_name, download_dir) + + +def _sine_glide(duration: float, start_freq: float, end_freq: float) -> np.ndarray: + samples = _num_samples(duration) + t = np.linspace(0.0, duration, samples, False) + freq = np.linspace(start_freq, end_freq, samples) + return np.sin(2 * np.pi * freq * t).astype(np.float32) + + +def _pink_noise(duration: float) -> np.ndarray: + samples = _num_samples(duration) + return np.random.normal(scale=0.15, size=samples).astype(np.float32) + + +def _menu_select(duration: float) -> tuple[np.ndarray, list]: + signal = _sine_glide(duration, 520, 960) + signal = _apply_envelope(signal, 0.01, 0.12, 0.6, 0.15) + effects = [Chorus(rate_hz=1.1, depth=0.18, mix=0.6)] + return signal, effects + + +def _power_up(duration: float) -> tuple[np.ndarray, list]: + signal = _sine_glide(duration, 270, 940) + signal += 0.25 * _pink_noise(duration) + signal = _apply_envelope(signal, 0.02, 0.26, 0.45, 0.2) + effects = [ + Distortion(drive_db=14.0), + Reverb(room_size=0.45, wet_level=0.25, dry_level=0.9), + ] + return signal, effects + + +def _level_up(duration: float) -> tuple[np.ndarray, list]: + base = _sine_glide(duration, 420, 660) + harmony = 0.45 * _sine_glide(duration, 660, 840) + signal = (base + harmony) / 1.45 + signal = _apply_envelope(signal, 0.01, 0.18, 0.55, 0.25) + effects = [ + Chorus(rate_hz=0.95, depth=0.24, mix=0.55), + Delay(delay_seconds=0.18, feedback=0.25, mix=0.35), + ] + return signal, effects + + +def _swish(duration: float) -> tuple[np.ndarray, list]: + signal = _pink_noise(duration) + signal = _apply_envelope(signal, 0.1, 0.3, 0.2, 0.3) + effects = [ + Reverb(room_size=0.7, wet_level=0.5, dry_level=0.4), + Chorus(rate_hz=0.4, depth=0.2, mix=0.45), + ] + return signal, effects + + +def _thud(duration: float) -> tuple[np.ndarray, list]: + base = _sine_glide(duration, 80, 120) + signal = 0.7 * base + 0.3 * _pink_noise(duration) + signal = _apply_envelope(signal, 0.01, duration * 0.4, 0.0, 0.3) + effects = [ + Distortion(drive_db=10.0), + Reverb(room_size=0.85, wet_level=0.55, dry_level=0.3), + ] + return signal, effects + + +SFX_DEFINITIONS = [ + ("menu_select", 0.65, "short ascending ping", _menu_select), + ("power_up", 1.1, "riser with harmonic shimmer", _power_up), + ("level_up", 0.9, "bright burst", _level_up), + ("swish", 0.7, "noisy transition", _swish), + ("thud", 1.0, "low impact", _thud), +] + + +def _render_ogg(path: Path, duration: float, builder): + signal, effects = builder(duration) + processed = signal + if effects: + board = Pedalboard(effects) + processed = board(processed, SAMPLE_RATE) + processed = np.clip(processed, -1.0, 1.0).astype(np.float32) + sf.write( + str(path), + processed, + SAMPLE_RATE, + format="OGG", + subtype="VORBIS", + ) + + +def _slugify(text: str) -> str: + return "".join(ch if ch.isalnum() else "_" for ch in text).strip("_").lower() + + +def _configure_logging(verbose: bool) -> None: + level = logging.DEBUG if verbose else logging.INFO + logging.basicConfig(level=level, format="%(levelname)s: %(message)s") + + +def _generate_sfx(output_dir: Path, force: bool): + target_dir = output_dir / "sfx" + if force and target_dir.exists(): + logger.debug("Removing existing SFX folder %s", target_dir) + shutil.rmtree(target_dir) + target_dir.mkdir(parents=True, exist_ok=True) + + for name, duration, description, builder in SFX_DEFINITIONS: + target = target_dir / f"{name}.ogg" + if target.exists() and not force: + logger.info(f"Skipping existing sound: {target.name} ({description})") + continue + logger.info(f"Rendering SFX: {name} -> {target.name}") + _render_ogg(target, duration, builder) + + +def _load_piper_voice(model_path: Path, config_path: Optional[Path]) -> Optional["PiperVoice"]: + if PiperVoice is None: + logger.warning("piper-tts is not installed; skipping voice generation.") + return None + + if not model_path.exists(): + logger.warning("Piper voice model not found at %s; skip TTS.", model_path) + return None + + resolved_config = config_path or Path(f"{model_path}.json") + if not resolved_config.exists(): + logger.warning( + "Piper voice config not found at %s; skip TTS generation.", resolved_config + ) + return None + + return PiperVoice.load(str(model_path), config_path=str(resolved_config)) + + +def _synthesize_phrase_to_ogg(voice: "PiperVoice", phrase: str, path: Path) -> None: + chunks = list(voice.synthesize(phrase)) + if not chunks: + logger.warning("Piper generated no audio for phrase '%s'", phrase) + return + + audio = np.concatenate([chunk.audio_float_array for chunk in chunks]) + audio = np.clip(audio, -1.0, 1.0).astype(np.float32) + sf.write( + str(path), + audio, + voice.config.sample_rate, + format="OGG", + subtype="VORBIS", + ) + + +def _generate_tts( + output_dir: Path, + force: bool, + voice_model: Path, + voice_config: Optional[Path], +) -> None: + voice = _load_piper_voice(voice_model, voice_config) + if voice is None: + return + + tts_dir = output_dir / "tts" + if force and tts_dir.exists(): + logger.debug("Removing existing TTS folder %s", tts_dir) + shutil.rmtree(tts_dir) + tts_dir.mkdir(parents=True, exist_ok=True) + + for phrase in TTS_PHRASES: + slug = _slugify(phrase) + target = tts_dir / f"{slug}.ogg" + if target.exists() and not force: + logger.info(f"Skipping existing voice: {target.name} ({phrase})") + continue + logger.info(f"Rendering voice: {phrase} -> {target.name}") + _synthesize_phrase_to_ogg(voice, phrase, target) + + +def main(): + parser = argparse.ArgumentParser( + description="Regenerate the OGG sound library for the demo." + ) + parser.add_argument( + "--output-dir", + type=Path, + default=Path(__file__).resolve().parent / "assets" / "audio", + help="Where to store generated OGG files.", + ) + parser.add_argument( + "--force", + action="store_true", + help="Rebuild every asset even if a file already exists.", + ) + parser.add_argument( + "--skip-tts", + action="store_true", + help="Do not regenerate the text-to-speech phrases.", + ) + parser.add_argument( + "--skip-sfx", + action="store_true", + help="Do not regenerate the procedural sound effects.", + ) + parser.add_argument( + "--verbose", + action="store_true", + help="Enable debug logging while generating audio assets.", + ) + parser.add_argument( + "--piper-voice", + default=DEFAULT_PIPER_VOICE_NAME, + help="Piper voice identifier like 'en_US-lessac-medium'.", + ) + parser.add_argument( + "--piper-voice-model", + type=Path, + help="Path to the Piper ONNX voice model (defaults to /.onnx).", + ) + parser.add_argument( + "--piper-voice-config", + type=Path, + help="Path to the Piper voice config JSON (defaults to .json).", + ) + parser.add_argument( + "--download-voice", + action="store_true", + help="Automatically download the Piper voice before generating TTS.", + ) + + args = parser.parse_args() + _configure_logging(args.verbose) + logger.debug("Output directory: %s", args.output_dir) + voice_model_directory = ( + args.piper_voice_model.parent if args.piper_voice_model else DEFAULT_PIPER_VOICE_DIR + ) + voice_model = args.piper_voice_model or ( + voice_model_directory / f"{args.piper_voice}.onnx" + ) + voice_config = args.piper_voice_config + voice_model.parent.mkdir(parents=True, exist_ok=True) + args.output_dir.mkdir(parents=True, exist_ok=True) + + if args.download_voice: + _download_piper_voice(args.piper_voice, voice_model.parent) + + if not args.skip_sfx: + _generate_sfx(args.output_dir, args.force) + if not args.skip_tts: + _generate_tts( + args.output_dir, + args.force, + voice_model, + voice_config, + ) + + +if __name__ == "__main__": + main()