diff --git a/applications/PoP/docs/sound_plan.md b/applications/PoP/docs/sound_plan.md index f3d0b3c..5ba3d8c 100644 --- a/applications/PoP/docs/sound_plan.md +++ b/applications/PoP/docs/sound_plan.md @@ -156,6 +156,45 @@ B имеет смысл только если C окажется неподъё зеркальные наборы (`pop_vflip_load_all`: 28 Кид + 5 страж + меч = 34 страницы), останется ~98. Проверять запас надо ИМЕННО ТАМ. +## 1г. MSDOS против SDLPoP: чем отличаются наборы (сверено 2026-08-20) + +У нас лежат ДВЕ копии звука — оригинальные `.dat` в `MSDOS/` (версия +1.3/1.4) и распакованные ассеты `SDLPoP/data/` (версия 1.0/1.1). Разница +есть, и она влияет на выбор источника. + +### Оцифровка: берём MSDOS + +Заголовок разный (`digi_new_type` против `digi_type`), но **28 звуков из +31 совпадают побайтно**. Различаются три, и все не в пользу SDLPoP: + +| id | звук | MSDOS | SDLPoP | +|---|---|---:|---:| +| 10 | `sword_vs_sword` | 5 020 сэмплов | 3 504 | +| 11 | `sword_moving` | 1 172 | 1 172, но **другие байты** | +| 48 | `spiked` | 5 069 | **7** — то есть звука нет | + +`spiked` в наборе SDLPoP фактически пустой. Поэтому упаковщик читает +`MSDOS/digisnd*.dat`, а не распакованные ассеты — в отличие от графики, +где источник наоборот SDLPoP. + +### MIDI: если дойдём до музыки — брать SDLPoP + +Здесь всё наоборот. Содержимое музыкально то же (деление 480, те же +каналы 0..7 плюс ударные), но: + +| | MSDOS | SDLPoP | +|---|---|---| +| формат MIDI | **0** — всё слито в ОДНУ дорожку | **1** — 8-9 дорожек | +| размер (звук 24) | 327 Б | 448 Б | +| размер (звук 56) | 13 587 Б | 12 773 Б | + +Формат 1 с отдельной дорожкой на инструмент — это готовое разделение +голосов. Для пути B (MIDI -> три канала AY) оно решает половину задачи: +дорожки можно выбирать напрямую (бас / мелодия / гармония), а не +разбирать слитый поток и догадываться, что чем было. + +**Итог: эффекты из MSDOS, музыка (когда дойдёт) из SDLPoP.** + ## 2. Что лежит в ассетах (замерено, а не по памяти) Звук в PoP адресуется как ресурс `10000 + N`, N = 0..56 — 57 звуков diff --git a/applications/PoP/poc/res/sound/s0.bin b/applications/PoP/poc/res/sound/s0.bin new file mode 100644 index 0000000..00c2472 --- /dev/null +++ b/applications/PoP/poc/res/sound/s0.bin @@ -0,0 +1 @@ +{{yzyz}}iG0!#=]t_PLI_q}}R]g`E*JG^Ƽc9%.GME5( !A[{ǻ|zkdkgnmZ\K:/4<>Snw|}mUVRH8-4NoX[x˹u|o{y`MXvqmQKabl|yȰξbcszif_x}ib_aNK[aoz~i[P7JowfD4OfjZOQS\lx}wpxflearvsq|~|lenkJBVw|wxpprWVg|tfPWtxZc~||^o}}sS\ns`X]nt~jhnmulhXY[`u~pjnqlqzraOKKUWYiosxtgbturk^YR`s~~{up{xtxtpzmhovyw~yvxxivtoy|ypuglwxwnlz{}{}yqvxyyr}rpy}wzxpsu||~|zuqkopopnsuz{|{vnmpu{swstuv{ljsxxuhvw||t{~}xu{}|xwzyrqv||zz~zxuqty|vv|}zz{uswuuwtonsx|~|urtyyux~~}|}{}xvtyyqinnptx}{zz{|zvy}z{|||~~tx|}||||{zxwyxz{tqx~}~|ustx{{yxz}|||}}}z{|~~{z~}}}|~~|zw|~}y{{}}{~~}zxzz|{{z~~}}~}}z~~xuy}~~}||}}{{|yx||z{}yxyyxy{}|~|{{~~}~}||zz{}}~}}}~~|z{{~||}yxxy~~~~||yzz}|}||~~z{~}{|{yy{~~|||}~~}}~~~~~}}~~~}}~~}}}z|}~~}||~yy{}~~}|~~|{}}|z}~}|}~~~~|zyyy{|}}zyzyxy{||zxz|}~}~~{{~yy{|||~~~|}~~}|{|}~~~~~}||{{|}~~}}~~~~~~}~}||~}y{~|{}yxy}wx~vttzyy}|z}{|~wwzztv|zsqyzz}~}}|trxtkjvwty|~|wt{tjnzurvy~vt|xx~wpt|ulnyuopxww{~~tnuxibq{tv||{|y~olt~{srx}vrw{z}{y{|poxunqzxqysu}rr{upt|{x{}||{qs~rlr~|stzxw|voxpks~}zwwy~z}uuroyxv|~~~xv|urwymjswnq|uywnr}ljuphn{zvv{~kjykZi|qsx}{~qozzigpk`cxyjk{zs|vfh{yrswvpuzptvnuxtw~{wxtqx}mjsnah}wgfwvt}rrzscl}tbbtwqm|wysjsmY`z|urnw}tvvjqj[bxxqpoy{svvouoch{wrqv|uz|twtjm{urryxt|tpu~mhn|sf]omgupqlXU}lcqqix{rwi[bzvjdrnizvnvdYe~}tniw|oo~kkxx]Xlzujk{rzslvlW_{yrhotn|mit~`R^|tm^ppi~jh{w_Qjxshd~|jrzloo[]uuphprkxwhnfWa{{spkw~mlrgngYd|{tll{nv}jhzz`Znzqgoum|oit`S_~ri^qidag{kVFpkRLpX^~xw^_zfS`lT_|~uyk^g|xmfu}icxljwjW]u~{qaqpg}sgokXaw|tfrvpkguaR]{um[kof{^kgQIl|ufR}z_dyjtiTYx|xhktgrxlpm]`ruldoohzwhljU]vvk]pfd}pgoeVfyje}{holjuz_[j|rebpai]dqmPPhvh[dgScheumOZzzk\oeVlwhmmVcz{upopbcw{TNljLMlnjhkrYaVPmiLVrhiqzsnwmfro`iz`\p\Wj`Oa[IUymZdtoeezoPZubL[uwciuxnncawsaj~d^l]Re_TcXPbjU^lfW^|TOknO]ukdft|lelgZft]f|pasvjqa\mSKcaQcxjUbwgITygJGmw^Yexzfbwr]f]WijZbxxdcrgUa[Rgkbmztioy\Q\{PF^gP]kd[dzUX{bTb~hV]{p[_ucHY[Kbl`mvrrwa\lkIZxu[YjYThaDPhFGrzcZWfiYmi]o[E\{xgUUvvUIk^RbxgnxxLFwǮ[9LsZlt^ixďSFTH=Xwl\TXxpRU|aQf]F^{oXWk}[QbiLVa\o]RfWKd}_assdkzcHKuY8BvaS^d{iVU{—RNYȵ_=TiyUS[]IM|qG=hӯ]EQul]]v}c[o_G[zEIgkR[upJSo{HDUĀ>5RƨmGHWreLPl„RNe̲kHNfrNA`UCZ[FW{JG^|WN]hZ\zUOdd@OpaKdq^D]r_I6_`D1fĚlGW`hSVxϯfOQˇNIY[GLrnG>b}B>dΦ\9iةK6IqŃMCOxFOgeW[{hY_oND_̽k5CsS7KmĮb3@meB\pyQfr~tdYkhRPexSAHzB8GzvVK[mSV{Ȱ{\JhgUaX?T˾l45`ƜMERq_RZgiOIdʠJ8WcMIrͶhzکX1Wvf\aTcIRڕV':a9&dzLgf``Url?1oN*JȨ{^Ub^ujT^ʟV2F~;6`•iVZgmaZtyE?gܧP1Mĥ~]Xicyi^cԜX3Eڄ>1bȖkXjphm^rI4]_2;vdUebfx^Y|²^;8w8(Y—ujWcPvfOZmJ7fL,PԤkc[o^iy_PƮb@FzӁ:5gəcHNZgjJHhӥW4BӁ::_ȝiGL^{iLS|υA(R^,BvʻSNama\fμyB2iܯa5F|ƳQOhuv][o͟S/9؎9*Qţd?TkqfQZv݂=#GV4&s̈́YG`jtkQ[k;9nܠN3TɣqVVajcRc®j;Bz͎I8Zr[_fpfWfY@Ny5@nĠVG}B?W̤YG?gcJPiϲfI4dͭ^GFqмnOEj¡aM[vƳrPB\ìoJGcſW9IU?QŎT=UƯi@LmÇTAD|K@Ktՠ`F9k̙WGQtԷ}X:Q½WDRPKcҒ\Q(bǮmS9^؞dM=}DGcΦiQIZwQOZĽlPENͬ[DRhΆ_=>~ʟd@@p̱qJDlTMg˦eOMfΨ]@JgāY<@\HQƋV@SȷoADb˛bI5]ūhJ8^_A,q݌G9O۶sT@R}SKW{L;Da4@\\; yX;auL0W̪_DWwxH>Sѿo<@Y֢S>$fбY>9kת\<@ˆGAaΨkJFbëpKLa|Lvӯk?=oUEUu˫aB6]ѫY>@a}]*6ڐY5;{b8>̂BD\ר\E8cӮUzÏ^MOyҠc9:wѝW5=txK3OzDCHV12~L5bɩ^>MlvE9SqC=Y֣d>3lӳoA5^ƇM9TijqDLhǏR?DӐM8CwڽyO'IʈR5GӕS5Iv@C`Ѧ]E0[νeB/NiK%Nk>:Zݞ\>:rΣW?IgӺbD4YұX=F^}T+2ޏO-=ղe>:lƛ\ETrƳqC?_ϴi>FeԞ\?.mбiB7aѸnCDa֮sK0RLJI3EΕF8Kѻb2KpǕOCBs˟YBEg~O6KľQDV͕P9IŁ?;T˱oJ5I]CK~˒U8L~GCdɦiJLcxTQYtK6Jh@EYܟl;*m׵pA*XϔO9FRO]~ҟF<8E4KwӀ[-0٦`92g|A8\ʭb;NmƒMBEϗN>GrϿmH5^˶nF>\×_CJufQWlnJF`ƯkFLg˒Y>C~ϗV=Fqƾ\@Aq¦pMB_˹jFBsכR6Z~վyOEA~ǞbI<_ʽpI5\ͪaBNjM?EϒG9GtĺqHG>]MIs֤Z=EԎP=WʳyPELskKF]¶lDCaȞYEUoQ>OďTQo|vhw]G\D(NZd~sb;lmKK{oCNqqko|e~oqaTbgn|mowk[ateSc|mvʺ|Mfmeg{sloWabtnwo;b}v\oxY{Ȟh[kMRrkc`Pynd_5ifRof^wws}jJMlznZ\oz|}wozwzxu}j<@f{}nWc_T]daYC,8XgF-Odtrp|ýǚjj<=qt}}NWR'Cm|ZN~lXsv{pstRSvs|KLffF8RVM>)M\KIdzkhn~}hsxsxnwhp}xtn{kJYlP@VzeYܧϹeHv`ocoUjgNTYph{}vvovUN:0^p[H9}cTT`acz}tplg۱m}w~y{~QEd|}xdeZwihnObtgsplnogn{|or}wqaJ=X|T(QwjWtaVtkJ–x_fl|w|s{uysvmpƣiGc`qs=~ngU?tbC?BtNq^fSmJr_Ty~|opvjrkafPzzs[r~aWgwkv|qck_}֫tYsiu`UifgHQ~KEe7\\FIzkqrqc@xbV6_}NdqNycOfxvztgTPlo`t|i]=II~BS}julgwq[Lny[i}gyocef[VkŤdU]PAAO|~dxzi_rRi_sewwpUZW}tkeaVK>8y|_̐|ub`gxv~ix}kP\Rgzjs}qs^orpaayzSWxMS}unl_|eVCaj^jsjlzl\RcdB>NNnodo{xe{xxitnLD\tuguxwkеʥ|l]o[aSV^T5[sM[F[Y}czrzQFSx^Swsprò̸wvy\cjJ:CPmxOK^_n_LTKLiv~|fgyam{t0AfS:=EfJ!7OnRB9AzfsuNJu|~o\TFDIOKdj|o{oMnr|qcbwJNo~ia[VNaqiMavdgis{viqyv\Xn]Xk}e\UuaknO_Slq-8_OwtXiZYgH|qIefXvySktpl`egp\kYTxh`\||yoxsaTkryyvriXdlt`bm~iTdleztrypn~bri~tjmp{axzy}|SrbWdut:BA^LTtPWj}hQzfew~}{mpaEUtlmhmjRAepqlitdf|yw~^Wgvk_`ctsvj]umM_qx~hZxwxm~o]|ztxsmOa{rez~Zm}yfe|{|kn~ok{fme_k[p||pjonlz^juawŶsl]UYcg~~ns}uy|wUGa{}bptFCojOYZnzjmurnfsdlcpu~ylhX}fqzc]{1JU`C[~zigqrmbaxha{gdxti{uJJ}sqrzjhrekk[n{jxfhvaklgpr~nVQvzm٦yjVKsgl6XRHkScsR^Oniftkr`̗¤{vpypvvkmp`FQ^qghmnzr[lvn~qq]RiX@JyM9WRxpbdKRVhsci|zt`iG[\ttyyyXw}idt{amot}bXt~jI^v`a{ngyz||wZLaUKValagf|}{|{tcloplxn{fU\p}rX_twit~p{]de_jdcjadyjr}usnahzxyw[E{^kzxWlqv{tgt~Vhl{p~lxtuqwmRGRbldG\ \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s1.bin b/applications/PoP/poc/res/sound/s1.bin new file mode 100644 index 0000000..23eabf7 --- /dev/null +++ b/applications/PoP/poc/res/sound/s1.bin @@ -0,0 +1,2 @@ +jtp]ons}vwyhax[T~_`|yegnjpwqp]elgkv}mmN_oo_hsxqv}f}u|}fvxsuUTmobab}~f[lyWly~on|qswzt{woke{vtyywufj^XY_ibq{{yw}~iQGJQb|xont~|oyes}]NSUfwn{wyobPaIDAVk]9Bdyy_cnYnKTz~cdkQSqsvnjqu{q|zm^hnYkwqn^]qYgslr{wl}~~srlrvX`au|nht~ix~n]byhxkxp}~oa^jzokid[yw|uty}kpu|va_sgPJVeinnvzeZhu~z|r}}|YZjojojltr{~jjzv{r}l||lY}y|~x|Vjmbb[sq{mqrguhMVe\n}|xq{ubyv{s{~sxnrqUQdvu{wohv}uhh{wcsq~g]k}wldewuqpkqoo|w~z{wwjslhnm||oux~xrux}~Nc|{i]OhdVQM\aWY]brv|orwztolz|x{{{irrcrztj]i}wts{|oXm~nit{zm|u}borye[ozs`_jibnr}tXnSIyuy|}nmc\swn}xkr~utxyuvdarymbio}qfcfw{rlj{}tllus~|gkx}|mj~fsrnutysvwt|}wxu|wp]K\nmz[r|vfsx|rox\WI5Nfn`S`ywsuvnkrvysvu}}v|~~|vxyyrzxrqtzz{vxkWiujMGcvo_fxz{wu|tzx_d{sttyju|ojis~rv}y}xc_hrz~|w~ri~okqyvq{{|{z~nhhc^bprimpbdjz{pq}yhbnnseYk{t~~wxbtnqvvfp_fmhmc}anpvq{vzostqmzz~~t|ru}~kjsuririjuqkowtim|xrr~yz}{~y|zts~xlrcheit{z{~vy\j~nvwwsmthgxnwkx}ysm~ztvzzmmwxr{wvz}}~{zoendbv}pbi~uq~|ry{xdl}tvzz||{ux{vspprkmtotw{v}}yxvvtkqgf^cYgkdmonu{{|}qkx}~v{}ztz~}zzswy{}|rpysssz|zx}~xvyjbmkejlqxux}z~~mt~txx}{}}{{rt|zvmhzqp|hstypq{}}z}srp{xovjoegelowmpmirzwuzy~|xfwohpw}em}ertd|vz~~yiWYikpxss{~vlw~|n]lwnnkl}x}qxsv~oz~||t|~|}p}}~~uuwjhppkqant|wo~{wznlmw{i`jpfdd]gmafs|tbmxxv|~{{es|wtsrlyyt||{~yxx|{|sjzsqymw}gmpvthwn|ivoyvyyzwnxuvkwpqrgqq|zyzqxy{|ttvqssjghekyvsvt}u}wuqs~}y|uw{{z{~}}tspgfpnw~uvxz}}}sx|yy{}vyyz{kvylwvlr~zz~|{zw|wvy}yvtxsmrtz|xxtx~ywytr{z{us|{||}zxz|}zpl}}~}y~xzyyzwz}ytw{sn}|x{}}{yt{||y}}}z{y{z~wswxw~{pw{y|yw{}|zz|}{sux{wv|}|{x{zw{}|z{|}~|wu}x~yu{yvwx}yxy}~z~}zy{z}|}z||{||}{{}{}z|}}~|wxzzywwyyyxx{|~}xvy}zy{}ztuxz~}~|{}y|{}}~}~}}}}z|{|yxxvvx|y{|z~}}{|}||||z~~}~~~}~~{{~z}~~}~zy{{|}}~}~{{||{{zyz}{}}y~~|~}~}|~z|~|}||~~~~|~~|{}~}~}}~~}~}|~}}}|{~~~}}~~~}~~|}~smrr`bOGg^Drpqg,)IIJO3>TmjEUbӵb/P~qw›j]}ݸe" "^{XcuƓE *LŖdTmˈxYmqLAHE~Ćfz~eu4JfcQpr_^apmP`mi|jrpxfvTPɍdvcSObğ|zrdto_O=^}{~m|hJQr~jWlƼwmJ>SjwncqvxW7#@yljzn\HKd~u[Yuepmizyqs|vberyfohah^N_x|x`o}qgq{~zig{iUUtarrfdvzx}rzwsvys|qxyzrjcg\[q|vwrrx{jczsxwm^Xs{|~}~zlrnjbli^fu~tpx{n_l}yps|wjm}|pv~zwyy~xnmvyyv|usvusvx{pl}z{{{~~urxtnx|~wtvyvry{wsuz~~upw~{sqw{vtw}pgt~usv}{}|xz{zwux~|{~~|}|y|}z{ywwvz}~}~~yvxyvuzz{|z~~{y{{wx|}wyrpty}~{try{|zuw{}}~}~~{wuu{~~}zz~{zz}}ztv|||}|~xv|}}}{zz|zx|}}wtv{|}{xxy}}~|~|{}z{}~|~|zz~~}|~}}~{~}}~~|{~}|}~~z|}ypaRpfgcNryNOm{kMI^n|mctv|tsQexMNxYFkaAMzhL\ePer}omfZmmsn[\h_djYxFQsq]cY`irze|hXl|WebZh|}lfmjVA8?JVbrxrorsusosobSP[ky̾˺`DDR\[\ev}w|}rb\fnXZf`KFWmvuvxvojmmeepxfiwsc^c`RE=756647BXuÿsfbdhms|wommmoxy|{m^\eomb\cllb^epy}{qf_``\WUX^bel{ú÷xmfb_`flppnrx|~wePA=<703M^grxm\^xzzȻԵмɺs`_soI9IhmPFZsyun`QO]lpk`TR^lka\_``egb[[`eksreZ`p|ysxwtihp|sa^jrrqmaU[ozreZW[ixtbY`efnvsgbjrvz|uot}smw~pfdgnsqhgknorxwojq|yvv}{qr|wonqsohb^[_imh][cillh``dlkhe`]courlmt}y|ywvqlnrollnkhkjqmhijpwxpijpuw{yqou}xokox{riimnnrskfint{xpu}|~z{{stvyywrjimqssqlefnsnihilsyxqooooqxyngmv{|yrmt}{|}~|yrlmpqomligjorpkhiovwpgflrwyxtruz{wz|xvvvy||xx~zux}}zxtpsz{vqqttv{{vtttwz|xrv|}yy|~~|yvvwwursuuuvwutsrqrvxyz}}}}zz}|{}}~~}}{ywy||{wtrtxxsopqrrrqnnqtv{{y{~~||{zxxzzzywuwy{yvuwz|~~{y{~~}{zz|~}|}}||}~~|z|~|}~~~x}~}}vns}}phbyok~cX{giswUXw|yumhqpU`}|hspioqsk^j[JX|[kh,)Wsn_RUwnCV}znzcubtvleiowG[hov`9Hn`O5Qͺw߭G4.KbetqvYVA"']hvɳm?5EgptikY29~ȺdyԻwzfFT޿wFHuylhpF#&fldȷTHUHgY\ybAXsttuam\*-]\`hax:Grv}B@/yOcǒ}ടʹȜUg|voN\",]VHGwFTsd`s|{`B7IozjB9XhjHVXAas^l|LU˽wTPJAXtѫu]Kcƶ|nscFbu> 3fB1Wgal|Y&<~RR[v=30Fhlf9elN!PϓUlmᣆȬ~o}|S)2`ytgfuoM$;Zlr]Vl]3HXd|pfsv`gqzvsy{~siwɹԺſrjgrV@Kh_|vY`yxJ..;Xcwc\KWdsoz]FaL1FW55X_dsr^WbAHx|I[JCě}}~^`؜U)Nm'*hs/?sh`fxc23cΜǯÎ`RgwhgRBRdnsvu`D$(`}wbND?>9QZu`509;AsVeͻˬ~ʹМqx]iy`VicG_qi[M[kpf[Z`hpqfpsWayZ@7>OXNOrzgbpmnxz{w}WKmiNIblsf\PB<.1GMhcKCSjodes{XENYYbif^gr~~nƼyrzxyws{[JOSaxwTE=Gf|uSH[rw^EAJT_pnt~tzwt}xsvsį{jh[Y\ff]]lyw{xiW:Ikwrmztqldi_R[go|tkgkmpvzvyxy~yaU[joquya]hpwstteZ[dhj|prpgmxustYJYojkov{y{xwx}|xe[Xatw{z{uk[ZfnpgikcU[caMHEBT[NJUsyrx}~xyzutuu~zyypt~}|ocejov~urphdqvzwfuxkuwabskbgywityykwoowtnne\UV^hmehr}yfV\nzfbaVC9=Oi}vmdPBN`p{vgaaeuzsmlpuy|{{xi[]ppp}tglzxyplnqmg]Xar}ps~q~~ydVSYYcrxt{u_Z^]nxsh[OKSUWTTguyyy}zxtmifnt|{yz|~yuv}|l_o}zwus}|zv{~xmhp~qbVQW^`XWURTU`lilgr|wcamgc]_ev~sxycXewxwzo\TLDBGIJU`jnpzwh`jyyqikxsqysotqcev{nfoytou~vqk`ixu~|ou{zfmurloff^_kme^QXfqonvwhjidiyqib]]dq{~vg\W]luutmyups}~~zqrx|wjmv{tkiir|}vzttw~vji~~yov|rklks~}}}~zyuy}yrlmoqi^baag^OP[dbK22DSY\]`hnmnojgpyzxukfba`fv~~|nor{yy}}s}wztt}wx||trvz{sllllihhmvvnjegmuyxullw|wvz|zyxztkhf^^eefe`cr~yxzz{xpks}{|{olr~zowsw~xnknvth`dqoc]gonquxodahnlmjllnmjedeny|yuqnkhoxtkjlpw}~yonmmmozzuztlmnwsqt}wxz|~{z{~ws{}wz}~ssv|yyzw}}|{~|v}}z~{w{zqru{{trtyxniov{}yv|{}zw{ytx{zz{xla]gw~|zmotuwxz~xsvmn|{x~njhlpkZ[fkjljfijebglz}xvx|{~|ystw~~yyvtw{wprtzvrv~|{spy||~rhmty~xssvw{wx{yywumpqswz||qmtxwnot~}}yy|x||wodgprry|tpswz}wtz{yz}{sov~zvuxxvuojlloz{}~z}ypls~~unlnpmlorru~wv{~zupmpvy~z{|~}xz}{xxzttx}{vuz{wtw~}|}zxxqtz~}~~z{{|}znljhmpvyxtmjjknrruxz}~yxwx|~zzropx|wzzyxvy|~zz}}wrw|yqnjgjpqsy~~~xy{}zqptwxvy~|xy{tlnuy{|truyts||www{~|{~xtruxxxrkflx}vosy|wrrtz~rmlqw|~ytvwxtzxpjjjlnjlkgebbeknllsyvswz||}}||wtyywywrsv|~{|{y|}}truvxvsstvsqvzzxqlmsx|}{xvy~~}}~{}|z{}{~}zz{}tnntyy|~{y~z{~}}{upu}{yxy}zvzzpjpxyrnopou|~|{}}~yy~}urty}|wuz{|||yspuzzz|unpwzuomrvvsusrx~xw~}~}zy||zxtonpu}~xy~|yusw|~~|yz|~~|}{|}xy|}xy~~~}~|{~}}yyy{~z{|~~x|}}}}~zz}~|}~|}}{y{|{{|}xv{}{zyz{}~~}}zyyyvv}~~~z{{z{|~}xx|{|~{|~{{}}{~~}}}{wtwz|~}~yvtw|zqptutwyzz{||{|~~}|zxxyzyvtv|}zz{{{}}||{ywuuwyyy|{x{~~|~~{z|~~~|zz{{}~}}}|}zyz|}|}~~~~}~{{}}{{|}||}~~~~nNZvl]fhfl|{SPrmGe[egYrs]nhHZ_Rbvi[vnfs|xi[ilZq}kvzk`bjqu~lekt||syki|mZ[k}mfxhQYk~|mc^U_wfvmwwporkkwvsghk|}u|xcP\ykkhkv]qfIDYsygSUo{hl|xfktmmcoxqtx~yz}}hbu|pz{jegs{or|mjv|qr~u`QZssbevv{g_fy~zsyhm}rx{vxjagi_UR\v|y{rrw|}vmmyxnhjxypmt~sowwv~zulkr}xnv~ww}vrphfe[U\]dpbbfh{|unhq||~ur~{wzxqt{ztkfefjlkigipuoikpz~vuvvnhgks|~}}}{yy~~{}zvtwvrrx{wy}{smlsz~~~~{y{|}}{}|usvxxvu{{z{||{{{}|xy}~wrpruuttx}z~voh`Z[]^_cfjou{~vof\OB855;GT`hov~}vgS=( -?KQYft˿xgTC91' +*6CQ[clvƽw_J8% "2@Qf{ƺseXK?4* (5@MYcoĺwi]SKD=60+'# (3?JU`js}}tld^WQLHD@<950,-3;BKU]ciq{ºyrlhd`\XTRPLHDA=:89>DLQUY_goxýyupligeb_][YUPJE?:89=AFKOSY`it}yuspnljfb\XSNID<62//38=AFKQX`hr{xuromlifda]WPIB?<8423679:753112359=AFKOU]hv{vsqpruwwurmigeedb_[WTSSROMLLOT[aglpu}ý|yvrnjfb_\YVSPNKJIKMPSTVX\agoy|yvtsrokgeca`_\YVUWY]bgknrv|~yuqmhda\XTOKHDA?>>>>@BFIMQU[bjt}}zxtpkhedb`^\[[ZY\_cgjmpsw|~zvsqnljfb_\YXWVVVVVVWZ^cgkorvz|yvtpmkigdb`^\ZYXXZ[[[[Z[]afknprtw|{ywtqnkhfdbaa`_^]\[[[\^_aaabcfjouy|~|{zyyyyyyyxwvutsrrqpnmkihffffghhijkkllmnoqsuwz|~}{zxwusrpnmlljhgggghhhijjjkkklmoqstuwy{~~|zxxxwwvvuuuvuuuuvvuutssssstttuwxz{}~~~}}||{zzxutroke\K:-+^zP\tDGlɈE')5F[ealfUW]\TXoww}zpf^\]^`ejouy|}}|{}{xjf|sg_abdinu~oh^TPPU^kv}zvrnjmruxyuojebdjs}tkhgebbhpx~vnllmptwy|}|}~~|xtqtx|~|wuxypkjnw}zropsvxwuuy~|zyyxwttwz~zwsrsqnklnrx~}|{{~zvtssuxxwz}}zwttuw|{ywvvx}|xvvvvxzzyz{}~|z{~~{xwwx{~}{xvuuvxy}}yvuttwx|{xxxyz{}||zyxz{|~~||||||{yz{{~~~||}~~~vu}yvz|}~xw{zwz~~~|}}}~~rhnmm{wzyno~vq{ztwutz|z~|ut|vuvajyqasygivwhp|{qv~nvzrt}~{ohlu~xxy{~syogkuoq{ikquv~|ztzyyxtnijny~~zpiu}z{linm \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s2.bin b/applications/PoP/poc/res/sound/s2.bin new file mode 100644 index 0000000..357897f --- /dev/null +++ b/applications/PoP/poc/res/sound/s2.bin @@ -0,0 +1,7 @@ +jlnkn}{vz}yhgmt|v}znv|rqy~wnow{xsr}xvehxxgcsq`g{xjmx{}|yxt{zz{{|zyzvznm|vkhuxlgl}t`f}qgwzq{}wwswzxywyrklgZ^htqeagotvx}~w|~|y{{mdqn`bp~zijz{nqyu}~}xxtqqrsuy~ui{kalrsvio}pZcmjwjbeiowkuzio~qfqvoj_hw~ytx~~zy|ogghiknv}yxwvwtvz{{{}y}yryw{tbaghdejjfjxty||}tmz{lw{iit}u~|kpyyv}p}}zpyqjt}opknvxvulwxvvthdktzmjqwwvz~}}yutuspcXZ_cghf`\alkekposz}~}upzzvuswi{~qswtrmut\fyaquknvvpu~vzyzvrwz{ypjjr{{qfky}pkzygnsx~|~|xxwpryyrqprxvj||vrxuuykr~sm}uin}pwsu||{t~vtz}uus}wqsuqvvqvrllssuztrsrw|yv{~}|{~}xw||vsuurrsnloqmjlrplpsrswzuty~~~zxuz~|{}{xv{}xx~zy{y|zxx{wwyywxz{xx{|z{~{z||{|~}|{~}|}~|{zxx{xvxxvtvyxvwwvxzyyxy{{|}}|}~}{~|~~}}|~~~|~~{|}|z~~yvzzyy|}y{~|yy{||~}}}zy{~~{z{|~}{zz|}~}{}~~~|}||}||}~|z~}zy{|~}~~}~~}~|||z{||zyyz{|{{|}~|}~}{xz}}~}{z|~~}|{}~~~~}~~}zz{{|}|{{||}}}~~~~~~~~~|{||}|~~{}~~~||~|~||}~{{}}}}|}}|~~~~~}||||||{{|}}|}~}||}~}~~|{|||~~|||~~~~|~~}~~}}|||~|{{||}}|}~~~~~}|}~~~||}~~~}~~~~~~}~|~}~~|{{}~zvuuu{~}}{zxz}~}{zyyzz}{y{|z|~}}~~}zxpuqy~xurkrqxurpy}qkkjpuxyqlnr}}m`ZYjxrdZYcttmc\^fxymgbfgoxvrmgimvz~xpXYasoecdehrjnp}wbWYly{_[SPdyr_RdslHBFZbzla]mx{l^^iuk[VU]js{ypkhneLDISm{eadp|srw}|}vz{zwgqzw|pknoq{}|upwnv}|lnmuus|s^eukNEo__~FRj@g[zl|w]ayjp}V`P[smnfcAeltnuekJAQgu|shnz¹~nknoqof`\XQIJP\n~z}~z{{|{yz{~dKI^lqwxurpl`SR[j{|oWC:=CN]voZJEObs~|vl^RMQ\iu~rc]Z[_fnw~|umfcehozcTOUbp||twz}{}y}|rnqxztlks{zxuv{{z}smkfb_^`fr}rbQFEP_n~ug`^aegnx~|xtojmqx~tifcXOKSam{paZXXY]gsxusrpot||uniilosvz{|zvokhijmqtvy}}~{xwusqoquxwxxyz|~}xrorttssuvwwusronptvusu{~|{|{yvttqnprrsuwyvrttrpnouxz}xyyz~}y}~}~~|~}{xuuvz~}|}}|{}~~~~{wtqrruxxxyxxwxyzxxyz{zyyzzxxy}~{{||}}}~~~~|||zxvuvvttuwz|}}}~}{yxwvuttuvwxxxz{||{}}{zz{{{{|~|zyxxxy{}~~}|zxxxxyz}~|zyxxy||~}}~w|uj`y̗[3WƔĹn0*̌kml0 +F[]F96>Siwzmfn~vlqy{wl`XTMB:>I\p|tpvz{xwxX=5AG:7=HPIBCHMNKLX^\aurWJSXPWivpor~vjca^bmt{|aMJP^jr}u_RR]nmK42Hn~f[`tÛuZC:Mq?'$5Qpk7$(:W}MMsynieu—eHHWfs|rwqhni]`ks~}xaD,,@WgvuI" Cex|kH)%=fT #IpJ, 0QmrQ5'/Eb~rH3,/=Pauzj[QMOaͦs<:`oYZjzzmrvoyvmqvwſvsw|~yifl}¾{leacrxy|z|zx||uhda_ZST]hw~q[C59Mcvzj[UW__aiv~zqhgou{xj`b^QFDRco|zgZTUUV\fpw|yqs|~vnd][_iq{~~zpha]\`hptvz~}ywtokkouxvsoqw}~vnmrxyuronrtrpmhhntvtqrxzyz}}ytrqnkmommosupmprspmpuvywvtw{|~~}zvtrsx||zwwz|{zz{||{|}~~}}}~~}|{{{zxtpnmkjjjkmptwxwwxvspqrrsuwz~~~}{yxyxxwwwwxyz{|}|xuttux{~~}}{zz{{zz{|{zyz{|}}}}~~~~}{|~~}~}|~{z|ztzrr|}{{zuxyw|rqrsxv{umyznqz}vr}~pl|zhcqvkk}_dy{nmxYYimzn^eqqs|ofqy|sntvtx{jjt|~}~|wss{znebdmj`iuzx|wibpzsUM`v~u}lRK\q|}hTT^ozg]^j}kohdzlZ]ZUgtfiovr|tZScoxsvqnurbXRYw~snv~qy}c>8^|kZVjvvvifjoxgduo`XVWeƯl_iusieipwylgm~k]`zx]SWNOwoULepglspΐ\U_xsTQok^RDJo[OPQUarνcGQhnw\M[utlhmuzyokhghiho̚gOQm~zoMNiyfaa_h{iNO\o|upvԠZ=GeNAX|v`KF`ui\Xf{~tpWK[|zXMa}zm_]exvogemqpmckȾfW^mu`Tau~smcYeqgmpjpwodeyж}ZR\px|~c\fwvqkadpzhqqes|zilrs}bcr{ry|pouy|y}vihtnino~{vtdewkqyvv~}vs}~vsvvuyvq|vyzuqh\UXfкXLWq}ye^l|yfaqx}odgz{jY[bm~}{mgrz{{pp{xs|uruzmfvor}xvvohhgdzʬyZXkyx{gdswqqu~yhdhsgkz~~||~zrf[cc`q}{vuyyeb}vY[n{|{y{{gly}sqy~~ue^j|ebr}rygJJežp`cxuruyoq|zqr{wc\chws]bpyr[MY~rhkpstw|xpsz~ysu{}tijpgaxr_enzz}yhbfdnhfnmq~tprw}uuytorkbm|}~}{omwxsuzztlfhwpchsw{zqszyw|vkryplz|~}~st{zy}m_VWqŶjaiuy|}}xmoxuqxxj`dnswwoksmjzxrrqieuvmmqyzux|}wkhnv|~zwx|zxuoic`l~c_ht~|vu|~}~{tehxzsyzpsz}~{quunmrph`kt`_j{|{vy}wwzqikmsx{xsty}{y|uqqtwtosvmo{}|~~~omvs\O_~xniu||~|vv}vhbirsy{}~||}~{{|}~{mhqt}{wz}yxx}{vsv|}{tkkv|}}z|~ywx~ssutv|~~~}qovz|yyvpryzvsoqzzvy||}ro~{trv~sr||vwyx|~{~~{}~~|}}ysosz~|{{~~|}~~yy||{{|~{z}lcm}u~ztr|pgo{|{y{{wy~rlp||{}|}ztvz~wu|~zz~zz}|{~~~~}|}yw{}yxx|~tmox}{}|xwz|wy}|}|}}yy}ut~{vz~qnxztw}}{}||}wow{yx|xmmvvw}~xz{{~|y{||~~}}}}~}|{}ytvwv}}{|~}{|}~|}||}xtxz~xmp}ynxyt{zz~|{~|z{{|vv||wz~{wy{wv|~yz~~}~~~~~}~{~|{}~|}|}stkm{vn|N31;I\ieW`xȹrjjb[XWUQQ[gq{xpok`TPRE+%0202>A@7)""+=Uistusswwu|vzŻwnp}ue\WTQQUSF5(%.6=FP\ejnr{~n_UKA;?Qk~{vw{ʿzi]PGAD<41,%%%&(%"%( -I\fjtü|_JDGKME826AGRjvj_P?4/-7HZn©l[SLJLTe|yuvvolr~qiaTOQMFAAIZmxwµ}q_L?BRcnqv|ulfa_ZUSU\`ZX\YON^tıynd`elqvy|zrf]^fv׽ykgp~xthP=665;@@4#  + +!(-01.!$$ !7UppT9  +.Qejf_ZSOOKC:3)  !?Ziouwnh[H?@ABEHKOSW\^_`a^YTOID>96778:@CEGKPTX[]`b_\ZWTQNKNPSV[`eilortvxz|~}|yvroljhfdcbaa``_____]ZWTRPOMORTWYYZ[XTQMLKKJNSY^bfjmnnnnnoopqrtuxz}}xtrpmkpv{yxwww~}|ywurolifb_[YWVTTSSRQPONNNMMNOPQPONMHB=71,'" !"$(,15:@EKLMMNKHEBAA@@CGJNSY^djpv{~~}{zz}}yusrpnnnmmmllkhea^XQKEDBA@HPYajs|}}ulfc`]\_bdghijjhgecba``cehjmorsstttssrrsstvz}~xrlf_YSMJHECHMRW^elsvx{~|zywsolhea^[[ZZZ^adhov}~}|{zxvtrojfa\WRNJIHGFFEEEDCBAAAA@?=<:864479;?DINQSUWWVUTUWXZ^chmqsuwwutrqqpooonnprtwxz|~{xurpnlilpsw|{vqrrssx}}wqkihhghjkmnpqstvwyyyyyzz{|~~||{{{zyxwtqnkgc_\XUROLJHFFEEEEFFFDB@?>=<;98766666655532001346:?CFJMQSTUVVSPNJFB=:741////0134679:??@ABBCDDCCBCEFHLRW]cioux{~¿}{ywvusqoljgc_[WRNIFDA?=<;99887788999::::9986420-+(&$" !"$%),047:>AEINRVZ]abccdddddgknry}zwtrpmkjjiiiihhgfedb`][WRMIEB>;9753210..//024689:;<:752/,)&$#! &,26:?CFHKNOPPQSUVX\`dhknqtx{~yupljhgefhikkkjjgc_[UPJE?93-)&# !"#$&'&&%$$$##$&')*+,-+)(&"#(-39>??@@><:9;<>?BDFHIJJKLMNOPPQQPONMNOPRVY]`bdggfdb`^\YXWVUVWXY]bglrw|Ŀ~|{wtronpruy~ytplgghijmptwwwvutrpnnnnnljhfa\VQLHD??>>=AFJOTY^cbba`[WRMKHFDFGIJLOQSUWXZXWUTRPNLMOPQTX[^adgiiiiihgffhjlnsw|}|zxvsqnlifedba`_^]]^^^`bdfghijiihhggffghhiihhgd`\XTPLIGFDCDDEDB?=94/*%#   + !&+06=EMSY_ehjlnpqrsuy}}|zywuspmjgeb_\ZWTPLHC>94/*%   !(/47:>?@ABBCDEGILOSX]afkpty~zvqnlkiilorux|{vrnjfbabcdfimpponmhb[TOLHDEHKMPSVXWURPKE@:51,('(()/7>ELSZadegigeb``__^adhkorvy|~~~~~}{zxvttwz~~ytomjhfghiiklmnpqrsttuuvwxyyzzzyxwxyz{þ~~}}|xndZTNHBFIMQ[epyysonmmmpsvy|~}vojgebcfilorvy|}~|zvqmhc_ZVSQOMMNOPSX]behknnljhffedfiloqqrsoje`\XTPOOOORUX[]_ac`]ZWQKD><:86:50+%  +  #(/7>FLPTWXWUTRPNMNQTX]ciotx|}yuqmkjihkpty}}yuromkikmoqsuxzyxwvspmjigfddeefhjlnprtvvwwwwvvvxy{|~~{xussrrsux{}|{zxtokhfdbacdfimrw|xqjfb^Z[]_aeimqqqrromjgggffhjlnmllkgd`]ZXUSUWY\dlu}|void_ZZ\_bfkptvwxyxvtssstux|{vrmmmnou{|qg`ZTNOPQRUX[^__``aabbdfgiklnoooookhea\WQMLKKKNQTX\afjmqtvtrpnid_[XVSQQQQRSUWZ_dintz~}|{}|yvspnligfecbbbccfimpswz}{zxwqke`[WSOQRTUY\_bdfhjkklljhfdb`^]_acehkoqonmkfb^ZYWUUXZ]aejnrtwz{||}}|{zyxxwwwwwvutsqpnmkihfeeeegjmprstusqnlifc`__^^__`aaaaaabbcccbbbaa``aabbbaaaa``abdefhikmpruwy|~~~~~}}}xsrtuwy{~~|zwtqnljighhijkmnpppoolhd`\WSNMLJIKNPSVZ]aabbc`\YVTRQOOPPPRTUWZ]`ceghjjjjjklmnqsuwxyyzzzzzz{{{|}~}zxwvuuwz|}yvsqopruwz|~|zyxwvtsrqonljhfdcbaa`aaba_]ZWPJD>83-*+,-048ACDLSY`dijqzzphd]YRND><697=COXajmtrw}zxrrnkknie`\XVRPKGA?BFQUZffkmpszzsmkihgijjhfida]XUNJGHJMUY_ehmpu{xspnlorrsppmkga\WPNLORVY^_ehos|~{yxvvtvvuqnnjfebYUXS\]fimwx{~ywxtslffddcbdfhijloquuz}{vqlmnomilnponnotuz~~xtqrpprpofebdgkmnprw|~|wspmkigcdfjmptw~}yvqlgda]XVWUTQNKKNSY_dhjjlosy~yuqpmnlnonkhhac]_[XUTRNNNNLMNQRTUTSVYZ\cfs{xwuwwrjfddehgjigfeffheaXRLKKLJGHKOTY\`dhmrx~~zvsqrpnhd`]ZXUSRPMHFFHLPRQQTY\cmt|~}zz|{~wzxyusogd`_YWRQMOS\bjoptt}yuttuwvsqmhea^ZURNJHFGILORVX[`elv}}zvqnopsrsqnia_]`eiotx}vqkiopttrlgeabafdeehlt~~zvrnje_ZWWZ[\\]]_acfgfdeghnpsw||zurptronlmghgfgfhe_^WWRTWW_ajllqr{}~|z{{~|{{{{z|{yxvututuvuuyy{~~|wrmhdbciptutrqppolhda__beinsuwz}}|}~}ywtrmjihhlmmkhgghfda`aaaceghklnrttsuux|~}{yxwutusux~}{xvuusttuusstuvx|~~~~{z|~|tpmnopqomlhhhilosvusqopux||{xusttxz}}|~}~||}|yvspmjgda_^adhlosvxxvusrqonoqsvz~~~|zyz{|~}{xvvwvwvvupnllmnprttuutussrppmknqv{}}}~~~~~|{|}||{}|zxvutvvuttsrnjhffgijklmnonnonooppprsuvwvvwvwvvwwxz~~{z{~~|zvsqpqsuvutuxz}}{{z{}}{zyzz|}||{zzzxxx{{{|}~~}}~}|{|}~~~|xttsrqonmnoqqpnllmoponomkllmopopopnpqtx{|~~||{|{{z{zwvututuvz}~~~~~~}||||~~|}~|{zyz{}~~}zxxy|~|yxyz|~~}{yyz||~~~}|zwrnommnpsw{}|{z|~~{xvvwz{{|{|}}~{yurssvx|||{{{|{zyyyyxy{~~~~~}|zyyz}{xxz}~~~}}|}~||}~~}}}~~}~~~~~~|{zxxyz}}}{ywvwxz{{||{xusqrqpruwy{~~|zyy|~~~}|{z{zz|~~}~~~~|~~}}}}~~~~~~~}}|{{zz{}}}}}~||{{{|{}~~|}||{{~~||}~~~}}{yxwwwxy|~|zyzz|~}|zyxx{~~|{{}~{ywtrqqsvxyzyxwwy||{{z{}~~}}yyxx{~~}}|~|yxx{{xwvvvvvwxzz|~~|{}~}{{zzzz{~}{ywwxy{|{{z{{{{{||~~~~~~}}{yxwwusssvy{}}}{zxyy{}}{zwwvvwxy{{~~}yurrrttvy|}zyxy|~~~~}zxyzz{z{}~~}{yzyyyyz|~~}|yyyz|~}{zyxxx{|~}|||{|}}~~~~~~~}|~}}}}zwvvuuvx{}~~|{||}~~|zyxxy{~~||{|~~|z{|~}{{z{||||{|}}{zyxxyz|~~~~~~~{{yxxy|~~~}||}}|||{|}~~~}}~~}||{}~~}||{zyzzz{|~~}{zyyy{}~~~~}~~}e@(")%(/6DcwbN>3..16;@FLRY\V[he[[]`cfjmortwz|~¼~wrsqnrupmquoe]VZ]ZZ]bgeemnnpopsvusuuuuw|{zyz~}|~~|}zvvwxywwxuuuvy}~~|uokkiffjllmomgb_\^daWZffcfhhgbadbcedeecacikkllmmnqsqv{{yywwurtusw{}}|yuronopruxz}|xuqmkklkkloruy||}~|{{|}|zzyxwwxy{}~~}|}~~|zxvtsrpnlkkkjhgffghjlklllmnoqqponnnopomjhfcaaa``a`bdgjlmopqppomjgea^ZWWWWWXYZ]`bflptx||zxvtrpomlkjhijklnqstuxyyxurponpqsuvy{|||}~}{yvutstuwy{}}}}~}{yyyyyyz|}}zxvuvwxyyyz|~zyz|~|yvplhe`[TOMNRV[_dfhhikkkjihhhiknmllmorux{|}~|{zzxtrpnmlkihhhilpsuuuuuuvwxuqnic_ZWVUUVZ^bglqtwyxvsojfb_\YWWWY[_ejosuw}{upmlotwx{|}}|}|zz{|}}}|||~~~}|zxtqmklnqstw|}|||{yxwxyxwwusppqrrruxz|~~|zwspppppprssuz}{zz{}{xuuvwxwutv{}xvuutsqonnpsvyzz{}~~}{yuqmkmoruy|}|||}~{xsqooqvzzvsplhc_^]\]]ZVUVWZ]bdfjlmnprrsssssssttuvx{|~}ysmkllkkmrw|~{wsponosx|{unigda`aadgjmqx{xutux{~{xsnifdba`_^]\^`cfkpuwxz|}}{ywvwxwvwvtqomlkkkjjkmoruwz|}||}|zwutuuvwxyz|}~|zwspljhfefhjmpuzzuonnlkkkkkkllnopoprtutsrrrrqpoliecbdfhhjkkjklnnnnnmmnqtvvwwxz}~|zxurqsuvvvwxwvvvvusrpmkjhfc_[YXXYZ[\]_aabceghijlmnpsuwz|}~~|{yvspppprrsuw{}|{{{z{}~{wsokhhfefiknosvy||}|{yunhd^[XVTTVVX[`eiloruuwxyz{||{zxwwwxwtrponmlllkkkkklmnmmnnnmljihgecba`aabdgjnqtwyzyxvutrpljhffgjlmprtuvwy{||{zyxvuutttuuwxyyz{||~{yyxwwxxwwx{|}~|||}~|ywusrstuvxz}}zwrollllkklmmmnnprrtuvx{|~{vqmjgdbba_^^^^`abaa`^^^_``bcddegjlpuz~|yvtrrrqqqrsuw{}~}}|{zyxtrpnoprsuwz|}|yyyyz|~}|~}|{ywvvw{|{zzz{z{|}~~||}}}~|zxvvxz|||{{}~|{{z{|}{zyy{}~~~}|}||}|{zyyxwvvuuuvvwxz|~~}{{|{{zyxusttvy{~}|||{yvttuvwyzz{{|~~~~{yxwwwwwwwuuuvy{{|zxwvwxxxvtrpppprsttuuvvwy{|||{ywvvvvurqpoprtuuttuvxyz|~~{xvvusrrrrstuwxyyxxxyz{{{zxvustuuuuuvwy{|~}}{zyxxyz{||z{||~~~}|{{}~}zyyyyyyxwxz}~}{yxwwxyz}}{zzz{|}}{z|~{xwwz|~~{ywvtsqonmnnnnnooooppqrtttsrrqqsuuuuvvvwyz|{yz|~~}yyyxwvvuuvw{}|{{zyyyz|~}||}~}|{ywutuutuuvwxyy{|~}zxusrqqrtvxz|~}{ywusqonnoruwxyz|}}zxwwxxyyyyz|~~|zxvtrpnmnnnnpprsuwz|~~}|{zzyyyz{zzyxxxyzzzzzyyyyyzzz{|||}~~~}~~}{yxxwvvuwyz{|}~~}||}}}|||{{||}}}~~~}|||}}}~~}|}|{zzyyyxxxyz{||~~}}}|||{{{{|||~~}}}|||||||{zzzyyyxxxxxxxyyyyyyyzzz{{|||}}~~~}}|{{zyyxxxwwwwvvvuuuuuuvvwwwwxyyyzz{|}~~~}|{zyxwvutssrqpppooooopqqrstvwyz|}~|zxvtsponmmmlmmmnopqsuvxz|~}{zxwwvvuuuuvvwxyz{}~~}|{zyxwwwwwwxxxyz{}~~}{zzyxxxxxxyyyzz{{|}~~~}}||{{{{{|||}}~~~~~~t}}barkKLfkZWr{xw}vtwwqmmmha^_]YWZ]^_bfijjlnoopruwx{~}||}|||{zywusrqpppqrqqqrsrpppooopqrrtuvwwxxxxyxwyz{{}~~}|||||}}||||{zzyxxxwwwwxxwwwwwwvvvvvvvvwxxxxyyyyyyyyzzzz{{|}}}~}~~~~~~~~~}}}}}}}}|||{zzzzyyyyyxxyyyyyxxxxxxxxxxxyyyyyzzzz{{|||||}}||}}}}}}}~~~~~~~~~~~~~}}}}|||||||{{{{{{{{zzzzzzyzzzzzzzzzzzzzzzzzzzzzzz{{{||}}}}}}~~~~~~~~~~}}|||||{{{{{{{{{{{{{{{{|{|{{{{{{{{zzz{{{|||||||||||||||||||||||||}}~~~~~~~~~}}}}}||{||{{{{zzzzzzzzzzzzzzzzzz{{{{zzz{{{{{{{{{{{||||}}||}}}}~~~~~~}}}}||||||{{{{{{ \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s5.bin b/applications/PoP/poc/res/sound/s5.bin new file mode 100644 index 0000000..332e9af --- /dev/null +++ b/applications/PoP/poc/res/sound/s5.bin @@ -0,0 +1 @@ +{{{{zzzzzyyyyyyzzzzzz{{{{{{{|||||||||||}}~~~~~~}}}~~~~~~~}}}|||{{{{{{zzzzzzzzzzyyyyyyyyyzzzzzzyzzzzz{{{||||||}}~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}||{{{{{zzzyyyyyxxxyyyyyyyyyyyyyzzzzz{{{{{{{|||}}}}~~~~~~~}}||||{{{zzzzyyyyyyxxxxxxxxxxxwwxxxxxxxxxxxxxxxxyyyzzzzz{{z{|||}}~~~}|||{{zyyyxxxxwwwvuuvuvuvvvvvvvvvvvuuuuuuuvvvvwwwxxxxxxyyyz{{||}}~~~~~}||{{zzyxxxwwvvuutsssrrqqqqqppppqqqrrrrssssttttuuvwwxxyz{|}}~~}|{{yxxwvutsrqpponnmmlllkkkkjjjkkkkkkkllmnoppqrstuvwxyz{}~~|zywutsqpomljigedcba`__^]]\\]]]^^^__`abdeghjkmortvxz}|yurolifc`]ZWUROMKIHFEEEEEFGHIKLNPSUX[_bfimquy}{tmga[TNHC=840,)&%$$%&(*-048<@EKPV\cjrzſ}rg[QG>60*%!"&+18?HR\gq|Žwmc[SKE?:620.-.037@CGKOSX]chntzĿyqh_WOG?82-($" !$'*.28>DKRZcluľzqibZTNHC?<:87789:<@CGKPV[bhnu|~xrmhc_[WUSQONNNOPRTWZ^bfjnsw|}yurnlifdba`_____abdfiknqsvy|umu_AHTTFEVconl}Ҫ{~wjmg|jqvj\Z]UVNJLPTPT\bnt|}zyy}{qgfeiu~yi\RLOWbqrdVMLOXfu{naXUYcqsg_]akxpcZY^huyj^WW[ftzla[[`jxzl`[[`lzuf]YZbm{vh_[[bm{rf]X[blzrg^[^eq~xlebdjtuia^`gp|tjc`bgp|xngcejr|zqjggjr|{rkhhkrz{slggkpvvpljlqxzsommrx~zsnlmptz|wqppruz}xp{sm}|zwsrqu||wstootwz{tspmswy{urpopux~}wtrqsvz}ywuuy|}yuttvz~{xvvwz|yvvwy}{yvuvx{}zwuttvx{~}zxvuuvx{}{{{|~~~~~~}|{zz{|}}|{zzz|}~}||||}~~||{{|}}~~||{{{{{|}~~}}}|||}}~~~}}~~}|{{{z{{|}~~}}}||}~~~~~~}||{{|||}~~}~~~{~~~~}~~z~|~~~}~}}~~~}|~}{}{z~~~~||~}~~{~}~~~|{}~}}}x|~x|vx~|||}~}~}{{}}~|~~~}~}~}}{|~}}}{z||~|{||{}}|z{|~|~z~{x~|~{yz~{~w~~|{|z}w}yw}|uwz~z{~~}zx}|}|y~{}~zz|~z~~}}|}}}~}{}||~y|~~|~|z~||}~{|{yz{z{t~~|xxy~xu}|{qvy{r{~~~yyx{|{}s{~x}ox}||y~yw|x~{}~}~||}~}y~~}}}}}}y{}}w}}}z}y~xyw{wr|xtxklkhowvoqt|~xkwourzzrixvxqy~~yt~wxwz|yr}tw~usyv}|xzp~ux}}rz~}|t~xu~tzwv|s{x{{x~{vqnmlnt~{{ny^[sdiqjtovop|euzpwku|r|~qwjzuqyszyj{}x{owy{hx}olglasfy}cultzXqzrxk{ylyv~`avrv_v{xywZfryuyw~~pxeucygyh~xyvgi~o{qywv~{zpyxqwtu{ko}hzf{akfpueqvwlrvyltwvalHzeoy~gprt^d{p~bfuga[va~uab`hp{wynzsr{pzlwfiv~ht|zxu{x{|}~}r|i}sxbyl~t|co|tivor}pskkvq_[u`wuomxvizqsp~wT{mw|fqqe_xgUtx|V{no{sxot~tlou|}mw||sidnzvi}}z~pquohxk}{mrvrimjwpvznxw{r]tsuyzzg{wlz~_{yrwbvquqqirzrayxwzmukvbsirjuvykbletmnx}~yikz~{n}kowrltk_~fyozbw|t]ZrKtoV]`xl_lxTqlrevo{nkmy~dzosnm}_~wI{kxthsqszpo~vx{}h_}t^_slgwzvew|uhjfjhzbw~k}{uomxx|xkpl\vgK~xivpvprqr~y{gzpo|~xrzys{qno~xqhui{}jkq|zw|}{yu~y}mtzsk{uwy{nvlrh~ry|qpxutnstvolavtqhett|jv}qwV~eiisw}wlvivrnxr}rthzxgw||~rv{|}qg|bh}}~znk|e{|xxejxuynutrvq]}ztupyotxvwzhpfqu{y{rzudyrv{ptnxvxyx~n{yy{ozyz{|s|yv}|z~}{{z}v{~|z}~}|~|x{~~}{|w~ys||{x~zx}{|y{x|~zz|{~}~{~q{~}~}w|~|~~{{w~~|{{}|y~yzz{~zy}~~~~}~z{||}~~~}~|}z}||}{~|~}{}~}~|}z~}|~~~x}y~|z~{~~~~~}~~~~}|~~~|{~~~}|~|~}~}~}~}}~~~|~}}}~~|}~~~~y~lp{|tqq]ytaeqkUMYbny\ax|ujivojkuvrzp~zloxlf{xoYenqz}uoqltreT`gbv}er]UbkycOmkctw[v~buIi{LTejiWTp}|v~ym^ltlxzty{wfLivprtrk]Xc|yr~z~sqry{n_`qvjdnwt~vltqelmjxtydqndqrvpW~daurrsyvcn`khXUclfzők~XRle\{xb]p{neZcryy}x~|srwwlwqXd{tpqbtd`8Hmxyn`wǭs[TSeoUb{pql\kogn{`U`jxhknmy|gyvvqoox~vhzsy}q^Rl~zkhhgnlmlgovzwxz|}t^lUL~gpzm[^}wynat|aUf}yrw}tt~tot}{t[tqg~{rclniz{~ysz|{sqypitz}}zw|yxwqy||y|whn|}yy~~xt~x{}rjnv{~{xz{vqrywtw|}zy{xyuvxry~ztx~~y~~}zy{xz{}~||{}~~}~~}}yv{~}}xx}~~{w|~}}|~|{~z}z~y{~}}|}}{|~}~}}zwz}~zz~}~~|{~|~~yy~~zyz~~}}~}{wz}y}}~}{~{z~}}{{~}~|~}}~~~{~~~}}|}~~|~~~~~}~~~uvmgfe~{gcgTUKex}uRIf[dfSOhҊI2KpYW]h͓A'A^=\ďW)&WϹxE6\Z;EpБI8`tGAerINmVW|X:Rznjn[Hg~hfvlroneSY}vbnw}~Y^u^bhftmwy|ff}x{}uyo`rvt}qvy~wkyti|shxzz}u{v|}wrhp{l]gpgrkjxzzuqnrxisxvtihk_swkfskeiu}cfh]cofWnrjfne_swmk~oepqdilhwztzvqw~qp{xx{zz}vuu|xowwu|~xs}{{x~tu~yvwzvw}vu{y}~{z{yr{{{~}{}}~}~~}}xu||xy||}}{~~xw|z{~|y|~{}|{zz|{zx{~{uw{|}~}}xy}|z}zy}~{yz|}{~xx}|~~~}~~}~~{|~~~|~~||~}}~~z|~}{}~{~{{~~}}|}~|||}~}~~z{|{}}}|~}{|~|}~~~{z}~}~{|~}}}~~}|{{~~}}~~~|}~~~~|}~smrr`bOGg^Drpqg,)IIJO3>TmjEUbӵb/P~qw›j]}ݸe" "^{XcuƓE *LŖdTmˈxYmqLAHE~Ćfz~eu4JfcQpr_^apmP`mi|jrpxfvTPɍdvcSObğ|zrdto_O=^}{~m|hJQr~jWlƼwmJ>SjwncqvxW7#@yljzn\HKd~u[Yuepmizyqs|vberyfohah^N_x|x`o}qgq{~zig{iUUtarrfdvzx}rzwsvys|qxyzrjcg\[q|vwrrx{jczsxwm^Xs{|~}~zlrnjbli^fu~tpx{n_l}yps|wjm}|pv~zwyy~xnmvyyv|usvusvx{pl}z{{{~~urxtnx|~wtvyvry{wsuz~~upw~{sqw{vtw}pgt~usv}{}|xz{zwux~|{~~|}|y|}z{ywwvz}~}~~yvxyvuzz{|z~~{y{{wx|}wyrpty}~{try{|zuw{}}~}~~{wuu{~~}zz~{zz}}ztv|||}|~xv|}}}{zz|zx|}}wtv{|}{xxy}}~|~|{}z{}~|~|zz~~}|~}}~{~}}~~|{~}|}~~~}~wx{}}}z{}~~zwqlndmam[jpoo^|kfuobv|`oomklmmllnjj||vtxwx|}~{wx~}zy~~~~|}}{xxy{}}zy{|yy~}{zzy{|}~}~~}~~~}z}~{x{~{~}||~}|}}~xxwwz}z|}~~{wvx~~~{xz}~|}|yy}}|{zz{~{vrqqsy~yvy~|z{~}|{yxy|{yz}}zy{~|}~|z|~{yz|}|}}}}}|{}~~~~~|{z|~~~}~}{z~~~}|}~}}{|~~}|}~zxy|~|{|}}||~}|~~~~~}}|}~~~}yxz|~}|}~~}|}}}~~}}~}}~~~~||}}}}}}~}~}}~~~~~~~}}~~~~~}}~~}}~}~~~~}~~~~~~}}~~}~~~~~}|~~~~}}}~~~~}}}}|}jeq}|z|yrryyux}{xqjq}|{uf_`^[f|zyv_NXf[LNQKY~htr[K=,(ǁ:g̝aFeC]^%ja;Z½O)ۙKA]Tsp!C}ƭyUUi~fLF`ʨ\=;OalsiWTamqz[1-L{ǬoI2;füX.$:b|zҠ_1%8Z{umq|~o^V`}uYQXemh\SWktXQ`}|w_C5?arfmiVUkw]RZpkQELa{ykhqzƦo?.9CI^uzw`SkhjyykhvzlkxebpzpkdfwstvjRMo~}vjfs}lfeeiqpd^k{yf]mq=*DoɹjUXx¶nadg_TQUc`;;^}o\SfƗo]cry~zWAKow\J=:ETf}rmq|jYZlzaTS^qq`Z]ht{dC5FiaB8Gayza[ltehu\LYu}jaepskdi~mUQ_qyozxh`gqvwzhQO]ktvqmqwxrlmz{oms||wz~znaY[clrvzshehlmpzsel|xtor|wgdm{xoszzrlp~vuxyxuqrwyshag{pho{}vrszyswzrns~lfimnlhgmtvtpoyytx||{|zy~|vtvwtrrtvvvtsv{}wngfn{zuv|aMXp}~wjjtrhimlsoillp|{quzhXlwkn}z~F$Bijkuã~vt[Tpi3;[ceq|ûqr|vS,0LXbq`tӶod{|WHA2:^vx|fn~xpr];1DZl{}{ֵ~lQ6"$C]_`ltx_A@KS\jtztP?EP]kpowhB,&1NgfbjntĬnJ4?bvvzzjfydF8CUg|}|hO?^}yaX_oxmXMSk|igpvo_OGJ\t~{|}sf^^gr{|rhdhs}zvxzz|~|vmfeipx}z~neiw|k`]ezzpr}|eSOZpsdajm`bp|kaeuxe^fzs_V\po``m~j\Zfx}qkm{vfdkxrijt{tsw~xplms{zx{zohhoz}upqz~xy}tpqqwznpmWYtgOaW7GʼnF6b^?`|R8NZJupQIoRS~_D:icbaȃhm^y73Mcf_Ukz}wV0IINoYgq`XXZom||fTi|smt}|obUb~~sdl~}{qxrjqmelupnwvso\PJKZlzzwol|}i]YTUafdkqqu||xbYVR\ox{woljm{~wssuy~|unh\W^fr~yjb\RQYeoyuqmlgbbackw{zzxvvyuqlklnrv}~|~zyxuttw{}{z{~{wy}}xrnov~}zyyxurswzyurnkkklow}{ysnlqtx~|xtstvz}{wtwx|}~~{www{||{|~~~~}|}|{{|{zyzyyyxwvututssrpooonnlkjkjiiijjjkjjjiiihjklklnopqrstuuuuttuvwyyz{|}~|{{~}ytrrruuoloolkhghihfeeedgihfedfhhiijlmjghkntvutsrqquvwxxz|zvu{~{|zwttrpqolpqqphcgknmjffgdbdgomlkkjfbgknnllmnkfgkrvqmmppppuxvspos \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s6.bin b/applications/PoP/poc/res/sound/s6.bin new file mode 100644 index 0000000..99dcdaf --- /dev/null +++ b/applications/PoP/poc/res/sound/s6.bin @@ -0,0 +1 @@ +uvv{~~}zwttw}xtsqonnpmidceimonkgedeknkcZ[djigeglqmjnsz|yuw||{zvvvzzsrrokeceig_^flnd]^didY\chd]]gsvpmouxwy|||wruy|vrvwwtsuyxqkpw}~zqr|~~wurniclqtxsry|{|~|y}}~vonnlc]][[VRX\WNMWeuxruy{vlp{uhilsmaagf]RRY__]`iqvxvxotmcad\YV_daS>AOWbXYlifa]irunlvz}wuynjkrsnigd\TW`kttty|uokryz~{}{jco}}j\]^^VOZdkh^gpme\^k{}qswz|yĺȷy}mTEIVWH>:4. )30!&::7/3FVYOISX^YXr{lyyyprzylmiheetxx}wtoq}~~syshjnwjWH;0)#1:;/ 2DURQ[ihd]y˼Ȼxs~xYXQNLEQbeaQRZUH>DOVWD1W_bPPzwKVamransVbѶzp}|mtrd_z[XdhoinsZL?BQ]lhWGHRJIWmvwwwpT@AFKSTemjuyh`ON^btr`GDLXlgm~henzii\^eYm|ziUSKQccxdo޽ͿŪƯrc\TYZjpX:'5IO_e}zhXceaZ[}^X]fniqweJ69@BLUm~mUVcgqw·›{|{mVH,% "-9FDN\}t}ʹ~oxtvTH9:PRZRFMIQk|}_fhqna\NH>'/OxĺrtyR7CQ]XMOE7$"D]ffr`Zlqalv{ueZftduK?UhvbSD>;2P{mlUC]zǺƸvtrVrnfaiFBcoXT\\YEYxusun^:A^l{wtZ.GlqkqtmZioIG]sumpmdOX_@QpcSU[P@Xrs{s79UhV+'$(Euʠ_\|s`fňe|nF 5byj;Hp|c-/Pso\ryweqĴ˶tbntZ7+Zɲe-0]P331),Uw}snhֳN-@ex`@BNULBLa}bvpqqXK_{aiyqmYmyVNl\qokUB>2IeinnYMAUxorVZVglmydO^o}|xznkloybr~naj^ae^TpeoyuusviZbdRI7.02NMKwsz]KQBDUagOI0Dchzkntp[^~|g[XL]XYx{yssr~wrskecf`eyx|}~yxg]\RRV^pz}o`epsi`r{jhjasrla^USPQopmbl||zx{}~pjbejp|t|{{piclokcu|qtzuyrn|{{}vilpuql~}s|h^ct{w}|wngjlp}|yklrumt~yyskovz|~~yiqpyyqx{}wifi}{}ytpkorz|{skmxzvy|{z{ttsxz~rkrx}{zz}}njlw}~quruuu|}|ynpuwz{yzsuxzz{}y}~iow~|}z{vlpr}~xotxzyx|yztqu}|{}~}~usx|}|~|}tms||~|}qru|}}}otz~~v{~}|y|wrw{~z}|xty}~{z}}}qrz~~}}wtwz~~~xtx}|{{||vx{}~|vx{}|~}vsw~}~{vx{~}}~~uw{|}~~|}zx{~~~~zy{~}~|wx|~~~zz{~~~|z|~~~~}{|~}z|}}~{z|~~~x{}}}|~}{|}{}~|~~ww|{|}{~{|}~~}{z}|}~|ww~z{}}~}xzy|~~{||z{yz~}z|zwz{{~}{}}w{z~~~~{||~}yz|{x|xxywy{}~~}}|~{}}~}}}}}~y~zx|}}}yxy}~||xx~|x{|{}{y}zz~vvxxswx}~|y~{||x~|xy}}}|}}y~z{}z|z~~{}}}{x|t~|}}}}z~||{}~x|~}}||}ztsvzwr~w{}}t{|wx}|wy~|wmsxyzvz~~|~zzx}~{~bbexzhy{iyvwz|x|~sy~|{w}yz~ru|z{t{vn~}wszx}stv{{wxy|~~xrwupx}{}|~u|~|ls}}r~pqs|{yylu|xtwyrvusbywvvup}jqglxysxyzu}r}xx}{||}xuyxyz~|zsmutyytq{wzvz|hxwwvty}|{xtvym|xz}wq~p{~{}|vy|{~||xz{}{{yryvxtn~w}}x|zyn}pryn}xl{rlvxn}rz}|nvwdurn|zspvrtyxpz}~vmr}{{vtjf`{sfwdxzxww}jhup}waXztxl{q]quq}jpxvRp}amqZH?mxoWkh{urzb+1zoO^vVUdwNȎP]Lgqcը*M;buGfƩ?C|RloplҔ4[j%gWRl[i%gn>-]kUYr^e_KX{pUcy]QO.DxdGZikr|پuMKcu{ursw͹{m`^k}}tlgYKMZfg^VMELduvrph`affW>/-8Q\VSX[Zns{x}|}ɿs_[`cfims{~xpgZL=1/7<@DHMXaa`_VOUYVW^gkpw|xwvx{zrmljec_YVUSTURNKHHIMU]doy}vplc]]ZWWVVVVWWTRQNJGECBBCBDGDEMPOSYXYZ\]Z\bcdlw{}}~yttv|~~xsttxyrrx{ww{{~x{ytpmg_[SR]^WVW[VICDED@<9?LQB>QWMPTONOTOG\gWTZ]fqsstvn\]pxsoXRW^fq}}sswy{{xvtty{~{w{~vojhd]\bghjmoruy{ywz|ytvz{yxwy{{yxzyxvrsuspruwxvuxytrsonuz|~xrwxuwyy|~~xsojfhjlnigjmosxywvusqole^YTOMORUY]^_bdfkrxzxwvwwupkkprsw}}}{xvtqnjhhfcdb`dedjrv}yvvvvwwuw{|}~}~~~~|zyxvsokga\WQKFCCDHIGEGJNTY]diihhgilmkjnommoqux{|~|xtpnnoponmptx{~~}||{{}}yvwwvvvuttuvxyyz||zxurpmigfcbbbbb`aba_]]]\\[ZYXWXZ\_a``dfgknljlnprtx~~|zyxspopnmlkmmkhfffec``chha_bcbcgiiihghmrstw{}~{z{|{|~~||{y{||}~}~~~|yzyy{~}~}zxxxxwwxwy{zyxwvxyyxxyxwvwyzz{zxvsqqqpooonmkklkkkklnqsuwyyzzyxwxxvwyxvuw|~|{zyxyzyyzyxywuttrqpqqrsqponmkigedbaabcdegjnoqtvuvxwwxxy{|}~~}}~~}}~~}|zwuttsrrqpqpooqrponnoooopqrrtvyzzyz|}}}}}~~}{zxwvvvwxwuuuuuuvvvwwvwwwxxwxyzzz|~|yxxwvvtsrponmkjijklklnoonpqqrstttsssrsrstuvxz{|{{{{zyyz{{|}~~~~~~}|zxvuusqqpoooopqrssrqpoooponmnnmmmnmnoprqppqppqpppoonnoooopqrssrqrsstuwyyxwxwxyxy}~~}~}zwtqooruwy{zwutstuvwwwutrqppqrtuuutsrqpqsttsssrrqonmmkjjknrtw{~~|zxyz}~}|{|}~~}}|}~}{zz{|||{|}||~~|zxvutsrssrqponmlkjiijiiklllmnopppppoonmkkklmprtvvwyyz|~~~~}|{{{zyyxxwvvvxxwwvvutsrrqqpooppqrtuvvvwxyyyyyyxyzzzzyzzz{{||||}}~~}~}|~~~~~}{z{|}~~}|{{yxxxwyzzyzxwwwvvxyxwxyyyzzyyzzyxxwwxxxxxxyxwvutsrrrrstwyzz{}}}}|{{zzxvuwxwvvvuttuvutstttuuuvvwxxxwwwxxxyyyz{|}}}||}}}~~~{~{{~{{olftRq``gՓurIkb?=* ,T/ ob;jtG_Ŷkc̰ũP5qPBLw9ZvrP=A8P^boаth8]t`hafd^Y5&^]t}]Hwgr{lHCRB Q{aJju;jvdqw^R#Br'AwCkBsmӺǵynyOPQ)):+bnGRȵw^2[flfejpveW;45=CVAqpRˉjpʦqx7,\ANMY|SybRBjf}wzklJPJW>R(q/mov͠w͖jrgM22;Z0IKPVdYB/g[F@l|szëȬrz|wwvHOhC_|`fks`XZlPf[[qq~y}gZpyimfoxd\T]\fwsyzvnwhTdWLTR[qdowzm}|{mSmw]cJLiwYQhiftdzhhV@^L`mQ^Xy`ph8\_ujx}}zow~zzvaN\`mqdapzvvl[`jfeilwz{grnv|vzyrggW_za^xwjlsygknogkmp~plujRrlHTV1WYUNcWM^_ejvxkiyvyhe~zspOV`e__vvwuohdkVP\i_SWYTXmefzeZ`NJUi_cjdy{r{qblyWqz{v}n`jXcsqrgyuirpfiV>@C5Gd@EfQIeerƽqlkJOf_]krr{v|peuvibYPTTPcnsjYZ[U`qbp|nrx|qidRMPQdld}uur~|w\opYYQSSO\n|{ntx}snaiQMOUZbdq{rle\S?@RUYdlwx_fdYrslu|pqzndS\LJZekzzrdMLBNtkwQByPSttoXRnjhjSiiSmѧz~nlrrj}y\lÜU|]LSqql[bgb|f=xqr=vSAYcktPo.dvm_fc{Ldkbpk`~qA`o7qvfx|ilvOL~eo{]_\WIVB[jZ{eYgSvqIv{{yjr0;uY;$0TVPcy[uTjJMlIvj;^uhuMev|\XРcmdjAdcix]uqTO]^`Y{xv˚r}yyzimVc`r}d[``~RpVrtyvxnw~sG{ʈ>xsVfxUr^IleyNT=R#Yr~{zmRam|nik|ll`|r}tyuyƉ~uyuiayg@[|eKp{uF?zeyq^LtinosldRYkokvn{bbnt|mi{fnqowiWapIcURGUuhtZLb8viOm_|bhPribhm}yjv~Wpog}{ĬÑywnw}byzuxy`xmmw}f}i}}{ywm}xmvz_~mdgw`hZ|WnMSyYdkv^n}U|wz}mvolo^nwqqWkpd{lglgvhgBP|z}d`Zye^q]PyXq~HqriM_j>crL{A{exLdX{PwQh]PzYkuY_qag}Y}ul[UliQoZedY|ot`fu~nrm|kbw|woqa|uvnzlr{pz{su}j}ydym{tpyv{czhwowtw}xfhNrk}oalfLhseJ=FJDMx{A\e^q`ka]dVSUW[fqSOGDz_jmXO3ZuPGUKa7=QO~xt@H,Faz[}}|R5dFTE4pYXmz{ZelfMM[Zmhb[mVoRzTz|}wnm}{~tK{yx|~~ew}jt~Qþh{yrnnw~{rwy}rxzuzzehq~~evrdVqup]baxjdWt`gyykejz|_ofythik~zzvxyzuvvn}uu~ss{zry}|s~~}tcajs|~qw~z}z|pdqzbbvy}|znjvjn|xaQvyx|wtx||yq~t~~tj{j~u~t{}{z}zx~kjqnf[uxp^l}|pfcsvfqzskzop}lTRnto|q|xtwk}tp{ikn~y}mfsut}|wrv{|{sxvnrxo \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s7.bin b/applications/PoP/poc/res/sound/s7.bin new file mode 100644 index 0000000..a0befc2 --- /dev/null +++ b/applications/PoP/poc/res/sound/s7.bin @@ -0,0 +1 @@ +ux|nq~wuyw||qx~~t~~}yz||tzs~rrps{}}|vwpr`omiflyz}x}z{no|rs~txuvs|pfks||~y~wu}v}z~|rwuu}y~voj{xz{|{wyyvv|}|~|~zz}zwu|~}|v~~}~~}|w{wx~x~}z~{u{yf|cuza_czv^yxtgerbixw}ok~ytzl`p~hiwrs~z|{w~z{u|mzvw|~xyr|_x{lw|~spzuzxxuxz~xv|w{}|xuvyy|{w|{|{z}}}|xz{{y}~}}{}~|{{}|vyzz}x|{ux}vsxn{zswvx{y~umkfhurlhglvgg}oi^w`o|vyikpzjzxnq}xz|~}}|{z~|x~xz{xv|~|~zzoyz||}}~{}~~{~||x|z~y{xw||}z~~z||}}~|~}~|{}||||~~}||{~}{||}~{||}xy}|xz~}~||{~}~}}{x|~}}}||}~~}~~}}~z~~y~}~~~|~~~~~~~~~}~~~~~}~~~~~~}~~}y{}~~~~~~~~~}~~~~~~}~~}~~~~~zz|}}|~|}}~~~~~~~~}}~~~{|}z|}~~~}|}~~}}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}}~~}~}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~|}}}~~~}~~~~~~~~~~~~|{{{{{|}}|~~||}{|~~|{{}~~}||zvsrsuxz}|xwxz|zyyz|||{zxyzzyxvtssrqpnmlmooosx}yvvtqmd[VW[_dgkljgffeimopsyz{{{}~xuvwvwupnqtrrrpmjjlooqrsstvz~~}}~~zurruy{yursx}~}~~||~|~|z|oux}}}}vtnkghinw}|}~zsvrsy}~|~}}{}|yx|}~yxtsonppssptxz~~}|}{{zuqrwzz|~y|vpptz|}~~}~}yldflpv}zz}~~{snikptxyyz~{xwkig`adl}ywzo`W[hqrty~}zxyn_Zblszvqsy|wssvwcL=>JYqykdfkotzytxsianx}raWY`o|trnv|iZ[pvk\[wi\[cnt{uqoeclkp}wljwq[Waz{ePSgtimx|}ne_]\[j|~toqu|xjlqyvbKFMn|jgr|uwr|~pm}~xtxyurvw{tikgdemmu}|vrmpiehdl~yqot}|tqnpyx{zywtpopxyqnljmrx~xvrjhmmrwtxznkt~wrz}~{{iduyt{rv{upw}saYSJiieqxtxx~pwxhc]]mm_VMOkwT<7Ikzpx~spon{`VVXavzmf_^[[_gw|~~{roowwzrknns~su}|xiekm{wswy}snx~wofaitpqtsv}{nefiwrlf__trhnpd`zlp^N_|y[Sct~z}x`Vi{z^RYjty~uivtsx|b\mwzywv^Ycxm[ey}aTZlg_o|Z=An}nkx|jai|z~wsorvs{wzi_ipttocajkmv~yhZOWeunqyv|rqbZcrhX]kmtkqw}here}rkvstnovuࢢsfbfnqn~GOax~}}tztzuqno}sY]|_TkBJetp{yefYWdcmiebyqz`R^|ycmvXBUsxy|zholyxg{pq~edRtz_J+Npk^_OV|yalqKrv}k{|mj_M5HsqS_acqvrZV_vx}lo{aSZtlein{n_jwhs~~xknag?3<[qO83[eJgrrmbpGhYNw|Htqnۥy~{{sa=44>=Qmv|wU;.<_bnO +Vӭyp{fhywywzri]UYTJSY\|nwgZ}ֶzxi|mj}ovMICUcj[[n{hOtdTko}uww~nkp{{uwlnt|mnw{uviboxydYq|v`ix~{h[]SNE+2=" &1Halnwұ|npmxttjkia_DF7B;38WQc|wYOdixzw}tTUvzuoy{|shcYcry|w{ƽ|uhRB@BHJEK\y}ngjVQ\__mujefloulfe^ZSSfmosqwbgolmjnlnow\Lfuqr~~j\UYfrzq_eiuofopw}}unkg\Z^eq}gabehkjmpy~xs~srvtgljtzx{s~zot~wuyUHOfn|x|momd\^pnsv^qs^LLWeeiou{n~~zhlnkjrz~uj_epqu{wmpxy|||}uxy}sy}rmkcackpicljnokhuytzqqcjjleq~yrxzzzqjldefhkqqx|rlttio{}}ywyrt{zqsskfkpt}zqq{}~wogWOR[ejhosrukpriakpnwx}xtzyonoimukfa`]dirpu|yyyzsy{urysjjifmppqmhdcgnpx|~|~{txxy~~yvtvz~~~z|wu|zwtvzx{p}{}|zyspllmnyxvz~uligeiiimopqv|{vvy}~xnjggjmptyyyyzz{{y|}}}wyy}}~}zwx}x|{xwvtuww|{zwtrpnmpqsusolmkkkiffhjmruwwvvx||xwxwyvsqqnkklosyyvvwy}}|{ww}rjdaainqpsvvuxyxy{~|{yyz~{yzyz~|wtqtz|yzxz~}zvtssqpopokjnrtw|~z{ytxz{zrnklnrux|wstux{|~zvsohdbaeipu}~{z{z|}|yututpmkjkmoopppppqsuxz|zxyy{~~|{yxvxywtqnmoqssuvvvvvvvuvvy|{xvx{~|{{zzxvuuwyxwvvuvx{|{{|}}|}~~~}||zxvtstuvx{~~{xssssuvuuvvvvvuvuuttvw||}}~}}~~{ywvwz|}~|{z{}~zwtrrsux{{z{|}~|{zyyxwwxxy{~}zzz{|~~|yyxy|~}}}}}}||zyyyyxyz|||||{z|||~}|}~}~~~~~}~~}}|{zyyzzyyz{{|||||}~~}}~}}|||||||}~~~~~~~~~~}|z{}~|yxy{~}zwwy||ywx|}zy{}|yy|}{{}~|zxxz}}|zwutux|~~}}|{z{~|zz|~ywtsrsw{~|||zyz}}{zyyz~~~~yutv||vrqonorx}{spsvwz}zvx|}xsswy|zusv{}yz}{ussstuwxxurnmnmmnqvz}~{yyxvvx|}}xtrty~tlhioy{tomqywnjjp{zqjgktwpknvyqlnu~|smmr|vpnr|~ulgiq|~xod_akxzrnqzyrrxzogekvxogdisxokmu~wpnry~umjls{~ulghox~tmlqz{tqsyvmggmv}{qkjpyvnkoxwmhir}xmfgmxsgcgqwjejtqiiq{xmglwxlb`ix|sg`bn{tjeitxvurqyulow}|nhhhhp||g\cott{~oecixskjihlw~|~{vv~{{ztvztpw~~qfjxyqlgis|pkr~~zspruyyvvyywvvwvw}~}wsv}y}z}{{|ysquvts|zppuwqjlwztvzzwy~{{}yppw~|wsvyvtuyysruzxohly{tsvvpmswsywt{~x{oehsy|{upjipxmo{{|xnnyvf^amyri`Z_q{pkr|||}}ukb^br{necflt||qhejs|zsppryxrkkv{|qlmpwtkeck{uf\atyj`cmws\V`p~jdhkmv|z{seey}{o^Xh|bU_w{pmkhgo{zslkvvrqkb^dqqb_huzppv~uebn{z~ycQZ|qimztebk{wmfgoz}rhfp{~}~{x|zuppy{qfcm}xhVQ^uxoqz~ytlegwrmssh]b~seamxoaVXlo[MPlyrbL@OttVGQmvaTS`tjWTao~|ikuqiq~ttqf`ksmlgXQ`suzq_Wfx\Xi|wnprrzzsj^^t|ri\R]{uhXLTokSQhhT[n~e\fnnnz|f_gpqpxtmuxu~srtq|ystrdTVoyxwjUQgsZQf}fVdlZaywcaozzxsmt{yst}~plqx{}rjoutqwyhciot~|nkllrzne]\m|meXKKe~vaOSpl^guyu}xrtl_`ysYKYyy`PWr}hevw|yu~rw}laj}pqz|m\[m{zrr~men{|us}||qtuuocgqtrum^]flotwqsrnp~||ypio{uy{sik~ytozw|txzxxr}yspvwpkqvlnohagy{vundh{zpc[cyyePIUnz[OYm~ladpx}unhaZ]m|scY`tngnpdeoz~|k]]iuz{w}yps{sy{~{nhpwhgr{xrv~lhs~{lfpzwjdo||k_g{zqw~mouksrkpn]MObuvliu}ta]j|wovsktux}zvovyrxqddpy{z|qtywomwrdcovsournxysz|{nku~wrv~ysy~tpu~{v{~rnt||yy}|rlr|zxyvrpty~}}||zz{}}zz}~}xwy|xpmt}~~ssz|yz~{rjkpttuy~{yvtsw~}~~~yrpv|uqsutpowzuuxyxvx~||}{x|}yqljmqsrpppmga][^dinrw}|zz}~}}xttvunhdee`[VYbjmmmoqnf_^fs~wpot~}yx||xtszviabhnmjehq{yohgknnigiotw|}yssx}~ztmhfghec``chovzxsoosxxtpkknv~~~~|xutx}{{xqpt|zspokc\Y^gqvuqqyzqprtsrrx|phhnv}}sh`bn|ypjhhgdbelsyzl`[^hzpeemwtifhlqsu{|vla_ht~}nd_blw|vwtaSORZesymdadm{wlgimomknwzoiiigddhoxzmeceijhhmuui`[Y[ahnt~vsv||pnrzyrooljhhjq{}|unmortqjedkt{zoffmw{wsu|tnnsyxqhekxzngfgfcabjuyz|nglstqtz|{~|uoiiu|ywuuvzuqrstwz|~zsot}rlosqmjhfglt{~}ymc^ZWZdsrg^WST_qtd]XRKGLYgopsz~wokijknrw|}|}}|zy|{tnlotyzvrswyvsx}}}}yyytleaafr~{pd[X\cijlpu|zqhdcfkpw|yz}|sf``aaeoy}yussx|vuy~}~|unlnu||wsswywros|ywvtsxzssz~wpnpqqrw~}urstsqrtwyzyxz}tt}}}zngfjoruywd_fqvrkghp}vomptx{~{okq{}uopv{~~~~||xvtqlgefjpwyrnlnrtvy||yusv{zussuxy}~{{zsmhddhov|{yyxwy{{xsoou}tqw}|ukegoy~~sos|yzxpifinrsrv}sga`ciry~|xxz{xsposy}wja\]agox}{||xwywsnmr~wneaaeoz~yuw|yrmklptvx|~zvssvz{vsruwwxz|}||}}vnkmrvy}~|zxuqkefqtpoliec`bkw}vstx|}|wsru|xttuvwxyxwxy}{usuy|yrljq|~~}{yy{}~|xuuxzxtppt{|vsuz}}|{|{yxxyywtqquz|}|~~}|~|{{zwspqtxz{}~~~}zxxyzzyy{~~zwuuvxyyyy{}~{yy}{ursvz}~{yy|~}|z}~{yyz{{{{|||{zywvwwvspnosy~}~~~{yxvurpnnooooqsvy{||||}~~|zyywuttvxz|~}|{zyyyzzzz{{{||}~~}}|}~|yxwwxxwvuuvxz{{{yvuvwy}~~~~}||{{{{{||{zywvuuvwxyxwvvvwxyz{|~}{z{{}~~|zwwxz{|}}||zzyyxwvvvvwwxxyyz}~~~~}|zzz{||}}||{zzzyyyz{{{|}~~~~}||||||||| \ No newline at end of file diff --git a/applications/PoP/roomtest/pop_sfx.h b/applications/PoP/roomtest/pop_sfx.h new file mode 100644 index 0000000..a4d60e6 --- /dev/null +++ b/applications/PoP/roomtest/pop_sfx.h @@ -0,0 +1,43 @@ +/* + * pop_sfx.h — звуковые ЭФФЕКТЫ PoP через COVOX-Blaster. + * + * Данные — оригинальная оцифровка игры (`digisnd1..3.dat`), приведённая + * упаковщиком к 10 937,5 Гц. Конвертировать в рантайме нечего: у PoP + * сэмплы 8 бит БЕЗЗНАКОВЫЕ МОНО, и это ровно формат CBL (см. и + * ../docs/sound_plan.md). + * + * ОДИН ГОЛОС. Оригинал тоже одноголосый: `play_sound` глушит + * предыдущий звук (`stop_sounds`, seg009.c), поэтому новый эффект просто + * перебивает играющий, и никакого микшера не нужно. + * + * ПОЧЕМУ ЭТО НЕ ЛОМАЕТ КАДР. Насос живёт в прерывании CBL и отдаёт 128 + * байт раз в ~11,7 мс. Кадровые прерывания при этом теряются (ветка CBL + * в трамплине делает приватный RETI), но нам всё равно: темп кадра + * считается ПО ЛУЧУ (pop_pace.h), а не по прерываниям. Если бы пейсинг + * остался на них — звук сломал бы игру. + */ +#ifndef POP_SFX_H +#define POP_SFX_H + +#include + +/* Поднять звук: занять 8 EMM-страниц, вычитать в них набор, открыть CBL. + * 0 — OK, -1 — не получилось (тогда pop_sfx_play молча ничего не делает, + * игра идёт без звука). Звать один раз при старте. */ +int pop_sfx_init(void) __banked; + +/* Закрыть CBL и отпустить страницы; звать на выходе. */ +void pop_sfx_close(void) __banked; + +/* Начать эффект с номером id (0..56 — нумерация оригинала, см. + * sound_plan.md). Перебивает играющий. У звуков без оцифровки (это + * музыка) длина 0 — вызов просто глушит текущий. + * + * НЕ банковая и НЕ __banked: зовётся из горячих мест (play_seq в + * pop_kid.c, физика, боёвка), и трамплин на каждый шаг Кида не нужен. */ +void pop_sfx_play(uint8_t id); + +/* Оборвать текущий эффект (порт stop_sounds). */ +void pop_sfx_stop(void); + +#endif diff --git a/applications/PoP/roomtest/pop_sound_tbl.h b/applications/PoP/roomtest/pop_sound_tbl.h new file mode 100644 index 0000000..e7fe6af --- /dev/null +++ b/applications/PoP/roomtest/pop_sound_tbl.h @@ -0,0 +1,98 @@ +/* pop_sound_tbl.h — раскладка оцифрованных эффектов PoP. + * СГЕНЕРЕНО toolchain/pop_pack_sound.py — НЕ править вручную. + * + * Данные: 8 бит беззнаковые, МОНО, 10937.5 Гц (CBL_FREQ_10K9) — формат + * CBL один в один, конвертировать в рантайме нечего. + * + * Начало каждого звука кратно 128 — размеру блока запроса CBL, а + * страница (16384) кратна ему же. Поэтому НИ ОДИН блок не пересекает + * границу страницы, и проигрывателю не нужна логика стыка. + * + * Смещение хранится РАЗОБРАННЫМ на страницу и адрес в окне: на Z80 + * 32-битная арифметика дорога, а так всё влезает в 8/16 бит. + * Длина округлена вверх до блока — неполных блоков не бывает. + */ +#ifndef POP_SOUND_TBL_H +#define POP_SOUND_TBL_H + +#include + +#define POP_SND_PAGES 8 +#define POP_SND_COUNT 57 +#define POP_SND_BLOCK 128 + +typedef struct { uint8_t page; uint16_t off; uint16_t len; } pop_snd_ent_t; + +/* len == 0 — у звука нет оцифровки (это музыка, см. sound_plan.md). */ +static const pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT] = { + { 0, 0x0000, 1664 }, /* 0 */ + { 0, 0x0680, 12032 }, /* 1 */ + { 0, 0x3580, 6272 }, /* 2 */ + { 1, 0x0E00, 1280 }, /* 3 */ + { 1, 0x1300, 1152 }, /* 4 */ + { 1, 0x1780, 1408 }, /* 5 */ + { 1, 0x1D00, 5504 }, /* 6 */ + { 1, 0x3280, 896 }, /* 7 */ + { 1, 0x3600, 1664 }, /* 8 */ + { 1, 0x3C80, 2816 }, /* 9 */ + { 2, 0x0780, 4992 }, /* 10 */ + { 2, 0x1B00, 1280 }, /* 11 */ + { 2, 0x2000, 1280 }, /* 12 */ + { 2, 0x2500, 3840 }, /* 13 */ + { 2, 0x3400, 7552 }, /* 14 */ + { 3, 0x1180, 17664 }, /* 15 */ + { 4, 0x1680, 4736 }, /* 16 */ + { 4, 0x2900, 4224 }, /* 17 */ + { 4, 0x3980, 6912 }, /* 18 */ + { 5, 0x1480, 2816 }, /* 19 */ + { 5, 0x1F80, 1408 }, /* 20 */ + { 5, 0x2500, 1152 }, /* 21 */ + { 5, 0x2980, 1280 }, /* 22 */ + { 5, 0x2E80, 1408 }, /* 23 */ + { 0, 0x0000, 0 }, /* 24 */ + { 0, 0x0000, 0 }, /* 25 */ + { 0, 0x0000, 0 }, /* 26 */ + { 0, 0x0000, 0 }, /* 27 */ + { 0, 0x0000, 0 }, /* 28 */ + { 0, 0x0000, 0 }, /* 29 */ + { 0, 0x0000, 0 }, /* 30 */ + { 0, 0x0000, 0 }, /* 31 */ + { 0, 0x0000, 0 }, /* 32 */ + { 0, 0x0000, 0 }, /* 33 */ + { 0, 0x0000, 0 }, /* 34 */ + { 0, 0x0000, 0 }, /* 35 */ + { 0, 0x0000, 0 }, /* 36 */ + { 0, 0x0000, 0 }, /* 37 */ + { 0, 0x0000, 0 }, /* 38 */ + { 0, 0x0000, 0 }, /* 39 */ + { 0, 0x0000, 0 }, /* 40 */ + { 0, 0x0000, 0 }, /* 41 */ + { 0, 0x0000, 0 }, /* 42 */ + { 0, 0x0000, 0 }, /* 43 */ + { 5, 0x3400, 2688 }, /* 44 */ + { 5, 0x3E80, 4224 }, /* 45 */ + { 6, 0x0F00, 4608 }, /* 46 */ + { 6, 0x2100, 5120 }, /* 47 */ + { 6, 0x3500, 5120 }, /* 48 */ + { 7, 0x0900, 4480 }, /* 49 */ + { 0, 0x0000, 0 }, /* 50 */ + { 7, 0x1A80, 4864 }, /* 51 */ + { 0, 0x0000, 0 }, /* 52 */ + { 0, 0x0000, 0 }, /* 53 */ + { 0, 0x0000, 0 }, /* 54 */ + { 0, 0x0000, 0 }, /* 55 */ + { 0, 0x0000, 0 }, /* 56 */ +}; + +static const char *const pop_snd_files[POP_SND_PAGES] = { + "SND\\s0.bin", + "SND\\s1.bin", + "SND\\s2.bin", + "SND\\s3.bin", + "SND\\s4.bin", + "SND\\s5.bin", + "SND\\s6.bin", + "SND\\s7.bin", +}; + +#endif diff --git a/applications/PoP/toolchain/pop_pack_sound.py b/applications/PoP/toolchain/pop_pack_sound.py new file mode 100644 index 0000000..02efe6f --- /dev/null +++ b/applications/PoP/toolchain/pop_pack_sound.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python3 +""" +pop_pack_sound.py — упаковщик ЗВУКОВЫХ ЭФФЕКТОВ (оцифровка, chtab нет). + +ИСТОЧНИК. `MSDOS/digisnd1..3.dat` — оригинальные контейнеры. Разбор: +индекс по 8 байт (id, offset, size), **первый байт ресурса — контрольная +сумма**, тело за ней (спецификация `docs/POP-DAT-FormatSpecifications`, +§3.1.2). Тело — один из двух вариантов заголовка: + + digi_type (1.0/1.1): word rate, word count, word unk, byte size=8 + digi_new_type (1.3/1.4): word rate, byte size=8, word count, word, word + +Различаем по позиции байта размера: у нового он на смещении 3, у старого +на 7. Сэмплы — 8 бит БЕЗЗНАКОВЫЕ, МОНО (проверено по `convert_digi_sound`, +seg009.c:2358: один байт на кадр, `(b | b<<8) - 32768`; стерео в данных +нет вовсе, каналы размножаются уже на выходе). Это ровно формат нашего +CBL — конвертировать нечего. + +ЧАСТОТА. Приводим ВСЁ к 10 937,5 Гц — это `CBL_FREQ_10K9`, то есть +частота железа. Не к 11 000: проигрывание 11 000-данных на 10 937,5 дало +бы сдвиг тона −9,9 цента, а пересчитывать три файла (2 750, 8 200, +14 000 Гц) всё равно надо. Взамен CBL открывается ОДИН раз и частота не +меняется никогда — ни между эффектами, ни при переходе на музыку. + +РАСКЛАДКА. Всё склеивается в EMM-страницы по 16 384 Б, и начало каждого +звука ВЫРАВНИВАЕТСЯ НА 128. Это не косметика: блок запроса CBL — ровно +128 байт, а 16 384 кратно 128, поэтому при таком выравнивании ни один +блок не пересекает границу страницы. Проигрыватель за счёт этого не +знает слова «стык»: замапил страницу, отдал 128 байт, сдвинул указатель. +Плата — до 127 байт на звук, всего ~2 КБ. + +Выход: poc/res/sound/s0..sN.bin (по 16 384 Б) + roomtest/pop_sound_tbl.h +""" +import os +import struct +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +DAT_DIR = os.path.join(HERE, "..", "MSDOS") +OUT_DIR = os.path.join(HERE, "..", "poc", "res", "sound") +HDR = os.path.join(HERE, "..", "roomtest", "pop_sound_tbl.h") + +PAGE = 16384 +BLOCK = 128 # блок запроса CBL при 8 бит (см. cbl.h) +RATE = 10937.5 # CBL_FREQ_10K9 +NSOUND = 57 # id 0..56; у музыки оцифровки нет — длина 0 + + +def dat_resources(path): + """id -> тело ресурса (без байта контрольной суммы).""" + d = open(path, "rb").read() + off, _ = struct.unpack(" 4 and body[3] == 8: # digi_new_type + rate = struct.unpack(" 7 and body[7] == 8: # digi_type + rate, cnt = struct.unpack("= len(src) - 1: + out[i] = src[-1] + else: + a = x - i0 + out[i] = int(round(src[i0] * (1.0 - a) + src[i0 + 1] * a)) + return bytes(out) + + +def main(): + res = {} + for i in (1, 2, 3): + p = os.path.join(DAT_DIR, f"digisnd{i}.dat") + if not os.path.exists(p): + sys.exit(f"нет файла {p}") + res.update(dat_resources(p)) + + sounds = {} + for sid, body in sorted(res.items()): + g = digi(body) + if g is None: + print(f" звук {sid}: не оцифровка, пропуск") + continue + rate, samples = g + pcm = resample(samples, rate, RATE) + sounds[sid] = pcm + if rate != 11000: + print(f" звук {sid}: {rate} Гц -> {RATE:g} Гц, {len(samples)} -> {len(pcm)} сэмплов") + + # Раскладка: начало каждого звука кратно BLOCK, страницы по PAGE. + blob = bytearray() + table = {} + for sid in sorted(sounds): + pad = (-len(blob)) % BLOCK + blob += bytes([0x80]) * pad # 0x80 — тишина в беззнаковом 8-бит + # Длину округляем ВВЕРХ до блока: хвост последнего блока — это + # выравнивающая тишина следующего звука, и проигрыватель за счёт + # этого не знает слова «неполный блок». + table[sid] = (len(blob), (len(sounds[sid]) + BLOCK - 1) // BLOCK * BLOCK) + blob += sounds[sid] + blob += bytes([0x80]) * ((-len(blob)) % PAGE) + + os.makedirs(OUT_DIR, exist_ok=True) + npages = len(blob) // PAGE + for i in range(npages): + with open(os.path.join(OUT_DIR, f"s{i}.bin"), "wb") as f: + f.write(blob[i * PAGE:(i + 1) * PAGE]) + + lines = [ + "/* pop_sound_tbl.h — раскладка оцифрованных эффектов PoP.", + " * СГЕНЕРЕНО toolchain/pop_pack_sound.py — НЕ править вручную.", + " *", + " * Данные: 8 бит беззнаковые, МОНО, %g Гц (CBL_FREQ_10K9) — формат" % RATE, + " * CBL один в один, конвертировать в рантайме нечего.", + " *", + " * Начало каждого звука кратно %d — размеру блока запроса CBL, а" % BLOCK, + " * страница (%d) кратна ему же. Поэтому НИ ОДИН блок не пересекает" % PAGE, + " * границу страницы, и проигрывателю не нужна логика стыка.", + " *", + " * Смещение хранится РАЗОБРАННЫМ на страницу и адрес в окне: на Z80", + " * 32-битная арифметика дорога, а так всё влезает в 8/16 бит.", + " * Длина округлена вверх до блока — неполных блоков не бывает.", + " */", + "#ifndef POP_SOUND_TBL_H", + "#define POP_SOUND_TBL_H", + "", + "#include ", + "", + "#define POP_SND_PAGES %d" % npages, + "#define POP_SND_COUNT %d" % NSOUND, + "#define POP_SND_BLOCK %d" % BLOCK, + "", + "typedef struct { uint8_t page; uint16_t off; uint16_t len; } pop_snd_ent_t;", + "", + "/* len == 0 — у звука нет оцифровки (это музыка, см. sound_plan.md). */", + "static const pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT] = {", + ] + for sid in range(NSOUND): + off, ln = table.get(sid, (0, 0)) + lines.append(" { %d, 0x%04X, %5d }, /* %2d */" % (off >> 14, off & 0x3FFF, ln, sid)) + lines += [ + "};", + "", + "static const char *const pop_snd_files[POP_SND_PAGES] = {", + ] + lines += [' "SND\\\\s%d.bin",' % i for i in range(npages)] + lines += ["};", "", "#endif", ""] + with open(HDR, "w") as f: + f.write("\n".join(lines)) + + have = sum(1 for s in sounds.values() if s) + print(f"ИТОГО: {have} эффектов, {len(blob)} Б = {npages} EMM-страниц -> {OUT_DIR}") + print(f" заголовок -> {HDR}") + + +if __name__ == "__main__": + main()