2IMGRVLW@@@ @ 8L xC)pJJJJ IH(ȱH:=IH[H`@H^H 2 9 @   I/H`JLNGȄBȄF aK ' faaFF  RJm# KKJ qJ )J ۈJJm  JFȱJGJKaȄM ' 5aaNNJFLGJ`a  XL LG &PRODOS`DaElH$?EGvѶK+`L XX LU ŠϠĠӥS)*+,+`F)) (*=GJFjJJA QE'+ '== `@ STSP8QSS8 m P o R(8RNTP.TOOL2220%9"' @[READMEFIRSTP Q ET0%)INSTALLERKg! [ +TOOL222DEMO /% p0%8DOCUMENTATIONg 0%1MUSICh /%'SOURCECODEi 0%9SCRIPTSjQ+,%;SYSTEMk',% NinjaTrackerPlus player (c) 2018 by Ninjaforce ___________________________________________________________________________ Tool222 supports the 4soniq quadriphonic audio card. The player supports up to eight output channels. Hello, Antoine Vignau and Olivier Zardini, founders of Brutal Deluxe Software, are proud to introduce the "NinjaTrackerPlus" Tool222 to the Apple IIgs community. This new tool set includes Ninjaforce's "NinjaTrackerPlus" player embedded in Olivier Goguel's "Soundsmith player" Tool219. The "NinjaTrackerPlus" player is based on the file format of Amiga modules sound effects. Please, open the Documentation folder for more information. The SourceCode folder contains the source code of the tool set and of the demo program, as well as macro files for Merlin 16/32 and Orca/M users. Visit our friends' website at: - FTA: http://www.freetoolsassociation.com/ - Ninjaforce: http://www.ninjaforce.com/ ___________________________________________________________________________ Installation Manual 1/ Double-click the "Installer" program. 2/ Select your startup disk 3/ Install the NinjaTrackerPus Tool222 script onto your boot disk. The following file is copied onto your startup disk: - System:Tools:Tool222 4/ Restart your computer. ___________________________________________________________________________ Minimum System Requirements The program requires at least 32KB of free memory. It has been tested on Apple IIgs ROM 01 & ROM 3 versions. It is compatible with System 5.x and above. ___________________________________________________________________________ Limited Warranty Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Brutal Deluxe assumes no responsability for damages resulting from the use of the program. In no event will Brutal Deluxe be liable for any loss or profit or any other commercial damage, including but not limited to special, indicental, consequential, or other damages. ___________________________________________________________________________ Contacts Commercial Contact_________________________________________________ For any questions regarding a disk update or anything commercial nature, please visit our website at the following address: Internet: http://www.brutaldeluxe.fr/ Technical Contact_________________________________________________ If you want to get some technical information or if you have problems using this software, please contact the authors of the program at the following addresses: Mail: Brutal Deluxe Software 56 rue Corneille 78150 Le Chesnay FRANCE Internet: antoine@brutaldeluxe.fr olivier@brutaldeluxe.fr >x>t  p  B[SW@`UUDD70$H IH MHHCT <BT<I <2| !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\,C ~ExpressLoadN'H,~directhG@,mainDH,>~direct?@,;mainNCopyright Apple Computer, Inc. 1987-1990 Apple IIGS Installer V1.2V1.00V1.10K{^"*)#Hh`h`````"hZ" ) `" 0BB1c0"   o   "  (" " ")` ^ 4"H"h ^"HH ^H " ;[j+hfhhjiH^H@^H"y :"""``"HH"h^h^^ɀ@jiHH^H"nn";E8H#``44````"h"᭍^H"9" ""᭍^HjiH"d^HjiH" I^H" 6" '"^HjiH", H *"hbhbh Haa"`>L@\XH LAbout the Installer...\VH .>L File \H LQuit\*QqH .>L Edit \DH LUndo\V*ZzH LCut\*XxH LCopy\*CcH LPaste\V*VvH LClear\H HH-" "HH-" "HH-" ""H"h*"`) 5V`-/%'13"E> +dHH^H "h7h9HH^H "hX`hZ`"a +֭0 0"A"H"h SCRIPT e ȾHJOV`-i/iHڭZ`HX`H"Z`HX`H (h\`h^`\`m- ^`m/-i-/i/0 0%)'+0 0;m%i%m''Hڭ9H7H"9H7H (hh m) m+ 0;;Ȁ0ȢH)Xh)R @3"V` 8 +*%)'+V` mV`1m%%m''Hڭ9H7H"9H7H (hh HHm1 m3Hڭ+H)H+" ȥ  55V` )e i eȀʭ9H7H "9H7H (hR`hT`Z`HX`H "Z`HX`H (h\`h^`T`HR`H^`H\`HV`:H"ozV`:H"R`T` 00`8` 1:SCRIPTS:^N+ " v l l l l l%e2>eKWe]ienznzI~~I v]a laO fbnbubzbEbJbObZb33333333 K^[ U'"HH"7"c:"="g:"="Ki:"``"lc:"="lg:"="~i:"``" "#,m^HH"o^)HH"q^)HH":"BB",d`0"HiH:"bb" HiH:"#b#b"0"+:"Y="D:"Y="m:"=" /+k ;[K,d`0HHU"i#H::H:" )@8qq8HHiHH ";" H H"(-0"."HHT"6"2 )(7"."HHT"6"+ ;i k( ( R2R2HH== "zHH""(" R2R2"11E R2R2 + 2 2Hbb"hiH#b#b"hiHHHHWHUH[HYH]HaH_H " hhip9H7H (h!h#V` HHHH "hH (hh 4ȷHHHH-- "hH (hh 4ȷHHHH^^mm2H 2H "hhdd `8` &f`1^d`HH""dd ,^P f` /,^p ,+HNs^s^"h Eк " v2 + U',d`06U"αHiH:"R2R2"iU"ιHiH:"__"3`^)u^  " "`<" > +`" >HHb`H``H "h``hb`M``R```i m\`m^` ^0^^>0"?"}AX"BR""C7k" @"X?8 $^9k" @"/D,8 $^&k" @"K8n> > >"?,d` U'6H > >"? > $h8`,>J 1,t8a>a>0>a>a>5>"H]>]>"h > $`Ozgw>>n( `" >`8H8H"ᜀ88`0>>^0`Reading Writing &OHH"HH<< "hX8 H" ] b H{,z80 {Hk8|8JHhhH &"h0 Ⱦhh08 +H {Hh8k 3H8H8 H88"` HH H0 : K&^^KK:Kȷ K K0 KK0 8K :ʈʎK0^ ^ ʎK0K KWH (hihi0K K0 J0K K08 0 J+ 88"8(F D +8M0 HKH0H HK#HHK)iiHڭ^H " hh +K K h KhK hhH (hihi0KK0 J 88"8!FD 88 +8A8!9"!9"!9 -98  v8x8v8KKh h0hKh 0h hh `8`8H8H (hh )~k,t80"?@88,t8"HH"8hKhK08HH"zKKKKRRHHZڭ^HHH "z +888H8H "ᭂ8H8H (hh 8H8H "ᭆ8H8H (h;;h;;*V,t8A*V)@$9^9^9" 9 n] R $^ P]*V@ +99999" 9e88e 88"888 +邏8989"988 +i99"S8 +c88HH^H "[9h]9 +.H (h8S9h8U9"@"888 +"S0^H^:^Ȁ^0^8^8" 888 +邕0h^08Q9"AW9"#Q9 S9iS9U9iU9W9"#Q9]9H[9H";e8e 8)ie8e 8 >W,t80"@"A R)<:0=:<:0)8m8):0::09^9^9" 9 n]*Vv99999" 9<:H<:H" G88 +Ă>,t80"@" X;88 +d; F;f;H;h;J;j;L;l;N;R;R;Z;;;" ;L888 +R̈́;R͂;R͂;R;R8nR" ;88 +邂l;" ;88 +]8R;R;͊;;8nRh;;;;;;;m;;;;m;;;;;;" ;88 +" ;88 +9^9^9" 91" @;E88 +,t80"A" ;88 +u,R S;;;;;;;" ;88 +9" ;88 +l;c" ;88 +;;<;;;;" ;88 +" ;88 +邴:H:H" G88 +݂D8 +;88 8 8 : 88"8&D88 +䪭8+ H8H88 h8h Ν8 ) 8 IH8 88H8H"HS" Sh(k,^PpY)X^)4)^)^ @^"H"hSH1"SS" " "" S" S" SSS S" S" SSS" S" S``;;;899999" 9" ;LM88 +˂9^9^9" 9;;;;" ;88 +邼" ;88 +邢9^9^9" 9" ;88 +Ђol;`99999" 9" ;88 +Ђ-9^9^9" 9" ;88 +Ђ;;;;;;;;R;R;;;;;;<99999" 9" ;LM88 +˂9^9^9" 9;;;;" ;88 +M" ;88 +39^9^9" 9" ;88 +Ђ`.V.V4W WVV)i8n4W W0.V̯V1.Va{)ߍ8Va{)͟8ۭ.VͯV0`08`),V`): 0::-32W0a{)Ȍ0W2W,V Ȍ2W0W݂6W)H6W,4W0=99.V.V9)H+"0: /08W:W8ȷ)_>8 )__ʊ h?>?>>?> K;8[' n)+' );i&'+hhhhhk-nnnnapppqpplppp p 5q q p bqU" bqS" Dw F sZڀYtYt iH H " pnn "pp&"F: nq"nn&"``` p p#ȥ%)d):8:Z iHȊzЈ ):ȀȥF qddH nq"hFi 8 < >>wB{iH"eiDHHHFH "h<w@H"h,< p8 iJJ)2 4 ȗ ȗȗHHHH2H 8 H "@HH "h(hȗ` p q` p#%ȗ q n`````` iH :::H:"`)` ` ppp` `""""`6"8"H"h) ,"`z{i HZ`zHHHZ iHcȷ`*HH"` p r rd Ls ]s H sh sH"h ur(ȷ) 0n`< p(ȷ 0HH"i,iH bq bq" ""`< pi,iHHH" bq bq "` 5q q< p bqU" bqS"De F: sZڀYtYt iH H " pnn "pp&" nq"nn&" De `{iH "`d< pDe  0  0`F De ͩ``:< pDe  De  H"h)  bqV"` ) t) AtCt``wutuGvuv# 0 30 3333331333333330 333303030333330 0 YUU  )vHd "zHHHHZH "hvhhh$ȷ kwkw)H vh)ww-wHI-wvhvCwwvswȷuwȷ:wwȷ:yw?wH"h)ޭୱ έЭҭԭ֭حڭ܂H chȷ󪈈ކ୅H chȷ } eΆР҆Ԡ ֆؠ چܥ8pI>ލ ΍Ѝҍԍ֍؍ڍ܍H chޗȥ󭅀H ch } e·Зҗȥԗ֗ȥؗ ڗȥܗ{i+;ik ;8[i8pI׭٭ AH chȷ񪈈׆٭H chȷ 8pIܭޭ AH chȷ񪈈܆ޭH chȷ dѧ)ͧ)ϥ8pIͅ˂υ˥8pI 0 % ɨ)ӥɨ)ե8apI 0 z8pI 0% 8 8apI 0 z8pI 0% 8 ɂ8pIтт х  % 8pI {i+;ik ;8[iߥeߠ8"z d 8pI  p8pIHH"|h8pIH"|h8pI0  "zߥeߠ8މ d "z{i+;ik ;8[i8ߥJߥeߥ8pI: "~8pI*"z"z"z: "~{i+;ik]nh`t`z` `R`n`4``ar {N^A+Qw AUYfbcgnbquubzbEbJbObZbx``=Bbb#bMqaR2R2= R2,R2=bV#b3-j^mCs^}R2_(%1)I=`Ube sw`Ec3-p96 %=U`1`Idam!!-#$K$$$$$%$&.&,/&7='^'-(8(R2J(m(_@)`)b)R2))#b*_*********+*`*`+a+(+(+k.+^+4+7V+Z+l++p++t++x+++d+`+d+++k-,jeL,Ze,,,,,,,-,)-,`-Ye-i5-A-A-kl-nep-xet-ex-e|-e-e-e-e-f-$f-8f-Bf-Vf-of-f-f-f-f-f-g-'g-=g-Lg-eg-{g-g-g-g-g-#h-Oh-ph-h-h-h-i...,/.7//:/J/>/b/B/z/V/`n/`/ta/Q0/10Y0A011i1i1Nj1j1j1{1+22-22O2%2Q221P3-323#24444444^5^5_\5_5^5^6&6h6>6v6`6D6~6666i7n7p7^z7^89)9_9B;:\;<:;<:;:;:=> =>1=>a.>aB>]>k>w>o>>>`>>?<?Ik)@kb@|?|@y@?@f?DAo?A^A8ABA8 BB9B8_B9B8B9CCCCCCCCCDC|iDkiD+D+DldD9oD9D3HDGE^F9PFGGhH3HI^I8YJ8J!9J!9L^L9L9L9M8=M9dMSM8MSN^N8@NQ9bNQ9O^&O9GO9RO9]O<:hOGOX;O;$P;IP;P;P;P^P9 Q@;1Q;mQ;Q;Q;Q;Q; R:RGpR8RSSSSSSSSSSSSSSST9 T9T;8T^CT9YT;sT;T^T9T;T9T9T;U^U9U;oU9zU9U;U^U9U;U;V^ V9V;DW.VWWVX9X.VbX8W]8]8]8^P<*^s^nnYtnnnpnnrYtsnsp-snAtwuEttItuMtGvQtuUtvwkwyswyvEyswKyv|ywy9wyswyvywUbqw} Uims~ +/FJau (+6KOZos+!&-18@DOSW[_cfkntz} CFS\behkntw{~  $(,/3>BFJNQUY]amv{{!%@JPTerv GJP[^dgk")/49@ORYhknt2 !(6AEJX_m| $,/2AOa{  &*59=D|!%37BEHLS]cguy"  #(+.19>DGOS^dos' 69CGMSV_jnqty| -03 u})-4?CFRUfnx #(+17EVY $-IMZ^ehl""&1>AGQU`cgk~"$'*/@CFNQTWfilt|  #'+ov~'08;>ADGJNR[^ag{~0 !$036>ADJMTW_irz 1:=H]aehorv|) *158;>ADIUX]behkpsvy|  #/ALUkpw~ .1;LQjmp & *036:EIMVZeimqtx{" !$,/25DGJRZmsv ).18HNQWZgk,03>ADJWZ`oru}/ +.19PSV_bfinrx~&#8;>FKSVY\_betwz "%6=@EOch|.4GTW!!$'/25;HKNQ`cfz}/ "%(0369==៦i>==៧i>=i>= б(k9'_0x<0)<i>ῦ= (kh8k xKHHH "hh;8[i;i=+Xk xK)i[="  "&"(+kkkQc k=" i[dd+kx0", =(k'_芃kkK i[ހ;ހ6ހ1 : $&(*ܣ = $&+  hhhkK i[ނ ނ{ނu^: $&(*$t$&t&"dd"*t*H(t(H" ""dd +hkK i[ހ_"  : $&(*Ȁހ-%H". "+ hhkK i[ހH"  ހ6ހ1: $&(*  $&+hkK i[ހ+" dd = "+ hhk Ki[ހ*ހ"= I" +hk "" "d d"`$ڵHHtt"hi`"`"H h8`HHHHH "Yhh"H"$ h8`"`LL L, Lu L L ```x K0[ )< DEE U  7 EE+Xk+X8kڢE`nfc!EE Q S )`8` H)EOc _ !_h)E _ )E )F ) E_ )G I )K ) Zg*zM )OQ )SU_  )FFmEEEiEEEEEڭE[E[[mE![[i#[E[mEE[iEEE`ڠG)G _` 6  6 WY`WY`WY`WY WYOQSU`  I[ ] m[_` <0 `O? =[ ` <0 `d?= `+_)_?_=_=_F) [[`,#_.%_\,KKh.ᩧ - <0)< >ȹ = K_M_`>^>KE'_kx K['_ <0)<_ >=>>=>= #_,%_.X+kKKh)OckKKh)MckxKF 3_1_XkX8k K0[ <0)<>==)>J5)I_I__ʹE>Q=E>U=E>YE =0L 0'_+_)_+_ L +_O_ O_ L r ?_;_ H) A_h) C_ H) E_h)G_ B _ɭ;_0?_ <0)<Q_*_M_K_K_>K_=>>L_=0+kE>=>=Q_mE>b=>=Q_>b=>=OE>b=>=Q_CcE>Q_0Q=>=E>U=>=O=>Q=E>S=>U=Q_ bQccE>WE=>YE=L -_|x ~ 1_ 3_/_1_??_E6?_5_9_=_F E'_`=_F) [[`-_5_9_/_L -_/_B) m!_?_5_9_L ` 'V| , Jp -Q_fx Q_QcC_G::cK` bQ_ Q_C_ٍ_ _Q_ Q_A_o_ A_Q_ Q_E__ A_&o__MmA_)!_1bQ_ Q_`G_1A_A`'A_A`G_)JJJmA__`G_) mA_}`#``G_ `A_L`G_ `A_L1`G_ `A_ `_MmA_)!`A_Q_)Q_`G_)JJJ1aG_) Jy`aOa`G_)JJJaG_) Jyaaa`G_ E`Mc`G_ 8G_!b`)JJJJ!b`G_@@` bQ_ Q_`G_)/_-_`G_/_-_`G_)JJJ_G_)G_|" G_)_` 8 CM_`G__mG_  _1bQ_ Q_`G__8G__1bQ_ Q_`G_/c`G_) *`G_)ma`C__ ڭG_ g*M`G_?_5_`9_9_G_7_5_;_`7_5_;_`9_`G_) *aG_)b`G_?b]b``mG_@@` bQ_ Q_``8G_ݭG_{b`A_ bG_bA_`G_O_`1T-^|Q___`#`2#`A` _`}`A_o__C_L `_y`  _1bQ_ Q_`_8` _1bQ_ Q_`/c#o_`D::o__Myo_)!_ٹ`! y`ٹ``_1bQ_ Q_`8`ٹ`޹ayOaDOCUMENTATIONv ' '+FTN.D5.0008l 1'/%; g-MODFORMAT.TXTx'K- g[TOOL222.DOCP0ET,% gMUSICv ' ',ARNESUNE.NTP0])%;)%;h,BLOWBLOW.NTPI)%;)%;h*CONRAD.NTP\Do)%;)%;h-SPICEITUP.NTPյ.X)%;)%;hSOURCECODEv ' '/NINJATRACKERP.Sr(%4 0%i.TOOL222.MACS.SE\:/%iTOOL222.MAKE.Sqz/% i)TOOL222.S0@/%i-TOOL222DEMO.SHt0%8i.TOOL222.MACROS0%>0%iSCRIPTSvQ+' 'TOOL222Ki',%;jSYSTEMv''  'TOOLS',%kmnopqNinjaTrackerPlus file format ___________________________________ File Type: $D5 (213) Auxiliary Type: $0008 The File Format NinjaTrackerPlus sequences is a new file format released in 2018 by Ninjaforce. It has the following goals: + new file format ++ allow up to 31 MOD instruments (or more) ++ add stopper bytes to instruments where needed ++ pre-split instruments ++ pre-shift instruments ++ store sound ram positions of instruments + allow 5 octaves + store output channel (2x4ensoniq cards) + allow 1-15 channels (instead of always 14 for soundsmith) + store only the tracks that are needed + add all Protracker effects (except filter and maybe sample offset) + add missing e-effects except 0 and F (not really possible) + fix frequency problems + when instruments have the right size (256,512,1024,...) use free run for loops, no interrupts ------------------------- Header: + 4 bytes: identifier "nfc!" + 1 byte: version (currently 0) + 1 byte: number of tracks (1-15) + 1 byte: number of instruments (1-255) + 1 byte: number of patterns (1-255) + 1 byte: length of pattern order (1-255) Track data: + 1 byte: output channel for every track 0= Front left 1= Front right 2= Surround left 3= Surround right 4= Front height left 5= Front height right 6= Surround back left 7= Surround back right Instrument data: + 1 byte: type, consisting of bits %00000xyy with x: 0= random size 1= size matches an ideal size (256, 512, 1024, ...) with yy: 0= not looped 1= looped (entire instrument is one loop) 2= loop header (the next instrument is of type 3) 3= the loop + 2 bytes: length in bytes, GS style big endian first, not Amiga + 1 byte: volume (0-64) + 1 byte: finetune value (-8...7) + 1 byte: position in doc ram (page number) + 1 byte: wavelen/wavesize, the doc register Pattern order: + n bytes: list of pattern numbers Pattern data: + 4 bytes x number_of_tracks x 64 lines per pattern x number of patterns ++ 1 byte note (0-255) ++ 1 byte sample (0-255) ++ 1 byte effect (0-15) ++ 1 byte effect parameter (0-255) Sample data: + n bytes, use length from instrument data + the sample data includes the stopper bytes if needed and is shifted to be doc usable. Links: + http://www.ninjaforce.com/ to download the player and its associated toolset (222). stuvw  !"#$%&'()*+,-./0123456789:;<=>?@ABCDIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~***************************** * NinjaTracker+ Player * * by Jesse Blue * * thanks to: * Huibert Aalbers, Olivier Goguel, Jon Christopher Co, John Valdezco, John Brooks * Brutal Deluxe, Digarok, Saga Musix, yzi, djh0ffman * ***************************** * AV 201809 - The next two lines as comment * dsk ntpplayer ; AV201809 * org $0f0000 ; AV201809 mx %00 ; all calls to the player must be JSLs with 16 bit registers ; copy this into your program in order to call the player: NinjaTrackerPlus = $f0000 NTPprepare = NinjaTrackerPlus ; IN: X=low, Y=high NTPplay = NinjaTrackerPlus+3 ; IN: A=0 for loop NTPstop = NinjaTrackerPlus+6 NTPgetvuptr = NinjaTrackerPlus+9 ; OUT: X:low, Y=high NTPgete8ptr = NinjaTrackerPlus+12 ; tool does not use NTPforcesongpos = NinjaTrackerPlus+15 ; tool does not use ; prepare ; Prepares music, copies all instruments into sound ram and inits the sound interrupt. ; input: call with X=address low, Y=address high of pointer to the ntp file in memory ; output: X=address low, Y=address high of pointer to instruments (main program can reuse memory from here) ; when carry bit is set, an error occurred. Either the player did not find a NTP module at the given location ; or the version of the NTP module is not supported. jmp prepare ; play ; Starts previously prepared music. ; input: call with A=0 loop song, else play song only once ; output: - jmp play ; stop ; Stops a currently playing music, turns off all oscillators used by the player and restores the sound interrupt. ; input: - ; outout: - jmp stop ; getvuptr ; Returns a pointer to vu data (1 word number of tracks, then one word for every track with its volume). ; input: - ; output: X=address low, Y=address high of pointer jmp getvuptr ; gete8ptr ; Returns a pointer to where the player stores information about the last 8xx command found. Can be used for timing purposes. ; input: - ; output: X=address low, Y=address high of pointer jmp gete8ptr ; forcesongpos ; Forces the player to jump to a certain pattern (like command B). ; input: A=songpos ; output: carry bit is set when the song position does not exist (error) jmp forcesongpos *------------------------------- yz{|}~Noisetracker/Soundtracker/Protracker Module Format -------------------------------------------------- Credits: Lars Hamre, Norman Lin, Mark Cox, Peter Hanning, Steinar Midtskogen, Marc Espie, and Thomas Meyer (All numbers below are given in decimal) 3rd Revision Module Format: # Bytes Description ------- ----------- 20 The module's title, padded with null (\0) bytes. Original Protracker wrote letters only in uppercase. (Data repeated for each sample 1-15 or 1-31) 22 Sample's name, padded with null bytes. If a name begins with a '#', it is assumed not to be an instrument name, and is probably a message. 2 Sample length in words (1 word = 2 bytes). The first word of the sample is overwritten by the tracker, so a length of 1 still means an empty sample. See below for sample format. 1 Lowest four bits represent a signed nibble (-8..7) which is the finetune value for the sample. Each finetune step changes the note 1/8th of a semitone. Implemented by switching to a different table of period-values for each finetune value. 1 Volume of sample. Legal values are 0..64. Volume is the linear difference between sound intensities. 64 is full volume, and the change in decibels can be calculated with 20*log10(Vol/64) 2 Start of sample repeat offset in words. Once the sample has been played all of the way through, it will loop if the repeat length is greater than one. It repeats by jumping to this position in the sample and playing for the repeat length, then jumping back to this position, and playing for the repeat length, etc. 2 Length of sample repeat in words. Only loop if greater than 1. (End of this sample's data.. each sample uses the same format and they are stored sequentially) N.B. All 2 byte lengths are stored with the Hi-byte first, as is usual on the Amiga (big-endian format). 1 Number of song positions (ie. number of patterns played throughout the song). Legal values are 1..128 1 Historically set to 127, but can be safely ignored. Noisetracker uses this byte to indicate restart position - this has been made redundant by the 'Position Jump' effect. 128 Pattern table: patterns to play in each song position (0..127) Each byte has a legal value of 0..63 (note the Protracker exception below). The highest value in this table is the highest pattern stored, no patterns above this value are stored. (4) The four letters "M.K." These are the initials of Unknown/D.O.C. who changed the format so it could handle 31 samples (sorry.. they were not inserted by Mahoney & Kaktus). Startrekker puts "FLT4" or "FLT8" here to indicate the # of channels. If there are more than 64 patterns, Protracker will put "M!K!" here. You might also find: "6CHN" or "8CHN" which indicate 6 or 8 channels respectively. If no letters are here, then this is the start of the pattern data, and only 15 samples were present. (Data repeated for each pattern:) 1024 Pattern data for each pattern (starting at 0). (Each pattern has same format and is stored in numerical order. See below for pattern format) (Data repeated for each sample:) xxxxxx The maximum size of a sample is 65535 words. Each sample is stored as a collection of bytes (length of a sample was given previously in the module). Each byte is a signed value (-128 ..127) which is the channel data. When a sample is played at a pitch of C2 (see below for pitches), about 8287 bytes of sample data are sent to the channel per second. Multiply the rate by the twelfth root of 2 (=1.0595) for each semitone increase in pitch eg. moving the pitch up 1 octave doubles the rate. The data is stored in the order it is played (eg. first byte is first byte played). The first word of the sample data is used to hold repeat information, and will overwrite any sample data that is there (but it is probably safer to set it to 0). The rate given above (8287) conveys an inaccurate picture of the module-format - in reality it is different for different Amigas. As the routines for playing were written to run off certain interrupts, for different Amiga computers the rate to send data to the channel will be different. For PAL machines the clock rate is 7093789.2 Hz and for NTSC machines it is 7159090.5 Hz. When the clock rate is divided by twice the period number for the pitch it will give the rate to send the data to the channel, eg. for a PAL machine sending a note at C2 (period 428), the rate is 7093789.2/856 ~= 8287.1369 (Each sample is stored sequentially) Pattern Format: Each pattern is divided into 64 divisions. By allocating different tempos for each pattern and spacing the notes across different amounts of divisions, different bar sizes can be accommodated. Each division contains the data for each channel (1..4) stored after each other. Channels 1 and 4 are on the left, and channels 2 and 3 are on the right. In the case of more channels: channels 5 and 8 are on the left, and channels 6 and 7 are on the right, etc. Each channel's data in the division has an identical format which consists of 2 words (4 bytes). Divisions are numbered 0..63. Each division may be divided into a number of ticks (see 'set speed' effect below). Channel Data: (the four bytes of channel data in a pattern division) 7654-3210 7654-3210 7654-3210 7654-3210 wwww xxxxxxxxxxxxxx yyyy zzzzzzzzzzzzzz wwwwyyyy (8 bits) is the sample for this channel/division xxxxxxxxxxxx (12 bits) is the sample's period (or effect parameter) zzzzzzzzzzzz (12 bits) is the effect for this channel/division If there is to be no new sample to be played at this division on this channel, then the old sample on this channel will continue, or at least be "remembered" for any effects. If the sample is 0, then the previous sample on that channel is used. Only one sample may play on a channel at a time, so playing a new sample will cancel an old one - even if there has been no data supplied for the new sample. Though, if you are using a "silence" sample (ie. no data, only used to turn off other samples) it is polite to set its default volume to 0. To determine what pitch the sample is to be played on, look up the period in a table, such as the one below (for finetune 0). If the period is 0, then the previous period on that channel is used. Unfortunately, some modules do not use these exact values. It is best to do a binary- search (unless you use the period as the offset of an array of notes.. expensive), especially if you plan to use periods outside the "standard" range. Periods are the internal representation of the pitch, so effects that alter pitch (eg. sliding) alter the period value (see "effects" below). C C# D D# E F F# G G# A A# B Octave 1: 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453 Octave 2: 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226 Octave 3: 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113 Octave 0:1712,1616,1525,1440,1357,1281,1209,1141,1077,1017, 961, 907 Octave 4: 107, 101, 95, 90, 85, 80, 76, 71, 67, 64, 60, 57 Octaves 0 and 4 are NOT standard, so don't rely on every tracker being able to play them, or even not crashing if being given them - it's just nice that if you can code it, to allow them to be read. Effects: Effects are written as groups of 4 bits, eg. 1871 = 7 * 256 + 4 * 16 + 15 = [7][4][15]. The high nibble (4 bits) usually determines the effect, but if it is [14], then the second nibble is used as well. [0]: Arpeggio Where [0][x][y] means "play note, note+x semitones, note+y semitones, then return to original note". The fluctuations are carried out evenly spaced in one pattern division. They are usually used to simulate chords, but this doesn't work too well. They are also used to produce heavy vibrato. A major chord is when x=4, y=7. A minor chord is when x=3, y=7. [1]: Slide up Where [1][x][y] means "smoothly decrease the period of current sample by x*16+y after each tick in the division". The ticks/division are set with the 'set speed' effect (see below). If the period of the note being played is z, then the final period will be z - (x*16 + y)*(ticks - 1). As the slide rate depends on the speed, changing the speed will change the slide. You cannot slide beyond the note B3 (period 113). [2]: Slide down Where [2][x][y] means "smoothly increase the period of current sample by x*16+y after each tick in the division". Similar to [1], but lowers the pitch. You cannot slide beyond the note C1 (period 856). [3]: Slide to note Where [3][x][y] means "smoothly change the period of current sample by x*16+y after each tick in the division, never sliding beyond current period". The period-length in this channel's division is a parameter to this effect, and hence is not played. Sliding to a note is similar to effects [1] and [2], but the slide will not go beyond the given period, and the direction is implied by that period. If x and y are both 0, then the old slide will continue. [4]: Vibrato Where [4][x][y] means "oscillate the sample pitch using a particular waveform with amplitude y/16 semitones, such that (x * ticks)/64 cycles occur in the division". The waveform is set using effect [14][4]. By placing vibrato effects on consecutive divisions, the vibrato effect can be maintained. If either x or y are 0, then the old vibrato values will be used. [5]: Continue 'Slide to note', but also do Volume slide Where [5][x][y] means "either slide the volume up x*(ticks - 1) or slide the volume down y*(ticks - 1), at the same time as continuing the last 'Slide to note'". It is illegal for both x and y to be non-zero. You cannot slide outside the volume range 0..64. The period-length in this channel's division is a parameter to this effect, and hence is not played. [6]: Continue 'Vibrato', but also do Volume slide Where [6][x][y] means "either slide the volume up x*(ticks - 1) or slide the volume down y*(ticks - 1), at the same time as continuing the last 'Vibrato'". It is illegal for both x and y to be non-zero. You cannot slide outside the volume range 0..64. [7]: Tremolo Where [7][x][y] means "oscillate the sample volume using a particular waveform with amplitude y*(ticks - 1), such that (x * ticks)/64 cycles occur in the division". The waveform is set using effect [14][7]. Similar to [4]. [8]: -- Unused -- [9]: Set sample offset Where [9][x][y] means "play the sample from offset x*4096 + y*256". The offset is measured in words. If no sample is given, yet one is still playing on this channel, it should be retriggered to the new offset using the current volume. [10]: Volume slide Where [10][x][y] means "either slide the volume up x*(ticks - 1) or slide the volume down y*(ticks - 1)". If both x and y are non-zero, then the y value is ignored (assumed to be 0). You cannot slide outside the volume range 0..64. [11]: Position Jump Where [11][x][y] means "stop the pattern after this division, and continue the song at song-position x*16+y". This shifts the 'pattern-cursor' in the pattern table (see above). Legal values for x*16+y are from 0 to 127. [12]: Set volume Where [12][x][y] means "set current sample's volume to x*16+y". Legal volumes are 0..64. [13]: Pattern Break Where [13][x][y] means "stop the pattern after this division, and continue the song at the next pattern at division x*10+y" (the 10 is not a typo). Legal divisions are from 0 to 63 (note Protracker exception above). [14][0]: Set filter on/off Where [14][0][x] means "set sound filter ON if x is 0, and OFF is x is 1". This is a hardware command for some Amigas, so if you don't understand it, it is better not to use it. [14][1]: Fineslide up Where [14][1][x] means "decrement the period of the current sample by x". The incrementing takes place at the beginning of the division, and hence there is no actual sliding. You cannot slide beyond the note B3 (period 113). [14][2]: Fineslide down Where [14][2][x] means "increment the period of the current sample by x". Similar to [14][1] but shifts the pitch down. You cannot slide beyond the note C1 (period 856). [14][3]: Set glissando on/off Where [14][3][x] means "set glissando ON if x is 1, OFF if x is 0". Used in conjunction with [3] ('Slide to note'). If glissando is on, then 'Slide to note' will slide in semitones, otherwise will perform the default smooth slide. [14][4]: Set vibrato waveform Where [14][4][x] means "set the waveform of succeeding 'vibrato' effects to wave #x". [4] is the 'vibrato' effect. Possible values for x are: 0 - sine (default) /\ /\ (2 cycles shown) 4 (without retrigger) \/ \/ 1 - ramp down | \ | \ 5 (without retrigger) \ | \ | 2 - square ,--, ,--, 6 (without retrigger) '--' '--' 3 - random: a random choice of one of the above. 7 (without retrigger) If the waveform is selected "without retrigger", then it will not be retriggered from the beginning at the start of each new note. [14][5]: Set finetune value Where [14][5][x] means "sets the finetune value of the current sample to the signed nibble x". x has legal values of 0..15, corresponding to signed nibbles 0..7,-8..-1 (see start of text for more info on finetune values). [14][6]: Loop pattern Where [14][6][x] means "set the start of a loop to this division if x is 0, otherwise after this division, jump back to the start of a loop and play it another x times before continuing". If the start of the loop was not set, it will default to the start of the current pattern. Hence 'loop pattern' cannot be performed across multiple patterns. Note that loops do not support nesting, and you may generate an infinite loop if you try to nest 'loop pattern's. [14][7]: Set tremolo waveform Where [14][7][x] means "set the waveform of succeeding 'tremolo' effects to wave #x". Similar to [14][4], but alters effect [7] - the 'tremolo' effect. [14][8]: -- Unused -- [14][9]: Retrigger sample Where [14][9][x] means "trigger current sample every x ticks in this division". If x is 0, then no retriggering is done (acts as if no effect was chosen), otherwise the retriggering begins on the first tick and then x ticks after that, etc. [14][10]: Fine volume slide up Where [14][10][x] means "increment the volume of the current sample by x". The incrementing takes place at the beginning of the division, and hence there is no sliding. You cannot slide beyond volume 64. [14][11]: Fine volume slide down Where [14][11][x] means "decrement the volume of the current sample by x". Similar to [14][10] but lowers volume. You cannot slide beyond volume 0. [14][12]: Cut sample Where [14][12][x] means "after the current sample has been played for x ticks in this division, its volume will be set to 0". This implies that if x is 0, then you will not hear any of the sample. If you wish to insert "silence" in a pattern, it is better to use a "silence"-sample (see above) due to the lack of proper support for this effect. [14][13]: Delay sample Where [14][13][x] means "do not start this division's sample for the first x ticks in this division, play the sample after this". This implies that if x is 0, then you will hear no delay, but actually there will be a VERY small delay. Note that this effect only influences a sample if it was started in this division. [14][14]: Delay pattern Where [14][14][x] means "after this division there will be a delay equivalent to the time taken to play x divisions after which the pattern will be resumed". The delay only relates to the interpreting of new divisions, and all effects and previous notes continue during delay. [14][15]: Invert loop Where [14][15][x] means "if x is greater than 0, then play the current sample's loop upside down at speed x". Each byte in the sample's loop will have its sign changed (negated). It will only work if the sample's loop (defined previously) is not too big. The speed is based on an internal table. [15]: Set speed Where [15][x][y] means "set speed to x*16+y". Though it is nowhere near that simple. Let z = x*16+y. Depending on what values z takes, different units of speed are set, there being two: ticks/division and beats/minute (though this one is only a label and not strictly true). If z=0, then what should technically happen is that the module stops, but in practice it is treated as if z=1, because there is already a method for stopping the module (running out of patterns). If z<=32, then it means "set ticks/division to z" otherwise it means "set beats/minute to z" (convention says that this should read "If z<32.." but there are some composers out there that defy conventions). Default values are 6 ticks/division, and 125 beats/minute (4 divisions = 1 beat). The beats/minute tag is only meaningful for 6 ticks/division. To get a more accurate view of how things work, use the following formula: 24 * beats/minute divisions/minute = ----------------- ticks/division Hence divisions/minute range from 24.75 to 6120, eg. to get a value of 2000 divisions/minute use 3 ticks/division and 250 beats/minute. If multiple "set speed" effects are performed in a single division, the ones on higher-numbered channels take precedence over the ones on lower-numbered channels. This effect has a large number of different implementations, but the one described here has the widest usage. N.B. This document should be fairly accurate now, but as the module format is more of an observation than a standard, a couple of effects cannot be relied upon to act exactly the same from tracker to tracker (especially if the tracker is not for the Amiga). It is probably better to use this document as a guide rather than as a hard-and-fast definition of the module format. Oh.. and yes, I would normally give bytes as hex values, but it is easier to understand a consistent notation. Andrew Scott (Adrenalin Software), INTERNET:ascott@tartarus.uwa.edu.au Author of MIDIMOD (MOD to MIDI converter), PTMID (MIDI to MOD converter) Tool 222 ($DE) (NinjaTrackerPlus Player or NTP) NTPBootInit ($01DE) Parameters: The stack is not affected by this call. There are no input or output parameters. Errors: None An application must never make this call. NTPStartUp ($02DE) Parameters: previous contents Stack before call: MemId: Word Stack after call : previous contents Errors: $DD01 NTP already started up NTPStartUp initializes the NTP. This call installs a sound interrupt driven task (using oscillator #30) that allows to change the music tempo and handle the sound effects. Therefore, you should startup this tool just before playing a music and shut it down when it is finished if speed is critical for your application. NTP is not compatible with other sequencer tools like SynthLab because it uses all the available oscillators. NTPShutDown ($03DE) Parameters: The stack is not affected by this call. There are no input or output parameters. Errors: None NTPShutdown stops the music, frees the memory allocated for the musics and stops the sound interrupts. NTPVersion ($04DE) Parameters: previous contents Stack before call: space: Word previous contents Stack after call : VersionInfo: Word Errors: None Returns the version number of the NinjaTrackerPlus player. Example $0100 = 1.0. NTPReset ($05DE) Parameters: The stack is not affected by this call. There are no input or output parameters. Errors: None An application must never make this call. NTPStatus ($06DE) Parameters: previous contents Stack before call: space: Word previous contents Stack after call : Status: Word (Boolean; True if active) Errors: None Indicates whether the SoundTrack player is active. Returns True ($0001) if active or ($0000) else. NTPLoadOneMusic ($09DE) Parameters: previous contents Stack before call: Filename: Pointer Stack after call : previous contents Errors: $DE02 NTE not started up $DE04 Not a NTP music. Loads the music and its wavebank from the same file. Example: Music name= Alf Once the music is loaded, the wavebank is copied into the DOC ram. You should use this call when you just need to play a single music. Otherwise use the Batch call. NTPPlayMusic ($0ADE) Parameters: previous contents Stack before call: LoopMode: Boolean Stack after call : previous contents Errors: $DE02 NTP not started up $DE03 There is no initialized music. Plays the last selected music which is the last music loaded by NTPLoadOneMusic or the one selected by NTPSelectBatchMusic. LoopMode indicates if the music player should restart the music when it is finished ($0001 = True) or not ($0000 = False). Example: load and play a music that loops. In assembly language: pea ^FileName pea FileName ldx #$09DE jsl $E10000 ; _NTPLoadOneMusic _Err pea $0001 ldx #$0ADE jsl $E10000 ; _NTPPlayMusic _Err ... FileName str '1/MusicFile' In Pascal : NTPLoadOneMusic('1/MusicFile'); NTPPlayMusic(True); NTPStopMusic ($0BDE) Parameters: The stack is not affected by this call. There are no input or output parameters. Errors: None Stops the music. NTPGetEndOfMusic ($0CDE) Parameters: Stack before call: previous contents previous contents Stack after call : FinishedFlag: Word (Boolean) Errors: None Returns True ($0001) if music ended (even if it loops). NTPAddToBatch ($0DDE) Parameters: previous contents Stack before call: Filename: Pointer BatchNb: Integer Stack after call : previous contents Errors: $DE02 NTP not started up $DE05 There is already a music in BatchNb $DE06 Illegal BatchNb Loads a music and its wavebank in memory and gives it a reference number which must between 1 and 25. Unlike with NTPLoadOneMusic, you will have to select a music using NTPSelectBatch to play it. NTPSelectBatch ($0EDE) Parameters: previous contents Stack before call: BatchNb: Integer Stack after call : previous contents Errors: $DE06 Illegal BatchNb $DE07 There is no music with BatchNb Selects the next music to play. NTPSelectBatch stops the music if there is one playing and frees the memory allocated by NTPLoadOneMusic if you used that call to play the music (however you should not mix calls to NTPLoadOneMusic and NTPAddToBatch). Example : Load and play two musics. In assembly language: pea ^FileName1 pea FileName1 pea #1 ; Music #1 ldx #$0CDE jsl $E10000 ; _NTPAddToBatch _Err pea ^FileName2 pea FileName2 pea #2 ; Music #2 ldx #$0CDE jsl $E10000 ; _NTPAddToBatch _Err pea #1 ldx #$0DDE ; _NTPSelectBatch jsl $E10000 _Err pea #0 ; False ldx #$0ADE ; _NTPPlayMusic jsl $E10000 _Err ; Play music #1 ]lp pea #0 ldx #$0CDE jsl $E10000 pla beq ]lp ; loop until the music ends. pea #2 ; select music #2 ldx #$0DDE ; _NTPSelectBatch jsl $E10000 _Err pea #0 ; False ldx #$0ADE ; _NTPPlayMusic jsl $E10000 _Err ; Play music #2 FileName1 str '1/Music1' Filename2 str '1/Music2' In Pascal : NTPAddToBatch('1/Music1',1); NTPAddToBatch('1/Music2',2); NTPSelectBatch(1); NTPPlayMusic(False); While not NTPGetEndOfMusic; NTPSelectBatch(2); NTPPlayMusic(False); NTPKillBatch ($0FDE) Parameters: previous contents Stack before call: BatchNb: Integer Stack after call : previous contents Errors: $DE02 NTP not started up $DE06 Illegal BatchNb $DE07 There is no music with BatchNb Frees the memory allocated for the music BatchNb and removes it from the music list. If that music was playing, it stops it. If you set BatchNb to 0, all the musics are removed. NTPGetPlayingMusic ($10DE) Parameters: Stack before call: previous contents previous contents Stack after call : MusicNb: Word Errors: None Returns -1 ($FFFF) if no music is playing, 0 if the music was loaded using NTPLoadOneMusic or otherwise its BatchNum. NTPPlayBatch ($11DE) Parameters: previous contents Stack before call: List: Pointer Stack after call : previous contents Errors: $DE02 NTP not started up $DE08 Illegal sequence Allows to play a sequence of musics. Therefore you need to define a list of words (Integers) that contains the numbers of the musics to play. A list must end with a 0 ( End ) or -1 ($FFFF if you want the sequence to loop). Example : Play musics 1 and 2, repeat music 2, continue playing music 3, and start over. In assembly language : pea ^BatchList pea BatchList ldx #$11DE jsl $E10000 _Err BatchList da 1,2,2,3,$FFFF In Pascal, you must use a pointer to an Array of Integer. But you don't need to care about that since the TPtrTListe type has already been defined. Program Soundtrack; Use NT; Var Liste : TPtrTListe; Begin NTpStartup(Id); New(Liste); ... NTpAddToBatch('1/Music1',1); NTpAddToBatch('1/Music2',2); NTpAddToBatch('1/Music3',3); Liste^[1]:= 1; Liste^[2]:=2; Liste^[3]:=2; Liste^[4]:=3; Liste^[5]:=-1; NTpPlayBatch(Liste); ... NTpShutDown; End. NTPGetTrackVu ($12DE) Parameters: Stack before call: previous contents previous contents Stack after call : VuMetre Table Address: Pointer Errors: None Returns the address in RAM of table containing 16-bit pseudo-volumes (values contained between $0000 and $00FF) for each of the used tracks and instruments. The $20 first values correspond to the volume of the 15 tracks (there are two unused bytes). The volume values are updated each time a new note is played. The table allows to draw on the screen VuMetres that show the volumes of the instruments or the tracks volume. See the demo program for more information. NTPPauseMusic ($13DE) Parameters: The stack is not affected by this call. There are no input or output parameters. Errors: None Even if you don't believe it, this call stops the music... You can resume it by using NTPContinueMusic. NTPContinueMusic ($14DE) Parameters: The stack is not affected by this call. There are no input or output parameters. Errors: None Resumes a music where it had been paused using NTPPauseMusic. h 8>`>t  8p, Pb#SW@%3  B              g  D$nfc! @3@ @ @$@0)4) p5*  @$ @ $@,  %7% % %7  "  0%   %5%  5%5% #  %  %  " U 0% U  X% X  %  % G G'  0%   %   %G% ( G*  % % (  ' %% % %#   %   *  %7% % %7  "  0%   %5%  5%5% #  %  %  " U 0% U  X% X  %  * %Y  '* 0%   Y%   %*% (   *  %Y% (  '* 0% % #  Y%  * ! % %- !G! ! "  0%   8% (  %( %  ( 8%  "  0%  7%    %  %* 7 *   0%   7%   %* % (  * 7%    0% % 7%  ! % %- !G! ! "  0%   8% (  %( %  ( 8%  "  0%  G%      %  %, G  , "  0%   G%   % , "*   , G%   "  0% " G% "  %%%  %   % %% ##  %   # %#     %     %    %   %%%  %   % %% ##  %   # %#     %     %    %    %%%  %   % %% ##  %   # %#     %     %    %    %  %    %   %    %     %     %  ##  %   #  % %      %  # #      #                     % %      %  # #      #                      % %      %  # #      #                                                   # #      #  % %      %  % # #      #  #                     % %      %  % # #      #  #                      % %      %  % # #      #  #                                                      # #      #          '  X X                                "  0 '       '     %     "  0              "  0 '        '      %     "  0            "  0 '       '     %     "  0      %    " % 0 %  % %   % % %7  "  0%   7%   %% % #  % %7%  "  0%   7% %   %  % %Y  '  0%   Y%   %* % (  *  %Y% (  '  0% % #  Y%   *   %  % %7  "  0%   7%   %% % #  % %7%  "  0%   7% %   %  % %Y  '  0%   Y%   %* % (   *  %Y% (  '  0% % #  Y%  * ! %8% 8%- 8! ! "%8 0% 8  #Y% ( Y%Y%  ( #Y% Y"  0%  !I% I I%  %* !I I  0%   !G%  G%!I% ( I* 7%  !G 0% G% 7%  ! %8% 8%- 8! ! "%8 0% 8  #Y% ( Y%Y%  ( #Y% Y"  0%  G% G  G"G%, G  G" G% G  G" 0 G% H" *  I, J% K" L% M" N% " O X X       MYW_w@/Uagqz³zrh`YRPJC<631.+&#$#  # %,+<9CeplXBotpolb\RONJ*$+7KeûɼxbUK<.-51'7AEJQ[jvzx~~y|yx|zxrw}|}}xlZD6/31$ &)07?JVdn{źxbUK<.-51'7AEJQ[jvzx~~y|yx|zxrw}|}}xlZD6/31$ &)07?JVdn{ź2 VF§OM<`l˥hPL@/78:5/($$#$&+/4:AHNSX[^aegkmrw|ĺ}zxtrnmhfa^YTOIC>74.*&%$&)04:AIR[epy¿wrlgb_\\[[ZZZZXXTSPMIFB@<;888;<@CIMSZ`hpw~¿}|xwsrpmlhgdb^ZVSNJHFCAAA>AACFHJNRUY[_bfhlnprrtvxy|~~yvqlgd`\ZXUSPPPPPRRRSSSSSSSRRPRRRSTTVY[_bfknsx|~|zxvsqnljfdb`_\[[ZZ[[[\\__aabddeefffffgghjkmnqsvxz~~~|zyxwwvtsssssstvvwwwxwxxyxxxxwwwwvvvwwHk+BVY[eda_؞|NʬDw80]O8YX@"=5[A=]ih_jx~ĨwԐW`W@?_ _bl7DgHD_fX?@/lZ4  )41GOWgkov{~аگƲȟrzJ@KLSg#VOX'50/:GY?PoRߨV{H+^D_wasԀػߚФػė`w`?PO]Xh_FH? ',/Cb6s;]_P~dOPgkrG{`gרwԿ脿зh?{@,McAd7XKk_2MoPVp[Y}dzoȔנxȢgɰg_p]bETP(7XOL8s`NMx5{tY*[z_hWH_Hg`gp`kh`gӴ䀿𽤷wl`Is@7hW?o@ e(?D1?l@a(?_`]kG[[ԟװƮܺ໤Ȅmpp_itlop'o@D3oa`27}XH-ofH/cxP:O]9GKlAKlMfuU[qv÷ę؝зˆݡG|O׈(Ob_`H?TepXSUPOpb[jـ?`_)Tut`dT4Sqtvx`utǨo`kg_w`oc`whKx_`Q]FN[RQGGMSYaʾ #.8CNX,*!!&.5=EO_RNLʾ #.8CNX,*!!&.5=EO_RNLʾ #.8CNX,*!!&.5=EO_RNLʾ #.8CNX,*!!&.5=EO_RNLʾ #.8CNX,*!!&.5=EO_RNLʾ #.8CNX,*!!&.5=EO_RNLʾ #.8CNX,*!!&.5=EO_RNLʾ #.8CNX,*!!&.5=EO_RNLʾ #.8CNX,*!!&.5=EO_RNLʾ #.8CNX,*!!&.5=EO_RNL}ukbnv~dudgd^x`hhhrDŽmfaqbg~ƅνxCp/mxic3?"q\Eq#5gskوw2ʗdb_e7Hfrp[Yٽ跿g^2M'@g7qhe۷ɿޥsS7/*"3CKdlp׻ռۥyz:?:I]˽¾׹Zc@D#&/9Kki̿ʖ~rtwu[hhTdd^fdalgq|pwymbKUVOP??:.:)C%;@=DMZaXjmůIJð|nxosao]jT^ZWaZX`edZfjlmkwz{|ynkg\[O\;QKFG=SOLNYWQaefvpxžȾǾr`w`cVNR;:.0)0)$*6$220L?KTaelwϼջʱµ~VcwWbr$_h88%xkia-@mg躄z[Ʈ۹{}Xd&Acc_f6^ K(o7v6?Hu_Ys[oqs|w繗x}\dVvZeg]wpop};xubc^ebwk`ad}SrczY{yu{v|f}lxcu~ucy~w}d{{}ni~s[ebbiagras`d^`p]qhdddszl~np{}zqwvovxmjptllggggeded_edZfdjhioklqpoqeehnp}~}|zymyqrrooooenjggddegdkjqfmjqomhptuurrz~}~|jrekkuhyfcdicqbeuadxecsairugduoorr{ob_wt޺wVX\fc~Ov oWi_UgpeOXfX2Ah0pg]~9fCw={^ikox~^dy~{]x_i[wm~|Sf^`d^zd5cgwbraelqc|xmojc|l{~wƚrgkapmhgsnun]fqmfxczera}a{}hbr]yjwwxrxfu}|~{~{|zvj}xvxut_oknopuelouwoxipktxzmjj|}}zyu{{v{zkzurmhuarmkqmiqopunpa}nkqeva}i}~|}~{{suoy~eup^gicyizoolysnuwvqud~~~~pzk|{t|u]ujob}khgqpxkdprwk~zgaq̗yadgot}Ҕwecd^equyqxkzcIY,lMǡ|i[9JUtmϱ̩peI=" $ FTl׻{mf|y°ԭlW7J%  -E?F``yƿ߹Ͻyc]KLN)4(6/084AV,tgž޹ܻԻ}qsmb__>QB>@"%1/%<-:@#Z/UPVgd|ǵ]ja_9:A1/&:- ,:T>?@\aZfers{~Ҭ¿ʽýxndhpgc^ZaQ\DHX!FAHc9RGdFe_`esahƙƞl~qtfxrddddddSbKGZ;TbKeKiq:l{Yjg{oiu||twouhqagq]ad^egdrjo~]w^\snjWyb]~bhVYLt$Xbruk/eX#oi_e^Fpor{XؘO\hs}/+u7\8Spogpzȗƍ{vum]~ozvha6h$J;U':7_h|pqovrnWuwȳ{]U9h8&&(6 !*DZie{}ɴjojddZV;@T?//<-6(50(1082.SKPU\hkztĹƿIJufqc^e\MERK<+2F6@-?_R:7gMFCqpjcw™͹kaqo{m4?/t~V)C?|v400=ilwŜuٔT8+h7m},Q_7<-A@"0*&'hQvkȫըi`obsadMhTXVN;@RYM;Xchtɽְ}ojY[QD?,%  $ 4:?@Tidnyм¦~tjbSOF=2/&2//18+263059QQRYYddgmbgnbxz}½wxqohc_V[LP:?:@D@C@MXNOPOUVa`edpp~uvxstrkbbd^\\aT^ZWZWW\[]WgcdqzxvxnopmfmkYfqg]eqbd^fd_grfhrnvxhyv|o|>|Weiera^tziYUw__edd}_]J[gwпාypږvΘvu_[a5a_eqehGi6mdkbgIiippag]ZW|kkxĉc~{oxx{r~v^k\bcie^`~m]e_`_^g|n}xnri~~ezwp]mklcqe_tdddx`ghhgyluny}s||xz}~vu~}ezuspovnpvvomk~uww|y|{w}}}pr{vmzh}rxypmukt{}|~}uqwu~kstzu|~~p|z|rpu~}zvrwkzpyv~vt~|x~yutnqwqqyu~p~qsz{vl~|z~kg;ml?rxbh}zXj]V#b/}byioՈzʝURSRwrv/g`eQP8@@wX7ځ]]VXh]eҩ}[Pr5#G+"ohwunno{̼}f^"C@@Lf]8rxqbțwwiy`K1- 2Ch8iLl]biٸegIid6:@J>+*+1&>.VO;gsoĦñұѨǼ~jwtrgkcd_BdE81=[54BRUDQ^`MdrbqzvȿǾȳ½arnpaJcKOBVI4@??J=JC?KK]__tfokǷ{kut`eddd^`OXO]aUWTWX^\Vajaopls}w{sy{dkvnnbppagdd__edgd^lkpevtopkyw}oq~pzmbqgzt`q=fedq}lakybY]u||twouhqagq]ad^egdTfOv;e`rb^jztmz}b]eZcUJSpe|G3T|Qk4Rn5ee($x6rλG_&gcLw]9h|Zyv-vsL/lcs Hh~]h-@@Or駿pL8?T xcϪtWfW9$Raaq]YrgW Lx`DHMְͿùЛytxyV:RL,te̗ƞutl(4l&Ogd!o(>HMְͿùЛytxyV:RL,te̗ƞutl(4l&Ogd!o(>HMְͿùЛytxyV:RL,te̗ƞutl(4l&Ogd!o(>HMְͿùЛytxyV:RL,t~|zzyx~}}~z~yjbv|qqYYlwglzyYxzZYn}vYYll~}Ylyt|zljZZOYˎYOOlZFzbbwYZ=}~zYYF>ll|vzvzwmY˓llYtv|x~pmZzYlZvdZvvzqyvv~vm}zjm}||vbTJ~JHlvlmZ}lewkZgbOZZllYT|mZZYlsldS|vJdb~v`YvdXllb}zmY~~vlbg`Gd}mg_qVd|t~dmvlbbzp}rdglv}mlyltm~}zqvemllr~rwmxvww|~lgflvzvrvtm~~}lvllllyvggw}ggxzzjt~~~~mh|ymvx|vqvrm~}zrp|zspvy~tzxv|~~q}~vszz~|vmwzvzp~~~|z~~~zq~~~}wqvszs|vrzqwzyzvztqwwv~|qt|x~zvw}~vv|xvy~wt|yvvx~}zzwyz}yx}xy}t}~}w||zwx|x~}}zzx~y}~zy}~~zy|zxyzy}z||yzzzy|~~|}y|z~z|zz~}}|zzy||~}z}|~|}|~||~|~~|~~||~~}~}}}|uphZD"2cƘuQ:2,2,"=lƦyyüyl_UKKUuphZD"2cƘuQ:2,2,"=lƦyyüyl_UKKUuphZD"2cƘuQ:2,2,"=lƦyyüyl_UKKUuphZD"2cƘuQ:2,2,"=lƦyyüyl_UKKUuy`]qoevkp_yf\gjh  ?w W o@//@zHl?|}ŠاС`sH_0 7//((? ?D{ппЯPHO_0+'P5$0J ?{@W?k`_vp˜װ࿴רЙz`fw^VSkdP%hX @PKN('  " 0 + >  /##,?0'?8=K?ZSX9f_b_PwepMczH__LjƨϤ͐͢ة˴̧АʬĚУմֈp{ppguptKze`U[d?4WHP)@7$$   +<)09F6TbSXUvriiƺ±tynboc]_gaTUVXDHQR4A6O@:>?;D@86;,/??71IO@0:GCH5MNHFFYNOU^T]N[aZ\dkl^ttqntvwv{zzzx|tyx{~~}~~~|~}|~}|~|}~}z}|{{||z}|~|}}~|}~}~~}}~}~~~~~}}~~~|}}}~|~~~}}}~~}}}}~~~~~@` W r\L 477?HHoЭp|D.&%$(_ǨH7w@0;_Ȭh/wzX[ls`g~p,GȩX_ȩtl93wxxKco`hzȴ̽tPp;v׸мxWdK4/% ?xp?x /€?H_Ҁ;p<@O`|lwSh?gԹH[rLCP_hgP_@pA_`%?W̔bSP0KwڐWѰ`#Oobe^h:>2)ORĚ`58,?_ʬwtcjS\@?goҸp$/_zhj8'gd]o}PER:I8MmodpdSb@3PgtgTg`_p*_H/Soqx`0+W`:IAWTZQJM_ywp:*'wn~D7N1_8MJSYF_t{ozdDH4OwFWxh('O]`EF$;opkpT*OxD7gxT69-5?odLSfD7yZB@?K_dPHMDFGڰhm|H/ID[ndg@7_gkdO3auJxyQmϻVdikG:TVBUgpfWRF;I]nlyr{pVXoɳ}hstʭnjornwtdaVPfx}IE|yyxw|~fW]cgZeeR_}wf{tTU~uzv{{qn~x|kop~yzz{zlm{}kp}{{|yxqw|zsuzqx}~|qyvyurpflwryxy~zxumlu{~x||~|}|wv{}zvv|~}{}~|}zz{|}y_KHK_yplllpphcluyupyuuëcHHZԵpZQUlyZ,,lεlQHKcp:=y޵y_KHK_yplllpphcluyupyuuëcHHZԵpZQUlyZ,,lεlQHKcp:=y޵y_KHK_yplllpphcluyupyuuëcHHZԵpZQUlyZ,,lεlQHKcp:=y޵y_KHK_yplllpphcluyupyuuëcHHZԵpZQUlyZ,,lεlQHKcp:=y޵r``xŚrUUrūff׸r`frlrlZfūfU`H`OrZf局`r帔ŔDr``xŚrUUrūff׸r`frlrlZfūfU`H`OrZf局`r帔ŔDr``xŚrUUrūff׸r`frlrlZfūfU`H`OrZf局`r帔ŔDr``xŚrUUrūff׸r`frlrlZfūfU`H`OrZf局`r帔ŔDA péX aݐl9Gul<F_N (hǃR)5NSpuùlcXLNA6 %1EVc]]]]\KA6%,Ki}ԵyL0)5EWd}̿}~mcXG6(, ##0,,,   %1NSd}˻zcB ,1Nfsϻ~~mmcXLNAE::%# ##0///////////?GRc]iuп~dB004NSdsѻ~~mrmmmmcfff[]]\\\\\\KP?::),,  ######0,,//////////?GRPa]srϻy~dV:#,KVds̿}KwmW]]]\\KPPPPNA:=:)/, ###0/?GS_ifprпé}~dV:#:EWpʹznp[_NGAEBBEEEFFBB599966+/+( #1/1=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[nfc!  `@- @p$f@`$@@-H -5X0@> 0F28 "'     '  "  % "  ' ' *  . ' *  ' ' "         "'    '  "  % "  ' " *  . " *  ' % "   %        ""    "  "    "  % " )  . " )  % " "          ""    "  "    "  % )  .  )  %   "           "     "  "  ' *  . *  ' "         "    "  "  ' *  . *  ' "                  $)  "  )  $    ' $  ) ) ,   0 ) ,  ) ) $          $)    )  $    ' $  ) $ ,   0 $ ,  ) ' $    '       $$    $  $  " $  ' $ +  0 $ +  ' $ $         $        $     $  '  ,   0  ,  '  $           '    '  "   % "  '     '    ' '            '    '  "   % " ' " *  . " *  ' % "     %       "    "  "    "  "     "    % "            "    "  "    " %  )  .  )  %   "            )  "  )  $    ' $_ )      )    ) )            )    )  $    ' $ ) $ ,   0 $ ,  ) ' $      '       $    $  $   " $  $     $    ' $                    $     $ '  ,   0  ,  '  $              @ "        "   "    ' *   .   *  ' "     0    0   0     "          "      "  ' *  . *  ' "          "       "   "    ' *   .   *  ' "         $    $    $  ' ,   . ")  % "          pv`_`/}S_؃oo@?@Wx_`o[oc`/@?cooR__ha`SRR/Sk𠝀_RUPW```S`W`S`oopgP7@; /R?W苐pnP?SSxoV{pg`SЏxRWp_hosCSP4?hSt¨VlTR /_h@WTP4?Ƞow`@Whef΀xP/R/(+WgRWRP?А{`GWXSRࠗ`StcTO_k`X@?R@9OWwؠ`/Sw`W\VP7WTS{PSpXU_Ԡ@RS@)?hS_ȠࠎgwRSp`P?w{Stk`@SpYoxR7WUP?Wg{pTohoaȠoy{|m`7W`W`owT?W]`Q`g`^P?|`doPShgghk`7?_`RnopR?p`eܠRWVT@?xctRSPWpR_Рзww{xoPOPsp``R__pT_w`ASUdTSXPwhgpR_W`_{`S__p_ਰpTUR?UWnROR/_`wwx_xTRP?qho`S^SlX_pT^R_TWp^RSwȯటp[`P SipV_`STR__`UT?MKWghRI@Opmdokp`WR> Wp`T_SSXWboddRSSSt``RSpXXRR@ Wgt`WURTPSg[TPN@SkS`PSpx`_x{ШjTRP?P _r`SWRKLS`_ptTRSWpwd`S_pho`R?S` 4?op_TGR@?S`TRWROWhX@/_pXgo~p𤠔TPH:??@/?pR_`R8?WUopUSWpoWdU_pp]w`@OUP 0Wo`PS@8?SxuhUnXPO_X@?Sp_g|hosZ\R@7SR /-?Sp`P?SRPShXWrdo`_hTGhgటR?RR4(' ShRORP5?_`kaohR?SP/IOWgg`o࿠n`R-?UR./SnXASXR?Ws`R_poho`@?po{{RORP/> ?ROSXP?RXRWpTPO`8?_qpwPSo`_ȸP>?@(#$ ?fh_ovwPSwsøRRBBC@0,)?lwļৰR?whZ_ǴTRP@" /W_gwxy࠯`'?}yy{ĸ`\RFA@0)$7Wo{`@ ?sxhcg`TP0!"SS_wzz¿Я@?p}{ZRKB<0)"ScwЫ@  Ww}|phegĻR@2(& /OWwxxļ௨@  W{zww_USR8(!?Ww|w࣠@$ Wwrjefhio´R@>0( ?S_w|xu{ਠP(  _w|vvuswȵg`WR0$! ?Ww}~|vP( /_n`\_fa_g࿳RR@0$ ?Snorw}{МP(*7_wtrmljk{odTP0*& ?Wsqu{ztoЗP/%$''?pdX[]VSSkȶVXP0% ?Udgn{lR) #'/78?~{ph`]_kdRP0."SgdgowxrpoR5( '550?pdUSSFKSw𯰴`XP4"SSZ_mw{zpiҠR +/?JHG_t`TSUgw跸ȰhTP10( W_`bgikoqvАxT' '7KPDG_dUP@BEOW௬`R0 ?W\]cgotphiojR3?SU`VWt`TSRSmw࿷pTP580'Scd]Y^cikkmophT':?SWXROxdTP@SĠp`RGOH/?MF@4/Sszxrljfcewgaf`XR@4?pXR>?@+?SSXR@7SȠ|tqmsoqyulXRCOpT@5?@+?OSP@(?}ȸpdVU__ae`XR@:940-/W௨hYWk`TRRLNOKMSkĠhVRS_gk`@?B?GOJ@?W𳨘~~_ZVU[\VTWpȠhXWgja_`@279==611OࡠxpjoRIJKSSSS_joxjbagjhgjR;?GRSD<=S𠚎`SRRU]XVWtw̰xpfkoh`_iX3:=:60*)?xy~~`AAKQSSS[rs}xpfgklegwxRGKLD@9;?RMSSRRRSWyxnkold`gw|`700-(%'7_~uw|R??GNRSUW{Ƞ}rifgkkoP@:005?Oؠ`PCGGMPJO|vpildcgstP '3?WtswzpP8?GOQJG_Ȑpf`ego{h@$+3?OSļȓ`@7?CBDG_~h_iiiopdX@%/;ESĐxrpsvp@8?ACACWdU_kwztlR'7?SSgȺХxz{xP2/3;?KS[`gmup`XUR /?MSȠpmoopT/077?GOȴ`Wcztjb\@+7GS_k¾xtpmk`#$/;GHO_lwh\TSJ 7OS_jfecghP,-5<8?Wp`VVR'?SWb]oȻrnj`_`P'3647Wop`XRCGD3?MPKO෰thgb\_cR$'+7SpwthXU_hP?ORLIOtl`WVWR#+3?`_xh`VSHKR@/;BA@G_zpnhc\\ZR +?Sp`_రtd`[glT?CDCGOW𶠅xl`XSP@ '3?p`guh\XTRKR@/3:;=?S~|tphZT@0 /;Opag|pfdbcgX78;?F@O𠐀|h`TP80/?_thgАx``VRPMSP++/774?_ȈvtbVP2('7?SpfoЀihdcaiT+,7;43?_i`R@70/;OtloȠc`SRKSUR%-.)*/S`T@1(+/?ru̠khg`_fR''0+(-5SȠs`R@: +?_zvȸSRRS_P"!/_Ƞ`T;4  7_g`ghP%# !'+?XR<'7Szu_h`@ SR@'7O|{w` '/WP+0?{rrwP ?`&!'Wwx} #?ĺ`?_t{`R _ȺP  ?_ĸcfT _Ķ@S{ggdPS! /4 WimupdP  SR*+3?@Smgj`T@?P07;>=0SȸpsupdXP?ļT?76=?@: ?pjjfXR<4/S@:9>?>80?иppwxxl`TP8?¼RE@8;?A@@80?mllf`TP@80 ?`PB@9:;=?ED@ SиciuwxpdXS@;8/WºR??835=GMMH@0?İ`_ghf`XR@:4,/ OSP@80/3;GOSVR@-?[eow{xhXRB@?ED7WgR@:0--3?OSSTP0$/_`^_hfcZTP82//7OS_`oTP8*'+/?OWdZS@O)>?_cgu{~|p`R@=?BGW_do`T@0(%/;GRS[TP?W@*+Smopjc`XR80-/3?_W`_Ƞ`T@,$'/;KSWb`TWxR?9Sz~zvjXR:===Oah_`R80(/7?KOSSSS_hP/+?̰tkdff`R@(%)/SWb_`R82,/;GSSW\XW`?@Sؠ|pXP80.7WajgXP:46?GMORLHGStpR?8?_АtrrupdT@ /__loŸԠpTPA<9?OSXUSSK_`SSSt`P0"#?khgo¸ȀhVTRDGOSSTRB@?_spRP@EW|pT0?wpopssh[XURGS_`XTSDOW`TUoܰ`P(S}`nbgkļhe`XVW^_`XRB9?_w`SHEGSРpT(SupUloqo̰jd`ZW_gmke`TASTUU]_oР`P$/Sv`S^klsȠlhbaedckndXR7On`@@?KRST0 S`PS_vspwΠkkhbensz|tdTRWR?ISWoqø`R( /SR?KSiorw̠ppplkkszzp`R;ST/07?OSfpVP(P'?O_pphgРwxpio}p`S_P<7GO_zzdR0 /(/7OWorphȠ}|pkohT0  '/?Soloİ`R(/?Skpnj`oРtlox`@(/;GSw|rkЯpT@'GS_ophX_Р|xrw`P'+;OWmhcȠ`R ?S_ijdXRSȠ}tv}` 37_oH()G G??PAd ψIkǐ_$ oo 7os`W?  hFi?*+YSϺ7򳯾ӏW_O_u 7owS?Q[xH8 `Gg0(o_9'7p,]/xgz_YhOXpwoA /3[vggV~WO/ #/C?/?XOwx{QwۯŜk{gS' #/7vgHKGhg'H5gx;$ ';[AOTˢw]7aQ9 ;WO8?'DB/K7!-80490'#XG`Yow|Qwmoyug{wk|Sd`|hSXJRjuwjr][mf`Wf_xWdeo_jkcq{xjk{u=SGjggrusz}x{kqsRmnmyelm_GM0;?RQo[LRRKieSaRa?XIYQPLS_f|sUcIRSopi^cixnmt_momioUhkw{zqy~z_Z]U__cgs]k\efr^_d_ejohkag[g\bimYTPHFRF9NHYEQDB:OFKQXJTUNYXeeo[rjugcibfhqo{uwou~opwy|{uvvww}vsjida_]a[a]]SVTRT]^ZRRPSPOPPTRNLTY]XZRU`__^ZSRVXNRSVSURUb_\`cixuw}||{wy}}wxrpee\hef\^Z^ZSGFNRWWULMAAFE?LHGKLJJIEICKLJ=?9HFEJQIHEDKLMRRPTUiwu}ſ~|z{wxotqtoeenhc]\ZXUSTSNIMQRRTXWRPPXWYTSO^_]g\`babfagd_]\[fgc`XRXa_[VZ`^fkirtrtvx~{~ÿ~xyv~~xuvowrsrnmrhcidghfdfYbkb_cYceaedclfdh_Z^_\`T_jmnkft{xxpnywntlm|wrslm{usrgq}~{tp}~|vq~zwsz~upmdej_\_Yaeecf`iceiekzwpsmlxvrsmuysvyrwzuwuy~|zvstl]eoljggpnlkomxuosol{yrvt}y~|{x}zw}ttqikmfpqrvusz}|{{wvypw|{|w}~~zr~}vwrovmflgntnhg`gpmkhesvmmlp~xpusw~uvxt{z{~~~|v~xxzx|{~|}}{~~z~}~~~~~~~~{z~y}~{~wvvru|vpomtvorrouqgmqvwplqrvyrtyyy}stywyvnprprmjqspqlnxwuxruvtvyu}~wzz{~usrsxurww{~wuyxzzqsutxzttrrvpjptvuoqqnpsov{y|{v{}{|xw}{{~xy|}}~~}}y}{{}~}~}z|{wwursqkmmoqqrsqswv{~~~zx{}~~wvvvxvsx{zzyx}~~~|{}|{xy||}~}~~||{zzwyxxyzvyyxywuwz{~{z~~{~}~}|~{yy|zyzy}}~~~|{|}~~~}}~~|}~~}{z}|}|{y{z||}}~}{z}~~}{{}|zxxxzyxwvvvwvvwxxxx{}~~~~~|}~~~~~}|{{}{z{|~~}|~~~~~}~|{}~~|||}}||}||}~~~~~~~~}||}~}}|{z{{{{{{|}~~}~~~}~~~~~~~}|{{||}~||}|||{{||||{|}|~}|}{{||{|||}||}}~~}|~~~~~~~~~~}}~~~~~~~~~~}~~}}~}}}}}}}~}}}|||||}|||||||~~~}}|}~}}}}~~}~~~~}~~~~}|}~~~~~~}~}}~~~~~~~}~~~~~}}}~~~~~~~~~~~}}}}}||}}}~}|~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~}}}}~}~~~~~}~~~~}~~}~~}~~~~~~~~~~~~~~~~~~~~J?74i½pbTB94/KtgXI:50Eʿyh\Q=618ý}l_T?623i¼nbVH732OteYK<31IʿyfZS=30Cû~l^UH6/7uüo_VK913WudXS>2.IzfYSB5/CĻl]TK23gwdWRC7/KzgXRE<0GĻn\SK?49sĻp`TKB79izeVMD=5S{jYMD>7IĻp^SEA:GwûtdTF@;=izjXKA>=W|l\QA=:Be|l\S>9>OwrbVMB>KgtdVMB=EY|h\SD>CQ{~l\SD=>Oo¼tcVK?>KcvdWK>Oi½xdVJ==KazgWJ<9EUżl\Q=8CQwľo\S>7=OgøxdUH97=OeƼyeVH:8CQqĺtdT?7=La­|lZJ:N_l[K>>KYwl\Q>FQgƼtbTB>BPa{ð|jYKACMYwl\QBAJTqļxdTJBIRgzdVKBGQa{l[QEGP\uo\QEELUmzdUMGLRf{|fVLEGQ]wn[MDDMTrr[MA?FQi½ybSC?EQb}~fUI?AKYwpZF1.;Q{r[M<0-EkfSA:39ijUB;64Sx[J?;6Iz`Q?;6EsjUB>9;ipZK?;;IhUC>:Gor[L@=BizbSB==WlXK@>Or\QA=GozdTEAIk|jVK@CYp]SCBStcTJBOzhYMCMo|l\QBIgrdUJGYtfWLFS|m^SGQ|obUKNo~uhYQLi}ri\SLaxnbUOY~wpdVNQ{tk\SQwzsl_TRi|wqeXSczuqg\S`}wrk_UY}vqkbVUw~wtqg\Xw|vpnf\Vo~wrpjbWg{upnjbXa~xsqnf\[}wrnkf\Xuysomh_Xo~yrmjg_Wg|uolid[b}vnigbZ\wxqlif_]w~xqjgd_Zo~zrlhfb]l~zrkfda\e}vngfd_c~|vmecb^]w}xogcc`^u}zrhba_[g~{sjeca]g|ukc`_[b{~xnea`]aw~zoe_\[\qzrg`^]]o~{rg^ZYXg~vj_ZZYe}wl_YXW]w~zob\[Z]w}zpd[YXZo~}tg]ZZ[j~{uh]XXXe~{xl`[[Zc{~xvm_YYYaw~xwpc[Z[`wyvrdZXX\ozxth^YZ\k}xui]WWXe~xul^WWXe{yum_VTT[w|pkf]X]hxîwdWQLRjybUQ;Ek~ƹzeXS=9eƼ}jZSH5I¬n\UK5Eo®t`VR<;iŵzdXS@7Sƺ|jZSH3I{n\SJ6;iĮt`UL<8WǶ|fVM=2IǺl\SC4AiǾr^SE79W®vdVK;1Iƶ|gWK7>O`{ȸbT@8=L^wźhVD:;GVut[L=AOazx^M@BO\v~cPCAKYskYEAIVow^NBIVj}|bPEFUe{kXGGRbwr^PHS_uyaRIQ\sjZJPZno]KNYh{yaSMXe|~fTLVaxm]MU^uv_NQ\q{fVR\mn]QZh|t`SYgzzeYYcxm_X`uqaX^nzf]_k|{ja_j|pcai{tgbjzzidjx|neiv}rhju~tkks~~~~xols~|}|}}}xpms}}|{{}}ztos}}{zz{{yuos|~{zzz{zvrsz~{yyyzyvssy|yyyzywtuz|yyxyxwtuy}zxxxxwuvz}zxxxwwuuzzxwwwvvvz|ywvwvtuy~ywvvuuuy~yvtutssx~zvttutsv}{wtssssu||xtstsrt{~xtssrrryzvsssrqw{wsssrqu}}xtssrqs{~yvssrprx{wtrrqqv}yusrqpu}~zvtrrqs|{wtrrqrz|xusrqqw~yusrqqt~~zwtsrrt}|wtsrqr{}yvssrrx~zvtsrrw~{xutssu}|xutsst|~zwutstz{wutstx~}yvustv~}zwvtsv{{xvttvz|ywttvx}zxuuvx~~{xwuux||ywvux{}zxvvx{}{ywwxz~|zxwxz~}{yxxz}}{zyyz|~|{zyz|}|zz{|~}{{{|~~}|{{|~~}||}~~~}}}~~~~~~~~qج|ksP#oj?|[/A@/rJ+'ǀ=(+˘ ȆR1A(|gXd  jiuސ7JhxEހHw`WxQԐ(@opo| KxhSru{P #MwcZc< ?OfR:LВ9k^OLC=t9+T^S*i^=+UWY?eX:xiMbKWX4OÀC_ZQY4K?NhTi6(@;Cyei+1/{@/szwy(7('hh#u{7CQIqg;CY ?w-_{RC^2g@OxhCeXIhIw?da?zpG|C_i +kHߠuPWo(dPh԰iiHyPIbho߈Go]?opT׀ӤHij +e_si`p(Wiϰg׀Jo:IrowРH]XDytbՐ˴EQ^ /e]̨|hE[9)Wdoz6XT#IpaۙCOb&?ipYڸ@Hs:/WvUԔh7ha!Fx^k顕x5fp*7ip`븍?K@'WySԏPCsi!IYq뜒i7it*?uiW밍7O:7ipOЏ;Ih+WH{ܖP5st-'IP_몋i.h9%FtiE3Kh";hrGԘ;Dn#7S@_ޠh3i:5O}\A尕n(WP1Noj17Dj1Hbw9_ҥ:3sBGXwPA㴣h%gXBTua/xKjBTjj/y̪5@|HQfo6Oԯ:/sTOcoL8ڷh#hbQ^o\(߸rKpR^lbg°3DS^ki4Cб5/wZ]jn:/ײ`'he[jpX#ٷmOr]jp]_+E_iph*C̳3/weipm5/ү`'ikgprJ"yѷmWuiruXO˺+E|jqwbAȱ3/{nrxl0/ˬ`'qqryv:yǯi_xsz{PO°+E~t{aA3/{t}p(/ŧP'is}5hŰiOx|POʸ+Ex{i@Ĕ2/wyr#/{ʢP)iu1hдhOuPKӼxEyh @Ȑ5?{p/͠@/sz|*hҰh'g{@Kռr'Kx` @Ȑ=H|{p/wҤ?7sx|,#iԲh6hs@Or2Sxh Eϔ?Hx{p/oըBEow-'iּh:iq@Or7WqhE֘CMv{t/oبBGozw0'ih?gs@Or7XohI|՘COxx3o}٨@Hwxw2/izhCiyr@#W{{q7`znhIx՘;Syox?os֤@Hys{4/ixҸPCivw@'_{yi7e{rh'Kr̀=W}ox'G{oϠCI|n{;7kpδXHwrwD6dwujCiwqh/QykːGd{kx,IwiϤHS|k{=Cgjwд\HvlwP7aosjHjrnh5Ssi˄Leygx9Hqg͠RXew?Gkiw̲iR~hqPEclmpRwtii;YncƐSo{cx?Qo_ʘZgcwFMg`sɰl_hqPGadgżp[wngiEXfaňYswcxGSi]wǘ]g{awHOj^sȰee|hsXMa^gŶp`wniiG_da|^uwcxKXg\wĐ_of{KQj^ucjjwXOl^gpivoiLcfdre{|kpPck\weykScpZoeunwZ_r[gjsumc]sd_{tryip[sjVvqgwZmpVkl}ks]gsZbm{pmebq^Y{twxlp]rhSwqk{]ooTkkmy_ksYbivucjw^Y{swxqpevjUwxumxctqTkoo{_qxZckwyao|_Y{tzshk{jUuuwrpfzrVkqo{buwZalwz_r}`Z{m~wam~jXutwtpg{rWk|vs}xa{}\dnx{_we\{o~vctpYqu{qpotWgxwo{xg|\drwyc{a]{o|ucuh]wm{tpit^otwvpe|`jvoz}]{hg{~g|_wrgyf{{eoxeriw}pgflro|~|bjizxj|_wtese|cqxeqgw~pgeo}hqtbklzti~~_wtjw|c`sxiscwhghr}hspelr|pgx]yunyza_vxmy^waonw~`ohgow}jera{xt|t[z]w|s{z]w]ory~`oegrx}hgpaxu}t`|\wzu}x_w]orz`oegszhepa{uzpZv[w|ytWw[oz{Zk]c{_bd^}~hZpZw}}nVw|Wq|xVk[g|}]cd^|h[pZw~~rXw|Wq~xWk[g~[ed^~dZpVwpVuzVqtVk[gZa`^_Y{pZwjUwtYutUo\k~Zgaf~`_pa{pZwt\w}tVo^nZcae}_^{p`w}pUvt\s~tUo|]k|Uc_g\^{hcz~dYwr]urVo|_o~|Vg`j]_{he{~hZwrbvrZs~|_r~|[k_m^f}~hi}}ha{}re{|t\u{|cv}|^oycr}~_g}|}hm~}hb{|{rh{|q]uy|dxzz_owcu}~_i}y}iq}}he{|{tk}|qcu{u|g{zx_q~tgw|ak}u{kr|}hgzvwtl~|{rdtyt|k{yxcrzrjywcl{s{ls|~diyvyuo~|kdtyuxl}{tbrztjyz|_n{t{mu|dkzvyor}hgwxuxm}|tdtzt~m{{|crzs{ox|~ekzuxst|jkyvuxs{tgwzs}|q}yzet}s{r|{}gs~tvu{}yko}vtyywvlzxq|~vw}|kw{pyu~v{ms{puv|zxopyqszy|uvlwtp}|u~vxitwp|s}w}iryq{rz||kmztwxx}{plzvtyvzxkxzs}t{~|kw}s{s}}}ms~twu|}{rr}xt~zzzxo{{q{wz~|mx|pyu|}nv}rtv}}{pr|ur~z{zxp{xq{xy~|nz{oyu|~ow~swv}}}ns~vtz{{vr}{t}~xzxp|}t{u}~nzvyv}}}nw{v~z|{ss|u}|zy~xr~tzx|}~q}vww|zp{zu~x}xsw|u}{{x~xs~t|~xx}~q}vzv||o{yyv|{qw|wu{zxsv}zx}~zq}w{~u}~~o{xyu}}qy|xu||tt~v}zz{zr~w}|v}~}q{y{s}~oy|zs{~qsytxxry~zt~zq}|}~r~~~o{}{q{~rw{tx~tt{~xtzr}}~|q~~q{}|o{~ry{qx}tw|xszt}~zp}~~r}~}~o{~~r{}ow~tv|tr~yt~xn|}q}|nzp{nvrw~prxsxp}zq}zn{q{~owrx~ps~xt}tq}zr}zn{~p{}owqwqstttq}zr}yo{}q{|oyrzputw~tr}~zt~~yq{}s}~|oxs{~pu~ux~tr}~zu~|xq{}}s|~|ox~sz~~ou~~~ux~qr}~zu~~tpz~|t}znx}s{~ou~~uxor}wvtq|~{u}ynz}u|~|ow}vz~~pt~~~zy}tr}~}|x}zr{}v~~|qy|v|~rw}xz~vu~~~|y~zt{}}x~}}t{}x|~uy}y{xy~|z~{x~~}z~~~x}~z}~y{~{}~z{~}||{~{~{~~|{}~}|}~~}}~}~~~s?cêg *p<Ǎ䫝rP2*2 D]鹗T4"Qzǣt%4l꫔]. =S؟zG9tݿUB4 18Y{}et7 -;oǦc5" '5-76<-".;/DKV]si=! #3YlǾȳ|kmnidazq}mlf]KQM=F<+%# !'2FLYjwwruj_QMA<#1C4+50//+A'6/)#'/ &3>KZdpôĵxeL-2$$#)#..-62)#"#',:BQ^svnc^XSTTU`dnvyspca]YVTXVWY\]`dpv~ytrijb]_[YZ[^biqtqnd_YXT[Y[[[X__cbe(b˔qf8-GЬt;  Tt?/&:W~vM0 >S̅>(AqѩI3 -s͛_B))/)/?iů|O?)-4LٱtQ(%%-:HACKawïzMEWèq_W_SiWmlt[Ei"%d)H|xqw;3PqF0cmBa"s{X7Pi6&Q?&|mӻZ)DeliպpS;dʒ8ۻM- EicMaʋ_I$@ڰi(VIVAe~^1|ڷw+0Pfc`}l6lpsȴtlHe-(FP;nivƱ^li>&(V{S(YhP3/=cӥsTLie;:jɋJ&7PO>0  EwdS5^ܸT+Hsɸ_B/ "=_cw̿y[aepistͺr;  "PzЮbUF=;EOV^deesӰ~silxp_^_[fglillif\jts]MC;?FQex}mb_ZXXW[d_flvv|z{xwsttzz~zutoi__bhhmqtu}xnlporw{pibbbdhiqxtib_Z\\cepxwsmjhllqv}~}~~GLiqqsW_qyh`/_S 1\8S<EX۴|C -pȟJ#2gɽ{G*%+Jn}_J91;CXx}gC;3DEMmpwth_EO[Qgwwqzpilg`pneprziwrymmnd[ZdJaaftxoplmjfjlswxu}~yzuvxtyy~|}}||xzuvuwx}{~~|}||||~}}~~rzss6#s &Fh p0M}CX8,~{cw\ 6\|݄T\<#YP¶[5+dOH=H5ua{s-cT^qxnC)1Bs?A_x|#KtLc\Q\vP_cUb1}C?rjcpxPi|s\KXb$kf9q̧pxBiuNeu[j7oX"~p{r3d`gRl]J^Nd;yPS_yvn;OK|Fkjm\ll 6    @ @. @(0& 0$@A@ (C(  &7'  ' 7' 7% ' % 7' 7" ' " 7% 7 %  7" 7 "  7 7   7 7   7 7   7 $G   G G   G G   G G   G G   G G"  " G G%  % G" G' " ' G% &7* % * 7' 7) ' ) 7* 7' * ' 7) 7% ) % 7' 7" ' " 7% 7 %  7" 7 "  7 7   7 !7   7 7   7 7   7 7   7 7   7 7   7 7   7 7   7 % &7'  7' ' ' 7% '  7' %  7" ' 7% "  7 %  7"  ' 07 "  7  ' 7   7   7   7   7   7  % $G  G  ' G   G   G  G   G   G  ' 0G   G  ' G"   G "  G%   G" %  G' "  G% ' % &7* % 7' * ' 7) '  7* )  7' * 7) '  7% )  7' % ' 07" '  7% " ' 7 %  7"   7 "  7   7   7  % !7  7  ' 7   7   7  7   7   7  ' 07 % '   '   '  ' 0' %   '     '' *  '  ' '%   '   '"  ' %   '  ' ' "   '     " '      '     % '      ' (    ' '      '  '    '  ' '    '     " '"      '%  % "   ''  % %   '* *  '  ' ')   *   ''  ' )   '%  ' ' '   '"   %  " '   "   '     % '      ' %    ' '      '  '    '  ' '    '     " '      '  %    '  %    ' *    ' '      '  '    '  ' '    '     " '      '     % '      ' (    ' '      '  '    '  ' '    '     " '      '  %    '  %    ' *    ' '      '  '    '  ' '    '     " '      '     % '      ' %    ' '      '  '    '  ' '    '     " '      '  %    '  %    '-*   ' '    ' '   ', ' ' *  '%   " '  %   '*     % ',   *   '+(  , ' '*  ,   '(  '   '$ ' ' %  '  %  " '(    '% %   '(  %   ')*  * ' '    ' '   ' ' '   '   " '    '   % '    '%   ' '     '  '   '  ' '   '   " '     ' %   '  %   ')*  * ' '    ' '   ' ' '   '   " '    '   % '    '(   ' '    ' '   ' ' '   '(   " '    ' %   '* % (  '%*   ' '    ' '   ' ' '   '   " '    '   % '    '%   ' '    ' '   ' ' '   '   " '    ' %   ' %   ' *    ' '      '  '    '  ' '    '     " '      '     % '      ' (    ' '      '  '    '  ' '    '     " '      '  %    '  %    ' *    ' '      '  '    '  ' '    '     " '      '     % '      ' %    ' '      '  '    '  ' '    '   ' (  " '   ' (   '  %    '  % '   '*   ' '    '*  ' *   ',  ' ' *   '+  - " '  ,  '-   ,  % '*  (  '%(   ' '  (  '%  ' (   '" ' ' #  '   " '    ' %   ' %   '' *    ' '   '   '  '    '' 3 ' '    '   ' 3 " '      ''     % '' 3     '' %  %  ' '"   '   '%  ' "   '' " ' ' %   '"   ' " " '%   "   ''  % %  '" % '   ')*  * ' '    ' '   ' ' '   '   " '    '   % '    '(   ' '    ' '   ' ' '   '(   " '    ' %   '* % ,  '-&  , # '  *  ' # (  '% # '   '   # '(  %   '% # (   '( # %   '"(  ' # % '    ' %   ' % '   '  ' % '    '  %   % '   '    '' *  '  ' '%   '   '" ' %   ' *' ' "  '     " '      '     % '      ' (    ' '      '  '    ' ( ' '   '     " '"      '%   "  % ''   %   '* &  '  # ')   *   ''  # )   '% & # ' '  '"   %  # '   "   '  #    '  #    ' (    % '      '  %    ' ( % '   '     " '      '  %    '  %    ''  ' ' *`' '%   ' ' ` '"  ' ' % *` ' `' ' "   ' *` '  " ' ` '    ' *` '   % ' ` '    '  '  ( `' '   '   ` '  ' '  ( ` '  `' '    ' ( ` '   " '"  ` '   '% ( ` ' "  % ''  ` ' %   '*  ' ' & `# ')   ' *  ` ''  # ' ) & ` '%  `# ' '   '" & ` ' %  # '  ` ' "   ' & `# '   '  `# '    '  '  ( `% '   '   ` '  % '  ( ` '  `% '    ' ( ` '   " '  ` '    ' ( `% '    '  `% '    ''  ' ' *`' '%   ' ' ` '"  ' ' % *` ' `' ' "   ' *` '  " ' ` '    ' *` '   % ' ` '    '  '  ( `' '   '   ` '  ' '  ( ` '  `' '    ' ( ` '   " '"  ` '   '% ( ` ' "  % ''  ` ' %   '*  ' ' & `# ')   ' *  ` ''  # ' ) & ` '%  `# ' '   '" & ` ' %  # '  ` ' "   ' & `# '   '  `# '    '  '  ( `% '   '   ` '  % '  ( ` '  `% '    ' ( @ ' (  @" ' ( @ ' (  @ ' ( @% '   @ ' ( % '  ' ' *' ' @ ' ' ' * ' ' '   ' * ' ' ' ' ' * ' ' ' ' *' '  '   ' *' ' ' '   ' ' '  ' ' '   '  '' ' ' ' (  ' ' ' ' ' '   '   '  0' '' '  '' '  ' ' '   '  ' ' ' ' '  ' ' ' ' ' '  '  0 ' ' '' '  '' ' '   ' ' '   ''  ' ' ' ' ' (  '' ' '  ' ' '   ' '  '  ' '  ' '   '  ' '   '  ' '    '   '  ' '  ' '   '  ' '  '  ' '   '    '  ' '  ' '   '  ' '   '  ' '    '   ' ' '  ' ' (   '  ' '  '  ' '    '    '  0 ' ' ' '   ' ' '   '  ' '    '   '  ' '  ' '   '  ' '  '  ' '   '  0  '  ' ' ' '   ''  ' '    '  ' '    ''   ' '  '  '   '' ' ' '  '*  '  ' '  '   '' %  '*' ' "  '    " '     '     % '     '(   ' '     ' '   '( ' '   '   " '    '  " % '  %  '!&  ' # '   *  ' # )  '& # ' '  '  % # '  "  ' #   ' #   '(   % '     ' %   ' ( % '   '   " '    ' %   ' %   '*  '  ' '  '   '' %  '*' ' "  '    " '     '     % '     '(   ' '     ' '   '( ' '   '   " '    '  " % '  %  '!&  ' # '!   !  ''  # !   '& # '  '"  # # '    '! #   ' #   '!*    ' '  !   ' '   '! *' '  '  '  " '* 0     '*    % '*      ' ' ' *`' '  ' ' ` ' ' ' % *` '`' ' "  '*` ' " '` '   ' *` '  % '` '   ' '  ( `' '   '   ` ' ' '  ( ` ' `' '   '( ` '  " ' ` '  '( ` ' " % ' ` ' %  '! ' ' & `# '   ' *  ` ' # ' ) & ` ' `# ' '  '& ` ' % # ' ` ' "  '& `# '  ' `# '   ' '  ( `% '   '   ` ' % '  ( ` '  `% '   '( ` '  " ' ` '   '( `% '   ' `% '   ' ' ' *`' '  ' ' ` ' ' ' % *` '`' ' "  '*` ' " '` '   ' *` '  % '` '   ' '  ( `' '   '   ` ' ' '  ( ` ' `' '   '( ` '  " ' ` '  '( ` ' " % ' ` ' %  '! ' ' & `# '   ' *  ` ' # ' ) & ` ' `# ' '  '& ` ' % # ' ` ' "  '& `# '  ' `# '   ' '  ( `% '   '  ` ' % '  ( ` ' `% '   ' ( ` ' " '  ` ' (   '( `% '   '  `% ' ' '* '  @ * @ *  @ e}xwprt~|rwwwx|rnh\aRXPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQȸZS|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxicx0K_@OгbWmj0 $ /?IWkzt´ndc`W_XT]bihRQ[fbXS]HG^PD:130( %4?HA;:8(-)*,5A4(**) )    (("$'$"#/8>?FDGOPSckheidcowljw{ro¼ztwsd]SMOQNLA;;8(($  $ % +HA<42488<:CIMMOPKOWYYZ]ckmnssvwuqlsw~}yvtqrpqwzvsrnlecmmjjooqprqryyuy}}~}}}y{zuwywy{{}xtpmkkkhghgmmlmrspgejjimosnoqrszzyzyzzy{}yy{|{{}~~{{{y{{xwyvuvuswywusoooqqpoonqsnoqqspoonkhigfmlkmlkqsuwzzz{{}{{zz{zzyvssvtsuvvwy{|{yywwvvwuvwxssrmkkgmmmlkgijgfgkjjfdcb_^a_[YWY][]\[\]beediilmqvwvw{|{{{{||yy{wvwyzywwuvupoqnkmqpoljkjfgggffb`]__][\\[Z[WUW[\ZYVWYXVW[ZZ[[_ababaaaadghijnqqssrrrsssǫqvwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@Dfzxnqs|xy~~eglkTrqpssvyz|V=@$5e¡}vZZR;ACGPbxymkF0It|mpsw||paSbxpZZ\_\FLPV_tb_LRC5J~g^F,.:^veSVL;[mX^flfsx~tfkkne@5=Gn׷xklkmmj627:BSúd^Z>A@Rpt|L@DJUflptvy}~~egkpv|xfmmv|z~lgZIRXw~|}|yC.U`˱|FFHIN;Rkpx|yVTXRBpvy|vYOTVkȷm`eefbLRTZ`gvTC04:>FvnY815LSFXv_adfhR|wp^\bghgmpsdkpseNP88=Cex~֙z|zJ:==CHMTY~ȲtTDIC,4=sgVLUw~mstw|~pqsv|~XRzhINRT[bhtêadF((;Z^ensv`RU>2*Umv„~e^bdgkVsx~|knpVV\akpppZTVZ_dgTOe˹|<688=CHNZ~}pZ^^VfdJRXrymknbMRDZlahpgkmqvy~~jkOUS;;>Cesxɼh^A>CDG408NgɘppnlRNG2:Ddy~mss~r~ty~lpqvx|v_ehetŹYHLMPU[`gnҲJGC.NTV_ekx~wxwwkTC*"AMkŦxejmppv~kehSNTXyqVNNOSVZ\FFOZ~ʱZUR77;>DJRv}~eskkngTl[bPNTZZb}z^_eflqv|ng;04B_bgpv|ĜxZ[\ZF@7",5UdԴkkTJORSS\bt_`brh~sssYZ\^bfkptfZbvʴzV>ACFLPV^lѴz_IhjkpeRY^fp^RB4<[jmrtx|lpzG8=Cfmpx~ƽ̠f__`aLCHIOUF=VgNLNOR>:Iejsvkwtejsevyx``dfknrw|xslgkllRRV[`gpг|SLmmmpVV\agnnpePVXZ`RYqv|~g_d[_mptzabeenrx||d`_b_FHLNTZ`gq֘rsttdO: 00#(? 8&/\0R ?PFO`3=5kY4/_XWPZeAF?{PoPwD?ogg߸ɠpOdXfTV@(>WP_`Tg`7QP8740707P00/|(/_@,0#;8._X8IOjMZ_lfg{pgζϴؠșЈwpvaotpor`_gS`POs@-?P:>>>>>>>>>>>>>>>>>?????????????????@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEFFFFFFFFFFFFFFGGGGGGGGGGGGGGHHHHHHHHHHHHHIIIIIIIIIIIIIJJJJJJJJJJJJKKKKKKKKKKKKKLLLLLLLLLLLLMMMMMMMMMMMNNNNNNNNNNNNOOOOOOOOOOOPPPPPPPPPPQQQQQQQQQQQRRRRRRRRRRSSSSSSSSSSTTTTTTTTTTUUUUUUUUUUVVVVVVVVVWWWWWWWWWXXXXXXXXXYYYYYYYYYZZZZZZZZ[[[[[[[[\\\\\\\\\]]]]]]]]^^^^^^^________````````aaaaaaabbbbbbbcccccccdddddddeeeeeeeffffffggggggghhhhhhiiiiiijjjjjjjkkkkkkllllllmmmmmnnnnnnoooooopppppqqqqqqrrrrrssssstttttuuuuuvvvvvwwwwwxxxxxyyyyyzzzz{{{{{||||}}}}}~~~~    !"#$&'()+,-/0134578:;=>?ABDEGIJLMOQRTVWY[\^`bdegikmoqsuwy{} $(,16:?DINSX]chnsy",5?IT^iu%6GYk~/Id EkI}+lK B*B:|8, t 4 l  2 \  0 L h   . < J V b n x X:PH$B2 z : r 6 b  2 N j  0 > J X d p z nL`V0L<  @ x  < f  6 R l   " 2 @ L X d p | *^pd>XD H  B l  : V p   $ 2 @ N Z f r | ,>prJ b N  N  H p > Z t   & 4 B P \ h t ~ DR  Vl V  V L v  $ B \ v   ( 6 D R ^ j t ~ \fd x ` $ ^ & R z  ( D ` z  * 8 F R ` l v t,|.* p, h * d , V , H d |  , : H T ` l x B(@8|8, t 4 l  2 \  0 L h   . < J X d n x Z<RH$B4 z : r 6 b  2 P j  0 > L X d p z 4n*L`V0L<  @ x  < f  6 R n   " 2 @ N Z f r | P,`rf>XD H  B l  : V p   $ 2 @ N \ h r | h.@rtJ b N  P  H p > Z t   & 6 B P \ h t ~ FT Vl V  V L v  $ B \ v   ( 6 D R ^ j t ~ `j d x ` $ ^ & R z  ( D ` z  * 8 F T ` l t v.|0* p, h * d , V , H d |  , : H T ` l v &Nv 2Z                                  !"#$%&'()*+,-./0123456789:;<=>?@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|}   !#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqstvxz|~ "$&(*,.02468:<@BDFHJLNPRTVXZ\ 1V[`yKOBae #W[iu>A^fimpt(!$),/258IVY\_ehory:#(.59@CFLORUX[_cfiluy|% "(+.148>ADGKNSXjrx !'6Ccj}&  #(+.17=@HQV^flrw}: #.5:?FKPSVY^ahkpsvxz|L  "$&(*,.02468:<>@FILSWZ_beknqvy/ $(.169<@DGJMSWbepsy}4 !'*-5DGKNR]adgmqtxD!$*.2=BEHNRV`cgloruy|8 "%(.26AEHKQUZ]jmptx}" "*15DILOUY\_chmsy}@  $(,048<@DHLP "&,29cw $.:oeIVQcЧ̰ŠҠЧ̰Ġà ĭ ө̰àà ҩ̰ à Ω̰àà ҩ̰ؠ̰٠̰̰؍ٍР̠̰ƫ̠űðР̰Ҡ ; to stay out of the way, do not use the direct page at all ; use DP only for faster access to sound registers ; the assembled code should not be bank relative (meaning: not compiled to a fixed bank) sound_control = $3c ;really at $e1c03c sound_data = $3d ;really at $e1c03d sound_address = $3e ;really at $e1c03e sound_interrupt_ptr = $e1002c irq_volume = $e100ca ; AV201809 - IRQ_VOLUME max_tracks_available = 15 ;the GS has 32 voices = 16 tracks, 1 used for interrupt, so 15 left max_pattern_line = 64 ;there are 64 lines in a pattern ;-------------------------- helper functions read_head ldal 0,x rts read_pattern ldal 0,x rts read_instrument ldal 0,x rts ;----------------------------------------------------------------------------------------- ; prepare ;----------------------------------------------------------------------------------------- prepare = * sei phb phd phk plb clc xce rep #$30 mx %00 lda #$c000 tcd ; AV201809 sep #$20 mx %10 ldal irq_volume and #%0000_1111 sta sound_control rep #$20 mx %00 ; end of AV201809 jsr clear_memory stx ptr_header sty ptr_header+2 jsr check_header bcs prepare_1 jsr extract_header_info jsr copy_instruments_to_doc jsr setup_music jsr setup_interrupt ldx ptr_instruments ldy ptr_instruments+2 pld plb cli clc rtl prepare_1 pld plb cli sec rtl ;-------------------------- clear_memory   ,@TOOL222DEMTOOL222DEM0K .A)44"H" Hi hi0JG 0$ = Π̲ ӠҮ Π٠ŮéԠŠ̠٠̠Ů(\O\(** .)#)#h" "1!'첲ޢ" :  I: HH "ELv = Ԡ͠ˮ  v =#M\堺  Gyv =Ӡ ϠԠҠ ϠŠHH"hh;8 [+;irB =ˠխҮ # #@ǝ "{   "fH "h  )ɀɠ rk   = Ǡ`  = Ǡ `  = `: i H c`0.)4#)#0(*"")"` @` @ `  @` @ K0l>(JJJHJJJhH }*KhJJ) }*Kl8hh02)ߏ2klH }*Kh 興`hT MTH`:TzT)' ɍ   Tשi`8 iHڭZH ) hJJzhih:8`666&>&>&>>8>&8&&&88 8000&>&~ ~`0 ~fff~~`~~~`x`~ff~``~~`~~~f~~`0 ~f~f~~f~`` 0 0>> 0 > 8????????f>f>||>fff>~>~~>|f<ff~ff~~```f~f66f~f~~fffn~vff>f6f|<`>~ffff<fff<fff~ff<><000<>>Pj}':1/Music/Arnesune.NTP1/Music/BlowBlow.NTP1/Music/Conrad.NTP1/Music/SpiceItUp.NTPŠĭŠөננҩĠĠΩРҩHZ 4 "Fatal System Error : $Mz 5F $Hhknt ),ru '?BEKNQgpu"EMI< = * phx ldx #zero_out_end-zero_out_begin-2 ]loop stz zero_out_begin,x dex dex bpl ]loop plx rts ;-------------------------- header_str asc 'nfc!' check_header = * ; patch ptr into header lda ptr_header sta read_head+1 lda ptr_header+1 sta read_head+2 ; check header string ldx #0 jsr read_head cmp header_str bne check_header_1 inx inx jsr read_head cmp header_str+2 bne check_header_1 ; check version inx inx jsr read_head and #$ff bne check_header_1 clc rts check_header_1 sec rts ;-------------------------- extract_header_info = * ; get basic settings ldx #5 jsr read_head inx inx pha and #$ff sta number_of_tracks sta vu_number_of_tracks asl sta number_of_tracks2 asl sta number_of_tracks4 pla xba and #$ff sta number_of_instruments asl sta number_of_instruments2 jsr read_head inx and #$ff sta number_of_patterns jsr read_head inx and #$ff sta pattern_order_length ; get which track uses which output channel ldy #0 ]loop jsr read_head inx and #%111 asl asl asl asl sta track_channels,y iny iny cpy number_of_tracks2 blt ]loop ; get instrument data ldy #0 ]loop jsr read_head inx and #$ff sta instrument_types,y jsr read_head inx inx sta instrument_lengths,y jsr read_head inx and #$ff sta instrument_volumes,y jsr read_head inx and #$f asl phy tay lda note_freq_ptrs_offset,y ply sta instrument_finetune,y jsr read_head inx and #$ff sta instrument_osc_a_ptr,y sta instrument_osc_b_ptr,y jsr read_head inx and #$ff sta instrument_osc_a_siz,y sta instrument_osc_b_siz,y iny iny cpy number_of_instruments2 blt ]loop jsr generate_osc_settings ; get pattern order ldy #0 ]loop jsr read_head inx and #$ff sta pattern_order,y iny cpy pattern_order_length blt ]loop ; calc pointer to notes txa clc adc ptr_header sta ptr_notes lda ptr_header+2 adc #0 sta ptr_notes+2 ; patch note ptr lda ptr_notes sta read_pattern+1 lda ptr_notes+1 sta read_pattern+2 ; calculate pattern length (= number of tracks x 4 x 64) lda number_of_tracks xba sta pattern_length ; calculate pattern pointers phx lda ptr_notes sta pattern_pointers lda ptr_notes+2 sta pattern_pointers+2 ldy #0 ldx #1 ]loop lda pattern_pointers,y clc adc pattern_length sta pattern_pointers+4,y lda pattern_pointers+2,y adc #0 sta pattern_pointers+6,y iny iny iny iny inx cpx number_of_patterns blt ]loop plx ; get ptr to instruments: it's the last calculated pattern pointer plus one pattern length lda pattern_pointers,y clc adc pattern_length sta ptr_instruments lda pattern_pointers+2,y adc #0 sta ptr_instruments+2 ; patch instrument ptr lda ptr_instruments sta read_instrument+1 lda ptr_instruments+1 sta read_instrument+2 rts ;-------------------------- generate_osc_opti dw 0 generate_osc_opti_next dw 0 generate_osc_settings = * ;from instruments, generate control bytes for osc A and B phx ldy #0 ]loop lda instrument_types+2,y ;see if the next instrument has an optimal length and #%100 sta generate_osc_opti_next lda instrument_types,y asl tax jsr (generate_osc_sett_tbl,x) iny iny cpy number_of_instruments2 blt ]loop plx rts generate_osc_sett_tbl dw generate_osc_0,generate_osc_1a,generate_osc_2,generate_osc_3 ;normal samples dw generate_osc_0,generate_osc_1b,generate_osc_2,generate_osc_3 ;sample has an optimal size generate_osc_0 = * lda #%010 ;type 0: normal sample, use one-shot for osc A sta instrument_osc_a_ctl,y lda #%001 ;stop osc B sta instrument_osc_b_ctl,y rts generate_osc_1a = * lda #%110 ;type 1a: simple looped sample, use swap mode for osc A sta instrument_osc_a_ctl,y lda #%111 ;use swap mode for osc B sta instrument_osc_b_ctl,y rts generate_osc_1b = * lda #%000 ;type 1b: simple looped sample with optimal length, use free run mode for osc A sta instrument_osc_a_ctl,y lda #%001 ;stop osc B sta instrument_osc_b_ctl,y rts generate_osc_2 = * lda generate_osc_opti_next ;type 2: this is the header for the next instrument which is looped bne generate_osc_2_1 lda #%1110 ;loop has no optimal length: use swap mode for osc A with interrupt sta instrument_osc_a_ctl,y lda #%0111 ;swap mode for osc B when A is done sta instrument_osc_b_ctl,y bra generate_osc_2_2 generate_osc_2_1 = * lda #%110 ;loop has optimal length: use swap mode for osc A sta instrument_osc_a_ctl,y lda #%001 ;use free run mode for osc B when A is done sta instrument_osc_b_ctl,y generate_osc_2_2 = * lda instrument_osc_a_ptr+2,y ;since osc B plays the loop instrument, copy its ptr and siz parameters sta instrument_osc_b_ptr,y lda instrument_osc_a_siz+2,y sta instrument_osc_b_siz,y generate_osc_3 = * rts ;type 3: do nothing; it is played via loop header instrument (type 2) ;-------------------------- copy_instruments_to_doc = * jsr clear_docram ldy #0 ]loop lda instrument_lengths,y sta copy_instrument_length jsr copy_instrument lda read_instrument+1 clc adc copy_instrument_length sta read_instrument+1 bcc copy_instruments_1 inc read_instrument+3 copy_instruments_1 = * iny iny cpy number_of_instruments2 blt ]loop rts copy_instrument = * sep #$20 mx %10 ]loop lda sound_control bmi ]loop ora #%01100000 sta sound_control stz sound_address lda instrument_osc_a_ptr,y sta sound_address+1 ldx #0 ]loop jsr read_instrument inx sta sound_data cpx copy_instrument_length blt ]loop rep #$20 mx %00 rts ;-------------------------- clear_docram = * sep #$20 mx %10 ]loop lda sound_control bmi ]loop ora #%01100000 sta sound_control stz sound_address stz sound_address+1 ldx #0 lda #0 ]loop sta sound_data inx bne ]loop rep #$20 mx %00 rts ;-------------------------- setup_music = * ; reset pointers stz timer lda #6 sta tempo stz ptr_within_pattern stz pattern_order_ptr ; get pointer to first pattern to play ldx pattern_order_ptr lda pattern_order,x and #$ff asl asl tax lda pattern_pointers,x sta read_pattern+1 lda pattern_pointers+1,x sta read_pattern+2 rts ;-------------------------- setup_interrupt = * ldal sound_interrupt_ptr sta backup_interrupt_ptr ldal sound_interrupt_ptr+2 sta backup_interrupt_ptr+2 lda #$5c stal sound_interrupt_ptr phk phk pla stal sound_interrupt_ptr+2 lda #interrupt_handler stal sound_interrupt_ptr+1 sep #$20 mx %10 ]loop lda sound_control bmi ]loop and #%10011111 ; disable auto-inc. and access DOC reg. sta sound_control ldy #0 ]loop lda timer_sound_settings,y sta sound_address iny lda timer_sound_settings,y sta sound_data iny cpy #7*2 bne ]loop rep #$20 mx %00 lda #reference_freq sta osc_interrupt_freq sta new_osc_interrupt_freq rts reference_freq = 249 ; interrupt frequence timer_sound_settings = * ; set up oscillator 30 for interrupts dfb $1e,reference_freq ; frequency low register dfb $3e,0 ; frequency high register dfb $5e,0 ; volume register, volume = 0 dfb $9e,0 ; wavetable pointer register, point to 0 dfb $de,0 ; wavetable size register, 256 byte length dfb $e1,$3e ; oscillator enable register dfb $be,$08 ; mode register, set to free run ;----------------------------------------------------------------------------------------- ; play ;----------------------------------------------------------------------------------------- play = * phb phk plb sta play_song_once lda #1 sta playing plb clc rtl ;----------------------------------------------------------------------------------------- ; stop ;----------------------------------------------------------------------------------------- stop = * sei phb phd phk plb lda #$c000 tcd stz playing ; stop player sep #$20 mx %10 ]loop lda sound_control ; kill sound bmi ]loop and #%10011111 ; disable auto-inc. and access DOC reg. sta sound_control ldx number_of_tracks2 beq stop_1 lda #$a0 ; stop all oscillators in use sta sound_address lda #1 ]loop sta sound_data inc sound_address dex bne ]loop stop_1 = * lda #$a0+30 ; stop both interrupt oscillators sta sound_address lda #1 sta sound_data inc sound_address sta sound_data rep #$20 mx %00 lda backup_interrupt_ptr ; restore old interrupt ptr stal sound_interrupt_ptr lda backup_interrupt_ptr+2 stal sound_interrupt_ptr+2 cli pld plb clc rtl ;----------------------------------------------------------------------------------------- ; getvuptr ;----------------------------------------------------------------------------------------- getvuptr = * phk phk pla and #$ff tay ldx #vu_number_of_tracks clc rtl ;----------------------------------------------------------------------------------------- ; gete8ptr ;----------------------------------------------------------------------------------------- gete8ptr = * phk phk pla and #$ff tay ldx #last_effect_8_param clc rtl ;----------------------------------------------------------------------------------------- ; forcesongpos ;----------------------------------------------------------------------------------------- forcesongpos = * sei phb phk plb cmp pattern_order_length bge forcesongpos_1 sta force_pattern_jump_p lda #1 sta force_pattern_jump plb cli clc rtl forcesongpos_1 = * plb cli sec rtl ;----------------------------------------------------------------------------------------- ; interupt handler (=the player) ;----------------------------------------------------------------------------------------- interrupt_handler = * phb phd phk plb clc xce rep #$30 mx %00 lda #$c000 tcd sep #$20 mx %10 ]loop lda sound_control bmi ]loop and #%10011111 ; disable auto-inc. and access DOC reg. sta sound_control lda #$e0 sta sound_address ; reads the interrupt register lda sound_data ; to know which oscillator generated lda sound_data ; the interrupt and #%00111110 lsr cmp #$1e beq tracker_interrupt ; it's the 50Hz interrupt and #%11111110 ; get the track number where the interrupt occured sta oscillator ldy oscillator ; y = track*2 ldx curr_sample,y dex dex ; x = ptr into instrument tables lda reg_tbl_ptr,y sta sound_address lda instrument_osc_b_ptr,x sta sound_data lda reg_tbl_siz,y sta sound_address lda instrument_osc_b_siz,x sta sound_data lda reg_tbl_ctl,y sta sound_address lda instrument_osc_b_ctl,x ora track_channels,y ora #1 sta sound_data rep #$30 mx %00 jump_to_interrupt_end = * jmp interrupt_handler_end tracker_interrupt = * ; it's the 50Hz interrupt rep #$30 mx %00 lda playing beq jump_to_interrupt_end lda timer beq parse_tracks ;fetch track information only when timer=0 inc cmp tempo blt tracker_interrupt_1 lda #0 tracker_interrupt_1 sta timer jsr handle_effects jmp talk_to_doc ;-------------------------- parse_tracks = * ;fetch track information inc timer lda delay_pattern beq parse_tracks_2 dec delay_pattern jsr handle_effects jmp talk_to_doc parse_tracks_2 = * jsr check_pattern_jump ;if we reached the end of the pattern or there was a pattern jump, handle it ldy #0 ldx ptr_within_pattern lda #$ffff sta loop_position_jump parse_tracks_loop = * jsr read_pattern pha and #$ff asl sta note pla xba and #$ff asl sta sample inx inx jsr read_pattern pha and #$f asl sta effect pla xba and #$ff sta effect_param inx inx phx jsr setup_effect plx iny iny cpy number_of_tracks2 blt parse_tracks_loop lda loop_position_jump ;if there is an active loop, jump bmi parse_tracks_1 tax parse_tracks_1 = * stx ptr_within_pattern talk_to_doc = * ;for each track: talk to ensoniq doc sep #$20 mx %10 ]loop lda sound_control bmi ]loop and #%10011111 ; DOC reg. sta sound_control ldy #0 ]loop lda what_to_do,y bne talk_to_doc_0 talk_to_doc_loop iny iny cpy number_of_tracks2 blt ]loop talk_to_doc_timer = * ldy new_osc_interrupt_freq cpy osc_interrupt_freq beq talk_to_doc_timer_1 sty osc_interrupt_freq ;set new interrupt frequency lda #30 sta sound_address lda osc_interrupt_freq sta sound_data lda #$20+30 sta sound_address lda osc_interrupt_freq+1 sta sound_data talk_to_doc_timer_1 = * interrupt_handler_end = * sep #$30 pld plb clc rtl talk_to_doc_0 = * mx %10 ; values can be combined by setting bits ; %10000000 = set control (and turn oscillators off before) ; %00000100 = set wave ptr/size ; %00000010 = set freq ; %00000001 = set volume ; %00000000 = do nothing bpl talk_to_doc_1 lda reg_tbl_ctl,y ;stop sta sound_address lda #1 sta sound_data inc sound_address sta sound_data lda what_to_do,y talk_to_doc_1 = * bit #%00000001 beq talk_to_doc_2 lda reg_tbl_vol,y ;set volume sta sound_address lda osc_volume,y sta sound_data inc sound_address sta sound_data lda what_to_do,y talk_to_doc_2 = * bit #%00000010 beq talk_to_doc_3 tya ;set freq sta sound_address lda osc_freq,y sta sound_data inc sound_address sta sound_data lda reg_tbl_freqhi,y sta sound_address lda osc_freq+1,y sta sound_data inc sound_address sta sound_data lda what_to_do,y talk_to_doc_3 = * bit #%00000100 beq talk_to_doc_4 ldx osc_instrument,y ;set wave ptr/size via instrument lda reg_tbl_ptr,y sta sound_address lda what_to_do,y bmi talk_to_doc_3_1 lda instrument_osc_b_ptr,x ;if we don't set the control byte, make sure we change the instrument sta sound_data ;in such a way that a looped instrument will play its loop inc sound_address sta sound_data lda reg_tbl_siz,y sta sound_address lda instrument_osc_b_siz,x sta sound_data inc sound_address sta sound_data bra talk_to_doc_4 talk_to_doc_3_1 = * lda instrument_osc_a_ptr,x ;if we set the control byte, change the instrument in the normal fashion sta sound_data inc sound_address lda instrument_osc_b_ptr,x sta sound_data lda reg_tbl_siz,y sta sound_address lda instrument_osc_a_siz,x sta sound_data inc sound_address lda instrument_osc_b_siz,x sta sound_data talk_to_doc_4 = * lda what_to_do,y bpl talk_to_doc_5 lda osc_volume,y ;update vu meter sta vu_data,y ldx osc_instrument,y ;set control via instrument lda reg_tbl_ctl,y sta sound_address lda instrument_osc_a_ctl,x ora track_channels,y sta sound_data inc sound_address lda instrument_osc_b_ctl,x ora track_channels,y sta sound_data talk_to_doc_5 = * jmp talk_to_doc_loop mx %00 ;-------------------------- check_pattern_jump = * ldx pattern_jump jmp (check_pattern_jump_tbl,x) check_pattern_jump_tbl = * dw check_pattern_end dw handle_pattern_jump dw handle_pattern_break ;-------------------------- check_pattern_end = * lda force_pattern_jump beq check_pattern_end_0 lda force_pattern_jump_p sta pattern_jump_param stz force_pattern_jump bra handle_pattern_jump check_pattern_end_0 = * lda ptr_within_pattern ;check if we're at the end of the pattern cmp pattern_length blt check_pattern_end_4 stz ptr_within_pattern ;reset pointer within pattern stz loop_position ;reset loop in pattern stz loop_position_active check_pattern_end_1 = * ldx pattern_order_ptr ;end of pattern; set next pattern inx check_pattern_end_2 = * cpx pattern_order_length blt check_pattern_end_3 lda play_song_once beq check_pattern_end_2_1 stz playing ;stop playing after this song rts check_pattern_end_2_1 = * ldx #0 check_pattern_end_3 = * stx pattern_order_ptr lda pattern_order,x ;set new offset position to new pattern and #$ff asl asl tax lda pattern_pointers,x sta read_pattern+1 lda pattern_pointers+1,x sta read_pattern+2 check_pattern_end_4 = * rts ;-------------------------- handle_pattern_jump = * ;jump to a specific pattern order position stz pattern_jump stz loop_position ;reset loop in pattern stz loop_position_active ldx pattern_jump_param jmp check_pattern_end_2 ;-------------------------- handle_pattern_break = * ;stop pattern here and go to next pattern but start at specific line stz pattern_jump ldx pattern_jump_param lda pattern_break_ptrs,x and #$ff beq handle_pattern_break_1 tax lda #0 clc ]loop adc number_of_tracks4 ;poor man's multply dex bne ]loop handle_pattern_break_1 = * sta ptr_within_pattern stz loop_position ;reset loop in pattern stz loop_position_active jmp check_pattern_end_1 ;-------------------------- setup_effect_jump_rts rts setup_effect_jump_tbl = * dw setup_arpeggio dw setup_slide_up dw setup_slide_down dw setup_slide_to_note dw setup_vibrato dw setup_volslide ;Continue 'Slide to note', but also do Volume slide dw setup_volslide ;Continue 'Vibrato', but also do Volume slide dw setup_tremolo dw setup_gs_panning ;IIGS panning dw setup_effect_jump_rts ;Not supported: Set sample offset dw setup_volslide dw setup_positionjump dw setup_setvolume dw setup_patternbreak dw setup_e_effects dw setup_setspeed setup_e_effect_jump_tbl = * dw setup_effect_jump_rts ;Not supported: Set filter on/off dw fineslide_up dw fineslide_down dw set_glissando dw set_vibrato_waveform dw set_sample_finetune dw set_loop_pattern dw set_tremolo_waveform dw setup_effect_jump_rts ;unused dw setup_retrigger dw volslide_up dw volslide_down dw setup_note_cut dw setup_note_delay dw setup_delay_pattern dw setup_effect_jump_rts ;Not supported: Invert loop setup_effect = * lda #0 ;by default, do nothing sta what_to_do,y sta vu_data,y ;reset vu meter ; if sample is defined, set it ; and set volume according to instrument lda sample beq setup_effect_2 ; if sample is defined, always set the volume from the instrument dec ;the 1st sample is at position 0 in all tables dec sta osc_instrument,y ;store which instrument to play tax ;use default volume from sample lda instrument_volumes,x sta curr_volume,y ;backup volume setting in track asl tax lda volume_lookup,x sta osc_volume,y ;store volume for osc lda what_to_do,y ora #%00000001 ;mark that we want to set the volume sta what_to_do,y lda sample cmp curr_sample,y beq setup_effect_1 sta curr_sample,y ;if it's a different sample than before, tell the doc lda what_to_do,y ora #%00000100 ;mark that we want to set the instrument sta what_to_do,y setup_effect_1 = * lda note ;repeat last note if no note was set bne setup_effect_2 lda curr_note,y beq setup_effect_2 sta note lda what_to_do,y ora #%00000100 ;mark that we want to set the instrument sta what_to_do,y setup_effect_2 = * lda effect sta curr_effect,y tax jsr (setup_effect_jump_tbl,x) ;if there is no note but a sample, then change the oscillators wavptr and wavsiz, so that an ongoing loop swaps to the new sample check_play_note = * ; if note is defined, play it lda note beq check_play_note_5 ;no note, don't play sta curr_note,y ;backup note ldx curr_sample,y beq check_play_note_5 ;no last sample defined, do not play the note lda instrument_finetune-2,x ;the 1st sample is at position 0 in all tables clc adc note tax lda note_freq_ptrs,x ;use note and sample's finetune and look up a frequency sta curr_ptrfinetune,y tax lda freq_finetune,x sta osc_freq,y ;store freq for osc lda what_to_do,y ora #%10000110 ;store that we want to set frequency, restart the sample and control sta what_to_do,y check_play_note_5 = * rts ;-------------------------- setup_arpeggio = * lda effect_param beq setup_arpeggio_2 ;no arpeggio, turn off if it was running before lda note ;if we have a new note, use it bne setup_arpeggio_1 lda arpeggio_note1,y ;else use last played beq setup_arpeggio_2 ;no last note - do nothing sta note ;make sure we play the last note again setup_arpeggio_1 = * sta arpeggio_note1,y lda effect_param and #$f0 lsr lsr lsr clc adc note sta arpeggio_note2,y lda effect_param and #$f asl clc adc note sta arpeggio_note3,y lda #$8000 setup_arpeggio_2 = * sta arpeggio_ptr,y rts ;-------------------------- setup_slide_up = * lda effect_param asl sta slide_delta,y lda note ;if there is no note, continue sliding bne setup_slide_up_1 jmp handle_slide_up setup_slide_up_1 rts ;-------------------------- setup_slide_down = * lda effect_param asl sta slide_delta,y lda note ;if there is no note, continue sliding bne setup_slide_down_1 jmp handle_slide_down setup_slide_down_1 rts ;-------------------------- setup_slide_to_note = * lda effect_param beq setup_slide_to_note_1 ;if there is a speed set, use this, else keep whatever is there asl sta slide_delta,y setup_slide_to_note_1 = * lda note ;if there is a note set, use this as target, else keep whatever is there beq setup_slide_to_note_2 sta slide_target_note,y ;if a note is set, this is our target to slide to ldx curr_sample,y lda instrument_finetune-2,x clc adc note tax lda note_freq_ptrs,x ;find the target in the freq table to slide to sta slide_target,y stz note ;with this command, the note is a parameter and is not played lda what_to_do,y and #%00000101 sta what_to_do,y setup_slide_to_note_2 = * rts ;-------------------------- setup_vibrato = * lda effect_param and #$f0 ;If either x or y are 0, then the old vibrato values will be used. beq setup_vibrato_1 lsr lsr lsr sta vibrato_rate,y setup_vibrato_1 = * lda effect_param and #$f beq setup_vibrato_2 xba lsr ;*128 clc adc vibrato_tableoffset,y sta vibrato_table,y setup_vibrato_2 = * lda #0 ;reset position in vibrato table sta vibrato_pos,y rts ;-------------------------- setup_tremolo = * lda effect_param and #$f0 beq setup_tremolo_1 lsr lsr lsr sta tremolo_rate,y setup_tremolo_1 = * lda effect_param and #$f beq setup_tremolo_2 xba lsr ;*128 clc adc tremolo_tableoffset,y sta tremolo_table,y setup_tremolo_2 = * lda #0 ;reset position in tremolo table: this is actually a bug in protracker sta tremolo_pos,y rts ;-------------------------- setup_gs_panning = * lda effect_param cmp #8 bge setup_gs_panning_1 ;GS panning: if < 8, then we set the channel for this track asl asl asl asl sta track_channels,y rts setup_gs_panning_1 sta last_effect_8_param ;if it is not a panning effect, store in shared register for timing purposes rts ;-------------------------- setup_volslide = * lda effect_param beq setup_volslide_1 cmp #$10 bge setup_volslide_1 lda #0 sec sbc effect_param sta volslide_delta,y rts setup_volslide_1 = * and #$f0 ;If both x and y are non-zero, the y value is ignored (assumed to be 0). lsr lsr lsr lsr sta volslide_delta,y rts ;-------------------------- setup_setvolume = * lda effect_param cmp #64 blt setup_setvolume_1 lda #64 setup_setvolume_1 sta curr_volume,y asl tax lda volume_lookup,x sta osc_volume,y lda what_to_do,y ora #%00000001 ;store that we want to set the volume immediately sta what_to_do,y rts ;-------------------------- setup_positionjump = * lda effect_param ;Legal values are from 0 to 127 and #$7f sta pattern_jump_param lda #2 sta pattern_jump rts ;-------------------------- setup_patternbreak = * lda effect_param sta pattern_jump_param lda #4 sta pattern_jump rts ;-------------------------- setup_e_effects = * lda effect_param and #$f0 lsr lsr lsr sta curr_e_effect,y tax lda effect_param and #$f sta effect_param jmp (setup_e_effect_jump_tbl,x) ;-------------------------- setup_setspeed = * lda effect_param bne setup_setspeed_2 lda #1 ;when 0, stop music or set to 1 ? setup_setspeed_1 = * sta tempo rts setup_setspeed_2 = * cmp #$20 ;when < 32, assume set tempo blt setup_setspeed_1 sec ;else interrupt timer sbc #$20 asl tax lda bpm_to_freq,x sta new_osc_interrupt_freq rts ;-------------------------- fineslide_up = * asl effect_param lda curr_ptrfinetune,y clc adc effect_param cmp #max_finetune_ptr blt fineslide_up_1 lda #max_finetune_ptr fineslide_up_1 sta curr_ptrfinetune,y tax lda freq_finetune,x sta osc_freq,y lda what_to_do,y ora #%00000010 ;store that we want to set the freq for this track sta what_to_do,y rts ;-------------------------- fineslide_down = * asl effect_param lda curr_ptrfinetune,y sec sbc effect_param bpl fineslide_down_1 lda #0 fineslide_down_1 sta curr_ptrfinetune,y tax lda freq_finetune,x sta osc_freq,y lda what_to_do,y ora #%00000010 ;store that we want to set the freq for this track sta what_to_do,y rts ;-------------------------- set_glissando = * lda effect_param ;only 0 and 1 are valid, but PT doesn't check that sta glissando,y rts ;-------------------------- set_vibrato_waveform = * lda effect_param cmp #8 bge set_vibrato_waveform_1 and #%11 asl tax lda waveforms,x sta vibrato_tableoffset,y lda effect_param and #%100 sta vibrato_retrig,y set_vibrato_waveform_1 = * rts ;-------------------------- set_sample_finetune = * ldx sample bne set_sample_finetune_1 ldx curr_sample,y beq set_sample_finetune_2 set_sample_finetune_1 = * phx lda effect_param asl tax lda note_freq_ptrs_offset,x plx sta instrument_finetune-2,x set_sample_finetune_2 = * rts ;-------------------------- set_loop_pattern = * lda effect_param ;0=record position, else loop bne set_loop_pattern_1 lda ptr_within_pattern ;record pattern position sta loop_position rts set_loop_pattern_1 = * ;start or continue loop lda loop_position_active bne set_loop_pattern_2 lda #1 ;start loop sta loop_position_active lda effect_param sta loop_repeat_count lda loop_position sta loop_position_jump rts set_loop_pattern_2 = * ;continue loop, enough repetitions? dec loop_repeat_count beq set_loop_pattern_3 lda loop_position sta loop_position_jump rts set_loop_pattern_3 = * ;loop has ended stz loop_position_active rts ;-------------------------- set_tremolo_waveform = * lda effect_param cmp #8 bge set_tremolo_waveform_1 and #%11 asl tax lda waveforms,x sta tremolo_tableoffset,y lda effect_param and #%100 sta tremolo_retrig,y set_tremolo_waveform_1 = * rts ;-------------------------- setup_retrigger = * lda effect_param sta retrigger_steps,y lda #0 sta retrigger_count,y rts ;-------------------------- volslide_up = * lda curr_volume,y clc adc effect_param cmp #64 blt volslide_up_1 lda #64 volslide_up_1 = * sta curr_volume,y asl tax lda volume_lookup,x sta osc_volume,y ;store volume for osc lda what_to_do,y ora #%00000001 ;store that we want to set the volume for this track sta what_to_do,y rts ;-------------------------- volslide_down = * lda curr_volume,y sec sbc effect_param bpl volslide_up_1 lda #0 bra volslide_up_1 ;-------------------------- setup_note_cut = * lda effect_param sta note_cut,y rts ;-------------------------- setup_note_delay = * lda note beq setup_note_delay_1 sta note_delay_note,y lda effect_param sta note_delay_count,y stz note setup_note_delay_1 = * rts ;-------------------------- setup_delay_pattern = * lda effect_param sta delay_pattern rts ;-------------------------- handle_effect_jump_tbl = * dw handle_arpeggio dw handle_slide_up dw handle_slide_down dw handle_slide_to_note dw handle_vibrato dw handle_effect_5 dw handle_effect_6 dw handle_tremolo dw handle_effect_nothing dw handle_effect_nothing dw handle_volslide dw handle_effect_nothing dw handle_effect_nothing dw handle_effect_nothing dw handle_effect_nothing dw handle_effect_nothing handle_e_eff_jump_tbl dw handle_effect_nothing dw handle_effect_nothing dw handle_effect_nothing dw handle_effect_nothing dw handle_effect_nothing dw handle_effect_nothing dw handle_effect_nothing dw handle_effect_nothing dw handle_effect_nothing dw handle_retrigger dw handle_effect_nothing dw handle_effect_nothing dw handle_note_cut dw handle_note_delay dw handle_effect_nothing dw handle_effect_nothing handle_effects = * ;when a non-tracker line is encountered, do what the last effect needs to do ldy #0 ]loop lda #0 sta what_to_do,y ldx curr_effect,y jsr (handle_effect_jump_tbl,x) iny iny cpy number_of_tracks2 blt ]loop handle_effect_nothing rts ;-------------------------- handle_arpeggio = * lda arpeggio_ptr,y beq handle_arpeggio_5 inc cmp #$8003 blt handle_arpeggio_1 lda #$8000 handle_arpeggio_1 = * sta arpeggio_ptr,y cmp #$8000 bne handle_arpeggio_2 lda arpeggio_note1,y bra handle_arpeggio_4 handle_arpeggio_2 = * cmp #$8001 bne handle_arpeggio_3 lda arpeggio_note2,y bra handle_arpeggio_4 handle_arpeggio_3 = * lda arpeggio_note3,y handle_arpeggio_4 = * sta note sta curr_note,y lda curr_sample,y sta sample jmp check_play_note handle_arpeggio_5 = * rts ;-------------------------- handle_slide_up = * lda curr_ptrfinetune,y clc adc slide_delta,y cmp #max_finetune_ptr blt handle_slide_up_1 lda #max_finetune_ptr handle_slide_up_1 sta curr_ptrfinetune,y tax lda freq_finetune,x sta osc_freq,y lda what_to_do,y ora #%00000010 ;store that we want to set the freq for this track sta what_to_do,y rts ;-------------------------- handle_slide_down = * lda curr_ptrfinetune,y sec sbc slide_delta,y cmp #max_finetune_ptr blt handle_slide_down_1 lda #0 handle_slide_down_1 sta curr_ptrfinetune,y tax lda freq_finetune,x sta osc_freq,y lda what_to_do,y ora #%00000010 ;store that we want to set the freq for this track sta what_to_do,y rts ;-------------------------- handle_slide_to_note = * lda glissando,y beq handle_slide_to_note_0 ;when glissando is on, we have to slide in semitones lda curr_note,y cmp slide_target_note,y beq handle_slide_to_note_3 bge handle_slide_to_note_g1 inc inc bra handle_slide_to_note_g2 handle_slide_to_note_g1 = * dec dec handle_slide_to_note_g2 = * sta curr_note,y ldx curr_sample,y lda instrument_finetune-2,x clc adc curr_note,y tax lda note_freq_ptrs,x bra handle_slide_to_note_2 ;no glissando handle_slide_to_note_0 = * lda curr_ptrfinetune,y cmp slide_target,y beq handle_slide_to_note_3 bge handle_slide_to_note_4 clc adc slide_delta,y cmp slide_target,y blt handle_slide_to_note_2 handle_slide_to_note_1 = * lda slide_target,y handle_slide_to_note_2 = * sta curr_ptrfinetune,y tax lda freq_finetune,x sta osc_freq,y lda what_to_do,y ora #%00000010 ;store that we want to set the freq for this track sta what_to_do,y handle_slide_to_note_3 = * rts handle_slide_to_note_4 = * sec sbc slide_delta,y cmp slide_target,y bge handle_slide_to_note_2 bra handle_slide_to_note_1 ;-------------------------- handle_vibrato = * lda vibrato_table,y clc adc vibrato_pos,y tax lda sine_tbl,x clc adc curr_ptrfinetune,y tax lda freq_finetune,x sta osc_freq,y lda what_to_do,y ora #%00000010 ;store that we want to set the freq for this track sta what_to_do,y lda vibrato_pos,y clc adc vibrato_rate,y cmp #128 blt handle_vibrato_1 ldx vibrato_retrig,y bne handle_vibrato_2 and #127 handle_vibrato_1 sta vibrato_pos,y handle_vibrato_2 rts ;-------------------------- handle_effect_5 = * jsr handle_slide_to_note ;Continue 'Slide to note', but also do Volume slide jmp handle_volslide ;-------------------------- handle_effect_6 = * jsr handle_vibrato ;Continue 'Vibrato', but also do Volume slide jmp handle_volslide ;-------------------------- handle_tremolo = * lda tremolo_table,y clc adc tremolo_pos,y tax ldaFGH 썪 ㍠젤ō㍠נݱ㍠젤ō㍠젤ō㍠䠻 ㍠젤ō㍠젤ō㍠䠻 ㍠젤ō㍠̠ݱ㍠젤ō㍠נݱ㍠젤ō㍠젤ō㍠䠻 ㍠젤ō㍠נݱݲ㍠젤ō㍠נݱ㍠젤ō㍠נݱ㍠젤ō㍠䠻 ㍠젤ō㍠̠ݱ㍠젤ō㍠䠻獠䠻 ㍠젤ō㍠젤ō㍠젤ō sine_tbl,x lsr ;divide by 2 because sine table is factors of 2 clc adc curr_volume,y asl tax lda volume_lookup,x sta osc_volume,y lda what_to_do,y ora #%00000001 ;store that we want to set the vol for this track sta what_to_do,y lda tremolo_pos,y clc adc tremolo_rate,y cmp #128 blt handle_tremolo_1 ldx tremolo_retrig,y bne handle_tremolo_2 and #127 handle_tremolo_1 sta tremolo_pos,y handle_tremolo_2 rts ;-------------------------- handle_volslide = * ldx #0 lda curr_volume,y clc adc volslide_delta,y bmi handle_volslide_1 ;when < 0 then 0 ldx #64 cmp #64 bge handle_volslide_1 ;when > 64 then 64 tax handle_volslide_1 = * txa sta curr_volume,y ;backup volume setting in track asl tax lda volume_lookup,x sta osc_volume,y ;store volume for osc lda what_to_do,y ora #%00000001 ;store that we want to set the volume for this track sta what_to_do,y rts ;-------------------------- handle_e_effects = * ldx curr_e_effect,y jmp (handle_e_eff_jump_tbl,x) ;-------------------------- handle_retrigger = * lda retrigger_count,y inc cmp retrigger_steps,y blt handle_retrigger_2 lda curr_sample,y beq handle_retrigger_1 lda what_to_do,y ;do retrigger ora #%11000100 sta what_to_do,y handle_retrigger_1 = * lda #0 handle_retrigger_2 = * sta retrigger_count,y rts ;-------------------------- handle_note_cut = * lda note_cut,y beq handle_note_cut_1 dec sta note_cut,y bne handle_note_cut_1 lda #0 sta curr_volume,y sta osc_volume,y lda what_to_do,y ;store that we want to set the volume ora #%00000001 sta what_to_do,y handle_note_cut_1 = * rts ;-------------------------- handle_note_delay = * lda note_delay_count,y dec sta note_delay_count,y bne handle_note_delay_1 lda note_delay_note,y sta note jmp check_play_note handle_note_delay_1 = * rts ;-------------------------- volume_lookup = * dw 0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60 dw 64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124 dw 128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188 dw 192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252 dw 255,255 max_finetune_ptr = 3574 freq_finetune = * dw 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38 dw 38,38,38,38,38,38,39,39,39,39,39,39,39,39,39,39 dw 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39 dw 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39 dw 39,39,39,39,40,40,40,40,40,40,40,40,40,40,40,40 dw 40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40 dw 40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,41 dw 41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 dw 41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 dw 41,41,41,41,41,41,41,41,42,42,42,42,42,42,42,42 dw 42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42 dw 42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,43 dw 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43 dw 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43 dw 43,43,43,43,44,44,44,44,44,44,44,44,44,44,44,44 dw 44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44 dw 44,44,44,44,44,44,44,44,45,45,45,45,45,45,45,45 dw 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45 dw 45,45,45,45,45,45,45,45,45,45,46,46,46,46,46,46 dw 46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46 dw 46,46,46,46,46,46,46,46,46,46,46,47,47,47,47,47 dw 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47 dw 47,47,47,47,47,47,47,47,47,47,48,48,48,48,48,48 dw 48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48 dw 48,48,48,48,48,48,48,48,49,49,49,49,49,49,49,49 dw 49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49 dw 49,49,49,49,49,50,50,50,50,50,50,50,50,50,50,50 dw 50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50 dw 51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51 dw 51,51,51,51,51,51,51,51,51,51,51,52,52,52,52,52 dw 52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52 dw 52,52,52,52,53,53,53,53,53,53,53,53,53,53,53,53 dw 53,53,53,53,53,53,53,53,53,53,53,53,53,54,54,54 dw 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54 dw 54,54,54,54,55,55,55,55,55,55,55,55,55,55,55,55 dw 55,55,55,55,55,55,55,55,55,55,55,56,56,56,56,56 dw 56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56 dw 56,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57 dw 57,57,57,57,57,57,57,58,58,58,58,58,58,58,58,58 dw 58,58,58,58,58,58,58,58,58,58,58,59,59,59,59,59 dw 59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,60 dw 60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60 dw 60,60,61,61,61,61,61,61,61,61,61,61,61,61,61,61 dw 61,61,61,61,61,62,62,62,62,62,62,62,62,62,62,62 dw 62,62,62,62,62,62,62,63,63,63,63,63,63,63,63,63 dw 63,63,63,63,63,63,63,63,64,64,64,64,64,64,64,64 dw 64,64,64,64,64,64,64,64,64,65,65,65,65,65,65,65 dw 65,65,65,65,65,65,65,65,65,66,66,66,66,66,66,66 dw 66,66,66,66,66,66,66,66,66,67,67,67,67,67,67,67 dw 67,67,67,67,67,67,67,67,68,68,68,68,68,68,68,68 dw 68,68,68,68,68,68,68,69,69,69,69,69,69,69,69,69 dw 69,69,69,69,69,69,70,70,70,70,70,70,70,70,70,70 dw 70,70,70,70,71,71,71,71,71,71,71,71,71,71,71,71 dw 71,71,72,72,72,72,72,72,72,72,72,72,72,72,72,73 dw 73,73,73,73,73,73,73,73,73,73,73,73,74,74,74,74 dw 74,74,74,74,74,74,74,74,75,75,75,75,75,75,75,75 dw 75,75,75,75,75,76,76,76,76,76,76,76,76,76,76,76 dw 76,77,77,77,77,77,77,77,77,77,77,77,78,78,78,78 dw 78,78,78,78,78,78,78,78,79,79,79,79,79,79,79,79 dw 79,79,79,80,80,80,80,80,80,80,80,80,80,81,81,81 dw 81,81,81,81,81,81,81,81,82,82,82,82,82,82,82,82 dw 82,82,83,83,83,83,83,83,83,83,83,83,84,84,84,84 dw 84,84,84,84,84,84,85,85,85,85,85,85,85,85,85,85 dw 86,86,86,86,86,86,86,86,86,87,87,87,87,87,87,87 dw 87,87,88,88,88,88,88,88,88,88,88,89,89,89,89,89 dw 89,89,89,89,90,90,90,90,90,90,90,90,91,91,91,91 dw 91,91,91,91,92,92,92,92,92,92,92,92,92,93,93,93 dw 93,93,93,93,93,94,94,94,94,94,94,94,95,95,95,95 dw 95,95,95,95,96,96,96,96,96,96,96,96,97,97,97,97 dw 97,97,97,98,98,98,98,98,98,98,99,99,99,99,99,99 dw 99,100,100,100,100,100,100,100,101,101,101,101,101,101,101,102 dw 102,102,102,102,102,103,103,103,103,103,103,103,104,104,104,104 dw 104,104,105,105,105,105,105,105,106,106,106,106,106,106,106,107 dw 107,107,107,107,107,108,108,108,108,108,108,109,109,109,109,109 dw 110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,112 dw 112,113,113,113,113,113,113,114,114,114,114,114,115,115,115,115 dw 115,116,116,116,116,116,117,117,117,117,117,118,118,118,118,118 dw 119,119,119,119,119,120,120,120,120,120,121,121,121,121,121,122 dw 122,122,122,123,123,123,123,123,124,124,124,124,125,125,125,125 dw 125,126,126,126,126,127,127,127,127,128,128,128,128,128,129,129 dw 129,129,130,130,130,130,131,131,131,131,132,132,132,132,133,133 dw 133,133,134,134,134,134,135,135,135,136,136,136,136,137,137,137 dw 137,138,138,138,139,139,139,139,140,140,140,141,141,141,141,142 dw 142,142,143,143,143,143,144,144,144,145,145,145,146,146,146,146 dw 147,147,147,148,148,148,149,149,149,150,150,150,151,151,151,152 dw 152,152,153,153,153,154,154,154,155,155,155,156,156,156,157,157 dw 158,158,158,159,159,159,160,160,160,161,161,162,162,162,163,163 dw 164,164,164,165,165,165,166,166,167,167,167,168,168,169,169,170 dw 170,170,171,171,172,172,172,173,173,174,174,175,175,176,176,176 dw 177,177,178,178,179,179,180,180,181,181,182,182,183,183,184,184 dw 184,185,185,186,186,187,187,188,189,189,190,190,191,191,192,192 dw 193,193,194,194,195,195,196,197,197,198,198,199,199,200,201,201 dw 202,202,203,204,204,205,205,206,207,207,208,208,209,210,210,211 dw 212,212,213,214,214,215,216,216,217,218,218,219,220,220,221,222 dw 223,223,224,225,225,226,227,228,228,229,230,231,232,232,233,234 dw 235,235,236,237,238,239,240,240,241,242,243,244,245,246,246,247 dw 248,249,250,251,252,253,254,255,256,256,257,258,259,260,261,262 dw 263,264,265,266,267,268,270,271,272,273,274,275,276,277,278,279 dw 280,282,283,284,285,286,287,289,290,291,292,294,295,296,297,299 dw 300,301,303,304,305,307,308,309,311,312,314,315,317,318,319,321 dw 322,324,325,327,329,330,332,333,335,337,338,340,342,343,345,347 dw 348,350,352,354,356,357,359,361,363,365,367,369,371,373,375,377 dw 379,381,383,385,388,390,392,394,397,399,401,403,406,408,411,413 dw 416,418,421,423,426,429,431,434,437,439,442,445,448,451,454,457 dw 460,463,466,469,473,476,479,482,486,489,493,496,500,504,507,511 dw 515,519,523,527,531,535,539,543,548,552,556,561,566,570,575,580 dw 585,590,595,600,605,611,616,622,627,633,639,645,651,657,663,670 dw 676,683,690,697,704,711,719,726,734,742,750,758,767,775,784,793 dw 802,812,821,831,841,852,862,873,885,896,908,920,932,945,958,972 dw 986,1000,1015,1030,1045,1061,1078,1095,1113,1131,1150,1169,1190,1210,1232,1254 dw 1278,1302,1327,1353,1380,1408,1437,1468,1500,1533,1568,1605,1643,1683,1725,1769 dw 1816,1865,1917,1971,2029,2091,2156,2226,2300,2379,2464,2555 note_freq_ptrs = * note_freq_ptrs_0 = * dw 0,204,396,578,748,914,1066,1210,1346,1474,1594,1706,1814,1916,2012,2104 dw 2188,2272,2348,2420,2488,2552,2612,2668,2722,2772,2820,2866,2908,2950,2988,3024 dw 3058,3090,3120,3148,3176,3200,3224,3248,3268,3288,3308,3326,3342,3358,3374,3388 dw 3402,3414,3426,3438,3448,3458,3468,3476,3486,3494,3500,3508,3514,3522,3528,3534 dw 3538,3544,3548,3554,3558,3562,3566,3568,3572 note_freq_ptrs_1 = * dw 0,228,420,600,770,930,1082,1224,1360,1488,1608,1720,1828,1928,2024,2114 dw 2198,2280,2354,2426,2494,2558,2618,2674,2728,2778,2826,2870,2914,2954,2992,3028 dw 3060,3092,3122,3150,3178,3202,3226,3250,3270,3290,3310,3328,3344,3360,3376,3390 dw 3402,3416,3428,3440,3450,3460,3470,3478,3488,3496,3502,3510,3516,3522,3528,3534 dw 3540,3544,3550,3554,3558,3562,3566,3570,3572,3572 note_freq_ptrs_2 = * dw 0,252,442,622,790,950,1100,1242,1376,1502,1622,1734,1840,1940,2036,2124 dw 2210,2288,2364,2434,2502,2564,2624,2680,2734,2784,2832,2876,2918,2958,2996,3032 dw 3064,3096,3126,3154,3180,3206,3230,3252,3274,3294,3312,3330,3346,3362,3378,3392 dw 3404,3416,3428,3440,3452,3462,3470,3480,3488,3496,3504,3510,3518,3522,3528,3534 dw 3540,3546,3550,3554,3558,3562,3566,3570,3572,3572 note_freq_ptrs_3 = * dw 0,276,464,642,810,968,1118,1258,1392,1518,1636,1748,1854,1952,2046,2136 dw 2220,2298,2372,2444,2510,2572,2632,2688,2740,2790,2838,2882,2924,2964,3000,3036 dw 3068,3100,3130,3158,3184,3210,3232,3254,3276,3296,3314,3332,3348,3364,3378,3392 dw 3406,3418,3430,3442,3452,3462,3472,3480,3488,3496,3504,3510,3518,3524,3530,3536 dw 3540,3546,3550,3554,3560,3564,3566,3570,3574,3574 note_freq_ptrs_4 = * dw 0,300,488,664,830,988,1136,1276,1408,1532,1650,1762,1866,1964,2058,2146 dw 2230,2308,2382,2452,2518,2580,2638,2694,2746,2796,2844,2888,2928,2968,3004,3040 dw 3072,3104,3134,3162,3188,3212,3236,3258,3278,3298,3316,3334,3350,3366,3380,3394 dw 3408,3420,3432,3444,3454,3464,3472,3482,3490,3498,3504,3512,3518,3524,3530,3536 dw 3542,3546,3550,3556,3560,3564,3566,3570,3574,3574 note_freq_ptrs_5 = * dw 0,324,510,686,850,1006,1154,1292,1424,1548,1664,1774,1878,1976,2070,2156 dw 2240,2318,2390,2460,2526,2588,2646,2702,2754,2802,2848,2892,2934,2972,3010,3044 dw 3076,3108,3138,3164,3190,3216,3238,3260,3280,3300,3318,3336,3352,3368,3382,3396 dw 3410,3422,3434,3444,3454,3464,3474,3482,3490,3498,3506,3512,3520,3526,3532,3536 dw 3542,3546,3552,3556,3560,3564,3568,3570,3574,3574 note_freq_ptrs_6 = * dw 0,348,532,706,870,1026,1172,1310,1440,1562,1678,1788,1892,1988,2080,2168 dw 2250,2326,2400,2468,2534,2596,2654,2708,2760,2808,2854,2898,2938,2978,3014,3048 dw 3080,3112,3140,3168,3194,3218,3242,3262,3284,3302,3320,3338,3354,3370,3384,3398 dw 3410,3424,3436,3446,3456,3466,3474,3484,3492,3500,3506,3514,3520,3526,3532,3538 dw 3542,3548,3552,3556,3560,3564,3568,3572,3574,3574 note_freq_ptrs_7 = * dw 0,372,556,728,892,1044,1190,1326,1456,1578,1692,1802,1904,2000,2092,2178 dw 2260,2336,2408,2478,2542,2602,2660,2714,2766,2814,2860,2902,2944,2982,3018,3052 dw 3084,3116,3144,3172,3196,3220,3244,3266,3286,3306,3324,3340,3356,3372,3386,3400 dw 3412,3424,3436,3448,3458,3468,3476,3484,3492,3500,3508,3514,3520,3526,3532,3538 dw 3544,3548,3552,3556,3560,3564,3568,3572,3574,3574 note_freq_ptrs_8 = * dw 0,0,204,396,578,750,912,1064,1208,1344,1472,1592,1708,1814,1916,2012 dw 2104,2188,2272,2348,2420,2488,2552,2612,2668,2722,2772,2820,2866,2908,2950,2988 dw 3024,3058,3090,3120,3148,3176,3200,3224,3248,3268,3288,3308,3326,3342,3358,3374 dw 3388,3402,3416,3428,3438,3448,3458,3468,3478,3486,3494,3502,3508,3516,3522,3528 dw 3534,3540,3544,3548,3554,3558,3562,3566,3568,3568 note_freq_ptrs_9 = * dw 0,28,230,422,602,772,932,1084,1226,1362,1488,1608,1722,1828,1928,2024 dw 2114,2198,2278,2356,2426,2494,2558,2618,2674,2728,2778,2826,2870,2914,2954,2992 dw 3028,3060,3092,3122,3152,3178,3204,3228,3250,3270,3290,3310,3328,3344,3360,3376 dw 3390,3404,3416,3428,3440,3450,3460,3470,3478,3486,3494,3502,3510,3516,3522,3528 dw 3534,3540,3544,3550,3554,3558,3562,3566,3568,3568 note_freq_ptrs_a = * dw 0,52,254,444,622,810,950,1100,1242,1376,1502,1622,1734,1840,1940,2036 dw 2124,2210,2288,2364,2434,2502,2564,2624,2680,2734,2784,2832,2876,2918,2958,2996 dw 3032,3064,3096,3126,3154,3182,3206,3230,3252,3274,3294,3312,3330,3346,3362,3378 dw 3392,3406,3418,3430,3442,3452,3462,3472,3480,3488,3496,3504,3510,3516,3524,3530 dw 3536,3540,3546,3550,3554,3558,3562,3566,3570,3570 note_freq_ptrs_b = * dw 0,80,280,468,646,812,972,1120,1260,1394,1520,1638,1750,1854,1952,2046 dw 2136,2220,2298,2372,2444,2510,2572,2632,2688,2740,2790,2838,2882,2924,2964,3000 dw 3036,3068,3100,3130,3158,3184,3210,3232,3254,3276,3296,3314,3332,3348,3364,3378 dw 3392,3406,3420,3432,3442,3452,3462,3472,3480,3490,3496,3504,3512,3516,3524,3530 dw 3536,3540,3546,3550,3554,3560,3562,3566,3570,3570 note_freq_ptrs_c = * dw 0,104,302,490,666,832,988,1138,1278,1410,1534,1652,1762,1866,1964,2058 dw 2146,2230,2308,2382,2452,2518,2580,2640,2694,2746,2796,2844,2888,2928,2968,3004 dw 3040,3072,3104,3134,3162,3188,3212,3236,3258,3278,3298,3316,3334,3350,3366,3382 dw 3394,3408,3420,3432,3444,3454,3464,3474,3482,3490,3498,3506,3512,3518,3524,3530 dw 3536,3542,3546,3552,3556,3560,3564,3568,3570,3570 note_freq_ptrs_d = * dw 0,128,326,510,686,852,1006,1154,1294,1424,1548,1664,1774,1878,1976,2070 dw 2156,2240,2318,2390,2460,2526,2588,2646,2702,2754,2802,2848,2892,2934,2972,3010 dw 3044,3076,3108,3138,3164,3190,3216,3238,3260,3280,3300,3318,3336,3352,3368,3382 dw 3396,3410,3422,3434,3444,3454,3464,3474,3482,3490,3498,3506,3512,3518,3526,3532 dw 3536,3542,3546,3552,3556,3560,3564,3568,3570,3570 note_freq_ptrs_e = * dw 0,156,352,536,710,874,1028,1174,1312,1442,1564,1680,1790,1892,1988,2080 dw 2168,2250,2326,2400,2468,2534,2596,2654,2708,2760,2808,2854,2898,2938,2978,3014 dw 3048,3080,3112,3140,3168,3194,3218,3242,3262,3284,3302,3320,3338,3354,3370,3384 dw 3398,3412,3424,3436,3444,3456,3464,3474,3484,3492,3500,3506,3514,3520,3526,3532 dw 3536,3542,3548,3552,3556,3560,3564,3568,3572,3572 note_freq_ptrs_f = * dw 0,180,374,558,730,892,1046,1190,1328,1456,1578,1694,1802,1904,2000,2092 dw 2178,2260,2336,2408,2478,2542,2602,2660,2714,2766,2814,2860,2902,2944,2982,3018 dw 3052,3084,3116,3144,3172,3196,3222,3244,3266,3286,3306,3324,3340,3356,3372,3386 dw 3400,3412,3424,3436,3446,3458,3466,3476,3484,3492,3500,3508,3514,3520,3526,3532 dw 3538,3544,3548,3552,3556,3560,3564,3568,3572,3572 max_freq_ptr = 146 note_freq_ptrs_offset = * dw note_freq_ptrs_0-note_freq_ptrs dw note_freq_ptrs_1-note_freq_ptrs dw note_freq_ptrs_2-note_freq_ptrs dw note_freq_ptrs_3-note_freq_ptrs dw note_freq_ptrs_4-note_freq_ptrs dw note_freq_ptrs_5-note_freq_ptrs dw note_freq_ptrs_6-note_freq_ptrs dw note_freq_ptrs_7-note_freq_ptrs dw note_freq_ptrs_8-note_freq_ptrs dw note_freq_ptrs_9-note_freq_ptrs dw note_freq_ptrs_a-note_freq_ptrs dw note_freq_ptrs_b-note_freq_ptrs dw note_freq_ptrs_c-note_freq_ptrs dw note_freq_ptrs_d-note_freq_ptrs dw note_freq_ptrs_e-note_freq_ptrs dw note_freq_ptrs_f-note_freq_ptrs waveforms dw 0,2048,4096,4096 ;random=square in protracker! sine_tbl = * dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,0,0,0,0,0 dw 0,0,0,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,0,0,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,0,0 dw 0,0,2,2,2,2,4,4,4,4,4,6,6,6,6,6,6,6,6,6,6,6,4,4,4,4,4,2,2,2,2,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffc,$fffc,$fffc,$fffc,$fffc,$fffe,$fffe,$fffe,$fffe,0 dw 0,0,2,2,4,4,4,6,6,6,6,8,8,8,8,8,8,8,8,8,8,8,6,6,6,6,4,4,4,2,2,0,0,0,$fffe,$fffe,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fffa,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fffa,$fffa,$fffa,$fffa,$fffc,$fffc,$fffc,$fffe,$fffe,0 dw 0,0,2,2,4,4,6,6,8,8,8,8,$a,$a,$a,$a,$a,$a,$a,$a,$a,8,8,8,8,6,6,4,4,2,2,0,0,0,$fffe,$fffe,$fffc,$fffc,$fffa,$fffa,$fff8,$fff8,$fff8,$fff8,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff8,$fff8,$fff8,$fff8,$fffa,$fffa,$fffc,$fffc,$fffe,$fffe,0 dw 0,2,2,4,4,6,6,8,8,$a,$a,$a,$c,$c,$c,$c,$c,$c,$c,$c,$c,$a,$a,$a,8,8,6,6,4,4,2,2,0,$fffe,$fffe,$fffc,$fffc,$fffa,$fffa,$fff8,$fff8,$fff6,$fff6,$fff6,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff6,$fff6,$fff6,$fff8,$fff8,$fffa,$fffa,$fffc,$fffc,$fffe,$fffe dw 0,2,2,4,6,6,8,8,$a,$a,$c,$c,$c,$e,$e,$e,$e,$e,$e,$e,$c,$c,$c,$a,$a,8,8,6,6,4,2,2,0,$fffe,$fffe,$fffc,$fffa,$fffa,$fff8,$fff8,$fff6,$fff6,$fff4,$fff4,$fff4,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff4,$fff4,$fff4,$fff6,$fff6,$fff8,$fff8,$fffa,$fffa,$fffc,$fffe,$fffe dw 0,2,4,4,6,8,8,$a,$c,$c,$e,$e,$e,$10,$10,$10,$10,$10,$10,$10,$e,$e,$e,$c,$c,$a,8,8,6,4,4,2,0,$fffe,$fffc,$fffc,$fffa,$fff8,$fff8,$fff6,$fff4,$fff4,$fff2,$fff2,$fff2,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff2,$fff2,$fff2,$fff4,$fff4,$fff6,$fff8,$fff8,$fffa,$fffc,$fffc,$fffe dw 0,2,4,6,6,8,$a,$c,$c,$e,$e,$10,$10,$12,$12,$12,$12,$12,$12,$12,$10,$10,$e,$e,$c,$c,$a,8,6,6,4,2,0,$fffe,$fffc,$fffa,$fffa,$fff8,$fff6,$fff4,$fff4,$fff2,$fff2,$fff0,$fff0,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$fff0,$fff0,$fff2,$fff2,$fff4,$fff4,$fff6,$fff8,$fffa,$fffa,$fffc,$fffe dw 0,2,4,6,8,$a,$c,$c,$e,$10,$10,$12,$12,$14,$14,$14,$14,$14,$14,$14,$12,$12,$10,$10,$e,$c,$c,$a,8,6,4,2,0,$fffe,$fffc,$fffa,$fff8,$fff6,$fff4,$fff4,$fff2,$fff0,$fff0,$ffee,$ffee,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffee,$ffee,$fff0,$fff0,$fff2,$fff4,$fff4,$fff6,$fff8,$fffa,$fffc,$fffe dw 0,2,4,6,8,$a,$c,$e,$10,$12,$12,$14,$14,$16,$16,$16,$16,$16,$16,$16,$14,$14,$12,$12,$10,$e,$c,$a,8,6,4,2,0,$fffe,$fffc,$fffa,$fff8,$fff6,$fff4,$fff2,$fff0,$ffee,$ffee,$ffec,$ffec,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffec,$ffec,$ffee,$ffee,$fff0,$fff2,$fff4,$fff6,$fff8,$fffa,$fffc,$fffe dw 0,2,4,6,$a,$c,$e,$10,$10,$12,$14,$16,$16,$16,$18,$18,$18,$18,$18,$16,$16,$16,$14,$12,$10,$10,$e,$c,$a,6,4,2,0,$fffe,$fffc,$fffa,$fff6,$fff4,$fff2,$fff0,$fff0,$ffee,$ffec,$ffea,$ffea,$ffea,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffea,$ffea,$ffea,$ffec,$ffee,$fff0,$fff0,$fff2,$fff4,$fff6,$fffa,$fffc,$fffe dw 0,2,6,8,$a,$c,$e,$10,$12,$14,$16,$16,$18,$18,$1a,$1a,$1a,$1a,$1a,$18,$18,$16,$16,$14,$12,$10,$e,$c,$a,8,6,2,0,$fffe,$fffa,$fff8,$fff6,$fff4,$fff2,$fff0,$ffee,$ffec,$ffea,$ffea,$ffe8,$ffe8,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe8,$ffe8,$ffea,$ffea,$ffec,$ffee,$fff0,$fff2,$fff4,$fff6,$fff8,$fffa,$fffe dw 0,2,6,8,$a,$e,$10,$12,$14,$16,$18,$18,$1a,$1a,$1c,$1c,$1c,$1c,$1c,$1a,$1a,$18,$18,$16,$14,$12,$10,$e,$a,8,6,2,0,$fffe,$fffa,$fff8,$fff6,$fff2,$fff0,$ffee,$ffec,$ffea,$ffe8,$ffe8,$ffe6,$ffe6,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe6,$ffe6,$ffe8,$ffe8,$ffea,$ffec,$ffee,$fff0,$fff2,$fff6,$fff8,$fffa,$fffe dw 0,2,6,8,$c,$e,$10,$14,$16,$18,$18,$1a,$1c,$1c,$1e,$1e,$1e,$1e,$1e,$1c,$1c,$1a,$18,$18,$16,$14,$10,$e,$c,8,6,2,0,$fffe,$fffa,$fff8,$fff4,$fff2,$fff0,$ffec,$ffea,$ffe8,$ffe8,$ffe6,$ffe4,$ffe4,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe4,$ffe4,$ffe6,$ffe8,$ffe8,$ffea,$ffec,$fff0,$fff2,$fff4,$fff8,$fffa,$fffe ramp_tbl = * dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe dw 4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc dw 6,6,6,6,6,6,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fffa,$fffa dw 8,8,8,8,8,6,6,6,6,6,6,6,6,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fff8,$fff8,$fff8,$fff8 dw $a,$a,$a,$a,8,8,8,8,8,8,6,6,6,6,6,6,6,4,4,4,4,4,4,2,2,2,2,2,2,0,0,0,0,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff6,$fff6,$fff6 dw $c,$c,$c,$a,$a,$a,$a,$a,$a,8,8,8,8,8,6,6,6,6,6,4,4,4,4,4,4,2,2,2,2,2,0,0,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fffa,$fffa,$fff8,$fff8,$fff8,$fff8,$fff8,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff4,$fff4 dw $e,$e,$e,$c,$c,$c,$c,$a,$a,$a,$a,$a,8,8,8,8,8,6,6,6,6,4,4,4,4,4,2,2,2,2,0,0,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fffa,$fff8,$fff8,$fff8,$fff8,$fff8,$fff6,$fff6,$fff6,$fff6,$fff6,$fff4,$fff4,$fff4,$fff4,$fff2,$fff2 dw $10,$10,$10,$e,$e,$e,$e,$c,$c,$c,$c,$a,$a,$a,$a,8,8,8,8,6,6,6,6,4,4,4,4,2,2,2,2,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fffa,$fff8,$fff8,$fff8,$fff8,$fff6,$fff6,$fff6,$fff6,$fff4,$fff4,$fff4,$fff4,$fff2,$fff2,$fff2,$fff2,$fff0,$fff0 dw $12,$12,$10,$10,$10,$10,$e,$e,$e,$c,$c,$c,$c,$a,$a,$a,$a,8,8,8,6,6,6,6,4,4,4,2,2,2,2,0,0,0,$fffe,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fffa,$fff8,$fff8,$fff8,$fff6,$fff6,$fff6,$fff6,$fff4,$fff4,$fff4,$fff4,$fff2,$fff2,$fff2,$fff0,$fff0,$fff0,$fff0,$ffee dw $14,$14,$12,$12,$12,$10,$10,$10,$10,$e,$e,$e,$c,$c,$c,$a,$a,$a,8,8,8,6,6,6,6,4,4,4,2,2,2,0,0,0,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fffa,$fff8,$fff8,$fff8,$fff6,$fff6,$fff6,$fff4,$fff4,$fff4,$fff2,$fff2,$fff2,$fff0,$fff0,$fff0,$fff0,$ffee,$ffee,$ffee,$ffec dw $16,$16,$14,$14,$14,$12,$12,$12,$10,$10,$10,$e,$e,$e,$c,$c,$c,$a,$a,8,8,8,6,6,6,4,4,4,2,2,2,0,0,0,$fffe,$fffe,$fffe,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fff8,$fff8,$fff8,$fff6,$fff6,$fff4,$fff4,$fff4,$fff2,$fff2,$fff2,$fff0,$fff0,$fff0,$ffee,$ffee,$ffee,$ffec,$ffec,$ffec,$ffea dw $18,$18,$16,$16,$16,$14,$14,$12,$12,$12,$10,$10,$10,$e,$e,$c,$c,$c,$a,$a,$a,8,8,6,6,6,4,4,4,2,2,0,0,0,$fffe,$fffe,$fffc,$fffc,$fffc,$fffa,$fffa,$fffa,$fff8,$fff8,$fff6,$fff6,$fff6,$fff4,$fff4,$fff4,$fff2,$fff2,$fff0,$fff0,$fff0,$ffee,$ffee,$ffee,$ffec,$ffec,$ffea,$ffea,$ffea,$ffe8 dw $1a,$1a,$18,$18,$16,$16,$16,$14,$14,$12,$12,$12,$10,$10,$e,$e,$e,$c,$c,$a,$a,8,8,8,6,6,4,4,4,2,2,0,0,0,$fffe,$fffe,$fffc,$fffc,$fffc,$fffa,$fffa,$fff8,$fff8,$fff8,$fff6,$fff6,$fff4,$fff4,$fff2,$fff2,$fff2,$fff0,$fff0,$ffee,$ffee,$ffee,$ffec,$ffec,$ffea,$ffea,$ffea,$ffe8,$ffe8,$ffe6 dw $1c,$1c,$1a,$1a,$18,$18,$16,$16,$16,$14,$14,$12,$12,$10,$10,$e,$e,$e,$c,$c,$a,$a,8,8,8,6,6,4,4,2,2,0,0,0,$fffe,$fffe,$fffc,$fffc,$fffa,$fffa,$fff8,$fff8,$fff8,$fff6,$fff6,$fff4,$fff4,$fff2,$fff2,$fff2,$fff0,$fff0,$ffee,$ffee,$ffec,$ffec,$ffea,$ffea,$ffea,$ffe8,$ffe8,$ffe6,$ffe6,$ffe4 dw $1e,$1e,$1c,$1c,$1a,$1a,$18,$18,$16,$16,$14,$14,$12,$12,$10,$10,$10,$e,$e,$c,$c,$a,$a,8,8,6,6,4,4,2,2,0,0,0,$fffe,$fffe,$fffc,$fffc,$fffa,$fffa,$fff8,$fff8,$fff6,$fff6,$fff4,$fff4,$fff2,$fff2,$fff0,$fff0,$fff0,$ffee,$ffee,$ffec,$ffec,$ffea,$ffea,$ffe8,$ffe8,$ffe6,$ffe6,$ffe4,$ffe4,$ffe2 square_tbl = * dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe,$fffe dw 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc,$fffc dw 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa,$fffa dw 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8,$fff8 dw $a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6,$fff6 dw $c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$c,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4,$fff4 dw $e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2,$fff2 dw $10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0,$fff0 dw $12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee,$ffee dw $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec,$ffec dw $16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$16,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea,$ffea dw $18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8,$ffe8 dw $1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6,$ffe6 dw $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4,$ffe4 dw $1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2,$ffe2 pattern_break_ptrs = * dfb 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0 dfb 10,11,12,13,14,15,16,17,18,19,0,0,0,0,0,0 dfb 20,21,22,23,24,25,26,27,28,29,0,0,0,0,0,0 dfb 30,31,32,33,34,35,36,37,38,39,0,0,0,0,0,0 dfb 40,41,42,43,44,45,46,47,48,49,0,0,0,0,0,0 dfb 50,51,52,53,54,55,56,57,58,59,0,0,0,0,0,0 dfb 60,61,62,63,0,0,0,0,0,0,0,0,0,0,0,0 dfb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dfb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dfb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dfb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dfb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dfb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dfb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dfb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dfb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 bpm_to_freq = * dw 64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94 dw 96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,125 dw 127,129,131,133,135,137,139,141,143,145,147,149,151,153,155,157 dw 159,161,163,165,167,169,171,173,175,177,179,181,183,185,187,189 dw 191,193,195,197,199,201,203,205,207,209,211,213,215,217,219,221 dw 223,225,227,229,231,233,235,237,239,241,243,245,247,249,251,253 dw 255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,285 dw 287,289,291,293,295,297,299,301,303,305,307,309,311,313,315,317 dw 319,321,323,325,327,329,331,333,335,337,339,341,343,345,347,349 dw 351,353,355,357,359,361,363,365,367,369,371,372,374,376,378,380 dw 382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412 dw 414,416,418,420,422,424,426,428,430,432,434,436,438,440,442,444 dw 446,448,450,452,454,456,458,460,462,464,466,468,470,472,474,476 dw 478,480,482,484,486,488,490,492,494,496,498,500,502,504,506,508 reg_tbl_freqhi = * dw 32,34,36,38,40,42,44,46,48,50,52,54,56,58,60 reg_tbl_vol = * dw 64,66,68,70,72,74,76,78,80,82,84,86,88,90,92 reg_tbl_ptr = * dw 128,130,132,134,136,138,140,142,144,146,148,150,152,154,156 reg_tbl_ctl = * dw 160,162,164,166,168,170,172,174,176,178,180,182,184,186,188 reg_tbl_siz = * dw 192,194,196,198,200,202,204,206,208,210,212,214,216,218,220 ;-------------------------- zero_out_begin = * ;for init, we're writing zeros from here ptr_header ds 4 ;pointer to file start ptr_notes ds 4 ;pointer to music notes ptr_instruments ds 4 ;pointer to instrument start play_song_once dw 0 ;0=loop song, else do stop song after one play number_of_tracks dw 0 ;1-15 number_of_instruments dw 0 ;1-255 number_of_patterns dw 0 ;1-255 pattern_length dw 0 ;pattern length in bytes (=4 bytes x number_of_tracks x 64, can be 3584 bytes max.) track_channels ds max_tracks_available*2 ;1 word of stereo setting for each track pattern_order_length dw 0 ;how many entries there are in pattern_order pattern_order ds 256 ;in which order the patterns should be played instrument_types ds 512 ;1 word per instrument instrument_lengths ds 512 instrument_volumes ds 512 instrument_finetune ds 512 ;instrument finetune value * 2 instrument_osc_a_ptr ds 512 instrument_osc_b_ptr ds 512 instrument_osc_a_siz ds 512 instrument_osc_b_siz ds 512 instrument_osc_a_ctl ds 512 instrument_osc_b_ctl ds 512 copy_instrument_length dw 0 pattern_pointers ds 1024 ;for every pattern, calculate the offset into memory number_of_tracks2 dw 0 ;number of tracks x 2 number_of_instruments2 dw 0 ;number_of_instruments x 2 number_of_tracks4 dw 0 ;number of tracks x 4 = number of bytes in a pattern line backup_interrupt_ptr ds 4 playing dw 0 ;0=not playing, 1=playing tempo dw 0 timer dw 0 pattern_jump dw 0 ;0=no jump, 2=pattern_jump_param has next songpos, 4=pattern_jump_param has next pointer in pattern pattern_jump_param dw 0 force_pattern_jump dw 0 ;0=no jump, else force jump on next occasion force_pattern_jump_p dw 0 ;jump to this songpos loop_position dw 0 ;position where to jump to in the current frame loop_repeat_count dw 0 ;number of times the loop should be repeated loop_position_active dw 0 ;0=loop not running, else=loop running loop_position_jump dw 0 ;$ffff=no position jump, else=jump to this position pattern_order_ptr dw 0 ;current position in the pattern order ptr_within_pattern dw 0 ;offset in bytes to current line in the pattern note dw 0 ;read note*2 sample dw 0 ;read sample*2 effect dw 0 ;read effect*2 effect_param dw 0 ;just the effect parameter oscillator dw 0 osc_interrupt_freq dw 0 new_osc_interrupt_freq dw 0 delay_pattern dw 0 ;after the current line, do a delay of X rows what_to_do ds max_tracks_available*2 ;what to send to the shound chip (bit field) ;the last line that we got from the pattern curr_note ds max_tracks_available*2 ;note number * 2 curr_sample ds max_tracks_available*2 ;sample number * 2 curr_effect ds max_tracks_available*2 ;effect number * 2 curr_e_effect ds max_tracks_available*2 ;e-effect number * 2 curr_ptrfinetune ds max_tracks_available*2 ;ptr into the big finetune table curr_volume ds max_tracks_available*2 ;the volume for this track (0-64) arpeggio_ptr ds max_tracks_available*2 ;when 0, arpeggio is off, $8000=note 1, $8001=note 2, $8003=note 3 arpeggio_note1 ds max_tracks_available*2 arpeggio_note2 ds max_tracks_available*2 arpeggio_note3 ds max_tracks_available*2 slide_delta ds max_tracks_available*2 slide_target ds max_tracks_available*2 slide_target_note ds max_tracks_available*2 vibrato_tableoffset ds max_tracks_available*2 vibrato_table ds max_tracks_available*2 vibrato_rate ds max_tracks_available*2 vibrato_pos ds max_tracks_available*2 vibrato_retrig ds max_tracks_available*2 tremolo_tableoffset ds max_tracks_available*2 tremolo_table ds max_tracks_available*2 tremolo_rate ds max_tracks_available*2 tremolo_pos ds max_tracks_available*2 tremolo_retrig ds max_tracks_available*2 volslide_delta ds max_tracks_available*2 retrigger_steps ds max_tracks_available*2 retrigger_count ds max_tracks_available*2 note_cut ds max_tracks_available*2 note_delay_count ds max_tracks_available*2 note_delay_note ds max_tracks_available*2 osc_freq ds max_tracks_available*2 osc_volume ds max_tracks_available*2 osc_instrument ds max_tracks_available*2 glissando ds max_tracks_available*2 ;0=no glissando, 1=glissando last_effect_8_param dw 0 vu_number_of_tracks dw 0 vu_data  첲 퍪 Ь 퍪 򍪍 𯲰捉썉첲썍剴剴󍉍 첲쉽Ű퉤Í󉴍󉴍󉴍󉲍󉴍󉲍󉴍󉲍䍍ljűðōűðč̉űðÍ􉽉쫤􉉽쫤퉉쫤㉉쫤􉽉쫤򉽉쫤㉽쫤􉽉쫤剉쫤Í򠼼寴𭱉󭱉㭱 㭱 㭱 㭱 Í譱 č譱 ō譱 ƍ㭱 譱 խ 㭱 㭱 占㠢 㠢 㠢 㠢 𭲰 荠፠獠獠젤ű ˍᠣƉ֠󠣤ƍ㍠ᠣ牻占獠牻֠㍠썍 ˍ㍠獠獍ᠣ獍𠤳鍍̍젤ű䠣ƍ̍፠㍠㠣Ǎؠ ፠㍠㠣Ǎ󫱬؍ ᠻ ㍠㠣Ǎᠣ߰  ፠㍠㠣Ǎᠣ߰ᠣ㍠썍󠳲 ˍ㍠ᠣ砽獠獍ᠣ獍𠤳鍍̍젤ű䠣ƍ̍፠㍠㠣Ǎ؍ᠣ獠㍠썍 ˍᠷӠ 䍠䍠ᠵӍᠷӍᠳӍᠵӍᠱӍᠳӍ፠ᠣ砽ᠣ㍠썍⍠䍠鍠덠⍍፠፠ᠤᠤ 䍠፠ᠤðᠤᠤ占፠፠㍠㍠㠣㍠䍠ۤݍ占ᠤ썠ᠤ첍㍠㍠㠣ᠣ堽䍠ᠣ砻 獠ᠣƍ㍍ᠣ䍠⍠鍠𠣱썍⍠䍠鍠덠⍍獠􍍠占䍍㍠𠣤ƍ㉻ҍ㍠㍍ᠣ철ᠣ젽占􉻠֠ 䍠⍠㍠썍󠲍 ˍᠣᠷӍᠣ㍠썍 ˍ獠ᠷӍᠣ㍠썍 ˍՍᠣ፠ᠷᠣ፠ᠹ󍍠ᠣ㍠썍 ˍ㍠獠㍠𠣤ƍ㉻̍䍠占䍠򫲍ᠣ㍠썍 ˍ㍠鍠𠤳ᠣ獠ᠣƍ㍍㍠쉻Ӎ ˍӯ 첲  卪 퍪 첱 Ь 퍪 򍪍捠썠ӱ첲̍捍場場場첲場󍍪 첲ΠՠűӠՠűÍōРˍР̰̠űðōРƸà̰̠űð̠űð̰ƫ̠űð̠űð̠űðРؠ̰̠ű؍؍؍̠̰ؠư̰̠űŰ؍ƍ̠űűŬ؍̰Šư̠űűì؍Íà؍Íàؠà̰Рؠ̰ҍ̠űĴ؍؍ؠà̰РؠҠ̰ijàÍà ̲ĸčàÍà ҮčàÍàč Ϯ̮č Ϯ Ůčà Ů čà é čà Ů̠΍̰ñƵÍ⠤ḭ̀ƍ̠΍̠Ϋ̰ø̰ƍ̠ΫР̰̠űðōРƸà̰ñ̠űð̠űðĠč̠űð̠űðРŠ ֍썠à̰ؠ̰٠̰̠̰̰Ҡ 첲 ̰ čà̰̠̰̰̰Ŵ̰Ҡ̰Ḭ́ŴḬٍٍ́̍̍Ҡ̰ƍ̰̰ŴḬٍٍ̰̰́̍̍Ŵ荠РŠ̰ؠųҠ̰ijàÍà ˮР̠űð̰ų̠űð̠̰ųРؠųҠ̰ijà ̰̰Рà̰ؠ̰٠̰̠̰̰Ҡ ̰Ҡ̰̰Ŵà̰Ŵٍٍ̰̍̍РƍѠ̰̠̰̰̰Ŵ̰«ؠðҠ̰ijà ÍàѢÍà ÍàŢÍà âà̰̠̰̰ÍÍàӍčÍč̰̰īčÍÍàӍؠҠ̰ijà խҮР̠űð̠űð̠űð̠ű÷Р̰Ŵ̰Ŵ荠à̰Ƴ̠̰̰ƳҠ̰Ս㍠à̰̠̰̰㍠̠űƍ̠̰Р̠űð̠űðРĠƍРà̰РѠ̰𠣤汍̰ƍРıŠ̰Ѡ̰ƍ̰Ҡ̰̰ŴḬ́ РŠ̰̰̰Ŵ̠̰Ŵ̰Ҡ̰Ҡ̰ijàÍà Ӎ̰àҠ̰Ҡ̰ijàÍà ÍàӍ̰Ҡ̰Ҡ̰ijàÍà Ӎ̰̰ŴÍ̍̍̍Íàč̍̍̍̍̍̍̍ÍàӍ؍؍Ӎ̰ƠР̰̠űðōРƸà̰̠űð̰Ơ̠űð̠űðĠč̠űðР̰ñ̠΍̰ø̠Ϋà̰̠̰̰ ̠Ӎנ̠̰ŵ̰ŵ̠占נ󍍠ˠ̰ĠנננðנננŰנננưנŶנðנIJנøנŰנ´ננננðנננŰנננננðנננŰנננ̰ƠӠ̰ƠˍРɠɠ̰̰Ġ٠̰̰ƬٍРۤݬٍѠ̰Ӡ̰ҍҍҍۤݬٍҍҍҍḬ́ƫ̰à̍؍̍Íà̰Ĭ؍؍̠űì؍Ḭ́ƠРà̰Ḭ̰́ҍҍĠō؍̍Íà̰Ĭ؍؍̠űì؍̰ۤݬٍ̰ƬٍÍàӠ̰¸̰¸ۤݬٍٍٍ̠̰Р̠űðĠƍ̠űðÍ̍ؠ ֲՍ ֲ ̰Ƭ٠ՠᠣ̍؍̍Íà̰Ĭ؍؍̠űì؍ÍРàՍ̰ij̰ŹҠ̰ų̰ŹӍ̰ƠḬ́Ź̰ųؠ̰ƫ̰Ŷà̰Ź̰ŹٍĠƍѠ̰РÍѠ̰РčѠ̰ƍҠ̰̰Ŷ̰Р̰Рà̰Ź̰Ŷ̰ƠÍà؍̰ų̰Ӎ̰Íà̍̍̍Íà̰̰ḭ̄ ؍̰Ġà̰ī٠ٍ̰٠ԠѠ̰٠ƍ̰ԠѠ̰čưٍ̰ĠР̰Ġƍ̠ű؍Р؍ҍҍٍٍŠ̰Íà؍ÍŠ̰ÍàÍ؍Ӎ̰ؠؠŲŲؠűųųŰŲؠؠððóóðؠűűؠðŰؠðؠŶŰؠŶŰŰŶŰؠŶŰŶŰؠŰŶŰŶðؠŶŶŰŶŶؠðؠñŰŰؠñðŲؠƳƳƳƳƳƳƳưöŶؠŶŶŰððؠŶŰŰŰŰؠŰŰððؠŶűŰؠŰųؠŰŷŶؠŷŷöðؠŶŰöðؠŶųðöŰؠűðؠñŶؠñöñؠŶŰŰŰؠűŰóðؠűŰؠ̰̰č̰̰ƍ̰Ḭ́ƍ̰̰č̰Ḭ́ōנƍ̰ƠҠЧ̰ƠҠЧ̰ĠҠSCRIPT V1.10 RR File System: NinjaTrackerPlus Toolset The script File System: NinjaTrackerPlus Toolset installs the files necessary for you to use NinjaTrackerPlus module toolset player with your applications. The selected disk must be a startup disk.\\ ~* ~:::Workspace::: 1 System:Tools:Tool222 System:Tools:Tool222 ~~ TOOLSv'' k''TOOL222](f.%0%㍠獠፠ᠷᠣ㍠썍 ˍ㍠ᠣ㠽ᠷᠣ㍠썍 ˍ荠⍠덠⍠䍠占䍠獠촍ᠣᠣᠣ촠ᠱӍ荠򍍠㍠썠썠썠 썠􍍠ᠱӠ 荠ᠱӍ占ᠤᠤᠣ䍠⍠ᠵӍᠱӍᠳӍᠹӍᠱӍᠷӍ፠፠፠፠𠣱썍 ˍ荠⍠덠⍠䍠占䍍獠춍ᠣ춠ᠱ썍荠䱍򱍠ᠣ㱍ᠣ㍠썠썍䱠㍠썠썠썠 썠㱍ᠤᠤۤݍ㍠ۤݬ򫲍㍍㉻ҍ򫲍㍠頤 塍頤占򍍠፠፠占䍍썠쫲獍㉻ҍ򫲍獠㍍䍠ᠣ䍠⍠ᠵᠷᠳᠵᠱᠳ፠፠𠣱썍 ˍ荠⍠덠⍠䍠占䍠獠췍ᠣ췠㉻ҍᠱᠱ򫲍ݬ𠣤ƍ㍠썠썠썠 썠ᠣ􍍠ݍ፠ō젤űĩᠤō젤ű䩍򍍠ᠣ䍠⍠ᠵᠹᠳᠷᠱᠵ፠፠፠𠣱썍 ˍ荠⍠덠⍠䍠占䍍獠쵍ᠣ쵠㉻ҍᠱ򰍠荠򰍠ᠣ㍠ᠣ㍠䍠㍠썠썠썠 썠㍍ᠱ􍍠㍍ᠤᠤۤݍۤݬ򫲍ᠣ䍠⍠ᠵᠷᠳᠵᠱᠳ፠፠𠣱썍 ˍ㍠⍠덠⍠䍠占䍍獠쳍ᠣ쳠㠻 ㍠㍍򫲍ᠱӠ 荠ᠱӍ占ᠤ썠ᠤ쫲ᠤᠤ򫲍􍍠ᠣ䍠⍍ᠵᠹᠳᠷᠱᠵ፠፠፠𠣱썍 ˍ㍠⍠䍠덠⍍占䍍獠첍ᠣ철򫲍岍󲍠ᠣ퍠岠獍򫲍占󲍍ᠣ㍍ᠱ򠣱ᠣ䍠⍠ᠵᠷᠳᠵᠱᠳ፠፠𠣱썍 󍍠㍠썠쫲㍍쫲썠占썠쫲㍠󍍪 󍍠㍠ᠤᠤ㍠ᠤ፠ᠤ፠占፠㍠㠣𠣤󍍪 󍍠젤ű젤ű捠፠占፠㍠捠፠፠፠፠䍠፠ᠤðᠤᠤ 占젤ű፠ᠤ፠ᠤۤݬٍۤݍᠤ젤ű 䍠占፠頤 占頤젤ű占፠㍠占젤ű 占젰젰젰 첲󍍪 ֩* NinjaTrackerPlus Tool * Ninjaforce, 2018 * Brutal Deluxe, 2018 * FTA, 1991 MACRO &lab _NTPBootInit &lab ldx #$01DE jsl $E10000 MEND MACRO &lab _NTPStartUp &lab ldx #$02DE jsl $E10000 MEND MACRO &lab _NTPShutDown &lab ldx #$03DE jsl $E10000 MEND MACRO &lab _NTPVersion &lab ldx #$04DE jsl $E10000 MEND MACRO &lab _NTPReset &lab ldx #$05DE jsl $E10000 MEND MACRO &lab _NTPStatus &lab ldx #$06DE jsl $E10000 MEND MACRO &lab _NTPLoadOneMusic &lab ldx #$09DE jsl $E10000 MEND MACRO &lab _NTPPlayMusic &lab ldx #$0ADE jsl $E10000 MEND MACRO &lab _NTPStopMusic &lab ldx #$0BDE jsl $E10000 MEND MACRO &lab _NTPGetEndOfMusic &lab ldx #$0CDE jsl $E10000 MEND MACRO &lab _NTPAddToBatch &lab ldx #$0DDE jsl $E10000 MEND MACRO &lab _NTPSelectBatch &lab ldx #$0EDE jsl $E10000 MEND MACRO &lab _NTPKillBatch &lab ldx #$0FDE jsl $E10000 MEND MACRO &lab _NTPGetPlayingMusic &lab ldx #$10DE jsl $E10000 MEND MACRO &lab _NTPPlayBatch &lab ldx #$11DE jsl $E10000 MEND MACRO &lab _NTPGetTrackVu &lab ldx #$12DE jsl $E10000 MEND MACRO &lab _NTPPauseMusic &lab ldx #$13DE jsl $E10000 MEND MACRO &lab _NTPContinueMusic &lab ldx #$14DE jsl $E10000 MEND ds max_tracks_available*2 zero_out_end = * ;for init, we're writing zeros until here 0K .A)4탩4"H" Hi hi0JG 0$ = Π̲ ӠҮ Π٠ŮéԠŠ̠٠̠Ů(\O\(** .)#)#h" "1!'첲ޢ" : I: HH "ELv = Ԡ͠ˮ  v =#M\堺  Gyv =Ӡ ϠԠҠ ϠŠHH"hh;8 [+;irB =ˠխҮ # #@ǝ "{  "fH "h  )ɀɠ rk  à = Ǡ` à = Ǡ ` à = `: i H c`0.)4#)#0(*"")"` @` @ `  @` @ K0l>(JJJHJJJ̈́hH }*KhJJ) }*Kl8hh02)ߏ2klH }*Kh 興`hT MTH`:TzT)' ɍ Tשi`8 iۅHڭZH ) hJJzhih:8`666&>&>&>>8>&8&&&88 8000&>&~ ~`0 ~fff~~`~~~`x`~ff~``~~`~~~f~~`0 ~f~f~~f~`` 0 0>> 0 > 8????????f>f>||>fff>~>~~>|f<ff~ff~~```f~f66f~f~~fffn~vff>f6f|<`>~ffff<fff<fff~ff<><000<>>Pj}':1/Music/Arnesune.NTP1/Music/BlowBlow.NTP1/Music/Conrad.NTP1/Music/SpiceItUp.NTPŠĭŠөננҩĠĠΩРҩHZ 4 "Fatal System Error : $z=5<FIьЈI=$=EMMHMhknty==),ruÏ=Ï=Ï=/"l͏**ll'*?TBMETKTNzQTgpuTۏPj}':п/0000 _STErr jsr Go_Close pla sec rts Go_Close jsl $E100A8 dw $14 ; Close adrl Params rts Params dw 0 Parm0 adrl 0 Parm1 adrl 0 adrl 0 *------------------------------------------------- Tool222 put ninjatrackerplus * End of code (AV) 卍ˠ첲Р 󍍠͠첲Ġ첲 č ),Wȷ)ȷ) פi ԩ)+hkN P  hhk q s  hhkSONG ȷOK8$`` ` "" "Zd d"`$ڵHHtt"5hi`"`"H h8`HHHHH "hh"H" h8`"`0`<>?0u ) i i  =  wiXew i iHHh:iPh:i> Պڊ iX~ ՊڊwӊՊڊw؊ڊ``` K0Ƃ[0<)<>==)>JRwJ <0 )=wi>=wi>7)= LiyyyͅLy0 ) yyLv L̒{ y { Ҋy)wJJJJ: WJ פy [ Ҋ)g ׊)Py } yy my} ׊H)JJJJm}<;¢h)m}<;â L y LH y y  ڪ}hL45>؏C ׊)H)JJJ ܌h)LیhLHy hףLHy ףhLIףL ׊)BH) h)JJJy 7WwףkW7y ףQ ׊Hy h) { *0 { y km#뢹Iף7 ׊) < y km#뢭Iף7 ׊)  ׊) Ɂ{Ly w <0 )ᮋ==  ׊Hy 7h)) y ף!)JJJy ף ׊Hy 7h)) y ף)JJJy ף ׊Hy h)) y ףw)JJJy ףW ׊)y ף75 ׊)@ 8?% ׊):}?%{Cw8y ?w <0 )ᮋ== Ly ?{Ly w <)==) =wi>==) =y )JJJJ:͇L i)g)y w )g)y w y e) ) ʥ̥)  g#)y w y { y km뢪k Nʀy 5J͋ 5 UJ͋ U <0 )ᭉ==wi >ᭊ==wi@>ᮋ==wi>ᭁ=ᭅ=wi>ᭂ=ᭆ=wi>ᭃ=y I =᭍ y 7 yyLv i%%@Li%}}{i) mWVy){%}ȷ) ),Wi )0+(k60d͝HC" "퀽dd A0yyLRJmymymyy 0) k}[ky y w<0 )᭕==wi >᭖==Lϕ0y L㔽}뢝뢽0# #뢞0# #뢞뢪k y w<0 )᭕==wi >᭖==L_y 7ry%kw}@ y w<0 )᭕==wi >᭖== y ?8ףNף}?Ɂף?y w?)u <0 )u==0yyL  #&*-148;?BFIMPTW[^beilpswz~ $0<HT`lx  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRSSSSSSSSSSTTTTTTTTTUUUUUUUUUUVVVVVVVVVWWWWWWWWWXXXXXXXXXYYYYYYYYYZZZZZZZZ[[[[[[[[[\\\\\\\\]]]]]]]]^^^^^^^^_______````````aaaaaaabbbbbbbcccccccdddddddeeeeeeeffffffggggggghhhhhhiiiiiiijjjjjjkkkkkkllllllmmmmmnnnnnnoooooopppppqqqqqqrrrrrssssstttttuuuuuvvvvvwwwwwxxxxxyyyyyzzzz{{{{{||||}}}}}~~~~      "#$%'()*,-.01245689;<=?@BCEFHJKMNPRSUWXZ\]_acefhjlnprtvxz|~  $(-16:?DINSX]bhmsy~dh@*\4Xz 8L`t(yQ=1)#%e%e%e%e                    >^</v/^/ //v//v/ v/$&/(/,*/0/4/8/<l/@/D/H/L/P'/T_/XO[[R[/{/s//)//)/// /./P/bƏ5U)07;OAB܊R'Y(rЯuЯssƏAݏ/w/s 5%55,A//s/6/I/M)/TƏs$/5/  яT$rƏvsAA"Ə&s0AkCƏsACݏ Ǐ,Ə0s:A=ݏI$/Nbl5/quяCǏƏsy{%}W&*׏=@)F/c/gN/o/sP/ /q/ /s% ( /0 /= E M P T W [  / / u @ w\ f Տ ڏ ~ Տ ڏ ӏ Տ ڏ ؏ ڏ Ə w! w+ 2 w< C wM 7[ ` ic yf yi yl q t y{ y y v ̏ { y { ҏ y w W ׏  y  [ ҏ ׏ y  } y  y y }  ׏( }1 8 }A ÏF K yP U [ y` e ym u x }} 4 5 鏍 > ؏ C   ⏷ ׏ ܏ ۏ y  ׏ y  ׏    ! ׏$ ' * 0 3 6 ׏F I S V y[ ` 7c Wf k wq t ׏w z  W 7 y ׏  ׏ y   {   { y k  #   ׏ 7 ׏y k##),׏/75׏<D׏SV{[^ybwuw׏y7y׏y׏׏y7 y׏(+y03׏9?׏CyKT]`yehn׏t}y׏׏y׏7׏%׏}%{wy?ww -03y8;?>{CFIyMw\wvwyigywgywy",58AFIʏLȌX[adgioryww~y{yk돡ky55UUww$/w9<GwQX_wipwwyy7yyv%%i%}}{ y&{)%,}8;FQWdg)CAyyRyyyyk[kyyw)w0;wEPϏUyZ_bfilqt#y#|돉##돖돝kywww_y7% k w#y(w9w@KwUbygl?px}׏׏?׏?yw?uwuyy%e   %e%e%e!#*w& ,@TOOL221 TOOL221 w&v^vvv&*l'_堪㩠嬠첱̠㩠򠱹㩠砪Ȯ堪젭堪쭲H["NINJATRACKER Tool Error : $s#)k#)m#0x<0)<i>==i>== i>=i>=б(k0#0x<0)<i>=(kh8k xKH "hh;8[;i5"U"#)0<i>=== `<>?=0,.\܏, .0<'">("=)<0""s+Xk xKsY[ A0<0)<᩾>===0,.  "H"w(+kksk5" k As [dd+kx0#)0<0)<i>=i>=(`kkK [s݀i݀d݀_ : $&(*ܣ $ ;" 2$& 5t$t&"  (*+  hhhk )  Hח  $ )::  h`K [s݂ ݂y݂s]: $&(*$t$&t& Add"r*t*H(t(H"Z " Add +hkK [s݀a A  : $&(*Ȁ݀-%CH" "+ hhkK [s݀Z A  ݀I݀D: $&(* C $&(*  +hkK [s݀a A dd $ M" " 4 5*" ! C "+ hhk K[s݂݂| #y"){"a%"}"ȷ) ")",W%ȷ)$ȷ) $i ԩ#)+hkN P  hhk q s  hhkSONG ȷOK8$`` ` "" "Zd d"`$ڵHHtt"5hi` " `" H h8`HH H HH "hh " H" h8`" `0`<>?0u" )" i i  =  wiXew% i i"HH%h:iPh:i>%  iX~ w  w  ``` K0[0<)<>==)>JRw#J <0 )$=w#i>%=w#i>7%)= #Liy#y"y"ͅ"Ly"0 " )" y#y#Lv L{# y# {#" y#)w"""JJJJ: W%J# $#y# #[# )g )Py# "}# y#"y# my#}#" H)JJJJm}#<;"h)m}#<;" L y#" LH y#" y# # ڪ } hL 4 5 >C   )H)JJJ h)L hLHy# ##h##LHy# ##h##LI ## ##L )BH)  h)JJJ y# 7$W$ w$$###kW$7$y# ###Q Hy# h)$ ${# $*#0 {# y# km###"$I###7$ ) < y# km###" I###7$ )  ) Ɂ#{#Ly# w# <0 )ᮋ#==  Hy# #7$h) )  y#  ##! )JJJ y#  ## Hy# 7$h) )  y#  ## )JJJ y#  ## Hy# #h) )  y#  ##w )JJJ y#  ##W )"y# ###7$5 )@  8 ?%" ):}"?%"{#Cw"8y# #?#w# <0 )ᮋ#== "L y# #?#{#"L y# w# <)==) =w#i>==) =y#" )JJJJ:͇"L# i#%#%)#g#)#y# w% ###%#%)#g#)#y# w% ##y# ## $e#) ##) ##%#%) ## #g##)#y# w% ##y# #{# y# km#"k## %N#ʀy# 5"J͋## 5"# U"J͋## U" <0 )ᭉ#==w#i >ᭊ#==w#i@>ᮋ#==w#i>ᭁ#=ᭅ#=w#i>ᭂ#=ᭆ#=w#i>ᭃ#=y# #I #=᭍# $y# #$#%#7% "y#y#Lv "i"%"%"@Li%"}"}"{"i)" m " W##Vy"){"%"}"ȷ) ")",W%i #)0+(k60d͝HC" "퀽dd A0y#y#"LRJmy#my#my#y# "0) k}[#k#y# """y# w#<0 )᭕#==w#i >᭖#==L0y# #L#}""#0"## ##"#"0## ##"#"k# y# w#<0 )᭕#==w#i >᭖#==L_y# 7$r$"y%k#w$}$@$ y# w#<0 )᭕#==w#i >᭖#== y# #?#8###N#}?#Ɂ#?#y# w#?#)u" <0 )u"==0y#y#L  #&*-148;?BFIMPTW[^beilpswz~ $0<HT`lx  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRSSSSSSSSSSTTTTTTTTTUUUUUUUUUUVVVVVVVVVWWWWWWWWWXXXXXXXXXYYYYYYYYYZZZZZZZZ[[[[[[[[[\\\\\\\\]]]]]]]]^^^^^^^^_______````````aaaaaaabbbbbbbcccccccdddddddeeeeeeeffffffggggggghhhhhhiiiiiiijjjjjjkkkkkkllllllmmmmmnnnnnnoooooopppppqqqqqqrrrrrssssstttttuuuuuvvvvvwwwwwxxxxxyyyyyzzzz{{{{{||||}}}}}~~~~      "#$%'()*,-.01245689;<=?@BCEFHJKMNPRSUWXZ\]_acefhjlnprtvxz|~  $(-16:?DINSX]bhmsy~dh@*\4Xz 8L`t(yQ=1)#%e%e% e %!e!!!                    >^<iR 07RYu , Trv "&0k ,0:=Iblu&*=@F %(EMPTW[@\f( !+2CFIM\v0",58AFILOX[adiorw~($/9 `pPJ <J`P <0 <` <P <J0J <zPz <`PJ0J< P<0<`<P<J0J<zpPz<`PJ>J` PJ <z 0 < ` < P,<J,0,<p,P,<,` P@0<PJ<z0<`< P<J 0 <pP,> `P@,< ` PJ<z 0 < ` < P<J 0,<pP <,`P@ 0,<PJ <z0<`<P<J0<pP<`P@>`P<0<`<P<J0J<zPz<`PJ0J<P<0<`<P<J0J<zPz>`PJ<J`P<0<`<P<J0J<zPz<`PJ0J<P<0<`<P<J0J<zPz<`PJ>J`P<0<`<P<J0J<zPz<`PJ0J<P<0<`<P<J0J<zPz>`PJ<J`P<0<`<P<J0J<zPz<`PJ0J<P<0<`<P<J0J<zPz<`PJ>J`P <@0p< `<pP <J|0J|<z Pz|<|` PJ|0J|< P<0<`<P<J@0J <zPzL> `PJL<J `pP<p0< `<pP<J 0J|<zPz <|`PJ 0J|<P <0<`<P<J0J<zPz<`PJ>J`P <0 <@` <pP<J 0J<zPz <`PJ 0J<P <0< `<pP <J@0J <zPz@> `pPJ <J`P <0 <` <P <J0J <zPz <`PJ0J< P zzJJ0<0<0<0<J0J<z0z<0<J0J<0<0<0<0<J0J<z0z<0<J0J<0<0<0<0<J0J<z0z<0<J0J<0<0<0<0<J0J<z0z<0<J0J<0 < 0 < 0 <0<J0J<z0z<0<J0J<0<0< 0 < 0 <J0J<zJ0zJ<z0z<J0J<p0 < 0 < 0 <0<J0J<z0z<0<J0J< 0 < 0 <@0 <0 <J@0J <zp0z <0 <Jp0J <0 < 0 < 0 <0<J0J<z0z<0<J0J<0<0< 0 < 0 <J0J<zJ0zJ<z0z<J0J<p0 < 0 < 0 <0<J0J<z0z<0<J0J< 0 @  @ p p P < 0 < ` <P<J0J<zPz<`PJ0J<P<0< ` < P <J0J<zJPzJ>z`zPJ<J`pP < 0 < ` <P<J0J<zPz<`PJ0J< P < 0 <@` <P <J@0J <zpPz <` PJp>J `P < 0 < ` <P<J0J<zPz<`PJ0J<P<0< ` < P <J0J<zJPzJ>z`zPJ<J`pP < 0 < ` <P<J0J<zPz<`PJ0J< P < 0 <@` <P <J@0J <zpPz <` PJp>J `pP< 0< `< P<J 0J<z Pz< `PJ 0J< P< 0< `< P<J 0J<z Pz>`PJ@<J`pP< 0< `< P<J 0J<z Pz< `PJ 0J< P  p     p      p      p      p      p      p        p    "      p         p    "     p     p   "  p  p "  p     p   "     p         p   "     p         p   "     p         p   "     p         p   "     p         p   "     p         p    "      p         p    "    p        p        p        p       0@ p       0 p           0@ p     0   p       0@ p       0 p           0@ p     0    0@ p   "    0 p            0@ p   " 0    p        0@ p   "    0 p            0@ p   " 0    p         p   "     p         p   " QRSTUVWXYZ[\]^_`abcdefghijklmcwurttsuqqqqqr{yixtsussysqqqqqsjswssussqsqqqqrsbwtsstsrgrqrqqsyzgwsstsshksrsrrshovsstsrPosrsrss]ststtrnAqsssssy]usrusrXAssssssicusrusqDAstssstXgtrsus`@BtutsswRktqsurH@CtutstpUosqtuh>ACuuuuuZVqsquuP>ADuuuuwPWsrquq@?BDsvvutNYsqru`>@CDqwwv`L[sqstH?ACEkwwwQL]sqsfB@ADE_xxxLL_rrsPAABDE]xyhKLcrrjABABDEWyyRKMgsrRBBBCEFQy}zKKPmspACBBDEFOyjJKSosXACBCDFFOzXIKYqqBACCDEFFO{LIK_r`?BCCDEFGOpHILgrE?CCDEEFHS`HJOmd=ACCDEFFHWPHIWqJ=BCCEEFFH_HHI_i=?BCCEFFGIwGHMkP=@CCDFFFHK`FHUl@>ACCDGFFIMLGH_X=?BCCEGFGJWFGMiB=@BBDFFEHKkFHY`==ABCEGFFILhFIeE@@BDFFFILs¿F_Z8>@CDFFFJLsSkI8<>>ACEFEHKO`dh89==?BDEFFIK]XkP6<=>@CDEFFJLoci<8<<>ACEFFHKOpi\5:<=@BDEGFIK[hiD6<<=@BDEFGJLiid58<<>ACDFFHKNsiP5:<ACDFHHKMhiD59:ABDFHIJLfo<49:<>ABDFIIKSew25:;=@ACEGJIL_c`26;;=@BCEHJJMic¿D38;<>ABDFIJKSlk@49;ABDGIKM_tje@9;<>ACDHIKNsw|heD:<ACFHIKNtKgiib=<>ADGHJLW`Kiijh==AEGHJL_CE_lmmo@>BFGHJLhCIgmmop=>DFGIKMHDNkmmpp=@EGHIK_CDUlmnpp=AEGHJL`DF_mooqm>CFHIKQHDIgmnpqhACFHIKkDERlnoqqdBEGHIM`DF[mopqq`BEGHJ_PEIfmopqpPCFHIKwxEFSmmpqqqIDGHIWdEG^mnprqqDEGHJoTELimoqrqpCEHISyHFWmmprqrdDFHIkjFIemmqrqsRDGHN}zÈ6P{NcpV|skwbs~eRsxhd{wpv]^XUMJKHFFILSV_eoxưqsg\SM@<5.+%"%)08ALW`ozȾsi^ULG6/'&'+98DMVZfp{ʿ{pkaXSJB:3-*!!(&027ADLS[clrv|xxvttrponkkhgedcaa``_\][[XXXWTWTTSSQQPSPPOMOMMOPQSUX\\aejpsx~Ŀ|tlhaZTOIC>92.)$!!%)-28>DIQV]dkrx~{xuspliheb`_~~}|{zzyzzz{|}}~~~~}|{zzzyyxyyyz{|~}{zyxxxxxyyyzzz{|~~~~~~yuomlou{|rkhhjkllkjlqxtf[WY^gid\XZbnx\EAFNV`dZKJS`oĻrF09CDHVaL6ETZjʾĿh=,49:BPZV,6LUdyͻkJ%,455CMU2'DM[mο|]/).0,9DLM3EO`qƺҽkM'*,*-9DL3 7DUctлӰi3+-+'0OWdwűʜK9:1.1>IT>(053@HXM&+7KTO[q²lbPB47AOY:$1>SOR]uڹsiUB4RaM$-?PSIQe]{Ĺ_B;@Yf8*/DTONRZY~װfDShb',?NVFQHHgШoIBYmC,0EQSHL>HwθwHHbo4,6HTMO?LWFL2=]}ɳõRUkT./DPWD>/Ap~ĠɿV[aI-6FTOA61H{ôızŎZ]^?,=MXF947[~͙\Rb6-CRX:42:myԥYT\+4GTN/40FywۡL]N';MY:.71U~||L^;,AQT(/74j~vU[&3IU@&32?yxZL$9MS.+7/V}x~ԗ^7'BPI#082evВX(-HO:"24=rpyؚE'5KG,)51I|vux~ܗ=%:I>'060X~ew{9(=B9#133djp{t1-<;7&4-;p[~ܶ^.+.12(2-Edl{ʪ[5/1<;::CUj~ʼW6-3B=B=N_s|ĻM2,8H=DEWh|yG00DHNOLZhx}SEJLRQS`m|{uOLNOUPXdr}kSRSTYU^iw}~hVTUWZXamy|gYYY[\[fq}~|{e[[\\\]it{}xd`__^``mw|ueba`^bcny}|rhedb`dgr{|}qjgecbfjt||}qligedhmv}}}~}rnkhffjox~}}{rnkifhkry}~zsomjgkntz~ytpnkimou{~zuqnkknpv|yurnmmpsx}xtqonoqsw|~yvrpoqquy~}xuqppqrvz~}yusrrrtx{|xttsrrtw{~{wvutssux{zwvutttvy|~zxwvutuwz||zywvutvwz}~{zywvutvx{~}|{yxwvvwy{}|{zyxvvwy|~~}|{zyxxyz}~~}}|{{yyyz{~}}}|{{{zyz{}~~}}||{{zz{{~~}}}||{{{z{{|~}}}}|||||||}~~~}}}||||{|}~}~}}}}}}||||}~~~~~~~}}}}||}~~~~~}}}|||||~~~~~~~~}}}}}}}~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~9Ugl`]eoGj`)~dv]~pJio~g~~\Wok{ooXxlqatvug|}b|Qzx{zu~rw|z~g}|qpyL||^{|}ozbwbV|1zv}|\fwswiz_Mbzlx{jqc}ngw||kriln{svvvqzp~xumplfxmor|qz}|}~{{~|q~s|~z~ov}}{v~~|t}tn}|}}~~uv{~}x}~}|~{yrx~~y}z}{v}}|ʀʁί˺рˀ耀£z{{zqu @P 9=-w FpH3΢:x/`>SAZavD3',:/E`ƒƌܨerU\/$iG5O S5ű돨ϻgPx=_r~ϱvwS BRϓx>E)o`ȰQ2l ^+:6z,^iRoۤf;Z /?!^hیkX? C! ,5@>&UԲiѫcD6(#f=9+>=onaؓ)7geZ{^>0I_P|wg|HKj}F67U(oko`gЬ~emksaKGJ9FBP,FkHXhԣz}pS[MlW&5ewp9vSTCIl3JSak"jq[zέqb5}(_qliH+1Dzs8c^rњ|b7-?4)grnd2 Q5PeT#_lA*,0y~}a5Bq`;vݿ\yx`VUe}֜^7!^;EftDzʛHsrqKE>CvPOdhh~taSrܼyrEO2mjZsskRDTJnƵɋf|fg;. '/6lsmvLpnU>*auhqq;ɑx?VrvV{vKjsTSHA_j|~rx{svoiwi_{]JMPbzÙhwy^hR|V09S2lbWAxyˉULuRZ]vcdTgeUrnxd^wutaqjgq~ztnvhC]}jdwsiZWLMopH_caMflvndt{\yZOjn_Z^`ef~ytf|e]mx~[l[VSL;LHM_`t`wNm~|lC]fA=}pm}i~xbawaqub0P^{g[Mq~^txiz{t|}ibXjd~ma}eWQM_|wxqZbKB.=KVy~~xxy}zyhegsni~y|xok`ee_w~{xnyogddbuO?ABCEGHu  #%'),.014679;=>?ACDFGIJLNOPQSTUWXYZ\\^_`abcdefggijklmnnppqrstuuvwxxyyz{{83578:;=>?@ABDDFGGIIJKLMNOPPQRSSTUVVWXXYYZZ[[' !#%'*,-013`K  #%'*,.02568:?@ACDEFGHIJKLMNOOPQRSTTUVVT  !#%(*,.6   #&'*,.12478;<>@BCEGIJLNOPRSUWXYZ\]^`abcdfggijklmnppqrstuU,,.0135689:<=>?@ACDEFGHIJKLMNNOPQRRSTUVVWXT !#&',mH "$')+.01468:<>?ACEGHJLNOQRTUWXY[]^``acdeggijklmopprsstvwN5478:;<>??ABDEFGGHILMMNOPPQRSTTUVWWYZZ[[\U$  #%(*,/149a¿e0 "%'*,.12578<=>ACEFHJKMOPQSTVWYZ[]^^`bbdefghijklmnnoqrrstuuvwxxyz{{{~ҵkVSSUVVWXYYZ[\\]^^_```abcccdeeeffgghhhhiii\D455555666666779:;=?@BDEFHIKLMOOQRTUW_tp\LEDFHIJLMNPQSTUVWXY[[]^__aaccdefgghiijklmmnnoopqrrrsstuuvvvwwxxxyyzz{{{||||}}~~|ussssttttuuuvvvvwwwxxxxxyyyyyzzzzz{{{{{{zvsppppppqqqqrsssttuuvvvwwwxxxyyyyzzz{{}     $ $00$$$$opqrstuvwxyz{|}~SONGOKNNNNNN!!9!9-9-!99-9-!!9!9-9-!99-9-!99+9+!99+9+!99+9+!99+9+!99&9&!99&9&!99&9&!99&9&!99(9(!99(9(!$$+9+!$9+$ $,0$-5$9)95)9-$$0$5)9-)9)$0-$0)9))9$$$)$-))9$)9&$)$-&9&&9)$0$-$2&9&&9-$/2$5&9-&92$-$5$9&95&97$+;$2+97+9/$$2$++9/+9&$/+$#+9&+9$$#$&+09+9($+$/(9((9+$/$/$4(9+(9/$-4$7(9/(97$+$;$4($/($0!!-09!09-409--0!$0949--09-00!!49!-09-09-4!$-0909-49--0!+09009+29++0!$0929++09+00!+9/09+29++!$/09209++09+/2!)29-29&29&)2!$-929&)29&-2!29)29&-9&2!$)29-29&229&)/!(/9+/9(09((/!$+909((/9(+/!&9+/9+/9+&!$+9+/9 &9,+0$!4!09!40$!40!20!29!0$$20$40+209+40+4$+0+209+40)22$2529&42$5242$59&42$&//$//9(-/$/2/9+/+/9+0-95995-9059-)09-09)$9)-)9$9&9)-9&)09-29&-/9259-2-9599597+9;297/92+9/&/9+#9&9#&099(9+/9(+/9/49+9/-9479/7+9;49/92-!$-!---4-!$-$-+4-$+2---$!$-2--$--!$-!----!$2--+4-+$2--$-4!$-2--$-2/$//++2/$+$/2$/4+/$$/)-/+$/---&$&-$+&--$0-$0-&$-0$-&$0-$-($0!-95)995)-!90)59-))!09-0)9)$!9)-))9$9&!9)&-9&&)!09-&29&&-!/925&9-2!-959&95&97!+9;2+97+/!92++9/+&!/9+#+9&!9#&+09+9(!9+/(9((+!/9/(49+(9/!-947(9/7!+9;4(9/(90$05$59)995)59-$-$0$05)59-)-9)$)-$-0)09)))9$$$$)$)-)-9$)$9&$&)$)-&-9&&&9)$)$-$-2&29&&&9-$-2$25&59-&-92$2$5$59&995&597$7;$;2+297+79/$/$2$2+++9/+/9&$&+$+#+#9&+&9$$#$#&+&9+9($(+$+/(/9(((9+$+$/$/4(49+(+9/$/4$47(79/(/97$7$;$;4(4$/(/@,@,@,@,,@,@@,@,@,@,,@,@@,@,@,@,,@,@@,@,@,@,,@,@@,@,@,@,,@,@@,@,@,@,,@,@@,@,@,@,,@,@@<@<@,@0,@<@<@P`@P@P@ P@ P0PP@ P@ P`@P@P@ P@ P0PP@` P@ P@P@P@ P@ P`0PP@ P@ P`@P@P@ P@ P`0PP@ P@ P`@P@P@ P@ P0PP@ P@ P`@P@P@ P@ P0PP@` P@ P@P@P@ P@ P`0PP@ P@ P`@P@P@ P@ P`0PP@0P@0P@PP,@P,@PP,@PP0P,P,@PP,@PP@P,@PP,@P,@P0PP,P,@P,@PP@PP,@PP,@P,@PP0P,P,@PP,@PP@P,@PP,@P,@P0PP,PP,@PP,@PP@PP,@PP,@P,@PP0P,P,@PP,@PP@P,@PP,@P,@P0PP,PP,@PP,@PP@PP,@PP,@P,@PP0P,P,@PP,@PP@P,@PP,@P,@P0P,@P,@P,@PP@`LP L`P@`PL`PLa LP@`P@`P@`P L`P@`LPL`P L`P@`P@aL`P @`P@`PL`P@` @`PLdP@PLP @`P@`LaP @P@P @P` PP PP PP PP` PP PP PP` P P PP PP` PP PP` PP PP` PP P P` PP PP PP PP` PP PP PP` P P PP PP` PP P P` PP PP` PP P `P@P@P@@`P@0@P@`P@`P@P@0PaP@PP@P@P@@@0`@@`@`@`@0`@`@@@@`@0@@`@`@@@0@`@@@@@0@@0`@`@0`0@`@0@`@0@`@0@0P` P@P P@P P@P P@P` PP@ PP PP@` P P P@P P@P` P@P P@P` PP@ PP` PP@ P@ P` PP@ P@P P@P P@P` PP@ PP PP@` P@ P PP@ P@P` P@P P@ P` PP@ PP` PP@ P@ PP@PP@P@P P@P PP0PPP@P P@P PP@PP@P@P P@P PP0PPP@P P@P PP@PP@P@P P@P PP0PPP@P P@P PP@PP@P@P P@P PP0PPP@P P@P PP@PP@P@P P@P PP0PPP@P P@P PP@PP@P@P P@P PP0PPP@P P@P PP@PP@P@P P@P PP0PPP@P P@P PP@PP@P@P P@P PP0PPP@P0P@P 0 0 0 0 0 0 0 0 0 0 0 0 0 0 @@ @@II I0I II I0I II I0I II I0I GG G0G GG G0G '' '0' '' '0' 77 707 77 707 77 707 77 707 XX X0X XX X0X 88 808 88 808 IIIII IIIIII IIIIIGGGGGGGGGGG GGGGG7777777777777777XXXXXXXX88888888777777777777777788888888888888888888888888888888XXXXXXXXXXXXXXXXп԰`T,/79@?@3_{謿_ HOQ@?0GF07+?/H_ +?P|/F?[m`PԚϸohgh@Nh$(DhW@O7tQgЩπwO@O`?wp@H[@P/<L8?(70BW?Kzte{РȿyߟпఏڳɠȀ?аK_0_0`?H;8;( (,*03@ ?o`?p[Pg૳ϰ쐗sPTo}`7@W@9;8H2?^H3g ''?/ O ?0/_@ 'LS@ D1//PP0+UZR[`/kWȷϯֺӺШc_{@_pwo!H?twH\@_?*I`% <)40/@?@?@ ,0&'/PQY0OtdP_€mȟȫпМuoGB[|K`eS`HOP@_P+X > 00#(? 8&/\0R ?PFO`3=5kY4/_XWPZeAF?{PoPwD?ogg߸ɠpOdXfTV@(>WP_`Tg`7QP8740707P00/|(/_@,0#;8._X8IOjMZ_lfg{pgζϴؠșЈwpvaotpor`_gS`POs@-?P:A@Rpt|L@DJUflptvy}~~egkpv|xfmmv|z~lgZIRXw~|}|yC.U`˱|FFHIN;Rkpx|yVTXRBpvy|vYOTVkȷm`eefbLRTZ`gvTC04:>FvnY815LSFXv_adfhR|wp^\bghgmpsdkpseNP88=Cex~֙z|zJ:==CHMTY~ȲtTDIC,4=sgVLUw~mstw|~pqsv|~XRzhINRT[bhtêadF((;Z^ensv`RU>2*Umv„~e^bdgkVsx~|knpVV\akpppZTVZ_dgTOe˹|<688=CHNZ~}pZ^^VfdJRXrymknbMRDZlahpgkmqvy~~jkOUS;;>Cesxɼh^A>CDG408NgɘppnlRNG2:Ddy~mss~r~ty~lpqvx|v_ehetŹYHLMPU[`gnҲJGC.NTV_ekx~wxwwkTC*"AMkŦxejmppv~kehSNTXyqVNNOSVZ\FFOZ~ʱZUR77;>DJRv}~eskkngTl[bPNTZZb}z^_eflqv|ng;04B_bgpv|ĜxZ[\ZF@7",5UdԴkkTJORSS\bt_`brh~sssYZ\^bfkptfZbvʴzV>ACFLPV^lѴz_IhjkpeRY^fp^RB4<[jmrtx|lpzG8=Cfmpx~ƽ̠f__`aLCHIOUF=VgNLNOR>:Iejsvkwtejsevyx``dfknrw|xslgkllRRV[`gpг|SLmmmpVV\agnnpePVXZ`RYqv|~g_d[_mptzabeenrx||d`_b_FHLNTZ`gq֘rsttdO:1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@DfzxnqwwqS>1 'jڹعg= 1@Dfzxnqx0K_@OгbWmj0 $ /?IWkzt´ndc`W_XT]bihRQ[fbXS]HG^PD:130( %4?HA;:8(-)*,5A4(**) )    (("$'$"#/8>?FDGOPSckheidcowljw{ro¼ztwsd]SMOQNLA;;8(($  $ % +HA<42488<:CIMMOPKOWYYZ]ckmnssvwuqlsw~}yvtqrpqwzvsrnlecmmjjooqprqryyuy}}~}}}y{zuwywy{{}xtpmkkkhghgmmlmrspgejjimosnoqrszzyzyzzy{}yy{|{{}~~{{{y{{xwyvuvuswywusoooqqpoonqsnoqqspoonkhigfmlkmlkqsuwzzz{{}{{zz{zzyvssvtsuvvwy{|{yywwvvwuvwxssrmkkgmmmlkgijgfgkjjfdcb_^a_[YWY][]\[\]beediilmqvwvw{|{{{{||yy{wvwyzywwuvupoqnkmqpoljkjfgggffb`]__][\\[Z[WUW[\ZYVWYXVW[ZZ[[_ababaaaadghijnqqssrrrsssw|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxic|t]$ %hͬ⼑cmu:&)F]XƼtzxicPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQPRQOLD>9)*&$$$$$$$$$$$$$0S]gtĽijǺ{xhkc^RI71)&!$$$$$%''%$'(4134>BFCDEHIQOR^at{xww~}ykt{z||twmqnnqs{xzwm^_XTXPRQQwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YwsH ڲv( 8YqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RqvGްx6RwXXPPHH@@$$88dd``  00  $$((    !"#$%&'()*+,-./01234567SONGOKBNN@NN@NNN` N@ NNNNNNN 12$220202-2-0+0+-&-&+$+$&!&!$$!/$!$!!$&$&!)!)&+&+)-)-+0+0-2-2015052424525240402-2-0+0+-)-)+&+&),$)$&!&!$$!!!!$$!)!)$$$$)&)&$012$22202&20-20-&+0-+2&-+&2$+&$&!&$!&$!0/$!$2!&$!&$!&&)!&)2+&)+2-)+-&0+-0&2-02015025242&542542&04202-20-2+0-+&)-+)&&+)&0,$)&$2!&&$!$!&!!!2$02!&2)$2$22$0)&2&$$&2252220&2&2-20$2+22-!2&+-2$!&$2!$02$!&2$322!&$&2&2!$2)22&!2+)-2-!+$200-$2200&2552224&5&2224$20222!2-0-2+!-$2)+02&$)&2$0&22!&$&22!$2!22!2$!-2)!$$2$0)$2&0$&2)5'22$&)&2)2$222)!2'-2!'$2$02$$&2'322&'&2$2$222$!2'-2!'$2$0$20$&2)5'22$&)&2)2$222)!2'-2!'$2$02$$&2'022&'&2$2$222$!2'-2!'$2$0$20$&28522&&22$27225!20-2!0$25027$5&2637225&7&232$2/220!20-23!$200$230&245522&&22$222!2-2!$202$&2)022'&&2)2$2$22!2'-2$!$2$0$2'0&245522&&22$222!2-2!$202$&2322&&22$222!23-2!$20$2503&20522&&22$222!2-2!$202$&2022&&22$222!2-2!$20$20&2)5'22$&)&2)2$222)!2'-2!'$2$02$$&2'322&'&2$2$222$!2'-2!'$2$0$20$&2)5'22$&)&2)2$222)!2'-2!'$2$02$$&2'022&'&2$2$222$!2'2-2!2'$2$0$202$&2522&&2525$27225!268-2!7$287025$3&20322&3&2023$2-22.!2-2!$20$20&225&22&2&2&2$2222&!22-2&!$22&022$&&220022-&2&202-$22220!2-2-20!-$2200$2-02&245522&&22$222!2-2!$202$&2322&&22$222!23-2!$20$2507"2817.2"5"2.3"20.2"2.23"0"20.3"23.0$2-32.02$$20$202$2202$$2)0'02$$2'&2252220&2&2-)20$2+522-!2&+-2$!&$2!$02$!&2$322!&$&2&'2!$2)322&!2+)-2-!+$20-022$0"2512.24"5"22%.4"201.22"2-0.2+"-"2).+"2&.)$2$3&02!$$$2'0!$2!302!2$!-2)!$$2$0)$2&0$&22)225220&22)&2-2205$2+)22-!2&52+-2$)!2&$2!52$02)$2!&2$'2322!&2$'&2&22!3$2)'22&!2+32)-2-'!2+$2032-022'$20"25%221.24"25%"22.241"20%.22"2-120.2+%"2-"2)1.2+"2&%.2)$2$'2&302!$2$'$202!3$2!'02!2$32!-2)'!2$$2$302)$2&'02$&22)225220&22)&2-2205$2+)22-!2&52+-2$)!2&$2!52$02)$2!&2$'2322!&2$'&2&22!3$2)'22&!2+32)-2-'!2+$2032-022'$20"25%221.24"25%"22.241"20%.22"2-120.2+%"2-"2)1.2+"2&%.2)$2$'2&302!$2$'$202!3$2!'02!2$32!'-2)3!2$'$2$302)'$2&302$22&522)&2225&2&)22&25&2)22&225&2)22&2&522)&2)&2522&)22&222&2&22&2&222&22&222&2$22&&2)&2+2222&222&2&22&2&222&22&222&2&22&2$&222&22&2222&&222&22&2&2222&2222&&222&22&2&22&)22&2)22&2&'22)&2&2'22&)22&2)22&2&'22)&2)&2'22&)22&2)22&2&'22)&2&2'22&)22&2)22&2$'22&)&2)&2+'22)22&2)22&2&'22)&2&2'22&)22&2)22&2&'22)&2$&2'22&)22&22)22&&2'22)&22&2&22&222222&2)5222'&2&2$)20$2"522-!2+-2!&$2$02$!&23$22&$&2'2!$2 322&!2")-2$!+$2'-02)$0"2,12.2+"5"2)%.4"2'1.22"2$0.2""-"2 .+"2.)$23&02$$$2'0!$2302$!2!-2 !$$20)$20$&2)5222'&2&2$)20$2"522-!2+-2!&$2$02$!&23$22&$&2'2!$2 322&!2")-2$!+$2'-02)$0"2,12.2,","22%.,"2'1.2)"2-..2""2,."2).'&2,5+22)&,&2+)2)$2,522+!2)2-25!$25025$&2))22522'&22)&2$2205$2")22-!252+-2)!2&$252$02)$2!&2'2$322&2$'&222!3$2 '22&!2"32)-2$'!2+$2'32-02)'$20"2,%221.2+"25%"2).241"2'%.22"2$120.2"%"2-"2 1.2+"2%.2)$2'2&302$2$'$202!3$2'02$!232!-2 '!2$$2302)$2'02$&2))22522'&22)&2$2205$2")22-!252+-2)!2&$252$02)$2!&2'2$322&2$'&222!3$2 '22&!2"32)-2$'!2+$2'32-02)'$20"2,%221.2+"25%"2).241"2'%.22"2$120.2"%"2-"2 1.2+"2%.2)$2'2&302$2'$2&023$2'02&!232-2&'!2$2302&$2'02'22)5&2)5)5)z|z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z |zJ| z|Jz |z | z |*z |Jz |z |z*| z|z |z | z |*z |Jz |z |zJ| z|Jz |z | z |*z |Jz |z |z*| z|z |zP ܊ zS zS zS ?zZ ZzZ ZzZZzZ Z0zZ Z0zZ ZzZ ZzZ Z0zj jzj jzjjzj j0zj j0zj jzjjzj j0zZ ZzZ ZzZZzZ Z0zZ Z0zZ ZzZ ZzZ Z0zZ ZzZ ZzZZzZ Z0zZ Z0zZ ZzZZzZ Z0Z ZZ ZZ ZZ Z0Z Z0Z ZZ ZZ Z0j jj jj jj j0j j0j jj jj j0Z ZZ ZZ ZZ Z0Z Z0Z ZZ ZZ Z0Z ZZ ZZ ZZ Z0Z Z0Z ZZ ZZ Z?Z ZZ ZZZZ Z0Z Z0Z ZЙZ ZZ Z0j jj jЙjjj j0j j0j jАjjj j0Z ZZ ZZZZ Z0Z Z0Z ZZ ZZ Z0Z ZZ ZМZZZ Z0Z Z0Z ZАZZZ Z0Z ZZ ZZZZ Z0Z Z0Z ZZ ZZ Z0j jj jjjj j0j j0j jjjj j0Z ZZ ZZZZ Z0Z Z0Z ZZ ZZ Z0Z ZZ ZZZZ Z0Z Z0Z ZZZZ Z0Z ZZ ZZ ZZ Z0Z Z0Z ZZ ZZ Z0j jj jj jj j0j j0j jj jj j0Z ZZ ZZ ZZ Z0Z Z0Z ZZ ZZ Z0Z ZZ ZZ ZZ ZZ ZZ ZZ Z0Z Z0Z ZZ ZЙZZZ Z0Z Z0Z ZМZ ZZ Z0j jj jМj jj j0j j0j jjjj j0zZ zZzZ ZЊZZZ zZ0zZ Z0Z ZzZ zZZ zZ0zZ zZzZ ZЊZZZ zZ0zZ Z0Z ZЌZZZ Z0Z ZZ ZZZZ Z0Z Z0Z ZZ ZZ Z0j jj jjjj j0j j0j jjjj j0j jj jjjj j0j j0j jАjjj jБj ܓjj jjjj j0j j0j jj jjj0zZ ZzZ ZzP zT 0zZ Z0zZ ZzZ ZzZ Z0zj jzj jz` zd 0zj j0zj jzj jzj j0zj jzj jz` zd 0zj j0zj jzjjzj j0zj jzj jz` zd 0zj j0zj jzjjzj j?zP Sz S0z SzS 0zS zS 0zS zS 0z` cz c0z czc 0zc zc 0zc zc 0z` cz c0z czc 0zc zc 0zc zc 0z` cz c0z czc 0zc zc 0zc zc 0zP Sz S0z SzS 0zS zS 0zS zS 0z` cz c0z czc 0zc zc 0zc zc 0z` cz c0z czc 0zc zc 0zc zc 0z` cz c0z czc zc ܊czc ܊czc܊czb ܊*0PJ  ** J *0J  *0* J<*0J ** J 0*J 0 **J<*0J** J *0J *0* J<*0J* z*zJ0 *zJz0* z*zJ< *?ZJ Z Z*Zj* ZJ Zj*0ZJ Z Z*0Zj* ZJ<Zj*0ZJ Z Z*Zj* ZJ Z0j*ZJ Z0 Z*Zj*ZJ<Zj*0ZJZZ*Zj* ZJ Zj*0ZJ Z Z*0Zj* ZJ<Zj*0ZJZZ* Zzj*zZJZ0 z  0Z ZZ ZP T 0Z Z0Z ZZ ZZ Z0j jj j` d 0j j0j jj jj j0j jj j` d 0j j0j jjjj j0j jj j` d 0j j0j jjjj j0Z ZZ ZP T 0Z Z0Z ZZ ZZ Z0j jj j` d 0j j0j jj jj j0j jj jЀ` d 0j j0j jjjj j0Z ZZ ZP  T Z Z0Z Z Z Z0Z ZP ܀S S0 SS 0S S 0S S 0` c c0 cc 0c c 0c c 0` c c0 cc 0c c 0c c 0` c c0 cc 0c c 0c c ?P S S SS 0S S S S 0` c c cc 0c c c c 0` c c cc 0c c c c 0` c cЀ cc 0c 0c < c܀ 0c P S \   7777777777777777GGGGGGGGGGGGGGGG7777777777777777777777777777777777777777077777777GGGGGG GG0GGGGGGGG77777777077777777777777 7707 0                     ((  3 33" "           ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` @(@@(@@@ @       (   0     0   (           (   0     0   ¢ ¢ ¢ ¢ ¢ ¢     0 ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ` ` ` `  ` ` `` ``(``@@@9:;<=>?@ABCDEFGHIJKLLG ASTARTUP$#   / XXύX?klmnÍoL) "6L'?"(0`6708" = ***)<JJH !h穖tp% ;"Z/݀>">"' 1" 7"5).莀/ ;" " 6" >" 1"6"$ "g"" !"""""IջLYL 8!9 詍` "  4"/pŠϠŠà͠ӠàԠŠH06172839h` z97L75v^e ?/( ze?L[LLɍ$?`?e ɍɥAH93827160hH46576879h`,C fL ɍ f ,S0 @ pLޭBDEF޾ p  ޾ p($ذ z (0 k( L?ԦʚLeةީe s  pL f,FLk,DL,C0$3 >@ Ɉ 3ɾꩈL(3ɾ;Ƀ kB94 l% fʽ  ՚,S` H $݅3`(l8L3LX>(Ƀ,`3,G0]ɾ g` H`پ_پ p _پ׾`>( p۾m׾) W)ʩ@`ɾ>(O puȾ ɾ-O ͱc־JjjjZ[ (`O>0O z POپھ p WH־Ǿh۰8L־JjjjZ[ɾ)Ⱦ8 AOLӜ ҤLLX>(F`־ؾپھ׾` fɄ KDEF zLp z pL[ fKɍKL?`  zLp@3 @LtJ)s@J f 򟰸 p`H? hth?,E30ɍФ3 E3HD F3 Ʉ%h3 fM E  pLthɍLL3`3,A0s0% Ipn HpnI:L ؅303Lm8n933LҞAAJL ةޘг uv $ 8LʞeЌ>?@`>?@`Ba8` K  LK ֟ ֟  KK`JJJJ8`轶K)` #hhLJپھ pHJh` H!h߻g޻tػٻpứ `޻ٻtػp߻8nٻniػtpiٻٻtụs໅o8ễpڻiۻniݻi>j?kܻڻ߻>ٻ׻pڻ׻Ii׻׻߻߻ڻ l 1ڻۻ `>i>?Ek?!>Q>>>ڻۻ `` `>ڻ ۻ `e>>?ܻ?ܻ>?Emn(>e>ܻȱ>e?>Q>ؠ> ie>>?`׻;ػ=:<ٻ:<=;`׻׻mػ;>:8o>oȑ>ppȑ>> :oݻp` HKpn͵ @p;=po:i>?Ek?>Q>> L>ܻ `/ e>>?ܻ?ޱ>ȥj>>m⻑>` !im8i仍nj廍ki滥lj绥oS ST$I2 U)VJ :T)`l8`a HbIJhjǾȾɾ p٭b=a<I/q)im@^ʈ0 L/S 51-m@ʈ0 L٨/` E չ5TLG-T VV H$ZA@Lĩ8 `߹-U -W b WW)JJ HT$K j0IDK H H5K 0.)K H  XK`LGLl  HK m Y ܩ8jK` X,, ( 5 ` X,  `  X, `)a)_`0:8 `)H " H 媢h} I hm   8`0 :AG8 `) 媰 ` . . `SI-SRR¸)RʈS UT`RSSS8L `yGLɳ 8`H b kXklmno YhjWVL58 L tֻʆt "ֻtl e DޭVJ P eօ L s򩣍eS3 zLG # e $L? b 4 kimljn`  pg׾mȾXhؾmɾYtѮȾɾ YX`8g Ie f`8` P־ǾҾ,G0C ж=W)_`ZV"׾پӾؾھ pD`Y׾ؾOW)Ⱦɾʾ pD`8`W)CB) 5W) )W)@! pZ}ȾȾ󰹩 p` ־ǾҾ,G 8`׾ؾ ж p ධۥs׾tؾE` ( о(־Ǿ,G 8`_`W)H־JjjjhZ[ p̭ зLKǾ  . .8   ۭ (8 mȾȾmɾɾʾiʾ` Lpl8l:/0sНsƬƀ#(ZZV4G_0=( A P FjL\5p-e9ABSAVERIFYBLOADELETEBYECATALOGOPENWRITEXECREATEFRESTORENAMEBRUNLOCKCHAIN#FLUSHREADPOSITIONOMONPR#PREFIXCLOSEAPPEND Hѫ5 FڬB :hQ|Q@@ -!S    !C- !ABELSDFRV@@ !$(19@EӱüϠž(+@ABCDEFGHIKLMNPSV     T[fouu~ՠٯ* PWN*]ĿNTz @n6VC/+A>@I5gN Oz @n[Dz @nd0,~z @`$仫@v$⩔,C[B?I>孓`仫6VtCicQĿUKqtVt Nʮq$6,⨁ K6, VtI=v!gNVt Vt  lg~Tһ   LiLMTRLLLLL[^)o `\o8` ԠŬLLINFOv1 '  '/FTN.D5.07.NINJAN 1"1'M-MODFORMAT.TXTZ'K- MOPQRSTUVWXYNinjaTracker SoundSmith file format ___________________________________ File Type: $D5 (213) Auxiliary Type: $0007 The File Format SoundSmith sequences consist of a 600 byte header, followed by three equally-sized blocks containing the notes in the sequence, the effects to be applied to the notes, and parameters for the effects. The file concludes with 30 bytes of stereo information. The Header signature (+000) 6 Bytes ASCII bytes "SONGOK". An identifier to SoundSmith that the file is not corrupted. length (+006) Word The length of each of the three equally-sized blocks that follow the header (Main, Effects1, and Effects2). tempo (+008) Word The tempo for the song. A note is played each tempo/50th of a second (see the "Playing the Music" section in this Note). instBlock1 (+020) InstBlock The instrument parameters for the first instrument. instBlock2 (+050) InstBlock The instrument parameters for the second instrument. ... instBlock15 (+440) InstBlock The instrument parameters for the fifteenth instrument. musLength (+470) Word Length of the music in SSBlocks. musList (+472) 128 Bytes List of SSBlocks to play. Each block is identified by one byte (i.e., 0 3 5 2 2 n means play block 0, block 3 block 5, block 2, block 2, and block n respectively). An SSBlock is 896 Bytes (64 * 14 bytes). The Main block is composed if SSBlocks. An InstBlock is a 30-byte block of instrument parameters defined as follows: instName (+000) String ASCII name of the instrument to be used. If this is less than 22 bytes (21 characters plus the length byte), it must be padded to take 22 bytes. reserved (+022) Word Reserved, set to zero. volume (+024) Word Volume for this instrument. Although this is a word parameter, legal values range from 0 to 255. reserved (+026) Word Used by NinjaTracker: The low byte of this word specifies the type of the instrument: $00 - unlooped instrument $01 - looped instrument, this instr. is only the header to play. The loop itself is the next instrument after this one. Headers are only saved when the header size is $100 or greater. $02 - the loop itself. MODCON copies loops behind each other till the sample will sound best. The high byte of this word is the finetune value, just like in a MOD. reserved (+028) Word Reserved, set to zero. The Main block The main part of the file consists of three equally-sized blocks. The length of each of the three parts is given by the Length field in the header; the entire Main block is 3*Length bytes long. Bytes in each block are related to each other positionally. For example, the first byte of the Effects1 and Effects2 blocks contain the effects to be applied to the note in the first byte of the Notes block. The first block is the Notes block. Each byte is a MIDI Note number representing the note to play. NinjaTracker does not support previous Soundsmith commands, such as STP. The second block is the Effects1 block. The high nibble of each byte determines which instrument should be used to play the note in the corresponding byte of the Notes block. The low nibble of each byte contains a value to be used by each effect. This value corresponds to the standard ProTracker Amiga effect command. The third block is the Effects2 block, and contains values to be used for the effects listed in the bytes of the Effects1 block. This value corresponds to the standard ProTracker Amiga effect byte. Stereo Data The file ends with 30 bytes of stereo data. The data is in 15 words, one for each instrument. A value of $0000 indicates the instrument uses the right channel; a value of $FFFF indicates the left channel. The first word corresponds to the first instrument, and so on. [\]^_`abcdefghijklmnopqrstuvwxyz{|}~Noisetracker/Soundtracker/Protracker Module Format -------------------------------------------------- Credits: Lars Hamre, Norman Lin, Mark Cox, Peter Hanning, Steinar Midtskogen, Marc Espie, and Thomas Meyer (All numbers below are given in decimal) 3rd Revision Module Format: # Bytes Description ------- ----------- 20 The module's title, padded with null (\0) bytes. Original Protracker wrote letters only in uppercase. (Data repeated for each sample 1-15 or 1-31) 22 Sample's name, padded with null bytes. If a name begins with a '#', it is assumed not to be an instrument name, and is probably a message. 2 Sample length in words (1 word = 2 bytes). The first word of the sample is overwritten by the tracker, so a length of 1 still means an empty sample. See below for sample format. 1 Lowest four bits represent a signed nibble (-8..7) which is the finetune value for the sample. Each finetune step changes the note 1/8th of a semitone. Implemented by switching to a different table of period-values for each finetune value. 1 Volume of sample. Legal values are 0..64. Volume is the linear difference between sound intensities. 64 is full volume, and the change in decibels can be calculated with 20*log10(Vol/64) 2 Start of sample repeat offset in words. Once the sample has been played all of the way through, it will loop if the repeat length is greater than one. It repeats by jumping to this position in the sample and playing for the repeat length, then jumping back to this position, and playing for the repeat length, etc. 2 Length of sample repeat in words. Only loop if greater than 1. (End of this sample's data.. each sample uses the same format and they are stored sequentially) N.B. All 2 byte lengths are stored with the Hi-byte first, as is usual on the Amiga (big-endian format). 1 Number of song positions (ie. number of patterns played throughout the song). Legal values are 1..128 1 Historically set to 127, but can be safely ignored. Noisetracker uses this byte to indicate restart position - this has been made redundant by the 'Position Jump' effect. 128 Pattern table: patterns to play in each song position (0..127) Each byte has a legal value of 0..63 (note the Protracker exception below). The highest value in this table is the highest pattern stored, no patterns above this value are stored. (4) The four letters "M.K." These are the initials of Unknown/D.O.C. who changed the format so it could handle 31 samples (sorry.. they were not inserted by Mahoney & Kaktus). Startrekker puts "FLT4" or "FLT8" here to indicate the # of channels. If there are more than 64 patterns, Protracker will put "M!K!" here. You might also find: "6CHN" or "8CHN" which indicate 6 or 8 channels respectively. If no letters are here, then this is the start of the pattern data, and only 15 samples were present. (Data repeated for each pattern:) 1024 Pattern data for each pattern (starting at 0). (Each pattern has same format and is stored in numerical order. See below for pattern format) (Data repeated for each sample:) xxxxxx The maximum size of a sample is 65535 words. Each sample is stored as a collection of bytes (length of a sample was given previously in the module). Each byte is a signed value (-128 ..127) which is the channel data. When a sample is played at a pitch of C2 (see below for pitches), about 8287 bytes of sample data are sent to the channel per second. Multiply the rate by the twelfth root of 2 (=1.0595) for each semitone increase in pitch eg. moving the pitch up 1 octave doubles the rate. The data is stored in the order it is played (eg. first byte is first byte played). The first word of the sample data is used to hold repeat information, and will overwrite any sample data that is there (but it is probably safer to set it to 0). The rate given above (8287) conveys an inaccurate picture of the module-format - in reality it is different for different Amigas. As the routines for playing were written to run off certain interrupts, for different Amiga computers the rate to send data to the channel will be different. For PAL machines the clock rate is 7093789.2 Hz and for NTSC machines it is 7159090.5 Hz. When the clock rate is divided by twice the period number for the pitch it will give the rate to send the data to the channel, eg. for a PAL machine sending a note at C2 (period 428), the rate is 7093789.2/856 ~= 8287.1369 (Each sample is stored sequentially) Pattern Format: Each pattern is divided into 64 divisions. By allocating different tempos for each pattern and spacing the notes across different amounts of divisions, different bar sizes can be accommodated. Each division contains the data for each channel (1..4) stored after each other. Channels 1 and 4 are on the left, and channels 2 and 3 are on the right. In the case of more channels: channels 5 and 8 are on the left, and channels 6 and 7 are on the right, etc. Each channel's data in the division has an identical format which consists of 2 words (4 bytes). Divisions are numbered 0..63. Each division may be divided into a number of ticks (see 'set speed' effect below). Channel Data: (the four bytes of channel data in a pattern division) 7654-3210 7654-3210 7654-3210 7654-3210 wwww xxxxxxxxxxxxxx yyyy zzzzzzzzzzzzzz wwwwyyyy (8 bits) is the sample for this channel/division xxxxxxxxxxxx (12 bits) is the sample's period (or effect parameter) zzzzzzzzzzzz (12 bits) is the effect for this channel/division If there is to be no new sample to be played at this division on this channel, then the old sample on this channel will continue, or at least be "remembered" for any effects. If the sample is 0, then the previous sample on that channel is used. Only one sample may play on a channel at a time, so playing a new sample will cancel an old one - even if there has been no data supplied for the new sample. Though, if you are using a "silence" sample (ie. no data, only used to turn off other samples) it is polite to set its default volume to 0. To determine what pitch the sample is to be played on, look up the period in a table, such as the one below (for finetune 0). If the period is 0, then the previous period on that channel is used. Unfortunately, some modules do not use these exact values. It is best to do a binary- search (unless you use the period as the offset of an array of notes.. expensive), especially if you plan to use periods outside the "standard" range. Periods are the internal representation of the pitch, so effects that alter pitch (eg. sliding) alter the period value (see "effects" below). C C# D D# E F F# G G# A A# B Octave 1: 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453 Octave 2: 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226 Octave 3: 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113 Octave 0:1712,1616,1525,1440,1357,1281,1209,1141,1077,1017, 961, 907 Octave 4: 107, 101, 95, 90, 85, 80, 76, 71, 67, 64, 60, 57 Octaves 0 and 4 are NOT standard, so don't rely on every tracker being able to play them, or even not crashing if being given them - it's just nice that if you can code it, to allow them to be read. Effects: Effects are written as groups of 4 bits, eg. 1871 = 7 * 256 + 4 * 16 + 15 = [7][4][15]. The high nibble (4 bits) usually determines the effect, but if it is [14], then the second nibble is used as well. [0]: Arpeggio Where [0][x][y] means "play note, note+x semitones, note+y semitones, then return to original note". The fluctuations are carried out evenly spaced in one pattern division. They are usually used to simulate chords, but this doesn't work too well. They are also used to produce heavy vibrato. A major chord is when x=4, y=7. A minor chord is when x=3, y=7. [1]: Slide up Where [1][x][y] means "smoothly decrease the period of current sample by x*16+y after each tick in the division". The ticks/division are set with the 'set speed' effect (see below). If the period of the note being played is z, then the final period will be z - (x*16 + y)*(ticks - 1). As the slide rate depends on the speed, changing the speed will change the slide. You cannot slide beyond the note B3 (period 113). [2]: Slide down Where [2][x][y] means "smoothly increase the period of current sample by x*16+y after each tick in the division". Similar to [1], but lowers the pitch. You cannot slide beyond the note C1 (period 856). [3]: Slide to note Where [3][x][y] means "smoothly change the period of current sample by x*16+y after each tick in the division, never sliding beyond current period". The period-length in this channel's division is a parameter to this effect, and hence is not played. Sliding to a note is similar to effects [1] and [2], but the slide will not go beyond the given period, and the direction is implied by that period. If x and y are both 0, then the old slide will continue. [4]: Vibrato Where [4][x][y] means "oscillate the sample pitch using a particular waveform with amplitude y/16 semitones, such that (x * ticks)/64 cycles occur in the division". The waveform is set using effect [14][4]. By placing vibrato effects on consecutive divisions, the vibrato effect can be maintained. If either x or y are 0, then the old vibrato values will be used. [5]: Continue 'Slide to note', but also do Volume slide Where [5][x][y] means "either slide the volume up x*(ticks - 1) or slide the volume down y*(ticks - 1), at the same time as continuing the last 'Slide to note'". It is illegal for both x and y to be non-zero. You cannot slide outside the volume range 0..64. The period-length in this channel's division is a parameter to this effect, and hence is not played. [6]: Continue 'Vibrato', but also do Volume slide Where [6][x][y] means "either slide the volume up x*(ticks - 1) or slide the volume down y*(ticks - 1), at the same time as continuing the last 'Vibrato'". It is illegal for both x and y to be non-zero. You cannot slide outside the volume range 0..64. [7]: Tremolo Where [7][x][y] means "oscillate the sample volume using a particular waveform with amplitude y*(ticks - 1), such that (x * ticks)/64 cycles occur in the division". The waveform is set using effect [14][7]. Similar to [4]. [8]: -- Unused -- [9]: Set sample offset Where [9][x][y] means "play the sample from offset x*4096 + y*256". The offset is measured in words. If no sample is given, yet one is still playing on this channel, it should be retriggered to the new offset using the current volume. [10]: Volume slide Where [10][x][y] means "either slide the volume up x*(ticks - 1) or slide the volume down y*(ticks - 1)". If both x and y are non-zero, then the y value is ignored (assumed to be 0). You cannot slide outside the volume range 0..64. [11]: Position Jump Where [11][x][y] means "stop the pattern after this division, and continue the song at song-position x*16+y". This shifts the 'pattern-cursor' in the pattern table (see above). Legal values for x*16+y are from 0 to 127. [12]: Set volume Where [12][x][y] means "set current sample's volume to x*16+y". Legal volumes are 0..64. [13]: Pattern Break Where [13][x][y] means "stop the pattern after this division, and continue the song at the next pattern at division x*10+y" (the 10 is not a typo). Legal divisions are from 0 to 63 (note Protracker exception above). [14][0]: Set filter on/off Where [14][0][x] means "set sound filter ON if x is 0, and OFF is x is 1". This is a hardware command for some Amigas, so if you don't understand it, it is better not to use it. [14][1]: Fineslide up Where [14][1][x] means "decrement the period of the current sample by x". The incrementing takes place at the beginning of the division, and hence there is no actual sliding. You cannot slide beyond the note B3 (period 113). [14][2]: Fineslide down Where [14][2][x] means "increment the period of the current sample by x". Similar to [14][1] but shifts the pitch down. You cannot slide beyond the note C1 (period 856). [14][3]: Set glissando on/off Where [14][3][x] means "set glissando ON if x is 1, OFF if x is 0". Used in conjunction with [3] ('Slide to note'). If glissando is on, then 'Slide to note' will slide in semitones, otherwise will perform the default smooth slide. [14][4]: Set vibrato waveform Where [14][4][x] means "set the waveform of succeeding 'vibrato' effects to wave #x". [4] is the 'vibrato' effect. Possible values for x are: 0 - sine (default) /\ /\ (2 cycles shown) 4 (without retrigger) \/ \/ 1 - ramp down | \ | \ 5 (without retrigger) \ | \ | 2 - square ,--, ,--, 6 (without retrigger) '--' '--' 3 - random: a random choice of one of the above. 7 (without retrigger) If the waveform is selected "without retrigger", then it will not be retriggered from the beginning at the start of each new note. [14][5]: Set finetune value Where [14][5][x] means "sets the finetune value of the current sample to the signed nibble x". x has legal values of 0..15, corresponding to signed nibbles 0..7,-8..-1 (see start of text for more info on finetune values). [14][6]: Loop pattern Where [14][6][x] means "set the start of a loop to this division if x is 0, otherwise after this division, jump back to the start of a loop and play it another x times before continuing". If the start of the loop was not set, it will default to the start of the current pattern. Hence 'loop pattern' cannot be performed across multiple patterns. Note that loops do not support nesting, and you may generate an infinite loop if you try to nest 'loop pattern's. [14][7]: Set tremolo waveform Where [14][7][x] means "set the waveform of succeeding 'tremolo' effects to wave #x". Similar to [14][4], but alters effect [7] - the 'tremolo' effect. [14][8]: -- Unused -- [14][9]: Retrigger sample Where [14][9][x] means "trigger current sample every x ticks in this division". If x is 0, then no retriggering is done (acts as if no effect was chosen), otherwise the retriggering begins on the first tick and then x ticks after that, etc. [14][10]: Fine volume slide up Where [14][10][x] means "increment the volume of the current sample by x". The incrementing takes place at the beginning of the division, and hence there is no sliding. You cannot slide beyond volume 64. [14][11]: Fine volume slide down Where [14][11][x] means "decrement the volume of the current sample by x". Similar to [14][10] but lowers volume. You cannot slide beyond volume 0. [14][12]: Cut sample Where [14][12][x] means "after the current sample has been played for x ticks in this division, its volume will be set to 0". This implies that if x is 0, then you will not hear any of the sample. If you wish to insert "silence" in a pattern, it is better to use a "silence"-sample (see above) due to the lack of proper support for this effect. [14][13]: Delay sample Where [14][13][x] means "do not start this division's sample for the first x ticks in this division, play the sample after this". This implies that if x is 0, then you will hear no delay, but actually there will be a VERY small delay. Note that this effect only influences a sample if it was started in this division. [14][14]: Delay pattern Where [14][14][x] means "after this division there will be a delay equivalent to the time taken to play x divisions after which the pattern will be resumed". The delay only relates to the interpreting of new divisions, and all effects and previous notes continue during delay. [14][15]: Invert loop Where [14][15][x] means "if x is greater than 0, then play the current sample's loop upside down at speed x". Each byte in the sample's loop will have its sign changed (negated). It will only work if the sample's loop (defined previously) is not too big. The speed is based on an internal table. [15]: Set speed Where [15][x][y] means "set speed to x*16+y". Though it is nowhere near that simple. Let z = x*16+y. Depending on what values z takes, different units of speed are set, there being two: ticks/division and beats/minute (though this one is only a label and not strictly true). If z=0, then what should technically happen is that the module stops, but in practice it is treated as if z=1, because there is already a method for stopping the module (running out of patterns). If z<=32, then it means "set ticks/division to z" otherwise it means "set beats/minute to z" (convention says that this should read "If z<32.." but there are some composers out there that defy conventions). Default values are 6 ticks/division, and 125 beats/minute (4 divisions = 1 beat). The beats/minute tag is only meaningful for 6 ticks/division. To get a more accurate view of how things work, use the following formula: 24 * beats/minute divisions/minute = ----------------- ticks/division Hence divisions/minute range from 24.75 to 6120, eg. to get a value of 2000 divisions/minute use 3 ticks/division and 250 beats/minute. If multiple "set speed" effects are performed in a single division, the ones on higher-numbered channels take precedence over the ones on lower-numbered channels. This effect has a large number of different implementations, but the one described here has the widest usage. N.B. This document should be fairly accurate now, but as the module format is more of an observation than a standard, a couple of effects cannot be relied upon to act exactly the same from tracker to tracker (especially if the tracker is not for the Amiga). It is probably better to use this document as a guide rather than as a hard-and-fast definition of the module format. Oh.. and yes, I would normally give bytes as hex values, but it is easier to understand a consistent notation. Andrew Scott (Adrenalin Software), INTERNET:ascott@tartarus.uwa.edu.au Author of MIDIMOD (MOD to MIDI converter), PTMID (MIDI to MOD converter) L| Ly Lv Ӡֲ㮬f"f"C# "&i01h+# )#M8 % ) L"g# )L"@, )7(P0 ( @A p 8 )# f" +#$#0 &$#0 %# )ȍX#f"P# )ɂH#*# ) %)0I0hx H( , %Щ ߜ)#j )f 8'  )ɀ)4,- U JNT) )#L# ) f"` #K)D/ #3 &#'#(# ## iL X"0#"0ӠĠŠŠҠ`#{% F%Z]``e-.!0SB}/BiBB}/ gF/0k) y! ʿ  L##  m# m# J LB Qר)ɨ] оȱ ̀𩠙 i ȴ O Ѻ G \ ɟU ʿ V@$ A ɛL e '8 Jm ʈ0 o 0堠خ YYZLYLY@뿭`d 8#@8` %MNЩUMߩ  L 5   8 0 8  `0 / X   / &; Pb 8 )0`ddd1&… (n&Dž (\%T&Ln()8= (J 8(&(& >((ʎ1΋&΋&&3223 ')Д )18&"m11 2H22h2舌&&12H)M0 h1020I20h2 (`L%12 `\(#L  98" :ȱ)ɀ  ) ( ` (Xp< @ ( )m ( (. (( M (i  ``) '(j21 & &!` (&&(i)&)( CdBdDdFdGE ) ) ))) ))&$ >(,&& … >(ŅL 'JJJJ`Ϡ(8`&  LdDž )Pi)) () ))&-&),&͉&) ))&0)У` )ɥ`HZJ)  )zh %J)֭)n)}11J  2 (8`rȱȱȱ0\aȱeek+ȱ+ȱ++ȱ++ȱ+ *+ + *`L@+ + * L) *Ș8e` ,$`ee` `+ H++ d+` w+ H+ d+`hh8`8`+++`}+`e`H)hJJ+0JJ)` (< ( < *? ( < (? ( < (? ( <*? * **? *? *? ( < *? ( <x0HH1HH "M,Z(") \i ᘏi᫫8(`hhh8k-<ʆ>Q=?BC8 é&'112`آ <B*IBGF08Lé'+8H <,``h(`@ڍL3HEVhEhH)IWHPHHHAHHHLaVEWLӿ``LKL`BLL ޥޥޥޥޥޥޥޥޥޥޥޥޥޥޥ(C)APPLE xLLM Mh@8nЍLޭ 0J @,,L=#P׽8H  ): e: y8鰕:Jjjj<)yאi8i;i(*=>hPם8`;Zx3Q`_^]ba`0h)ύh0HHHH " ׍hhhhhddhh .hh8`JIMJAYKERRY&MIKEhh@ihAiH(ؠȱ@JJJJq@)@ݔoȱ@Hȱ@Ah@@\e J) ހL JiB ހJ) @xNHHژHL(  ްʠx@BEOD  ް(`( C)CJJJlBJ,~@~@}J@` ߩ%S @ ~`E hhhߺ0 h߈ ߐ( ߐ ߐ   ޕ0 HϭߍLпllll8` Q)T 22D) ɺi )?  }   ސ `@Hȱ@IױHXATȱH ɯȩ׍̰5H)/@a)_ .0 :A[8@`,뎰ڮЕ` } L ` r@>q)I38 kם`K8`@Nȱ@O@ eIiNȽבN)/ȩ/N`@Z VH:JjjjhA "'KI؍0JHi 뎣`ةC8` @)0 e/N0 *ڽ0 ti` <; 뮣ٝ٘ 0 W,0 .H hȑNWȮّNW8`ٍّN0NN` G8`F@ 0 $ LK8`X YI8`FHGH GF܌ עFܽܕF芝ܝ 밸XY Z܅I m[IHHyHȘI L`ܞ @@ @Ю׍q)mיqʈ@ȱ@ȱ@lmq)5qI0ܢܽ n'c* 7FG (ef Ld܅Ip mcIH`  k0no cqHlFmG 밳lm 밨e%܈b" T)Ia)܍p*܍c'ܮ( 4 䭐 $H %HFFHGHG 됬`R8` )` cHq` _9܅IHHqqЍq  @`8 ` ͫ% ΫQ8`܅I `n܍op L8D`F` EgH)HFȍlHGm %܍&܍ܢ8* J8` }L ܝ\)I 'ܝX`d8ipFnGo`d܅IH3H ( )ȱH`ά8ceHI dSBX0k }ٙiٙgFleʈ L`8m0`,0H hi MȽٍ0dGF8yאFG  }$0 *01 E8`100 < 0̩ 谾 }谹`12)1`0`Ȏi i ٞU`)8`` U _G *A)H ܝʈh٭0٭)ܝ٭*ܝ٥F٥G٭'ܝ٭(ܝ`)َ 8ʈ` 0ٝ)i `8`O 鍮 dMمFمG ; ή0FG뮣0 ٭٭ٽ8`H8`  , 8`  `ٽJJJJ`Hͮhk)&NjNjNjN. 1Eͮ d8٭ u'Nۙ۰ڙک `Z8` 1# ` . . .8۰*J۩ ٰ:`JJJJ9 d묣͸ dٍ0 u  `H8` `ٍyٍiB0H0FGy h0`FG `ϩBxEdD0C ް(`(8`ؑ@`M8`8@ؐʈI묤)8 La LةC8`؍)@ fi)8wJ ] ؅F LW) y+%J(^ FإGؐ,` JHIH I%FHGI ԭJjHIH@=IؙJJ ?9 -4HIHI`JKJK`FHIG ( Ȣ؝؈JL)eKM`)` J Jͽ $0 άJFȱJL8`GBJ 6 FإG`BH 6FإG`,H hHB؅F  ؅GxDE؍00C ް(`(8` d뀧J  ! dH   9ؙ` r@ }P8`K8`B8` j؈qJJJJح) ) )Ю ЪG.F $ ᭔ع+ؠ H  0h8` 䮣ٽ ٬ؠ@` ( j )8`)i п` H h)N$% LL L e L  pJ )@NJOK iKK IJ v JФ̭JjHFIH HIGxKE ް((H vhH h8`8@ȭ@L쬤8NNO 8 ؍JL`QʱLN0MOMEKP.MEKӱL-M O,up莿eNNO(`JNKOL / P L8 a ?ؑJ`L@ȱ@ `@Nȱ@O`؝}I轘ؐ` Gؽ؝ G  G؝؈` ` H 1h)N@ ; L  $ )dJ S ) iH h8` ) )حJjIHIH؊ PLJʱNLMO MІMEKݸP$MEK O,u PeNNO (` C  7 2JHIHI؊ aL-  ` ? H ع H ؙ؊IhHIhH a iع `  عiعi` )؍0CGHFHdBdFdGx ް(8hFhG`@4͔ L @Ai ׭2` . 0#ع؍0 <讣)`.@+ i 8` L )0 )p )@ f ) yʩ ؝j0lm 밫 }nolmFG w嬤؍؍؝ ؝ q) q )حk͸ d`H@h`h``N8`  ) ⬤Ȣ؝@ݼ@ʈL KIJHȢݼ ^魼)Jn 8  ؍ ؍ 2H8 ع)JJJJ Ȣ؝I؈ h(8H  h(8Hh(`ؑ@`@ȱ@ ` r@@8Wq ^鮣ٍٍٍHٍ8hqJJJJq2)q@` r%I -) 20@q)N8` @LL =@ ȹP8` i` ם0 B )( ȹ`8m8m@8` G8`F } r }P⭏)@N8`q)@J טyרםqq)׍q 밑 LȹL@ȅH@IL,0` rD }ﭩ: SH-)N 0 $q)@kP8` 2  dHqefe h`yٙ٭yٙ٩`H 1BFG 3%&N    ܮ `J HH hh` 0@ tL)lL S_Xܝ ݝ0ȩFG  0` ܅F݅G ` \ Sͬ 밽܅F݅G ` \) S$ L`LHH hFhG܍ݍ 8 `FHGH  hGhF`ݹܙ݊`@Bɼ>K@J5 V9X(K VXXK تKo`V8`no` "on VI9XX`)&HJJJh`OeNeO࿰ V9XГO`@ȭ@` ON <NJKO`?>х=d<<>=?ILBJ DքEdFCJJJJ֍nH}IC J֭֬։/)DI@+8`@Ae C!$|1OIIJK,-NOPQRSu' @   !"#$ Ԡͭ HB-9F 3"aɿ LLB Nϰ H  @h( L Lj  @`eLJCAB@=?<>=?<>CAB@?A` 1 L  <>`ڢF]PL8i m L   6< L  BLRAM' hLDL ֽ ְ& .Vӈ  JJJJH 8h Ei 8EX`'8`jӍWӥC)p> pӥCYӍY 轊( ( ӈBV ( ӭp0 \BkJ ՠ@iӦ> Ӑi'j:ZH i@ioZZH h ѐȭnWǥBJ Ӱ8XӦ>` Ր+>*L o % ԽYӍZӭoӝY 3Ѡ шNZ`rZLkӭZӍq8r7IZӐiZkӐk 8 ѹs ӭq ѹ| kн Z)*>>` @ $(,048<@DHLPTX\`dh 0ުlptx| 0($ p,&"op8`kkV꽌ɪɖxlӽ*kӽ-kәmMlӈ 꽌ɪ`8` ZԍsԍԍԍԥDEԌ8TԌ8WpԌqԠ 7I꽌ɪ꽌ɭ蠪:љVE:8`]ѾV]H)]ѾV]ҙ)]ѾT]ҙ)] >8hUD` ԝY`> Hh݌(`HCJJJJ)*h`8LխӅ:HhHh Ո թ թ ՘VYҪҦ>:Y)Ң`;R?AJ;<ȰY)Ң`Y?)Ң`ȐҰ ;HhHh=Ң`Hh `Hh`DEiȍ0֌18V%֌&8V֌֠)HV)hH)hHIhդD?DRIDQD)҅; ?JDQD]ՎՎՎ`MY pӭY)p  ӭp`C)`BFGV 8``  / XʩXύX X %   % ɍRH hɛɘɉɈ $ Ld :Ldې)ɮ۰ɺ' Ld  : X ( % ɛ$ɘɉ ɈL :Lɍ)ې)ɮ۰ɺH h 'L  ġLL ̹L)'L ȳL O'F ʻ ̹(((L $ʩ $$ $L `ީ % K@D EFby LҠؠӠ΢ϠԩҠŠƠԠԠŠӢɯϠҠůȠԠĠ  ح o âXoύX`1e0e21ʆe dk)i/ k Lkdha+ # nrdcddpqt$q0c)crorcc0enib ` r )pqn  Эht X l)lhЏL2  9 X [ J  dgdshUj" !# wgjdg. wg'g%s wghg%s w h ɍ1Ɋɋɉɛ kʽ/`L2LY g Xȱl蝀igt 9 X   (L $ `dm &m &m &m &mlemmli`{g8s [t0{2H* Lh2  Xȱl i L `κºú` \GQ H ?h8 S / ?8 V []bj \ ^e_f a  i  \ 2EL 0 8`0)H ""H"h8 ek)E/8`HZ; [:HZ"h+h`8h`/Ȁ򈘍` L   `H0H"hHHH HHH "hpHH"VHH; [*i)    +hhHH"""8h/ ʎ S` ?8 r 0 88`  Can't run next application.ProDOS Error = $ Please insert the disk: Accept: M Cancel: Esc 300e"Enter pathname of NinjaTracker song to be played: (without .SSM)":"";A$:A$""ī300I768803:A:I,A::24,251,194,48,169,0,0,162,0,0,160,0,0,84,0,0,75,171,56,251,226,48,96,24,251,194,48,34,0,0,15,56,251,226,48,96:255 B15 X$A$".ssm"" X2$A$".w"4 X$X$",t$d5"^ (X0:D0:BB1:L44096:S24096:100 2(4)"bload"X$",a$2000,l"L",b"X:200 <XXL:DDL:D4LD0:BB1 F50 d216,0:B17 eX$X2$ fX0:D0:BB1:L44096:S24096:119 g(4)"bload"X$",a$2000,l"L",b"X:200? hXXL:DDL:D4LD0:BB1H i103S w216,0 x(4)"bload ninjatracker,a$2000":D0:B15:S2:L2:240 791:250 LL1 7685,L(L256)256:7686,(L256) 7688,S(S256)256:7689,(S256)& 76811,D(D256)256:76812,(D256)4 76814,BO 49193,65:768:LL1:s LL4096:SS4096:DD4096:200 :"Press Control-Reset to stop music (or reboot)." "Type 'bye' to exit to ProDOS."  ,::(4)"pr#3":(4)"prefix,s5" 6"Welcome to NinjaTracker." @S$(27)(15)"SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"(24)(14) JS$ T"Play music:"(13) ^"1- Arnesune by d-zire/silents" h"2- Blue Intro unknown artist", r"3- Conrad by xtd/union"g w"4- Other... Enter path of song to be played" |"":"":"Start program:"(13) "M- MODConvert II Convert Amiga MODule files"" There are more modules on this disk."0"N- NF Assembler Ninjaforce Assembler"" Source code for player and converter are on this disk.""""More info:":"""http://www.ninjaforce.com/products/products_ninjatracker.html"C23:S$"Return: Exit to Basic. Space: Exit to ProDOS. Make your choice:";KA$]A$(13)ė:tA$" "ĺ(4)"BYE"A$"1"A$"converted/arnesune":2A$"2"A$"converted/blueintro":2&A$"3"A$"converted/conrad":2+A$"4"ė:1"0A$"M"A$"m"ĺ(4)"-modconvert2":L:A$"N"A$"n"ĺ(4)"-nf.assembler":UD500)Apple II 2IMG Disk Image