From 2fad52d684d2fc2fab350aed97196b1ae1db0f8e Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sun, 27 Nov 2022 21:18:17 +0100 Subject: [PATCH] the adpcm example can now read wav files directly (so no need anymore to extract the binary frame data from them) --- docs/source/todo.rst | 2 +- examples/cx16/pcmaudio/adpcm-mono.bin | Bin 36608 -> 0 bytes examples/cx16/pcmaudio/adpcm-mono.wav | Bin 0 -> 35900 bytes examples/cx16/pcmaudio/adpcm.p8 | 102 ++++++++++++++++++++------ 4 files changed, 79 insertions(+), 25 deletions(-) delete mode 100644 examples/cx16/pcmaudio/adpcm-mono.bin create mode 100644 examples/cx16/pcmaudio/adpcm-mono.wav diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 62a3eb6dd..9ae55f58a 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -3,7 +3,6 @@ TODO For next release ^^^^^^^^^^^^^^^^ -- make the adpcm example read wav files directly (so no need anymore to extract the binary frame data from them) - duplicate diskio for cx16 (get rid of cx16diskio, just copy diskio and tweak everything) + documentation - get f_seek_w working like in the BASIC program - this needs the changes to diskio.f_open to use suffixes ,p,m - attempt to fix the expression codegen bug with reused temp vars (github #89) @@ -27,6 +26,7 @@ Future Things and Ideas ^^^^^^^^^^^^^^^^^^^^^^^ Compiler: +- add a mechanism to allocate variables into golden ram ($0400-$07ff on x16, $c000-$.... on c64 , take care of evalstack) - ir: mechanism to determine for chunks which registers are getting input values from "outside" - ir: mechanism to determine for chunks which registers are passing values out? (i.e. are used again in another chunk) - ir: peephole opt: renumber registers in chunks to start with 1 again every time (but keep entry values in mind!) diff --git a/examples/cx16/pcmaudio/adpcm-mono.bin b/examples/cx16/pcmaudio/adpcm-mono.bin deleted file mode 100644 index ddd6028f0f67e53948a710909719bc86648e9169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36608 zcmWi`F=k?o+bP>U|fNx40oVVR5=8juIQsrgmNmk)r_4ZLGLpz zJ{Va`Mye1<_N@TF0U#iC2=ieE>6W$%%nf0Ck~?(J5}t@(v;*V_X?+^0ku%1G|7Hk8Blf>*<@oHKcfi^a;NB_1tN8FbM4B8y(tnZb5g4fIKI=j9TiHG_HjI zQQqbN=abiJ3Qlsb-85HtPLG$&|)rH<5rD|U_TJtx;8gWmuH}Nn#AA{FamELEh-jigz`+E z!*w$eExtFuitBz(ei<~hDJ`h ze8QM`{+k(qjhx(SHTrj*f2uKRYR67$2nH9lvJl4~vHLK4@oT0`6?eCGVb+k$Y#9|b zYT{kL??#$ApTBKos{D0IG+290T*MW z&#>1ibq{|8AY?FmCT~!1Y7+XM%aPMZAR-1RqlF86pv&?`@&`0|9b7Q0KY<7n zV;ZO|gA@M5kJV1GN3_fYuDr}aBce4>Cq=)8)!p+hxouXS*Tz%peS|Jsru!G0_@Y^E*JdKT!^3s-D-3P zJb<-VHvfX;=b6)iscLlFwnLbrg>Pp;3+(zo&A4KWU;ca`5!`T;5{A^-`|&W%zlYmS zQrzUtz|^?Czjgv);?(F2=II^k^1GG9r=KKrL~vw-FFyNCJdfc1 zk8w(jh0ITtxc$Kn>oE=z2XE?7=LqI!q3h056#LE{E8hdTUHX4#RsC1oZfcF{m7&k= zS6xrc3iW&6SF1KaxWawH0F60Z2QDF72iAs;0ZI*`8Z`}-{|A{Os-PDluPID|j4>ZL zktI8~bv?*e1D^9cO=X;9$5w*GPhSC^m~xLAqxrY#TtR$R&q%`@?z(1a{0&Wjt4=xz z<0{0uf;6r|tvdgu8Za4xFIBtd%y?u4{v3dkX5$OOwCF*WK+^*Pn!$okD0;>RUpvBO z{rES%+~ig;eiRJ7C(-`U`S+y24;f&?ly1W*u`&Uy*6}0Ka+QEXD>$1TJE@n?vP`TD z4sPei0(`WLzRQxsP1Z4#zoCbgbY#l2_nsY_t8qLdkX&m^3CHex%r{$!Vh2+6p-&L8 z=w@#&Kkwj*q;%e&&;Apn?qIIfF;f-ehBcyG&&F5l*glWoG6{3VwSn7;FGSH}$b)`maS~*^lHY(;Wb-;8> zZ<{e}%o9JznoXCR>OLpx)IKbM#HQMW^BqH>cO#R%%9MXDd^Exyky-zId`~>!`V&ow z&b{rciM753;Dld zNM$Yl1>KQjsK*GIMQsmTeUCYO0r!pjn!h2bZ#%$mtz>wI`?d+WKqZ#y%&ZBUJf|D5 z>Jw`KW{p`I>4vpCP`u!~;(r4adRyS-42{t+cLJNjFMSVXZoM|aVUKO{Ui3H-_9?>hmI zg~PgYAW{K3K4yqg0K8b;I*s}+fjjdF>>1FKa_qhf5i?*%388Kh&Cke|NeF*Jc8+6> zPcY)LAN$0*_3}pib1QJ(CVa9HIc}84>wz+>mRLgv>O@1mY#CN96$$6rxc4OU4xc5a zuWeTn`%}OnIo_?s-6io|1$$S`k&hW)2-%b8k0lsrL7~R|8%Kj%PZx$yab!beH7nR^ zZ;|2*w+rW5D@-e7IUoUpT>6**9S|o_d2S~lcizl()2UuD1EAme4mIxhixe3^-iG2> zwq`q{}1paplOo_ zro%7s)Xo_osfO0or8suYdFRBqr%Rma5>AKSlX=XRJs{zu>&6f+$FxrvU>h@lTt^$5 zm9fjoJ4Yht>wJ?k`PkTz%Kej;-;CwTU31MjY+EwRMq4b~Gje$v!&-FhSmTV_Oqt+K&{f5^Lj zg?EVb*3lZWQ0h(s20;kF-5r8=+!DJrad!#u#xm{0f)3I?jdX?ZR~Biza^7=RLMips zFge-S_ATDF=y_k}uoS&E#d*fiTApK*{=tZqe%8TV11hc&^&w>CO{RJBzR8^JWAZpS zv7P+_s2&0hLGHARJOSa?IsbXNP6_P?XXsv)ZJU19YSg?H_Y83EI55mYmAdROo$&3S zg*$U}pH}qoliOWi>#V%Nn+iCqxSIP&D50NxJJ zwo%XON%|!<+^fZRi}Bq;-U1Dcmg)n6AJYpv;OiameFDxptalw9ysl*18E9Ev_l{Xh z*InHnE#RJD-DxIeYOw439!&NIZ+k{0WGJEA7}A^ghqwcobB@HTh1`h^w8b`b!QXmZ zF_vJjK?5q~wdV9E#+4SJeirN1XYs2=kN1u=G-PRQ{FJW@Fm-C?7^tY6P$VXTiUT5Ry#SlnM zUa)v(zuVp^Y&c zrj3_9gIXb#E3($t1uCd-3=1d9o9o=E(G!fV73sxqlai^YGo?F0ELYl~ zxYx!9M<>JlYzMv4uPymhB!gAH8AZjXoJStT3jc-Ur^JUCz_EB`Q(^nY^uFJ806u&V z&r~=}o>NaCFrst)dqHNig%#6c5MRE+oKMv;W66y5fAv|RdKtrA>Nmkc=HlwJwJhTgono8n0!U` zE;i1t6A-RC-SorDIpoJ7zqU_n%$BRox%Easwu~?xnK`!W79slY82R>TlXzl!kYt9L zqjFO0&Ol&K@(0o&Oe)6#qyKnBI+RmUH)Ma@F6W5qXczTw0Ngl>+(ILddG)V8;8%#y z9Wwzf-<_8n8x|3wiqk)(DQMh@xv{Ih!_n&?h=|q`uGQ=Xm3N^K-rVJ)!}JP0M_ zk2ac+djO9VPQXoL_en5_663$%-Jeo?O%4+d7e^@|FYeI4Bq9c4y5TpNaj>YX@bSlu zj7cusJvW3cRs~9Ew5^a8T+#xSvI|CZf7*KhZV|<*`p%y8&2v^ zq9Q)zy}E+uI;C`3@TpJnXKda7vlVciu_cgv=dIltUqyG$U8sqi!N4Hf^{HQ@rGLtK za)|iTs4g<<3Rj-tnZ36VvGFO&qnS0ihLv_)lt-b{(d<9aOxC9zRgp+XtR~2DD;9Md z<5GZ%_{RI<;uIPB+vyMaHlsvc)_b4p-bms%*{wt|7vI1S#H*lLCd?nKxZG+R%Ir!2 z{HU_2&T7!xY@eMb)|Mc1^YS!t%7V#Dn8UcJHGW53L*09npp81}N%2#-PCgIY9z6dM z5I9;98sE_?+>YCPw;6G3edc?2JsqMecFVK@MGg(3-&zer)CIh=;Jj7g&On2e zJsAnLao3ONDv@i1ea!tyg@-qmS$hlS>o({KHn7sSz`2dYr#LYLpQnz_F$ow>hR(m_ zd#I!9Jl|uwN_Z077iGl`umb#@Ykxk>G#|`?r|O9N0ryH|76WklcW}#4XttA@LkDeS z ze!r?2-i9&&5;?MbhU?jcpV&C?6eBg=8JwDs8gOgATzo}d0FgTM8Q>lQ#yf#nW|Zj5 z#}~V(Y@Dgm-C@C%r%l6P1_}vZwZp6N^9RGtic4u80wfjpYgePs;xH7vMPFEk@Qy0EspNhfWD>BM=Y% z@)}M{a3@wfhSMN)zcUmyj2&T3LII%D;b~nX|pCB&+eD)A%u{ zIh&{m4-)^$SbpQ^*aNRX9BXJ@ z4Z>|tv}1%ezVoQUiY-EB?WsyA$94?iOEgCo??T=YI%~8oB9jx9%DB4nLFN@;e8{I> zFmLco@;!$pGcD_7H|sb;n^zbmXX0}2K^4IS_+rh6$j9DL@} zy?~oiz)IcCA>Zd*vbjbQywe-zYJlHDWy>In4jPY5DcnIY3%?`Nx!3H=<0y}iiOktO zA^BdjcS(Im5nu~+HBt`qHv6gQktvyXG|SK1d?mqAp4u?TVq{ohIJnTZ%9duu7|$2d*_nut5kX*)3}Sx%&uvTClQ>u zye@YZSs?I>#P~!DqMPh|S3|hRCp=UvP>usmX;0dO~#i`O1x z3-*R9RG9EEYHi8x3QKE`X3vVrAQjB{-4rcXrBLjX$JVtl{UD0SsO#<}B`;G^D;&Yfi z=6H@E5HqzJ6m(w+-LiLlgbst~R_}MKq&jr`5R-PWTwf9~_>vbx16}NYa2$m^B)mq; zGsSFTm+G)6`)!3zWS`-^s)arW$cTD&XB>Bq(Z@-!gi6G|>FR;4%nOIO>J>oslucmj zDSQMShs6xM#rqZ z=_;D(VOJ8TaU}0qgx!yjc$Geft%&IEcCZoubpg6!xMQVW@$h4|AhRaQk(rMIE@iSkkom>9y_C`p zg3>)a^%@kqXN1?$$^_B}g86&U0Z>dS*z5Rg5^7$><%RhB43i#`{*LQ@sTYtrsGE~g zyn8*I7l0#SdR_tgMXdrr%Hd=XIh0VM0J_DLi#U%4(l9r$UC2%EZwW_-#K2og74AR+ zXCtBZ{Ux=+ZDB8_m|gp4xFNII@>vqG_s=K_VbDENkWTyOaGI!gJ{K^e;dC$sw71Tr zF`#1fjv71hWxj8K6s0_@5JCN)Vu%MlZJf}tZ-~=C>p*MdbGT1t_+;mH*&v8efGSOM zhZsE3@~fjcC@CQ2!KPvhkh3yl1|YjkrSCQU853okz1W`d$x9BH8@)&7PyXr1-&k zpIca$*%l0adXN(lUF4{wz8r-^ac+P5ghmb_taH!3`~cUXY3p%U<|_i}3oqh45@*LM zfYY#X8mW~xW|QU~j$MK|?7UT|OdfH*Az)TSG<5hF{FwWEwi6i#}@0eVad>~sUtbDsx4f0OFZGNmB- zvPJt?W(@W;q5mNuyH<$#I@haH&G`v%y-Z$V?9R$K_h3U(-zSZ##RHRdA$o4(J?INP_HYr^S62N&N!^!5!AEv59U6K=Ph?h;k3)K4hxz(G zTQQ(ge`~sx_^%p0soMx=%bIP`%Y8<5h4J4GnNX3wB{C-g833@ZPVKz;y=x7S$fFA8 zS{SIzC$z$Fh1GVK5$k}n4aE$FqOw5X5~URG44fuL3E2$0`>$2Xp0EiI4YVx}Z{el~a@4yMv^X zH+GB?H(+@??c3G?+{q|MS+0Qbuj8RYl6&2%4bi=!>ghthKLlI^UA0&|mLkikBF?ul z4Pyd)ARdabyUYCfRJv!>_XvV^(fYGVr~%Ga(eC5KoW}RC*bM;QY`q*)@CM@(E4?q_ zxuR+B$lw^`E2pmU{O)o8bCP>UX49PTvY?&}^^TH@oal)opP|?$?tB%81)xk7;~qa$ zkmVkQ`3`|s!HG)E7r>T`YCmJ2h9c`B`YejAq85xY7A9{Rg`Y5vz8rMS=DGkW`eo?RdC#v>0|pHz1BUni&8VV#oYgtc!8 ztSN(mKt8$aaJhAHnXYiaG`9BryuM0W)@V7|v-!-%SpWtUd!B3S`^FwiSZRfh1~$KZ zZpx*hJo2m)C4SR8rxzGpstYt7N}t}4K{V$y=syv7yNIN9w%g6)N6?%0;i={sG}p}; zh@04}05NoVrHbU+t)rc#!3{Zx2kZ6jn++RpqeC>V?gtzvFLy^0RuL0c!Q(&9tqRUy z0^?>|zuUC(lq(4)NjqnlDBtio7J(Eq%2aA+KF~lxg!R5#*wzytXiNnIvF505$43Vv zArpXc0}rb4^t(mrp z-FWf!eEaa!GNS~IyJxmf95;zDYh;4Z%+KnVH_SLmNv1(-`5UvCMrE6){NL<8wR;9h zQVh-Py?G$+D*#1b9Le^ie7mdCx=J7R&X>wU%r+r(5vbIHD^JRBS>!dXO-V!G84B=ikp>3*v z#$h~7f7b$-q4cdIQqm@2;W}pg=a#a{lFu3SAC|zN_b-agY+uE_lZQ70=_jx`a7c^e z0`T=Ez>a-QxW@g1>DX6@Iay~=Ad)N1lXd#@_{(#yTGbRYdslSifNHMq0Z+0%PO8C= zgp7$u{VA=*p+rQvswh_KX#e_0BvIgpk{zlPGZe^8UtpeLCg0XG!#3wEC)vz~_Dx|f z^rQG_47WSVt4F{9HWRAU>tHT0qR)-RPGgV;x1;dFw0tfeRP@#25Pr-3!nC*xAf%J1 zBcFUk>}-#y#1VsXAK?Ix&-$7by}WI)EJ|aGxEDClR#fu!n)R=pj2@eb_ZB&&qSTX= z_*PB#6)C87ClrVMG@w+lJlEW=D{rA#;%??kPqn!+gs&IHNRisiEh4m=dNKwjU2Ahx zXxv}<9J@kqsMZ+cwKohC^boKs0nd4yn7mM>2itE*`$0l9P1U!AOS|ZU3{QoIC#g;I zc5uGwuS0R6w=9VbdB4Gvk4V;5a}n?W+>$ZwY6#+is`jsOcA0)5&U-|BVpWO?30w5! zB>#TCL%M_J;IfNt2+S6YPlqj;-L&eyYBHY;EjJ3KRZ5#Z!5{=) zly`ZECoz!s$csamJya}JZPJ1C+_o~>Q;ZNfF;^w^uMHtNcvAqs{-saPQxAgn*f?^D zXm47wMq-ZS{M46T3y&EIb=vf7*wF2L0rMPoym@M`*&t(ct&-4NT&X9jBe&k;+8Nhl z2y@)C&m(b|o~tyty%V{&?~Vh^vyOWAi><)6HJ@YtVi*}}zO^Eb#7@&sy)VHSApdR> za0w!d9~E0}+NEwg4FiiOIM|5S(;{D_=e4VMc?`>*pti|Q{d)p`#-@!^M&*-)(!nH4k8Tj9V;7m@BCPTc53|6kx$+LPylMX z!QrhTUK5(+wI?b$qA63CY%}=#mmm zNPx`H9iQ`_z4j`>P?9#Wd9m@$5@+WmzSQZA^-YbDI!s(vaVPArkKrgL7L=YD@ED-L^~BR|oi`$f&HV4>lj z<7s^Pbr!aKN4}PiwbBvGoG(1wb84OpaIUP-@C-SekG6@5c@7JVv<^&Q2A<5A%!~fl zbFnr+(WO0!k)5Lxe!XT@O`9HKujXQ2I*s0SkDqHZ+@qWdEDbwuTHnl#d8HIuat}_s zYv)}}Nn>dBrbX+{>(SPb;C?_^Zjgs_rY4nVf8Cmhddshn4&IijJfiy{aAJa7KW%O2 z6=`L4Cc5i%8g@qT;wz3j&2P>mi7?Gg^jL1Vw-<)mBo2yfpSvteSMccb#?kgj zspTi7h$ozM-A2S@SKn;3HJk>%?KICd9*|-H%M-V@8KzgZj;3Wh0Oo&OmK*kzrxY*3 z!M64Ji{34Bf*Xb9^vk)cp4an1!YoFnH-&ynZPCUEohU0k%$4S!W+xE6DCc_(bH-QW z7nk>qQ<~Qof}0IjAO|hW^>RfAAf;SevN6CSC+7D!?^d>rPIFFKR)1Vw814&9b9UL2 z3a-~K?lR0937QQKy`#?UBc5_Ni!E^7BD`Vy3{UAf{Hj_jTl=ISmC#A|5XanEPx+ka zURI&@AaZd#_hLD5#y~)O{9d1>(Cm`2uj!`v$H@BB5X1Pd6v#8AB!N0)JSXZ`_g*IA63p$y4&lpGav&PVQ1{ zOzz{pvLq6L4#Z6$o!`IfCd>mZ;R0&T3BMez%SQS3IG4u@@2@I=O72Aq&|(e^MI_^) z6UNY00kyMG>B|mFME{vphgj&84E-M(IRl`u!?92YVC9^Ux4zDh@#MfoSj=rC9b2v- zka>Il zs1;4bGm7aPpjhe82yf0S?!;;b8Mq7d>*;%#h?y^ZoD4c@QzpqB5=zN05n;OwE$3Hj zU4e<_@(wm1bn9M2Fh7u+E*|CwF~zNW1{otK(iKfCpAB|z2ElpT-Pbh@p7v;$KwyMs zanbtmcs&DyUt-;5uv&q(vD~z=x_>YNNzmpLu^bQDi9WYxE9}UO^((5nnwLT3@Koh8 zLcDv^$m<@Fnge3K#7P>;{t-cm!K4-5Vq|oY;T5nwgo(u3itP^tPXnj>Y#IAF`J(VT zCu5xHEty7=u)aR4JQQT_HUF=T4OsShWVXjYQEEjQdn)f^yIZuNu%-#I=9|6X7nj9LVYH?nfgfma2RApM3amc*5=BQFqZl89nl!rP`yXpFGD5iq(qhaWpm^Cii9yw zC!Kv4I%RLnJT~c?*<@U`dffLlnL{g>-E!0X32VG@21_?Jj~-pHE9T*ZNo-}XuD=k9 z`ATS|xBfp}*8?izAK%6f3afU}GjD*^w?Z4_)ELX7QG1{K)|Cg5NsVLYe`XKPg zZ#;8>3dSflLoL7f#y&l&B!cWl2KlF1=SkKW7e*-^c1W!rVL3Vi`ca_oTgx!Z(-US0 zHNIc8jD>ly_W&Li61TyJbu%!>UrS&kFtKP;v4^@r$nB5<+?wI-~M^FMa2z2 znA)SkQ#+=5<5uUI3$Cmwu=+fyas9!;3P#aa3|PmbKZ#by0+pf22^cc&TeL*ONpF=o zIF1nC|Fh!A08ao;kO6j&wUaddssp;P+!>eGW!v%8HL1=-=qfmpdB|8tBaG+2F2h50 z=3Rd^ku-bR8ECQz7$y2hg=*+*L-&yR)IHnGX z)CK?edvKlP2eGM(&Y_xmaXygSlqAMl3JrPktM_wiBBBT0nUc+ zIVS11?#Us~++}K%{0hR>aG`8j98>qsqCzLMSA#D@Cz39;wiR1VXe9HwhQT{qWWe#2 zTys~w{Sb^xO}N}8lQzM6?__&^o|4Cnh=KqF9p`b|Ruw?1FaY`MYu zhE_=Y#59+#wFD`#MfY8iO8vrlAHrntRADz%q}uPeahYQONaRw!=_vMs;4B69(d--W)|HUuoiOwcp)`+W-{7lL4u5^o3P- z4zCXSSW$_exrAP}9gJId(iO=C!A#FdEo+eLIizCP0M-FuxP!PFXR$u^8)p|B7==2A zr*sE{;wV-JEt_E|4UucK@T0q`&hxQ;2E>hGnED5}T=N0k zX|W6c9CVY5a=XvEczHh&&4f)S#Zhj9>wO7j1SQuvHWH3mutFeIoI^$ zr!AFCt{SV0TWkkm$5VSVa0=@o@6hbKs-o-T`2c>73#${`yk}Iax2TfM$w6;lQPUA4 zX)KY4zh%W`JNr9N%R@gvLlu_lqWhMGJ*La$4v^s&gp-0Zj)BUy(9Mn9iX;{h24*&T ziy^vKQ$=Pkl>J%M3MRIGbCT21G2vR_s5nG(Uhh|cojk?0`3-G1?SYMk+z!B^18nOr zHRMfmWtefUHi8ONZsFZ<%I?z_zsj4#BmAy;*nrRAEb_G8p8X5?WBC*^B2giy`nK!( z=gTlRzA-cTH;|%7zIQbLAkMCo92SAh^8j`Bb;@ME8+TKd5+cNSWObP2Pzj~ysL(eH8_@a0) z17N()(l-c17(Q0o2iQ4_?x?yh@)*X88b$C(B6|+#0~aIkV{6jRA=i5`_J}THBtE2) z?Vb=P|5SQc+65S7^i`@yPt2#u>LHaSne2yz{7rPP)?K*&66T6~{!>jmAOjoMwmT((N|~C{zv{ zvRuME60id~gVQ8wEDmd*GAH|Wp96i zrgTEXc*kq;7>Y_;H=n9A%usNsE^rR9mkD2!pd+(K#M{<>!NcZQc#gA{8{y?6J-1x@~X(|A#979iueMaKMCF=%ZXHpAsn;RK+P2zxBbbTq$|D8G^l1w z0V#U&Y>eexwr^uwKye7{7~oL%)Q{Jy)1LS+n5AFUOkTsIE)r^JNM^6L(#bC|0K-Gi zF>m@$fI_M>6o8mLk^I~) z272HSAB{C7n2VS%ThU#*VjopMW(hhu)S|s-j*p>PU}|r_BecQ&H6|sZos+v(VxB3n zDn5>^LY24||9^SXOg#g18C&)9AdcNss8RL--#SO=`8VQVJnesdmuz%j_LN7A+&2Al z3bf>EU%C#T>cXvn@q4j@^HnXAgZweUG4kKT00;ftmSnDxN~nQ&%>E6H0ST6I+fN1v zsEXG#Tj;NOUc18-TdLK&FxGN_OHRN9P%}`Pml^#|^w%db0=I;} znnys!t9>c>QPVs6FBAj;y`euE9cbq+_R2B|w5-c~hI<{pH{)0NCKfb2yn$Ols{P@# zaT5#cUR<#|nU3~{6C?`QnLjKOdl}XLDe7~ey_26s%sR;+eJMB`g!|D|ey0x7YrlmW z%n~wpsntRI%%zLuS{)L4K5gFw!tH;Ex-BU2d@k5-0MX2su-hS%^S>tBKtRm=8Fqp) zeQ%g((w6h@ntA!3+RPlD{v){w#LP3l#u^yWeD8{PErX*khTTpO&Ha}5T5|U6pM^Fv zPZfV{ZKq*$;RaUCK;Wa8+Y2;%{~BwthzR>4+Mv(%uwR*Wf*h%RK{e<&%l&z%0Tetp z&bpm)v+l1$gkFV4zf-)HLbv5JQx7V;b06cI7`Xb@JklicyXMZh9UNtT9&^{o82g>z zv?P0&&x~ydN94bRoT5;(FhN*kZ0(Dv$IN$wFN7YQVxRm9w=nps>?N{^!!2Koc`V68 z=v|{d#J63$iaRB8)y&6;S;MREM!n10lkN+nmpSsN4QM%jPiUfrH<_!XL!(|RrrnI( zXSgHSL-5YYiepS6eqB&o~qljJQf6C4q?Gm;5L6Fcz_8I1c zYR=f67(?jvzE#PngR$-k-GFsT>s#tHA#pp|{|iP{ykDIr4Js-<6P#I7Um#L}V!f6J zLw1QqYx6@Ez_n@dEC`a0ntM?%|Ox z@I_pLsZqyV3gFGJ(`kQ=a=3cgiLY#mtOt1al4~sj+?g}ly-xeHWv#5eY38dG>_pnK zUoM;aphfvJPD5x@DR~YB4mdJr5ti#QBqs=ZyTklIk-gZa>~|Grt!LNFJT1dbuc=>9 zKbL=_D>1I-H6duSakL|QhODA}6~=)uEdJ`Cjqa`72Fxsc5GRAVV6ANw>4);mU<Mn|ZV0Wh1~l4rfa@ z2yB3kAl(vWKM{?Bff1Te{z%gS%9%RHcyq)0t~+z;!GO&BNL~8X9O$XNYV;mf?e=8b z31H5pIg80lm?i#BH32x%Uvfz9x3EJOJi?}cNG=8J_~wSvu~q?`k(G#jGRnR+GX}J> zx>nv&&ZVLf@xlswXSN<$MMFtCnS$BB+B{AN@zKW+kc|pQ16Pv9P1JS5lji{T5Zd%& zxM>mC0;s9J^*o}J=U}C_U@Cf&D>|GRx8>#yq5WBsx5N5L5?`vkG@Ox=V)w^7~EBOiONedweVsRqv5-wRcl{;tR4SI#);wheLq5P`vXQyg$j`W_(fBPtwwzkdk&D*Q zUz2=pH8i2MG0FEsDbveMGdwb+^S){~OE`DG(gnN)?@}KI^MA1J90&FRA%gs(C}V8#HRkD!W3I#rFQB0T_BrqFfmaq^hId$Cx9$n#GqCK zHyw4nR7;x{dBm|P_b7^m-UnpmBI5226fVInKrNk`fsq=!_?*XeNAz0bRj3^dJes5J z^m;laj-d@L@|U{aW{piNfaHti`SVa<4$c#sb@at~(9FF~7m#6MEuf??f|lJ6 zntK2-g(Q)~kgUWA5Li|ZX}G09nOChH;1RY^pOg>lwNwdi)zykuAkO|Wo#vDNoqd7Q zP#oGdpiRgCgle4icirDMv$M9rD?+u{vG!5Q zjxx}$+*k+5?H8{K4m;!iwS2rZu!0U6 zvBnP$0ZKGZH8RotD%z@txO~ zFFEjNHB+*!wz~T*k#vsN)h2Gxk$7*vE*+f1cUsi+d_i2lUM$EwvfZr2QkDL`GF4M$ z^LknqVlZ~NCKBa=ng(WO%XT1^Qhe|0v_f%roDqFNkY5J zkIpvGnezbc?9g`iIS@Ke1D(B(WG6(D6Ofz)BsmGP1FdWauoF6CJ8A2Lb~itmZGhQ5 zNtn4y=|0bG>Fixf_nym-J$J9>U+37d<>RlupU>z0dVOhj-zH|9gQ-q?KAk4*zo^RS z!4PN@I37dbL;Jv~ejaKmRi|<+xN&QI8iDcGv8g^D#(rf;Dmig`H8U^8pvE`oWI2L% zn)RR?3+=7GQ@0CH5DwjI(1w$R&_4ZprD5`A`?UT{qO(-%lNfA$BCQpm<1aHQYs7ub znU5{9;9pg#DUHKl07rNp-qQ)DloZ>%eol_h(c7Oqk=H2Qv-rs;F0O+pG9 zw{{$76rN>wR2Dh40BqkRO~G92aUjj5Ow{p`WO|9NT%#swnfLvYP9ZRH*pNh4lA#^d zYKrBkSAaAeu~MCz^x?TcR%aF@L2!HkrC39dcU78|72HPg_ zycL3wSJa1sAw*+|Gj39rgU0&|IVo>pZ<9`jbN{nA+5pv80e^(-1LX|!$fT$3d_CWD z4${+x?8h6uTaPKMRF)a|(QMp`SCo|!5a~e%l*!M4% zgC%MbtIYHh&~Rw8`gvnXG1>lpD9JPPvPj~;8OeRxna9SO;WFb*-=OpUhgSb9UMWuQwvUWp*eDAX58HZ zr0gZ}neTC_rb~#~>;rSzfm-iZwpOKedu{=A=3*UPwYd>mL^pTO_xYN6zh&dVpY&u* zr&&2ep(>MbT=+iHD%CejpYkQ4yh?3dK?t$#mC!2hAaeom4Q4TBX7^QTmry$csDH&w z!+UbBjhRcRA&!Sm+W)}&qKf&O?;+5@MgFEizXhC?9o>0bGg0pMY+B0Gr&!XgJcnCZ zvTDt20oup4d!|mKp*YjMM!iIIz(i<8y7v4`zVWMm{WR+m~7h6_KxA9rsFjZV6*}ySaG6yW*845esW>HGCLUp zy0(lco(bCWqv~UP^-aI7nn~)Dmj?T~a>ykNe6vPOn|8yveSVb|Cd|OehR+qxB`Xz{_IDSzXVc9bKcyXS%#CLqu__ww|R5`CDoB~)&s{=JMUD# z0!*jv7fQflYM1Mfo2~D;l|f6~HnO}Q@MO*=Hbuwl_SgV(K0hSPV%qVIF4a&}pjz&kyzOcX@V+x#2)sD;`n~BdZtL z?D-S+WC6X9fO~}U3e**OxAJZt3InDV1pQxr;C{JzueGbPaEUYyK$9y-P4jN0!+C!m zHDWLjsfp|*zt+}|ExH?aMF?Jc0Er)^Ubc^xqmT$>)kHsZSUFl-m;$5gb@ha4lsp`V zH_6jXNl;F}&*#EU;87)Yo+bnBdHT73h>C!G!k@~8-~=`|fs=pPQ0{2?QLyL2e!je| zzybeT@ZMOoQLXrlk{UwI=cEG`zP=IzE(&a=9X7mpx>U$VS(|Wqn5|11K7Zt-e}}si z%o-Ytou%=!U5%@5yn8dVghSv#JNv3()+SzUlZy3v>dJ5vS%2X?3%Et`yby-9Yr}^e z#m7P5G+S%}zNzDjZvR<&%fNXSY%dWbqIrL~m-SdKK@RIi`Z{BmuO8;D>lYA1uHn`n zA(F$|hM}#RBrf2kDYtN?6@bEpC@({=fE7kSzv!9#5`Gf z%S@ql!gpL%jt|LHg7*&Q1K-$u*M>WX6gaGSdkUtDG7Z;uC7|cH*&+y)`FM$EDU$7z6$t2gc`hQ3RjMp=?$Q;O(#^MiSvwi z(GHv!p#EAm9tHmqJ(Tn7i6-fAQxR?|A4oWUJhxp$8ey*f{Dg-@t1Rql^3S-UI z@{a(Q>^U;lcRY(D39odI3e5VPy^9CC5e{?70(WVN3svTRR@%>EM0_^FRv|*jj{a!VY%6z|NChBC=)PMBD|T>~)ufABmRN zF2VFQitSErli_#Ekc}Ay8zSh+(K;yjSm)pE>Inc zYTkCSYalh}xj_ajqnw0x^ja-aa{r*UuT)_LGO{z^R0~w^2B|8^LjCYwcX#}I-jT{~ zSxnW_+)>d27Wh4Xpbu%VdyYLei1}8zJp%h?TyF1HiHq$G-?&`&t>gs`85rJH6)~Q( z$)_q@Qz6$uWT{N1%XqhFs?)bMmeJ^82|g?{C5w7s19@N78AomRV5Tc6c!@Oi4YfaW zQ&)KqW0(DR=+?<`UsQOH^D#fh$Xk5Vpvi8u!x#TTFA{xI)=)6K8g5BdU-BBK?i*hL z8iZ7Uo!DD^;y`a7V`8Lm-XZYxx48F)7469f)x~zr<&BeOcCh+op&yHkR8i6(+tjV& z5Dj%3lS=5Z$M}T6(v}9|x76vJGhH}qf==;WnrT> zyko)^<~sqAGX2;WoRHfm$d82>5LXHbCd zd3<}p{er@@@N|zR4J4oJf%IM}vkBzs+bKG^@Ln?6c42mBPU%Q;_=xHOq9FIyFEx}+ z1<`cn)J=1s=VjMz(8~70Tu8yYQ*(wO&{{@ilDoL<(WyH)l(2u8px9LoU5<|X#mq6t z>3nHPaEsk-xx}07fbZpOv)oVHKV)VrxIqd(2fHTxbrZI2k0f|Fv9U!7pNS>x&&|Xu z*zPvD3bxW%Y$@~>FvHr4wMU~FG&Z!oLMQ0+JqNVV3$n`A$-PA60ap_@9>8W_)nk;z zvcWpdwAp%4>`us^y}6$#2Ai_#J5Z@Uu%};(MmI<|fO;%!#BIA_xCei>S|Bt{`>$63 zZzMlZC-tga^cdazMA1WxRl^~vyf(4U0k;oo{;{;L7q%{Wyot9Nc1pTf1Knt1XP@EF!4Wi3;}FXM5UjLc3uFIYDX(V?(_c=v>=zRrOgV>3bx z)NR7Y3a?r6$C(W9JH8Cg8R1LWV^Em0-Dmv*5Iqlc54(CXc!;&l&_~2V2OZyQVL@fu zK%Y-I%7N~>)72C=C+Ns0!u=M(bEPi=!)SFx8&ho8+)syd&xU_!Gsj)7Rl9#Y+B`M! z1}kiVWX9AVj>oDd*LsFb?FsnR*^GZS(-qHu2qekqZ8S8D8?V4Uh^bdr%2470Q7;PZ z;bKK?)YhrTJmv4r+~OAC4_@jz7SurE(^}xu7JA%+K1PL!ptRh^E(f7GoSXIVXPey_ zm-|Pz`D!27Q*W=V1FoK722IY;(@=PwNXw<%!Y7WW3}Cq|J}WdVo~lpK=g+wsZ1ro| zWtt)Ai70sPLxO2|E{sE5Xhy`!1=GnD=nl*YNR6bL14LBav>U<79Kh><-3}c5%k98q z^SdknCo|3e$tLHR7t$}wcglAFbM{zE-pnNDtF0ojLGC>upmp^j{(*?t z7d$uI>vX(s0^oXms!;elmQ{iI?wtL3i6|wAy6ihQ6D5K1qbvbTAy$=ILi@mQc3Xnp z?z-Dru6NrPnADiA+mz~r8Pi;oO0 zK~B^PKI<>zmp%!h?9WXI)td!E>|V(&#>zX@rAA@SF;zp%2eu@I(iL8+`z%`bOo)2& z0`O_I4rbWD&%U``mZ(Q6xK3>@R65pbjp-_+E%F<_1SslnkUg03R)|q*e6aokU9xS# z54tmlSIs#p+j|<*X#L`1v~b|A3$=XL7?bm*eM3AQ-Tt)Jkd%hn(zTFf_?FU8-1f6; zu-$kE(14(z9ZfNvjG`0P_Tp}7&VMmezm8$1273DG^$Y@$0q{&Izv^Wo;(?rHeAgr~ zy_M1H6M;8X)z5X((u`Lyp7+etfsN?|e)V0=I)vWaE6Cbjgc&bUmgx058W{&z&oy^s zE6*-q)WDe@>nf>34nEbceVCw6H|D%) zYf!tg1LC@1|@O}q1& zr~T$0`WvWCj|G4era&2;lx*7Bpn1a?gC5-W5g!3H*-UVIYLx3XY;)1ea-tfUt#qec zA4XGF`XkuId<}}F^EKW^9o9Z;9ozqqA>YmHg4ZZS5^+T%zopjD<^+5A;EBPsu#VwA-|sG~c*L_f`8sO(nyItH7@7;dnVowqXBa$k9VqTjJG{f(yJ` zwF*EcFLl~dXTD|0JAVE(OCx%A=5=*rLQ#(L(GlM&8j8MHgqTsJIa4{cHz##L${^k` zuXpy^i}td$`h~E|u8HJNymLLsKAG%J9k|9DhS%wqkEH!>@^DfQ93RzU-Qg2Cd_s9O zF}^wCExGS+p>GhF$u+pLTLVhvd+t3U#F*>34p)4;tGuzlsDtr*6bNp z9kA7H5;1$LdOwI>0%)&^tJYmEYByeEd8Bix_=Iyw6aIH|n(Nq6YwzI9WPkMINXkFWrI_8)W)KRv+Ep$2p;brcXs=VDjV~!6?hE$&B;p99^)qr~0}&dj<2;vzQ>}e*k%D5#Ik-u9K>O=1#>-pK z)S8C1(trmhk{?qifHA4nc6AJ?QM6v~x?EzfVget)KKOy)t5FA_1Ix-Oa05MK_u0lS z0=^ToYDYjDqmRJADRvuMER*Y_GZbXf{)wzB{08b!_%fkJnD2p_a*yM^o^i-*G*^v+kx5ZIb%94hJ_dcRJ>~U~t`+AWPG2HE@n$nXuUub^Oms)L@_+&v;Wo z_6A)*?pCOpwYcC;<@d@|<>h_6-B~(F1_y$N0PF(ZEG2exf$ZlYZI|_tw$`*Pz$#LB z?Bb+2)+NHdv=17rq;^HeN}I_G^6Ml#pkLzDV7RG1`w#=7WeTa!1gNu10I@mIMCT z?nZm3D(-zYU!`ju(NC1007)8;X#W5U_`iVW3Mmw`U^O?Q?Ty?+I4DcIi#Q~H`7DRw zWpLZu*n;G z;N$FfakX_|uCIC6JfNJ9Q>A_J@px^2a8^fh3SsFWyhb2BPw;LVmPl`rTOR;i&>ru1 z4x87f2+_5M;Pigzw6~}m{`x~PJEeV6IP&B`2s$XmHqxY&XFW$Qr14gFueP5x8>QV< zZ2-%91U(q;XP$tHLSL}=_uuTpF}k>Tf;EJOt)RM9AFX$rmGjXS$0DE8e#Ov$*^NoY z=djR^Ugo)(6yO@qFCO$4^UJYj>xIj)gHbSpqI+svR%22vM#7fIXgOV`ypx~-53qY; zU#dS2@@3CzxIQXfR%r>`3h7xaU-%a?qtPH6e$Wp+cmP2pA{<~Tb zOEL-fYj;#A$VYGX+roL&H!`m8=hz{*@mXyRWCM*$_NT0}N5`P&3cE=fwQCTdl3x(bbV zAna4BG_pVUHRNIPrp&wk`}uYVom5BPa?H?e{RYdpTZnH0M}QFXrhB;s)u^+@V{i@) zaolpWjwpO(Xg(6p^oeNlG13%TpP>!|mG~tOmnqcDUBE(JRRB6H@4X@OT&Zo3!Z9F8y#WdkL|^A=IYu5|kLtQL(;s<2NHnc(-3z8z;$^^~ z%*Dq|&_1hWvvAh@xhBRq?bZDo4Uv*~%JMi8S^~Rhs*BDO5?=C`?3nj zSt@2&GUIvr>X9OVCdB}(+8(T_yWobjw#Zcqo;jMVs*elQoWW+;wc$4hlLKynaceyF zAKs@v*`L$_2%M}Je)7Q4H)s_A3DdA*^>eeHNYp9@uou<8ovY+81ad|R73kUO=d!Iz z_&F8jnR4N`jeV1PA&Vs33i@lU*DWN9f7%7$k?@DAul(;xAu5R^1fP_GKVLF(322Fg z(Ljy%p;oFy;S84ZJPn~Q&2=Le=q#E#)}Y1a5j`XK@+*S+>!Zh&?dFAj@0- zXVDlNv}Li3CxQ?EAF@&D?w|C{m~C;X>piCK7BO$vPPsU(_kg-5Z;uQ$O#u9fnUeCc zdeyUPkmGpoYZ*_$@w9+5lG}U9`Lj7pGq1hipYP0f6BF$j(rT%{_D<1jx@cnpiw^cbDnC`!!8B+hqHOs4HjT&+X3{^#7I# z{?`uRUwt|KPh{Fqk?_yi1J{Cu1o1;K-(7#J#X8|nQ?b%*H#~1%ZHNt7mwfqf{k0u+ zH>osQk$5-f-8E~7WZ6e#WN?>S<(~^hRQFA9y0^xD z(+t%|_vt!Q&xeUMN)}qBw5T;&eKLWU$79jlCh{wtkei+gXQ?D)lTgU@ zw_of|hWch9TF+PA_8lZpn+vY-a zIF7j{(B)s525m`#5Wo#kZ0mbPKoLEWL0mX-!8yz&iD=0F=8diXZvlDhtpuN_EYv?p zK?>M8M)rZiD5snO=^*)|-O!iS#X`FR|I{gkuoPaBMvO-`nHx^3G!ET2YV33jEj3H`%-u^@+tx z*IqNuN;dU)UhTv0Fuo-#5IzYp)P;&>?Q6fbQEBv;y*93H6hGsuyS251T9U7~3{~q=G zLNMIC6V*HXcRfrpdgZ8y&B;Yr%`0d2UjS|@bOj`_bHFq1$(Vco1<98w{1R};5Pj0% zc$}cB$ee^IJJ8#U^l_9aI|7w_+yIpsr6q`r$R2z|_WL9-=}vB12`^H)Ss!(gmDIn1o@mSRdN zk)M;Sj^oOFJ9U;|ld4vBN_G3axSYI{S+j@MAD)~{uGXCl8~Y@D$84%jfG5f>6XsV# z`q+H{8Tk$8w=~y;#^0f2ZEShy1;HjQ!L_Ceh&bCz^Y)+(Do&#!X1QnE1C%S7`+jJy z^*i1Fi2GmXb4;o|x0Tms8oCUHkZ8CT_;j#3v}ei0VNj2|ec+T8`Ys1?<56YPn{l4( zE8J=Y)1Ec^*?ESnPkw=$eu0K&Y>`T$VnXWbA*Hm?>c~yQ>Mv<=88$f} z0ZV$=bNm{UdiUdFQUwZ3YFEd8qAp)_9w6 zm#7ha3{~xlEKcql3&8dv*?FH!nA2g%-Jjs8r)YBySpn=@ zYlLye6E0tZsLptNj-obd+z7O}myj!>W=I!?SU%v`sjv^coj5}sjMLu|kU<89f#zO9 z*+4fi!#cqG1}y2yZAKO<9GwYqei!7Bkp+I^PK2Fi%uwnE=Q?^ZTWo?Gi>74)+evUE zAru&%2$UQbvv>WHqYxM&TQ?!-8HQqcfyLjCYCpO-`x26Zd~YDo$N(iMf|dSNVsfdS zC5vc^4sP9sk4B*oE4cfPUJPY+@!ojNs)+8amy|JGIWw zrv!i%A}aoYo}vqpiu9P2-x|=pT6!uEI{)k^jWP7Ho!eXd+5o=`Lu2q+KYSzZW(?b2 zx*?(-j#`R)ZU~98A_$Ses3VymwujLHa5a3fb=llv?kNfgY)%K)( zqULqcPMFIg`r7@y&xqkv&qT#cAX~9nckE^G&j(h#_k3X#D#Gled=0%}6A|Xw$0%72 ze0wA8SfF!HF)OU~kg>4^=a%OB`G=5GzZV#>(|WM4??5+gAd{MKIZz~?f$b|Ev#oK7 zyYY?)hT4&NbTq*qT?5%Q7*dMo1%4l94oK!2*TTa+ z#Nr5E=GEM{0L(T09k#_c@fod0UcN~Nx(34IZhml?I4zOYl+ZT|xNP@n@faGOBLn>1 zXg};d>k!U}A+#;8v0JUeir7vqPjI%QgP~M?Dq(k@5$S55Hh$GtqxZz9<8*h!rYqmj;VCIE@p89xIFc@Mrze<2g4c84x zi$e2GeL=m}#%48wfB#^88$fW218uyxEEC5=;pw{mu)QX=e54eX^3hHxD@35brs*^p z>9(wu)T263BQqY`wb^yRAt4&GMurT}&P%&{t!j?3!#A?!!0}M1&lT$lJu7h?y{?QB z^|=Q#6-?(q=rW{K0!Xf}^QZkvjjsIEG!c@!=M|%K`XHegq)-Qel39<_Y znaC>9c?y?PAsk&z4x8VA1U*5AiR+Tq&Tb%?qUk+aCf2MkvU=y;JN8r&=`6vuc>waR z(&N6J0F>e--7t_rI(u*-jdR|6^oVbVXfKQiUa|fM+x8<>&A>$S%`>#lFwV$ZcEI3u z0w%u&w6;BCRB)zl5Q%Rm+ zZ}64v-3SdY@p|EUCQ^ns%xhV2fAq9IluS9%#l0A)xXzpd;M#5Z|1j4OXl96NOJ@H8 zqC*?Tj(m5>CNb{iFQbr4_v=90_SF5ehec`gE<(NtFh1w^bYyrTe>z$BEzjjXGQW%9 z66V-lD{KN-%XVOoU~p#bp_RxQe>t`wE73FYl^U%`q*D0OjlN`%NT5%R87mrvTJteT zJSrLXV3?8HV*p#=J8&er&Hjazxve@6n3iXC(~D$mLBjuu3~S6oUKtj&{n)iJ>t!~N z)(1Z3Jlz{=K{p55dppoF1KwsvUNDo%-`mJQq8mCLg6_A2Vuq_wnRggslD>RvEv6yK z?{My0%Kbnl3e&FeF#1^Yry6eJ(>CZoe6?P5s0#um=XP)bEq!iZh;4w%Ksp5^^ZgU& z_mSV?xpGO!S?6VW&GmL;*b3xzM9UWfXP-CrRiiOxN#FlLfyKLB=D6-BpYzKK&}^G3zOCJ~jQNxqxLsn?MKyxqM z1mqg%n-q%pOCQyd@-s|6NjS1c<=Vo89hUUr@QL3G9-7dn(GF{Mw2r)~+lH1aqL%g_U^-m{ko=>5 z2${8kfZ9i=qs;#p=5bWl4B@C)#jsvfHj8liqQ}f{|^8W9z8`i26%#3&* zBX+Dmlyjk3@b^g5&KvGZh3Ywts!$7q)B--wRcuXc#PR^Qq}@Grj(?LusY&=AZkEx> z^RCb;SfcEiF>OyF8*^{&lah|ezQGi4udlW!4Ib+jp#1R71rNko9`X(Iu9Dks@E%M~ z`AdICg=3yfd1pLjkWN%-JkNF*GQSo|yee;O_avq#^tvX*{e`xSvXc4MT2?4e*kJn? zPYW!w`H`ytnH}k^xewzBK1ej=m5NPJlr)_9Nbh3ho{=}OS+O9PJh#{e?yS`-LJF%9=noxhZ|vNzZRNP0NirBGO)!w3nTh^mI7~`2k(Jc$$Is7G=m6w)%ft9*1?+1&de4 z4t;~L(7q)O^(9OPzJUR}O6vof1*P?3jh-}JLU8X`dGPOf7}`8>1}391`>fcfhRs&1yF&z27Xsnpvni|_hK!Apq3;xSrA;d3dXl1Qey5;CrB9f!7C zHF^J_jL&Quwl=WhGIfg87u-DGpmwjo>t#+nnN2s3fm7!XGp;&emabJrTBNmDG8E}oy$7<70NfW70C zeziyTMpLYL(~P)PYh(X*sdPkqjFno=M5Uwl892Da6a0^ZXI; z)Fr%;OKPu+ytVt8Pl*;m|Jb3FR(5DrUo|zYsWdN`Pdw@(OwWV5lIKbbgC?7)^$&BeM6zOw7?EnXFr+RFL|3oT}w` zZbw#brPoa3hlP~1mx*!W+bgj5VSN+u?>zUi8Y2wVm#ljwj%yy9f=(SyBZtJK(_;r?z9Wvz7VU$&JDY26<%zaDR`=O zFCuTLGVLi{v^m?pSPX`fE@ekyYNJ?s$-Oyg${ZF~UG~;F#W|Q~4u%#s*bNuQp)DM5 zZ4v*3nh)n=yG4nGt5!`7_K(J`RRYKQ;-7mh@8rk#4y16G_eo?2(|sG+At3^3IS4cZ zXB>&@sq!5f%%PS`@Tp*SoN}h{JBMs@#s{YeA`rL^-eDPzNwiqS|1JW~{%!`L1p~0w zT9R*1PMu3zv&ZIgC@JB-wIJx<8tqZuaVXxiEIzrNNdGrF?~~)^N2zZ5xKva%o># zpU1nAz2rYgF%Q)+P)8h`d<=uMUAhj1l92fq+<8B$^{OzVvCNj9?-8#(5c)^KC=uS{ z>aS^6A<87_p-zo zT7>kgy32moPqUxm4YFn8b4*x(HdkqSE*`hco`yqOd~3-)ne?;+k6F7awd{}<=}ML` z&nJDvC)8i_qkk56-5tjb2pfE+Fyb@2s2ju3Rhm2=eZ<*O%KKf~Pm{;?&NaQNi|tSh z4}Ql3W-+<_;}saiDf@X7p%b#dU_OJwQRmoaHjDz>Hbt(GMpDe_H%5v66_boKMuX_5 zF{*L$^egNrYX+FR3py^K?b&>9m^4GKsqvtB0^G{{k#`sz*~?1MlRUU_E=Dzg-g{{# zngHGpe~#$Fxv@(z+)cYaP!~}HW}m(U8PtxQ>J-%Ah|Vdie5<*$DmScKZp?*ohR`}+ z(5^!e>wuE-83qlmUsOPH#)^%Xdwu{Lv!kAz@%UIQUGybSzMyi>%3;#`?IqU21Px?5 zWjh#tJc_Fd`b$AUF@-1NOaIXf4Er$M;T4?F-VQZnK8yMDo1r@gjcoI=P%1K^d1j7e zF0}y3t-$Ye+Z!syYvu8P4$O_3!9OeiZ~Ec?^fu&2vGtl#Yd|hjn?rJinML19rhjl7 zgu~81@SHiiXgw@&w3Cbf3y-pN)c8Wl?|cou)IVCgV-EHeAlbk+T$q~jysQJ?AaM!W zYk9(x1L-lQp8Gc+ppq9KxhWb>@2>nK?OV^pXc|#F&>_cDXo(gTHZ&Tr;dg&v0i`AP zkIghB(uKX^oK?s&dQ2lXCZ96)eco~e5MX#>1cSGXJ#g)FEOK5KaUSh~m)80L>P5kk z`g&M)I6r4V=iM6c+9=-|PFnX17lv^&J;rny!AAt>%6>6^g0v)Uduo$60VwlB*3zAX zPqaR!b`_(Rr^R%F6^72zuIFHMGO+8*A!xr#y9@c!Lj)7aeq{6y|BPj#b;?v`D|*sT ze~DF$Wyp%|asX2HxwuvADuu$2qY*E?*?48K2Y`uE*4812*rT|oSu^2RyrIMqG#LGk z0p^tnPrp3ORNKdCp;1}kFG=1tUVHqXDnJ9BmF({Zx-yP?qTeZ??3MPLq5a?(N=&Y0 z8Pn~R>E(BIVw?4K7fQb~NeDLgwIAp%Nx4eem^?9a#=Dh~ZhIMXT}k%52k_~DRL*L+ ze<@)0eftFQ55lU4e&RzP!cuAv(JdkS%(?3xwU6?=K^8S)Pl;5Zt^Dmhn{|U6N-JZx zqwy30Ep=5yMvZOjl)%JFU>I&3gAYjtKKb*SN*Hi9~hHo9L9ZE}RdAl}u--h<1v z((zpu=10YvsR)Ol$Y>BloW=VUK$NBZTeX%-flD_FP_EoJ^GR0_gIcnHcXcjyB~i3` z$f`w*9RcraHbiU14ppg$Z$T@V2e@4y7~%lW;icK=ncbE1_-=;gnk(5&0lnLUj(tv` zIavv-b=sPo_Brf((9QtY*r0iIN_Yc8nd88+$wSYXz-p+*S)#vYnQ4AFY{(y=b2N3I zi=^&AeMVkx`|ePbor5sLd6N+gZonJ2_yI^`*K7bLf(FA-3RY~Il;J~lQOE`a{cdafQR1*-CzT(z%F8<}%LA8)g9T$El zJN8Bi7WaKS0&-QV`hUL!piVoN-yvqMI8+mRm!^6j~jkZLQzI2BkT)%C#1?(Cs74utWnrk=@+f z)E>*KOdfP3_2^K;J%}x#dNk{CRnJ+~N|#!(2tC9eR#HtpmuW)|`&|>GHfO9Kuv}7Y z(fX1#n;Uftc{K+~`uTOZ-Q!rd*||nT;DvzEQfPT{pk$n$_IDV3K=)^a&|0Y_`<(Q~ zJ2B=2F2g}}#OQF$C3l1%{5~Y;)O1z;j8iBNU1+N2l^H`D^A!$5z(o1$nWPvGP6hT~ z0WA|H9o+Ds8N?s^sX!~V+NI{JLlYt9z`Chxba>n1v1(`$R5Sa2@H|ZmwBej!VtH31 zbRKm5=y8Vf<#?vc0_oqes$13nPlVyxE%%auD4<)_VV9HLQ#BuPhV2Kc1YLc=kyoeA zJ0_Bz>hFh9$?A*#3v3W%^i-Z_Xy~WWbbA$tA2UqRjUiI!-dZuV?|5iYkEx+sz8k?% zn%E=$kqAL($+%#A6(B%?$9h*|7>cyyMqNgU-`snfZ$SBm%oUHBEC%UpVo zS-<>~x8W*)_s;iuLbCPvwM#?^02yvaHj7jEujFZ;S%Sm5u_5~>V0~dEh)RUG=rd&8+a=>XleyV=^GOdot&JM=z}K&cP%gW8iI${6J0zY8l<8T{|`fRPJ0D zKZvmi?Qh9Nh^`B(v5kf#F7FLZ5%$i>uUt+sCGfTJ&w!-|?SL=wgmZQ)oE}VEq_F>y z9QHS6Wq{j!b+{X^UhLEL6g=Q@E)Zzv#|xY@l!la`IBmv{-@W8>ic=F@!?nIJx%2kO zUV9P|yoLoAcw%T8s=^A8)d`F@WdDbHiE>Vit5oG&IYw76_In-q7}rpC+sB;HPiv?Q z$((yTbJ-wlDU5d5=iPv+VDkifsZkF1AB0pu+q4kzklE%=t^y{a6dAuicAnZ&zKCN2?GdZ(~|yUy;0^k*Fe zVRqiro%UD06a5sg)T4oY`!pG)x30!ob$i?sYpJGVBfSgUb{b5N>s6%-?92`8pmSp0 zv|i)9VD$pu0(j)dt}th^d^k8QR{>!1ii6e&@fZ1yEEvEg_Pa@jPx07cNF-p!I;b*s+>>bc1KZpU+?P6oh7LP zvez=tK9h6_?w#V)Jmp}fcArWi@!hq#@p0T4RgTR@u(`eFWd3unlP$L7Y{JM+fLq}$ zpgvR7^N0S8VBZRYIpXtMN2#;AzH&L^Lkm3lqW)CAjOn}Ciq%~p)gxH0OfCfM z&f$&y7)iVcxOU6h9^g|+OMM8(2R_ytT*Nro2;61Rg*~p%#r7>iV z_d>gBAN5)6VZU*6IlKC;9NWu{()uRj$1|89>wP<`zRaE2sGVj(%+({VZr+@;Ve>3j z=6wqqXAJP`pyHo+NJ}49F1Yntb4&g-l6NGgH0UMp55DRg!j9Tec2NGSMn!KgMmFPE z;~(m(6CJf2seT$UO5V}ajvE93YJI5x2g9?XC*is z3zo2(Ad1S3%b~zqPjK;5XY_j>E_D3)#Jz~7GshDT|MzBKG#lu}P0quBr?jM)YGpiz z)i%+*;dOJjZbne1&Il0un~LrBeDbrDj^6ZZ?ng>jt(4?5j(OxbMv&%TNc!leyKza| zV|j!GTbLqlR@~&13UrReLGDV*Tf3soMc_sEPKM{^AP~6O-eP1ASE&n%*WvNCY)KN% z_%B&4oYBuqykrl3PU^=77r5@iuEOWChy4~abS<>a8w^K4%HrBk9A}FHb90M!{ZqhD~u@Y!7#+}*N{+5S*uqfN2OZBA$LtFa4hEv0|-?=kxr`BtIvUw_P3HmY-WzpN2iu_Doxz#!_A4~zO4Vnt8-g@7O(&i9yvBsSjb zx@CsoiJvS3FkTGIy>6S}e2i;+pm` zGR-qj7yVojIw>_&jOFkLxH15*1I8LY#`4yEwhPZn8L&EFd6lzizws_!Y%4c%2l>fw zXcmSD?C}Z7{Fk}zYjLK=b{gOY{3JyFaLQ^JJi!8h3pWY>3J5ml3At838$=U}fY6XM z9j`l@@In+A1h5XDi!6JW{-jokQcp>)wG5ZhR=$9AZZM;vuhz@uKJ|n&k-BNWYoO7Y zO)mQ`SUl+yyEBF^+M7v!qX&xvnRRahAbGW5GTl5FXCenD?dww3dqNy5Kck;Y2qy`f z0>ruTO{eG{>js!0xgSG@*9k8dF_!NKzL@YHtp{h=n=~%tEd47)cd}{sDf}m#TAee{ zXF!=&xuorG*qb1Wy(N`cpq%zRzy9k9Jd@eA_}3RZ$lHTeq%Vo zK*%Fl($GGn3TZ{Yw}>QcuJRHD>_$gWJVDVZ2@)-Yc*?aF#hk4a#wD5>Y!_|MoZ ztsEBP)cI6*fQ?i5ufqDPtCf-Hkd19E+2#5{f|Qcxx>>Rc=YK@ngfVCx4jtySTQP1H z_ZPxX9ZS%mQC9T(9)Q$714sW(aMhJxSL8 zzqRvwYU4cj_`55xcO`7^t^`^MoUT@2B;oc*!Z8B(oI%Ep!EUDh(X_TRopDG{>$vR< z;PjXzH@l0lcO_x(3ME}h;H*TO>`EvRq|=cEX@J~-u-mx4;YTx5=cYEkaWiMm*v?Jg zPWvaEcV;j4b}x3G_j#W0=c6ys%O3hmKd^)7uiCue0R(_0(R~WqrAj4B3x)#UhxAK^ zX=YzE>+%-vOUG47`8djV%Qap8A5`P^s`DOb6BdWB%OC~yQOmj`er-&2R+eB?@^{gL zZ{3h_9Trls8@C*2cQ!mRI*2i0n&y8*rbSiNP0gO<3)eVFOw-x9o{pq+jg{sW%?fpH zRXTEP>|rVvUuLctGBU`lR5BL1k1b!yjx=iAR5dZGLKyncSVEeHZfI8COJAxd&ChkD z0r|vya=+WURn$$fWq^VRl1^P9VYnzv_8=JR3?sCRr!9bSiCUoDcOQq0bZ1qH>j8%0=JrT?siK z5kF2P0hxag5W63Oi+=fwwqs!6w$v*;!Bx4Jw>!)EQ;vv7{aS-eCa1Yz`2q1jSFN4G zx0^qU4r9mzm6JyRK9vq6+0s{z)P+OoxazD=M6!$Bwowq3cRY1e_O6rh+T=ZQk+o@= z6xe*L(NGQk92r}U%v~1ZbgmTc^9DGl#4urusQK* zls zI5^j!wh>FPm&k>EP~?-07uELq*VgW_TfPK_iM8ju_r zffGZI1N`610HW>oU_3u(*Vi$Z|HU+%EIZt1KP<=D?jf78s3;MBgkIPWh(7KSG}|JL z^?1=Cx^2tbxX=HNAKj@YJdxJ&w%UgT-V(P`pe>Y$$0d&ZHN3#l4F5y5+CT%><=^Oc zK!6-i{RMC&MAYj05wcg{FGwx>V!i|Cos9n2X#8H#M);{06wnjrx7&?sc8VAi1< zdKv?Ms;e?9xsq+=HH)+R%;x`GUT#t@9+>3ebvbHD6D@xGo=j-oM|++No~CIp5e4G=g%h=EfGhcX|amn(Z&}a ztkFF6hG@Pif-t#jA%%E%**3~FM+Qgdr_Ja^uaMqe0W*mo8G5tK40HJ-o1ReL^}?*n zE7<3@cq|#XEEe`7=V@w3(ty}hSD7YKQL9S%2|Ueoee0vQ^Q zHDHj7WM4CQl55LvHv^ArWPZX7x`z_^qL59x+AGzIoZ}EEb}aRKuI36EwnN5x!LYpE z!+YtUDBs8oo(!)UCd+c&(dkVzaRr~zpA2=Vto%ft^j*R4VN8l}e!x~3@6jIj7jf?= zmAA*s-%@1S^(;S$H(S|hqs7Hul;^jP+B>lJRJ2i&JH@TjU@Aap6X|SE{5R5P3MV~0 zT%Pra;t*Fj$*H~P?n@$nnvF?&eM=BG7 zY`LLNp{m8ke$0WW_2@d{OSJ*~L~7dx)MNB)AW#bp&jH61k4ppiQw&>v4XX`c`bF0> z2hbd*_o9+=N*KE(@!cF5+8F?D@f(t;^?KGj!kZ5N?I0zM$y#{zx;;l zp2fN%p}Qs3+QYcNGeI{q@_$Uu+%hTarVnO`vBl6!(G1*g_p3{MIq8zFW!E`0-DjKa zxD@qXmMcW=&-}ZZNa=L!9qOZwW2x9VeX6g#LtfW7WbT5C-fM|oUM!!A|Ue~sK zWOo1gv1!~brR-V_RaU8ytZ{NudexNPYf^8M_L33S^j>A_B+y!VBe9G%rk~KaS!B~S zSS}2hq*v<=iyNk|59n2wrd>ThLy@GtJs2Q`vj`MpODr9 zoZe6T#p}P<9N2B7P1?eNv7+c&Fnu981eP88?Th>@XH(7MEtu%X%D|oxg>qMQ#Aa`CMIAb(fjkR%Rcll!yT@~9kV?f}1WMv;E-0ruf z3x~wbVD>pfZs2FNLQm4;dpCaz2~2?lYtlXFK#W~T8v+H6Zdb}^e^a9I!K zQdf9muSvPdH0D!*w0cZ@?xp6OL&=P#4)1OMKxs`IHgsVT_5RH%z|g4?s=SMRx2Gv}?q&E87Sy`B5KhhP3KfYQ`8 z%NXvvkw&k_qw*0Z3BEPg*#B2(a+R7v;wY7S%+#$auOhaa8I)dXGEbnQXeyoBy$UPY z=nvG&1?Rg|P3hcYfClOil6w{kORIRtZYaJ=Oe1wFu6YUb-ouGU`83U5Chw(Dm=e;@ zgGaF0=NREKD%B6VRa$-IZ(B~El1n}HD{%y18{qZCN02ztze|>&zcONJ`E@E2Jm5ra z`33$E_nGCWZN(u!b&kU6vN%a>F;~lX2t^E2V#bGlkRLd2y6uPvyd6xWNpJ36s!7@7 z;qwE+-z5(LCdx13cVw7jIioK79Z7sov|Y=eB|D($C3BzX`Mibu*8wn9j{W-)A(a8@ N*Wl|v5BPsO{{R8i6tMsR diff --git a/examples/cx16/pcmaudio/adpcm-mono.wav b/examples/cx16/pcmaudio/adpcm-mono.wav new file mode 100644 index 0000000000000000000000000000000000000000..951a245bfcdbbcf9258a895923c1f9882be22fac GIT binary patch literal 35900 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%0A2Ja=AH_W(qYmtNl{eMg#-MURu|DpzS_&O1pZ z+n}>f!>)K2@aBg6BC1S#w~FC5;!i%!{V=13-{lqcaO34MIfKNZ@##pj>Z>rBt7#ge zIy1YifFvf=kAa@?cxIhR%@bYu!cYu9LlqBaN7dT5kg#_P$ge<(HcWr0T~YSOy9GPH&(FC&)P8~3MAZ6;J#TaN_c|U%ouB2eOy_mM%drsH+K8Y-AI=hZsGVN>`nkAJ*Ye*rFx^cxO*{*d;D5%jbzzzO8uXL z|MZs}O9$*BuFCe!gWz)UszLFo3XozUJ}Ne8IcGvQH8+&^|+u@)%MZM3i@k=N2GaG&jOr>=ZLK zt1g!m=G%J%yv^=mWX(_3yFE`VXaCNDM=Y^nL%z}ZwkF|9x0}B}e4#gPac~nS7<+Aw zSCV)eM*S?lauBBLQ=b%}P@Oy;jtoi&!B%Kx9^=lZN;H-@ZCpDX&|4;{48FV-zajI4 zf=8|px2^Aq;r?v0Bl{G)E>n;^NT3Jx+#u^|DyQum?C{2YOI*3))4|G}*%v64MMug~@7$@;STfQ8YI9xL z+=yHqg_Ukt{$-yrnJ{HGUzV#Lw&EUNS?|_pDYgFjNZxi~e7k>cQETGVq=y7hC9oJM*{BP?O&Y`RZY{IQ)OAh-ELk%Td#oKSY{&^GaIE^!WK&uP+86TMD%2?e(x vzYB70V6#0iC9O7!qB(XS1NkOI9V}2M1(5$;Kiq!*=!g0Jdy1mi|L6EG1+gbM literal 0 HcmV?d00001 diff --git a/examples/cx16/pcmaudio/adpcm.p8 b/examples/cx16/pcmaudio/adpcm.p8 index 38ae5446a..0e6a48b9d 100644 --- a/examples/cx16/pcmaudio/adpcm.p8 +++ b/examples/cx16/pcmaudio/adpcm.p8 @@ -16,24 +16,25 @@ ; HOW TO CREATE SUCH IMA-ADPCM ENCODED AUDIO? Use sox or ffmpeg: ; $ sox --guard source.mp3 -r 8000 -c 1 -e ima-adpcm out.wav trim 01:27.50 00:09 ; $ ffmpeg -i source.mp3 -ss 00:01:27.50 -to 00:01:36.50 -ar 8000 -ac 1 -c:a adpcm_ima_wav -block_size 256 -map_metadata -1 -bitexact out.wav -; -; THEN use a tool to read the raw audio frame data from that resulting out.wav and save it as 'adpcm-mono.bin'. +; Or use a tool such as https://github.com/dbry/adpcm-xq . ; main { - ubyte num_adpcm_blocks ubyte adpcm_blocks_left uword @requirezp nibblesptr sub start() { - uword adpcm_size = &audiodata.adpcm_data_end - &audiodata.adpcm_data - num_adpcm_blocks = (adpcm_size / 256) as ubyte ; NOTE: THE ADPCM DATA NEEDS TO BE ENCODED IN 256-byte BLOCKS ! + wavfile.parse() - txt.print_uw(adpcm_size) + txt.print_uw(wavfile.adpcm_size) txt.print(" adpcm data size = ") - txt.print_ub(num_adpcm_blocks) - txt.print(" blocks\n(b)enchmark or (p)layback? ") + txt.print_ub(wavfile.num_adpcm_blocks) + txt.print(" blocks\nsamplerate = ") + txt.print_uw(wavfile.sample_rate) + txt.print(" vera rate = ") + txt.print_uw(wavfile.vera_rate_hz) + txt.print("\n(b)enchmark or (p)layback? ") when c64.CHRIN() { 'b' -> benchmark() @@ -42,11 +43,11 @@ main { } sub benchmark() { - nibblesptr = &audiodata.adpcm_data + nibblesptr = wavfile.adpcm_data_ptr txt.print("\ndecoding all blocks...\n") c64.SETTIM(0,0,0) - repeat num_adpcm_blocks { + repeat wavfile.num_adpcm_blocks { adpcm.init(peekw(nibblesptr), @(nibblesptr+2)) nibblesptr += 4 repeat 252 { @@ -57,14 +58,14 @@ main { } } float duration_secs = (c64.RDTIM16() as float) / 60.0 - float words_per_second = 505.0 * (num_adpcm_blocks as float) / duration_secs + float words_per_second = 505.0 * (wavfile.num_adpcm_blocks as float) / duration_secs txt.print_uw(words_per_second as uword) txt.print(" words/sec\n") } sub playback() { - nibblesptr = &audiodata.adpcm_data - adpcm_blocks_left = num_adpcm_blocks + nibblesptr = wavfile.adpcm_data_ptr + adpcm_blocks_left = wavfile.num_adpcm_blocks cx16.VERA_AUDIO_CTRL = %10101111 ; mono 16 bit cx16.VERA_AUDIO_RATE = 0 ; halt playback @@ -77,12 +78,9 @@ main { cx16.VERA_IEN = %00001000 ; enable AFLOW sys.clear_irqd() - cx16.VERA_AUDIO_RATE = 21 ; start playback at ~8000 hz + cx16.VERA_AUDIO_RATE = wavfile.vera_rate ; start playback - float rate = (cx16.VERA_AUDIO_RATE as float) * (25e6 / 65536.0) - txt.print("\naudio via irq at ") - txt.print_uw(rate as uword) - txt.print(" hz mono\n") + txt.print("\naudio via irq\n") repeat { ; audio will play via the IRQ. @@ -117,8 +115,8 @@ main { adpcm_blocks_left-- if adpcm_blocks_left==0 { ; restart adpcm data from the beginning - nibblesptr = &audiodata.adpcm_data - adpcm_blocks_left = num_adpcm_blocks + nibblesptr = wavfile.adpcm_data_ptr + adpcm_blocks_left = wavfile.num_adpcm_blocks } } @@ -195,10 +193,66 @@ adpcm { } -audiodata { +wavfile { + + const ubyte WAVE_FORMAT_PCM = $1 + const ubyte WAVE_FORMAT_ADPCM = $2 + const ubyte WAVE_FORMAT_IEEE_FLOAT = $3 + const ubyte WAVE_FORMAT_ALAW = $6 + const ubyte WAVE_FORMAT_MULAW = $7 + const ubyte WAVE_FORMAT_DVI_ADPCM = $11 + + uword sample_rate + uword vera_rate_hz + ubyte vera_rate + uword adpcm_size + uword adpcm_data_ptr + ubyte num_adpcm_blocks + + sub parse() { + ; "RIFF" , filesize (int32) , "WAVE", "fmt ", fmtsize (int32) + ; we assume file sizes are <= 64Kb so don't have to worry about the upper 16 bits + uword @zp header = &wavdata.wav_data + if header[0]!=iso:'R' or header[1]!=iso:'I' or header[2]!=iso:'F' or header[3]!=iso:'F' + or header[8]!=iso:'W' or header[9]!=iso:'A' or header[10]!=iso:'V' or header[11]!=iso:'E' + or header[12]!=iso:'f' or header[13]!=iso:'m' or header[14]!=iso:'t' or header[15]!=iso:' ' { + txt.print("not a valid wav file\n") + sys.exit(1) + } + ; uword filesize = peekw(header+4) + uword chunksize = peekw(header+16) + uword wavefmt = peekw(header+20) + uword nchannels = peekw(header+22) + sample_rate = peekw(header+24) ; we assume sample rate <= 65535 so we can ignore the upper word + uword block_align = peekw(header+32) + + if block_align!=256 or nchannels!=1 or wavefmt!=WAVE_FORMAT_DVI_ADPCM { + txt.print("invalid wav specs\n") + sys.exit(1) + } + + ; skip chunks until we reach the 'data' chunk + header += chunksize + 20 + repeat { + chunksize = peekw(header+4) ; assume chunk size never exceeds 64kb so ignore upper word + if header[0]==iso:'d' and header[1]==iso:'a' and header[2]==iso:'t' and header[3]==iso:'a' + break + header += 8 + chunksize + } + adpcm_data_ptr = header + 8 + adpcm_size = chunksize + num_adpcm_blocks = (chunksize / 256) as ubyte ; NOTE: THE ADPCM DATA NEEDS TO BE ENCODED IN 256-byte BLOCKS ! + + const float vera_freq_factor = 25e6 / 65536.0 + vera_rate = (sample_rate as float / vera_freq_factor) + 1.0 as ubyte + vera_rate_hz = (vera_rate as float) * vera_freq_factor as uword + } +} + +wavdata { %option align_page -adpcm_data: - %asmbinary "adpcm-mono.bin" -adpcm_data_end: +wav_data: + %asmbinary "adpcm-mono.wav" +wav_data_end: }