DOS=spC>p%NJg "@"NbCNJg @ hpNupNudos.libraryexpansion.libraryy????? g?????????????? .???????????? ????????????? 㵍?????????????֪Q??q?????????;ṣ ?9 ?9 ?9 ?9 ?9 ?9d-L ?9 ?9 ?9 ?9 ?9 ?9 =̫?9 ?9 ?9 ?9 ?9 ?9 :(̚?9 ?9 ?9 ?9 ?9 ?9 ?9 ?9 ?9 ?8 ????<?>* ??????  ~\?=B!?%(C @?=(@!@?!(@ @?!{ ?!0??"#)}???????${??????????%y????????&w??????????'u????????( ?????~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ÃÃÙϜÃÃÁəψ癙)၃ϔ癙癓Ϝ㙃ÃÙÙß*Г  + -S8@?x?`g?~x?~xx`?`x,!$ x``g?x~xx?x~8x~y~矀?`xxyxy燀g?|?-"]l ?08<?.#7Fs?~Nx|<??s<?08??/$w\i?c8 G??#qsy??q3y?????q3g3????#qG0%xLs????`8 c<0 ?@8?8p>|s<<>|>?8?,|Ns>>|>?x?4~|s?>|<x?ǎ?8>|s<>||??ǎ?<~|0>|?~??ǎ???~?y?ǎ?~?y? ?~?3???~?3?8 qAG9| 8>

G?9y|8>$0|χ??~AGϙy|< ??~??>4)zvh?? ?0<0?Á?~3?~43??5*W"x&~83Á?  @????6+Z>L<0 0 ϟ??<̙3<0 0 ~ß??>3?x???̙3?x?<L<0 0 ~ß??<0 0 ϟ???7,S8- )|`~p|9.y#:/;0n????<1 ???=2TM?????>3UF?8??46@5?A6z?B7X?C81mpD91 ppppppE:th+2ppppppF; @ppppppGpppp= IHGFEDCBA@?>I? `J@KApLBkMC)???????NDŀ??????????OE~????????PFm???????????QGz????????RH:????~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ÃÃÙϜÃÃÁəψ癙၃SIr0ߑϔ癙癓Ϝ㙃ÃÙÙßT,* g JK,LK` MED.gfx1.infopJLC"ș2 C!  ````pm mJf ADNb`"Bpf mCN28 -JoS3"A$v),lNCFp,xN)@|g"AX$v ,lN maJ@g"Ad$v ,lN`x)lbN* lbarJ@g"Ar$v ,lN`fJlhgpN(J@fx` pN(J@fxJDg0"A$v,lN lbN). ,@,xNN(`"A$v,lN"l|,xNbLHN]NuNU/ lh l AN` h$/H"(,lN o h N,_N]NuH0G` JRHH @Jf$[ fL NuH &H,xN)@pNHHHRWUrg p$,)@ NHHHrg p",)@a|Jhf Ka(`a&N. ,rg,xN ,rg,xNLHNu/JlgBlAp,l|NhB` lNR)H)Hb,_Nu/N1 lZ(6HH(7HH h2C,l|N(,_NuNUH".N'p9@9@p@f0|/H lZC$o ,l|N`0p0N&J@g0|/H lZ"l$o ,l|N`9| lZC,l|NrAfA`A)HH lZCNA"lZN"LDN]NuNUH 2&H KJfS rPl KCfCp,xN)@|fp`|A,l|N4)@ZfpRXqS`f0|/H lZ"oEUN l0(t%BTDHH9Ag Cp%,xN)@g ,@N)@fA"lZ,l|NRpLLN]Nu/N% ,g",g A,@N"l,xNb ,Zg @,l|NJ|g "l|,xNb,_NuNUH?2&H KaJ@gnaJgF/ lZC:EU,l|N$_ KNvJ@g$a0|/H$/ lZC$o(,l|N$_a lNJlf p0,^aJlg&Jbg lbN"0|/H$/ lZC$o(,l|N$_`N"l0|/H&/ lZC$o*,l|RZ fDN$_0/$[@f0,^S@fp9@^` 0,^fr9A^p0,^a` ,g @,lNJ@g l&h gtJgn"KJfS r@ҁnX lZC,l|N?@$ l"(g ACf`B,A"$ v@փ,lN0/$R@g0/$H lZC,l|N/ A"lZpNP$_`Jbg.Jyg& lb0((29SA3?@$N"Jo$fna`Jbg.0,`29@d lb0((RA3?@$N!Jo$f2a`fa0LLN]NuH1&H.",$ &,lNְVDHH LHNuH0&H$Ip0"JjRg~`r.RR L NuH#0&H$I.|R[=` K"Jar @t4, .SJf L NuNUH'0&m.,Hp;@$m;@`0pmfJmg X+JXgrpJjVr  KCajrtr2$m z;A`8-g"p KCa< KCarA0-@VR;@e mgnpJjVr  KCartr2$m z;A`4-g KCa*p KCa@0-@VR;@ep"剒ӭ $m Ѐ$ m Ѐ Rm0-GeL N]NuNUDH72.B-BBmpAaJ@g 0| `p-AaJ@g 0| `ppACaR \C @(pACar,H"l irt4R/(v"剒@! N'gB`4pACa?@*pACar20/*t4HBBB&AR&Hgp&`>gB`4pACaP?@*pACa>r20/*t4HBBB&R/R ]E^_ epA$H-fB`p Ja,J@g 0| `2p-Ѐ@Rpe~`zp fXp"Hg0pAaJ@g 0| ` -B@H@?gAaJ@g 0| `-gBR`p JaJ@g 0| `-gBj`ApapJ@g 0| `v-gB*`ApaJJ@g 0| `P-gB*`Apa$J@g 0| `*-gB*`(-g|@`AR _paJ@g 0| `-gB*`2ApaJ@g$0| `p45@p@@@@ Ѐ&J*g9|hR l$hp?ezAparJ@g0| `x"l iCp0( IaNJ@g0| `T"l ipa0J@g0| `6pAaJ@g0| ` "l ipaJ@g0| `pL N]NuNUH32.",t&,lNY+@A <"<,l|Nt&@ g2&ApaJ@fAp0+aJ@fAp0+anJ@fp0+AaXJ@f -Э",$v,lNpkfLpAa(J@f -\Ar,l|NtR `[Z]'@Jg"- @ C -T IaJ@g\`p|`Pp0$KApAЀ"<,l|Nt%@JgDp jaJ@f6 jCp0Ѐ IaJ@fRFkep0"l i p`0| LLN]NuNUH2A$C""G~pAaBJ@g 0| `-gpAa J@g0| ` Ѐ&p@fXgpAaJ@g 0| `0-l*pAaJ@g 0| `p0a$@ gr `z"l i -\/HA"<,l|Ntr2 o "l i$P f0| `0 -$5mA -aPJ@g0| ` RGp?@e,pLLN]NuNUH+HRaD|9|BlhAp4"<,l|Nt)@Jfp`N l MMD01|0A <r,l|Nt l!@fp`!| aDJgp`"l i|?"l ip0(A"<,l|Nt l!@fp`"hp)A"<,l|Nt l!@fp`ApT"<,l|Nt l!@ &@ fp`nAp@"<,l|Nt'@fp`N"l i 1|?1| aJgp`.apJgp`"aJgp`Jjf"l i|pLHN]NuH>:|(H,yCpNJg&@,@" $<N(g`"tvN"vFN*,yrN:Jg0$@"$&,KRb⢿Nְf MMD0f Ja|, `"J ,yN.,K"N"K,yNb L\|Nudos.library *g. @p)Sa(&(g&CJkj4+GSBכQQNuXNuJgӘNuH00$H" aP"jaa2 * g& @aaXaXaPaXa @ g $@a""j`L Nu *g @0)SaQNuAaXaXaX`/ g,y (g"HN.,_NuC"Q)gB)AAB(p`<lB"B)Iri3Nu/t aQAB$NuHx nCC*00fJ+g,+<l"EJgJ-Io ig3B"-g"B-A&B-HpaRc eLJ+f|lB-Qm PB- y3 ESJhkB-IJj `<>o 8az"m"|b+|;|2`JBg2`2ԂЂ+@;C22;EJ-IfL8Nuj kSjtz+j B-`ASE+g(;PHg"CPBSA%<p?a2JgA"HgVQ`B-`zAG+H" hf PI h`|IC+IJA21"m;A3ABC&BBBBBB" BY m"2B -fm/a`/ &mS-*n"mD*-Fg-Hjp<@op@@H@ "-8g$"ARd}^E@H@ R-VjB-V"mR+I80-,J-0g S-0o`RR0k AHA `A2;N" 8NZvvv,tvvt0`pD`p0R`^pF`0DAF`p/B-1`0a$BR+I8B-V`p0a+IR`B8`^HAAC"QTNuS;@,mHS-+nmE+0-.2-4gm6;A6m|qlrq7AJ-1g S-1g`RR0kHAA"px7Y&`A2;N".8ZhBLr0HAA"pxT+I>`0`;@(;@&RJ0j`pE`~p1R`Np=`jp3R-3`\r0;A4ReڑO`N0DH`Bm67m`8p-B-0`(S;@.0-&g0r0-G"mJA21m6;A7ARJ0j0-(;@&2-0H@2-@m67A0-2mB&_Nu1GZju}}ujZG1Ϲ/99gQ Nu*Yd"-g m 0Nu0:Pg rZAa3rOaCnaaaaA,0g` RfS!!"2"""###*#<#N#`#r###H?<,z gJnRgU(gB3(n gv.2R,lC2f|B.20.* n@@$p##0.,2@A~HzJz"W*Y.ZxvVV@fJfJgHJg@Jg@ S@App? @G+K p+H@k Fg-<fJg<bpaF`j<fz`\<f.Bn( zaX 9g"y,yN`<f&|l mJSk:00P m1@z`<f0a `R9#`<f<lF/`ʰ< fFj<@n4r-A`,f RhEӰY<@b H@`~< ff| F`h<fF @`P< f0@lb>=@.P#`2<f,SjJgN`|lF mJ,- k8E;pPFNzJg&02t-v-&m mfPaTRzDmX3,23.23*22.,RAznJ9#g@r n(f00..J9#kR@lmpr@/A0,mp@+B9#=A,$N 9g"y,yN,J n0.*@@$p0.,2@AE,AHS"XJ)k&f *g`?g *Wf)VQ,fLv~|E*Zzx--J-fx|lJ-RiA8k.S-j(J-IgmP-B-0 -"`mPQf 3z -"g @a"m-Qg-jB-B-Q0;`N"(hh"m:-|ql:<q;E3E`tm:-`Jgd H@J@f` Sf `S,-  mJ3p@`*-fjp` <@op@@@ `:-<lD3E`0-g2--N@bD@l`D@n2-Bm;A3A`JgD!- @rA0H-!@Em-!>- 3E`n<f <fb`<f <fR`<f*g@0rg8t-?v-&m Rj|@a:6`$<g<f`m Rzma0Lt4 QLNu@t0(f A+HJ:0 @\"46+NuH~> *HE"<f\` 46+|;p&jki;p(Ј\CV;p&:1PLNu  $H 0 gx"h)HCErH&ZJ7BQ&HE~ ( g>"@ )g6 @4)g.SB0) &k|o J(gPh?Q`p>BZQL NuJgaJfaRJf p!apNuapNu:ga aa NuRl:g z aB3B93pa8Nu 9g @Bh( ( g @ fNu:g"z/a _p`PH瀀aL:{g"g"zB3B93p"hi2)f `JgB,r2(.A1A+1|(#3#b0)"zNaNu 9g @29g ( g "@Jg QSAn3*23.23,2#bNuH0 t,yRpNJk3qC@#yA XB!HRCAXprNDJfP3xR .2g #<*FpC7NJgh#3RvIr(((,@CjpNJg"vCZpNJRm}f(()<)< z*3{pLP Nu `/p:gB93{,y3C SN,yJ93xg3C8N>B93xp:{k NP3q,_Nu/a.Jg&,yN|A^CNJg"@NJNva,_Nu,ypC^N#3tJgF,@CfpNJf6pC~,yN^#033r2P3zP3rpNupNu/B93rJ3tgBJ93zg:,yJ.&l:g3"z"pN^,zpNB93zB93p,_NuACf`jNuH2 9bg"@$iAXp09R@ 09`R@ 0:R@ 0* 0: 0* 0: A\,yCERnR?)G(NLLNuSg:%02.2ld/%02.2ld S:%03.3ld/%03.3ld B:%02.2ld/%02.2ld L:%03.3ld No song in memory ABBPNu1|@R.&1|)g.*i2<1A0fKS@#MS.&l1|NuP `:gn:ghH",y3@R.&EJ* g B* 3"Rj<b :g A R*fCSf$S.&l3LDNuRof224}3z$43f2&3D*0audio.deviceciab.resourceMEDTimerInterruptMEDSerialInterruptmisc.resourceserial.deviceMED modplayer ` @ phPLt4X(\:}hS@. Rpxqxqxqxq`^Nq o`TNqNuNu/ "Hrp/ +g -fRH0m n $҂ҁҀ` -fD$ S _ NuH2&lp g$S"K ),xN.&J`)Ht)HpLLNuH0$&HBHCCHBBBЂL NuJjDJj Da DNuaDDNuJj DaDNu/HA4f"H@HAHB4g0H@40HB2$Nu/v ARq4dQC AdYC A dUCJAkSC4HBBBHC604HAdSCЁdr2HCH@A&$NuD################$$R$X%&P&&&&&'&+--...b....//0/D/////00L0v00000003f3j3333334,4@F .1$ ^ V F 1.'2%H.h.1%P':.-.hRri= @؊؊؊؊ŊĊӊ؊ӊŊĠ$VER: MEDPlayer 3.21b (12.1.92)Usage: medplayer Without arguments MEDPlayer is opened in interactive mode. intuition.libraryLoading...Load error!! OctaMED songs can't be played. Press Ctrl-C to quit. Resource alloc faileR s|d! :U!! Loading failed !!Ptopaz.fontPlayContStopMIDI:NMIDI:YFReq<>&.&4&:&@&H&P&V&X<%&1 ,++ ** * , ,--  : : :;;    R!to2  ^r 6:(f< Z< n@< < < B  v>w2D>R"չ@nResource alloc failed.Can't play OctaMED songs.intuition.libraryasl.library<\T0(xfTL:0 zvfb&v>w2D>uvmxwv*`MEDPlayer.infopuwݳI&P̀v2lOPX11c11c11c11cuxnssssP8`````    ? ~11c11c11uZ~Kc11cssss11c11c11yz.z6k MED_pathspyܖ*MED3.22:Synthsounds/ SynthString1 SynthPiano1.echo SynthPiano1 SynthOrgan5 SynthOrgan4 SynthOrgan3 SynthOrgan2 SynthOrgan1 Synthchord2 Synthchord1 SynthBell1-low SynthBell1 SynthBDrum2 SynthBDrum1 SynthBass1 SyntHarp1 SynLead1 Strange2 Strange1 smoothpulsevib2 SlowLaser1 Siren1 SinePulse SineBell2 SineBell1 SawSound2 SawSound1 pulsevib3 pulsevib2 pulsevib1 NoisyPulseVib2 LeadBell1 HumanVox3 HumanVox2 HumanVox1 FX3 FX2 FX1 FastLaser1 basschord47 basschord37 rp{|}n*}|twdProgrammers.infop{}.x9C(H02ɩ ]C@ZsZ(9) $ $ $ $$$ ?03777*77?76?9*`5UUUUU\@@@ @ @ @@{,?0"UUUUUP????*????) $ $ $ $$$ ?03777*77?76?9*`5UUUUU\@@@ @ @ @@~vnq-_ Programmerspt Examples.info~zPO9pMZ22M_Z\?90 $ $ $ $$$ ?03777*77?76?95UUUUU\@@@ @ @ @@-hL?0"UUUUUP????*????0 $ $ $ $$$ ?03777*77?76?95UUUUU\@@@ @ @ @@I-Examples~VMw example1.cPt /* This is a very simple example how to play a module which is converted to an object file with Objconv. Linking info (assuming the object file is 'module.o'): blink from lib:c.o+example1.o+module.o+reloc.o+modplayer.o to example1 lib lib:lc.lib+lib:amiga.lib nd sc sd */ #include #include #include #include "modplayer.h" /* Use symbol name 'song' when using Objconv, or change this. */ extern struct MMD0 far song; void main() /* 9this can be linked without c.o */ { RelocModule(&song); InitPlayer(); PlayModule(&song); Wait(SIGBREAKF_CTRL_C); /* press Ctrl-C to quit */ RemPlayer(); } '): blink from lib:c.o+example1.o+module.o+reloc.o+modplayer.o to example1 lib lib:lc.lib+lib:amiga.lib nd sc sd */ #include #include #include #include "modplayer.h" /* Use symbol name 'song' when using Objconv, or change this. */ extern struct MMD0 far song; void main() /* 'sv example1.c.infoתEww(`p E`   <1" 1!*! *!$! $"$<   ? g$E   I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pv#}om}om}om}om}om}omppp :c/muchmore  pUFw example2.cx݊|/* This program loads a module, and plays it. Uses medplayer.library. Could be used as a small replacement of MEDPlayer. */ #include #include #include #include /* These two must be included in this order. */ #include "libproto.h" #include "modplayer.h" void main(argc,argv) int argc; char *argv[]; { struct MMD0 *sng; register struct Library *MEDPlayerBase = 0L; if(argc < 2) { printf("Usage: example2 \n"); i/return; } MEDPlayerBase = OpenLibrary("medplayer.library",0); if(!MEDPlayerBase) { printf("Can't open medplayer.library!\n"); return; } printf("Loading...\n"); sng = LoadModule(argv[1]); if(!sng) { printf("Load error (DOS error #%d).\n",IoErr()); goto exit; } /* Now, test if it's 5 - 8 channel module */ if(sng->song->flags & FLAG_8CHANNEL) printf("OctaMED module - can't be played!\n"); else { register long count,midi = 0; /* Check if it's a MIDI song. We checkv| the MIDI channel of each instrument. */ for(count = 0; count < 63; count++) if(sng->song->sample[count].midich) midi = 1; if(GetPlayer(midi)) { printf("Resource allocation failed.\n"); goto exit; } PlayModule(sng); } printf("Press Ctrl-C to quit.\n"); Wait(SIGBREAKF_CTRL_C); exit: FreePlayer(); UnLoadModule(sng); CloseLibrary(MEDPlayerBase); } MED module - can't be played!\n"); else { register long count,midi = 0; /* Check if it's a MIDI song. We check1rvdexample2.c.infomvtEg QE   <1" 1!*! *!$! $"$<   ? E  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pv}om}om}om}om}om}omppp :c/muchmore  pT<%w example3.aٶ; This program shows how to use the modplayer routines in an assembler ; program. ; It loads a file, named 'module' (you can change this if you want), ; and plays it until you press the left mouse button. ; link with modplayer.o and loadmod.o xref _LoadModule xref _UnLoadModule xref _PlayModule xref _InitPlayer xref _RemPlayer section "text",code movem.l d0-d7/a0-a6,-(sp) lea modname(pc),a0 jsr _LoadModule(pc) move.l d0,d7 ;store in d7 jsr _InitPlayer(pc) move.l d7=A,a0 jsr _PlayModule(pc) ; WARNING: BUSY WAIT USING THE HARDWARE DIRECTLY. NEVER WRITE CODE ; LIKE THIS IN REAL PROGRAMS (this is just an example) !!!! waitmb btst #6,$bfe001 bne.s waitmb jsr _RemPlayer(pc) move.l d7,a0 jsr _UnLoadModule movem.l (sp)+,d0-d7/a0-a6 moveq #0,d0 rts modname dc.b 'module',0 end er xref _RemPlayer section "text",code movem.l d0-d7/a0-a6,-(sp) lea modname(pc),a0 jsr _LoadModule(pc) move.l d0,d7 ;store in d7 jsr _InitPlayer(pc) move.l d71[vXexample3.a.infoEuwRX`hEp   <1" 1!*! *!$! $"$<   ? WE  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pv}om}om}om}om}om}omppp :c/muchmore  pmtMODPlayer.info~9OS`_1>V` P|\?9 $ $ $ $$$ ?03777*77?76?95UUUUU\@@@ @ @ @@-d?0"UUUUUP????*???? $ $ $ $$$ ?03777*77?76?95UUUUU\@@@ @ @ @@@l>:K#hOc'- MODPlayer~cFwL loadmod.a٨; MED module load routines by Teijo Kinnunen 1990 ; V3.00 module support added 22-Jan-1991 ; upgraded for V3.20 (OctaMED V2.00) 02-Aug-1991 ; Function: d0 = _LoadModule(a0) ; a0 = module name ; d0 = pointer to loaded module, zero if load failed xdef _LoadModule xdef _UnLoadModule code _LoadModule: movem.l a2-a4/a6/d2-d6,-(sp) moveq #0,d6 ;d6 = return value (zero = error) move.l a0,a4 ;a4 = module name movea.l 4,a6 lea dosname(pc),a1 moveq #0,d0 jsr -$228(a6) ;OpenLibrary() tst.l d0 beq xlm1 move.l d0,a3 ;a3 = DOSBase move.l d0,a6 move.l a4,d1 ;name = d1 move.l #1005,d2 ;accessmode = MODE_OLDFILE jsr -$1e(a6) ;Open() move.l d0,d4 ;d4 = file handle beq xlm2 move.l d4,d1 moveq #0,d2 moveq #1,d3 ;OFFSET_END jsr -$42(a6) ;Seek(fh,0,OFFSET_END) move.l d4,d1 moveq #0,d3 not.l d3 ;OFFSET_BEGINNING jsr -$42(a6) ;Seek(fh,0,OFFSET_BEGINNING) move.l d0,d5 ;d5 = file size movea.l 4,a6 moveq #2,d1 ;get chip mem jsr -$c6(a6) ;AllocMem() tst.l d0 beq.s xlm3 move.l d0,a2 ;a2 = pointer to module move.l d4,d1 ;file move.l d0,d2 ;buffer move.l d5,d3 ;length move.l a3,a6 jsr -$2a(a6) ;Read() cmp.l d5,d0 bne.s xlm4 ;something wrong... cmp.l #'MMD0',(a2) bne.s xlm4 ;this is not a module!!! movea.l a2,a0 bsr.s _RelocModule move.l a2,d6 ;no error... bra.s xlm3 xlm4: move.l a2,a1 ;error: free the memory move.l d5,d0 movea.l 4,a6 jsr -$d2(a6) ;FreeMem() xlm3: move.l a3,a6 ;close the file move.l d4,d1 jsr -$24(a6) ;Close(fhandle) xlm2: move.l a3,a1 ;close dos.library movea.l 4,a6 jsr -$19e(a6) xlm1: move.l d6,d0 ;push return value movem.l (sp)+,a2-a4/a6/d2-d6 ;restore registers rts ;and exit... dosname dc.b 'dos.library',0 ; Function: _RelocModule(a0) ; a0 = pointer to module ; THIS FUNCTION IS A BIT STRANGELY ARRANGED AROUND THE SMALL RELOC-ROUTIN=E. reloci move.l 24(a2),d0 beq.s xloci movea.l d0,a0 moveq #0,d0 move.b 787(a1),d0 ;number of samples subq.b #1,d0 relocs: bsr.s relocentr move.l -4(a0),d3 ;sample ptr beq.s nosyn move.l d3,a3 tst.w 4(a3) bpl.s nosyn ;type >= 0 move.w 20(a3),d2 ;number of waveforms lea 278(a3),a3 ;ptr to wf ptrs subq.w #1,d2 relsyn: add.l d3,(a3)+ dbf d2,relsyn nosyn: dbf d0,relocs xloci rts norel addq.l #4,a0 rts relocentr: tst.l (a0) beq.s norel add.l d1,(a0)+ rt6-s _RelocModule: movem.l a2-a3/d2-d3,-(sp) movea.l a0,a2 move.l a2,d1 ;d1 = ptr to start of module bsr.s relocp movea.l 8(a2),a1 bsr.s reloci rel_lp bsr.s relocb move.l 32(a2),d0 ;extension struct beq.s rel_ex move.l d0,a0 bsr.s relocentr ;ptr to next module bsr.s relocentr ;InstrExt... addq.l #4,a0 ;skip sizes of InstrExt ; We reloc the pointers of MMD0exp, so anybody who needs them can easily ; read them. bsr.s relocentr ;annotxt addq.l #4,a0 ;annolen bsr.s relocen]ntr ;InstrInfo addq.l #8,a0 bsr.s relocentr ;rgbtable (not useful for most people) addq.l #4,a0 ;skip channelsplit bsr.s relocentr ;NotationInfo move.l d0,a0 move.l (a0),d0 beq.s rel_ex move.l d0,a2 bsr.s relocp movea.l 8(a2),a1 bra.s rel_lp rel_ex movem.l (sp)+,d2-d3/a2-a3 rts relocb move.l 16(a2),d0 beq.s xlocb movea.l d0,a0 move.w 504(a1),d0 subq.b #1,d0 rebl bsr.s relocentr dbf d0,rebl xlocb rts relocp lea 8(a2),a0 bsr.s relocentr addq.l #4,a0 bsr.s9ΫD relocentr addq.l #4,a0 bsr.s relocentr addq.l #4,a0 bra.s relocentr ; Function: _UnLoadModule(a0) ; a0 = pointer to module _UnLoadModule: move.l a6,-(sp) move.l a0,d0 beq.w xunl movea.l 4,a6 move.l 4(a0),d0 beq.s xunl movea.l a0,a1 jsr -$d2(a6) ;FreeMem() xunl: move.l (sp)+,a6 rts end ,d0 beq.s xlocb movea.l d0,a0 move.w 504(a1),d0 subq.b #1,d0 rebl bsr.s relocentr dbf d0,rebl xlocb rts relocp lea 8(a2),a0 bsr.s relocentr addq.l #4,a0 bsr.s^`vloadmod.a.info"Eg o8AR@ Ep   <1" 1!*! *!$! $"$<   ? WE  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pv}om}om}om}om}om}omppp :c/muchmore  pHšb modplayer.a; modplayer.a ; ~~~~~~~~~~~ ; The music player routine for MED V3.2 (and OctaMED V2.0 4-channel) songs. ; Written by Teijo Kinnunen. ; If you find bugs in this routine, please notify: ; Teijo Kinnunen ; Oksantie 19 ; SF-86300 OULAINEN ; FINLAND ; ; THIS CODE MAY BE FREELY USED AND DISTRIBUTED! ;============================================================================ MIDI EQU 0 ;1 = include MIDI code AUDDEV EQU 1 ;1 = allocate channels using audio.device SYNTH EQU 1 ;1 = includ;e synth-sound handler CHECK EQU 1 ;1 = do range checkings (track, sample in mem etc.) RELVOL EQU 1 ;1 = include relative volume handling code IFF53 EQU 1 ;1 = play IFF 3- and 5-octave samples correctly HOLD EQU 1 ;1 = handle hold/decay ;****** Timing control ****** VBLANK EQU 0 ;1 = use VBlank interrupt (when absolutely necessary) CIAB EQU 1 ;1 = use CIAB timers (default) ; Please use CIAB whenever possible to avoid problems with variable ; VBlank speeds and to allow the use of comma.$nd F01 - FF0 (set tempo) ; If both are set to 0, the timing is left for you (never set both to 1!!), ; then you just call _IntHandler for each timing pulse. ;============================================================================ ;If you are making a demo/game with only a single tune you'd like to ;incorporate in the code (like "easyplayer.a" of MED V3), set the following ;flag to 1. This requires an assembler with INCBIN (or equivalent) directive. ;You have to type the module|J͗ name into the INCBIN statement (located near the ;end of this file, on line 2052). EASY EQU 0 ;Call _startmusic to play the music, and _endmusic to stop it (before ;exiting). Note: don't call _startmusic twice!! This would cause the module ;to be relocated twice (= Guru). If you need to stop and continue playing, ;don't use the EASY routines, use PlayModule/StopPlayer... instead. ;============================================================================ ;the MMD0 structure of%fsets mmd_id EQU 0 mmd_modlen EQU 4 mmd_songinfo EQU 8 mmd_songlen EQU 12 ;currently unused mmd_blockarr EQU 16 mmd_blockarrlen EQU 20 mmd_smplarr EQU 24 mmd_smplarrlen EQU 28 mmd_expdata EQU 32 mmd_expsize EQU 36 mmd_pstate EQU 40 ; <0 = play song, 0 = don't play, >0 = play block mmd_pblock EQU 42 mmd_pline EQU 44 mmd_pseqnum EQU 46 mmd_actplayline EQU 48 mmd_counter EQU 50 mmd_songsleft EQU 51 ;the MMD0song structure ;Instrument data here (504 bytes = 63 * 8) msng_numblocks EQU 5704 msng_songlen EQU 506 msng_playseq EQU 508 msng_deftempo EQU 764 msng_playtransp EQU 766 msng_flags EQU 767 msng_reserved EQU 768 msng_tempo2 EQU 769 msng_trkvol EQU 770 msng_mastervol EQU 786 msng_numsamples EQU 787 ;Instrument data inst_repeat EQU 0 inst_replen EQU 2 inst_midich EQU 4 inst_midipreset EQU 5 inst_svol EQU 6 inst_strans EQU 7 ;Audio hardware offsets ac_ptr EQU $00 ac_len EQU $04 ac_per EQU $06 ac_vol EQU $08 ;Trackdata sizes T03SZ EQU 88 T415SZ EQU 18 section g$"text",code IFNE EASY xdef _startmusic,_endmusic _startmusic lea easymod,a0 bsr.w _RelocModule bsr.w _InitPlayer lea easymod,a0 bra.w _PlayModule _endmusic bra.w _RemPlayer ENDC _ChannelOff: ;d0 = channel # lea trackdataptrs(pc),a1 lsl.b #2,d0 adda.w d0,a1 lsr.b #2,d0 movea.l (a1),a1 IFNE MIDI move.b trk_prevmidin(a1),d1 ;is it MIDI?? beq.s notcomidi ;not a MIDI note choff_midi: clr.b trk_prevmidin(a1) lea noteondata(pc),a0 move.b d1,1(a0) mov+z:e.b trk_prevmidich(a1),(a0) ;prev MIDI channel clr.b 2(a0) or.b #$90,(a0) ;note off moveq #3,d0 bra.w _AddMIDIData ENDC notcomidi: cmp.b #4,d0 bge.s notamigatrk IFNE SYNTH clr.l trk_synthptr(a1) clr.b trk_synthtype(a1) ENDC moveq #1,d1 lsl.w d0,d1 move.w d1,$dff096 notamigatrk: rts SoundOff: move.l d2,-(sp) moveq #15,d2 SO_loop0 move.l d2,d0 bsr.s _ChannelOff dbf d2,SO_loop0 lea _module(pc),a0 clr.l (a0) ;play nothing move.l (sp)+,d2 rts _Play dNote: ;d0(w) = trk #, d1 = note #, d2 = vol, d3(w) = instr # a3 = addr of instr moveq #0,d4 bset d0,d4 ;d4 is mask for this channel movea.l mmd_smplarr(a6),a0 add.w d3,d3 ;d3 = instr.num << 2 add.w d3,d3 move.l 0(a0,d3.w),d5 ;get address of instrument IFNE MIDI bne.s inmem tst.b inst_midich(a3) ;is MIDI channel set ENDC IFNE CHECK beq.w pnote_rts ; NO!!! ENDC inmem: add.b msng_playtransp(a4),d1 ;add play transpose add.b inst_strans(a3),d1 ;and instr. tra G'?nspose cmp.b #4,d0 bge.s nodmaoff ;track #>= 4: not an Amiga channel move.l d5,a1 IFNE SYNTH tst.l d5 beq.s stpdma tst.b trk_synthtype(a5) ble.s stpdma ;prev. type = sample/hybrid cmp.w #-1,4(a1) ;type == SYNTHETIC?? beq.s nostpdma ENDC stpdma: move.w d4,$dff096 ;stop this channel (dmacon) nostpdma: IFNE SYNTH clr.l trk_synthptr(a5) ENDC nodmaoff: IFNE MIDI move.b trk_prevmidin(a5),d3 ;get prev. midi note beq.s noprevmidi clr.b trk_prevmidin(a5) l @4ea noteondata+2(pc),a0 clr.b (a0) ;volume = 0 move.b d3,-(a0) move.b trk_prevmidich(a5),-(a0) ;prev midi channel or.b #$90,(a0) ;note off movem.w d0-d1,-(sp) moveq #3,d0 bsr.w _AddMIDIData movem.w (sp)+,d0-d1 noprevmidi: tst.b inst_midich(a3) bne.w handleMIDInote ENDC IFNE CHECK cmp.w #4,d0 ;track > 3??? bge.w pnote_rts ;no Amiga instruments here!!! ENDC ; handle decay (for tracks 0 - 3 only!!) IFNE HOLD clr.b trk_fadespd(a5) ;no fade yet.. move.b QI trk_initdecay(a5),trk_decay(a5) ;set decay ENDC clr.b trk_vibroffs(a5) ;clr vibrato offset or.w d4,dmaonmsk move.l d5,a0 subq.b #1,d1 IFNE SYNTH tst.w 4(a0) bmi.w handleSynthnote clr.b trk_synthtype(a5) ENDC tlwtst0: tst.b d1 bpl.s notenot2low add.b #12,d1 ;note was too low, octave up bra.s tlwtst0 notenot2low: cmp.b #62,d1 ble.s endpttest sub.b #12,d1 ;note was too high, octave down endpttest: moveq #0,d4 IFNE IFF53 move.w 4(a0),d0 ;Soitin-struct in  F_a0 bne.s iff5or3oct ;note # in d1 (0 - ...) ENDC move.l a0,d0 lea _periods(pc),a0 move.l a0,trk_periodtbl(a5) add.b d1,d1 move.w 0(a0,d1.w),d5 ;put period to d5 move.l d0,a0 addq.l #6,d0 ;Skip structure move.l (a0),d1 ;length move.w (a3),d4 ;inst_repeat move.w inst_replen(a3),d3 IFNE IFF53 bra.s end_getdata shiftcnt dc.b 4,3,2,1,1,0,2,2,1,1,0,0 mullencnt dc.b 15,7,3,1,1,0,3,3,1,1,0,0 octstart dc.b 12,12,12,12,24,24,0,12,12,24,24,36 iff5or3oct: movem.l d6-d7,-(sp) moveq #0,d7 move.w d1,d7 divu #12,d7 ;octave # move.l d7,d5 swap d5 ;note number in this oct (0-11) is in d5 move.l (a0),d1 cmp.b #2,d0 bne.s no3oct addq.l #6,d7 divu #7,d1 ;get length of the 1st octave bra.s no5oct no3oct: divu #31,d1 ;get length of the 1st octave (5 octaves) no5oct: move.l d1,d0 ;d0 and d1 = length of the 1st oct move.w (a3),d4 ;inst_repeat move.w inst_replen(a3),d3 moveq #0,d6 move.b shiftcnt(pc,d7.w),d6 lsl.w d6,d4 l]sl.w d6,d3 lsl.w d6,d1 move.b mullencnt(pc,d7.w),d6 mulu d6,d0 ;offset of this oct from 1st oct add.l a0,d0 ;add base address to offset addq.l #6,d0 ;skip structure lea _periods(pc),a1 add.b octstart(pc,d7.w),d5 add.b d5,d5 move.w 0(a1,d5.w),d5 movem.l (sp)+,d6-d7 ENDC end_getdata movea.l trk_audioaddr(a5),a1 ;base of this channel's regs move.l d0,(a1)+ ;put it in ac_ptr (= 0) cmp.w #1,d3 bhi.s repeat move.l #_chipzero,trk_sampleptr(a5) ;pointer of˝ zero word move.w #1,trk_samplelen(a5) ;length: 1 word lsr.l #1,d1 ;shift length right move.w d1,(a1)+ ;and put to custom chip (ac_len) bra.s retsn1 repeat: tst.w d4 beq.s begin0 ;rep. start < 2 move.w d4,(a1)+ ;move repeat to hardware bra.s beginn0 begin0: move.w d3,(a1)+ ;ac_len beginn0: add.l d4,d4 ;shift add.l d4,d0 ;d0 = starting address of repeat move.l d0,trk_sampleptr(a5) ;remember rep. start move.w d3,trk_samplelen(a5) ;remember rep. length retsn1: move.w d5,(a1)+ ;getinsdata puts period to d5 (a1 = ac_per) move.w d2,(a1) ;a1 = ac_vol move.w d5,trk_prevper(a5) IFNE SYNTH tst.b trk_synthtype(a5) bne.w hSn2 ENDC pnote_rts rts IFNE MIDI handleMIDInote: add.b #23,d1 ;2 octaves higher and -1 bpl.s hmn_not2low ;note number not too low hmn_2low add.b #12,d1 ;it was too low, 1 octave up bmi.s hmn_2low hmn_not2low add.b d2,d2 ;volume 0 - 63 => 0 - 127 subq.b #1,d2 ;if 128 => 127 bpl.s hmn_notvolu0 mov deq #0,d2 hmn_notvolu0 moveq #0,d5 move.b inst_midich(a3),d5 ;get midi chan of this instrument bpl.s hmn_nosmof ;bit 7 clear clr.b trk_prevmidin(a5) ;suppress note off! and.b #$1F,d5 ;clear all flag bits etc... bra.s hmn_smof hmn_nosmof move.b d1,trk_prevmidin(a5) hmn_smof subq.b #1,d5 ;from 1-16 to 0-15 move.b d5,trk_prevmidich(a5) ;save to prev midi channel move.b inst_midipreset(a3),d0 ;get preset # beq.s nochgpres ;zero = no preset cmp.b prevmidicpres(pc,d5.M kw),d0 ;is this previous preset ?? beq.s nochgpres ;yes...no need to change lea prevmidicpres(pc,d5.w),a1 move.b d0,(a1) ;save preset to prevmidicpres subq.b #1,d0 ;sub 1 to get 0 - 127 lea preschgdata+1(pc),a0 move.b d0,(a0) ;push the number to second byte move.b #$c0,-(a0) ;command: $C or.b d5,(a0) ;"or" midi channel moveq #2,d0 move.w d1,-(sp) bsr.w _AddMIDIData move.w (sp)+,d1 tst.b d2 beq.s hmn_suppress ;vol = 0, don't send NOTE ON nochgpres lea bytesinnotebuff(pc),a0 movea.l a0,a1 adda.w (a0)+,a0 or.b #$90,d5 ;MIDI: Note on move.b d5,(a0)+ ;MIDI msg Note on & channel move.b d1,(a0)+ ;MIDI msg note # move.b d2,(a0) ;MIDI msg volume beq.s hmn_suppress ;vol = 0 -> no note addq.w #3,(a1) rts hmn_suppress clr.b trk_prevmidin(a5) rts prevmidicpres: dc.l 0,0,0,0 ; 16 bytes ENDC IFNE SYNTH handleSynthnote: move.b d1,trk_prevnote2(a5) move.l a0,trk_synthptr(a5) cmp.w #-2,4(a0) ;HYBRID?? bne.s hSn_nosxasn st trk_synthtype(a5) movea.l 278(a0),a0 ;yep, get the waveform pointer bra.w tlwtst0 ;go and play it hSn_nossn: move.b #1,trk_synthtype(a5) lea _synthper(pc),a1 move.l a1,trk_periodtbl(a5) ;save table ptr for synth periods add.w d1,d1 move.w 0(a1,d1.w),d1 movea.l trk_audioaddr(a5),a1 move.w d1,trk_prevper(a5) move.w d1,ac_per(a1) clr.l trk_sampleptr(a5) hSn2: lea trk_arpgoffs(a5),a1 clr.l (a1)+ clr.l (a1)+ clr.l (a1)+ clr.l (a1)+ clr.l (a1)+ clrZ.l (a1)+ move.l #sinetable,(a1)+ clr.w (a1)+ movea.l trk_synthptr(a5),a0 move.w 18(a0),(a1)+ clr.b (a1) cmp.b #$E,trk_cmd(a5) bne.s synth_start move.b trk_cmdqual(a5),trk_wfcmd+1(a5) synth_start: move.l a3,-(sp) movea.l trk_audioaddr(a5),a3 ;audio channel base address subq.b #1,trk_volxcnt(a5) ;decrease execute counter.. bgt.w synth_wftbl ;not 0...go to waveform move.b trk_initvolxspd(a5),Eptrk_volxcnt(a5) ;reset counter move.b trk_volchgspd(a5),d0 ;volume change?? beq.s synth_nochgvol ;no. add.b trk_synvol(a5),d0 ;add previous volume bpl.s synth_voln2l ;not negative moveq #0,d0 ;was negative => 0 synth_voln2l: cmp.b #$40,d0 ;too high?? ble.s synth_voln2h ;not 2 high. moveq #$40,d0 ;was 2 high => 64 synth_voln2h: move.b d0,trk_synvol(a5) ;remember new... move.b d0,ac_vol+1(a3) ;and change it synth_nochgvol: move.l trk_envptr(a5),d1 ;envelope poginter beq.s synth_novolenv movea.l d1,a1 move.b (a1)+,d0 add.b #128,d0 lsr.b #2,d0 move.b d0,trk_synvol(a5) move.b d0,ac_vol+1(a3) addq.b #1,trk_envcount(a5) bpl.s synth_endenv clr.b trk_envcount(a5) move.l trk_envrestart(a5),a1 synth_endenv move.l a1,trk_envptr(a5) synth_novolenv move.w trk_volcmd(a5),d0 ;get table position ptr tst.b trk_volwait(a5) ;WAI(t) active beq.s synth_getvolcmd ;no subq.b #1,trk_volwait(a5) ;yep, decr wait ctr ble.s synth_getvs@olcmd ;0 => continue bra.w synth_wftbl ;> 0 => still wait synth_inccnt: addq.b #1,d0 synth_getvolcmd: addq.b #1,d0 ;advance pointer move.b 21(a0,d0.w),d1 ;get command bmi.s synth_cmd ;negative = command move.b d1,trk_synvol(a5) ;set synthvol move.b d1,ac_vol+1(a3) ;change it!! bra.w synth_endvol ;end of volume executing synth_cmd: and.w #$000f,d1 add.b d1,d1 move.w synth_vtbl(pc,d1.w),d1 jmp syv(pc,d1.w) synth_vtbl: dc.w syv_f0-syv,syv_f1-syv,syv_f2-syv,syŀsv_f3-syv dc.w syv_f4-syv,syv_f5-syv,syv_f6-syv dc.w synth_endvol-syv,synth_endvol-syv,synth_endvol-syv dc.w syv_fa-syv,syv_ff-syv,synth_endvol-syv dc.w synth_endvol-syv,syv_fe-syv,syv_ff-syv syv: syv_fe: move.b 22(a0,d0.w),d0 ;JMP bra.s synth_getvolcmd syv_f0: move.b 22(a0,d0.w),trk_initvolxspd(a5) ;change volume ex. speed bra.s synth_inccnt syv_f1: move.b 22(a0,d0.w),trk_volwait(a5) ;WAI(t) addq.b #1,d0 bra.s synth_endvol syv_f3: move.b 22(a0,d0.w),trk_volchgspd? (a5) ;set volume slide up bra.s synth_inccnt syv_f2: move.b 22(a0,d0.w),d1 neg.b d1 move.b d1,trk_volchgspd(a5) ;set volume slide down bra.s synth_inccnt syv_fa: move.b 22(a0,d0.w),trk_wfcmd+1(a5) ;JWS (jump wform sequence) clr.b trk_wfwait(a5) bra.s synth_inccnt syv_f4: move.b 22(a0,d0.w),d1 bsr.s synth_getwf clr.l trk_envrestart(a5) syv_f4end move.l a1,trk_envptr(a5) clr.b trk_envcount(a5) bra.w synth_inccnt syv_f5: move.b 22(a0,d0.w),d1 bsr.s synth_getwf J move.l a1,trk_envrestart(a5) bra.s syv_f4end syv_f6 clr.l trk_envptr(a5) bra.w synth_getvolcmd synth_getwf ext.w d1 ;d1 = wform number, returns ptr in a1 add.w d1,d1 ;create index add.w d1,d1 lea 278(a0),a1 adda.w d1,a1 movea.l (a1),a1 ;get wform address addq.l #2,a1 ;skip length rts syv_ff: subq.b #1,d0 synth_endvol: move.w d0,trk_volcmd(a5) synth_wftbl: move.b trk_synvol(a5),trk_prevvol(a5) adda.w #158,a0 subq.b #1,trk_wfxcnt(a5) ;decr. wf speed counter ~di bgt.w synth_arpeggio ;not yet... move.b trk_initwfxspd(a5),trk_wfxcnt(a5) ;restore speed counter move.w trk_wfcmd(a5),d0 ;get table pos offset move.w trk_wfchgspd(a5),d1 ;CHU/CHD ?? beq.s synth_tstwfwai ;0 = no change wytanwet: add.w trk_perchg(a5),d1 ;add value to current change move.w d1,trk_perchg(a5) ;remember amount of change add.w trk_prevper(a5),d1 ;add initial period to it cmp.w #113,d1 ;overflow?? bge.s synth_pern2h moveq #113,d1 synth_pern2h: move.w 5d1,ac_per(a3) ;push the changed period synth_tstwfwai: tst.b trk_wfwait(a5) ;WAI ?? beq.s synth_getwfcmd ;not waiting... subq.b #1,trk_wfwait(a5) ;decr wait counter beq.s synth_getwfcmd ;waiting finished bra.w synth_arpeggio ;still sleep... synth_incwfc: addq.b #1,d0 synth_getwfcmd: addq.b #1,d0 ;advance position counter move.b -9(a0,d0.w),d1 ;get command bmi.s synth_wfcmd ;negative = command ext.w d1 add.w d1,d1 add.w d1,d1 movea.l 120(a0,d1.w),a1 move&i..w (a1)+,ac_len(a3) ;push waveform length move.l a1,(a3) ;and the new pointer (0 = ac_ptr) bra.w synth_wfend ;no new commands now... synth_wfcmd: and.w #$000f,d1 ;get the right nibble add.b d1,d1 ;* 2 move.w synth_wfctbl(pc,d1.w),d1 jmp syw(pc,d1.w) ;jump to command synth_wfctbl: dc.w syw_f0-syw,syw_f1-syw,syw_f2-syw,syw_f3-syw,syw_f4-syw dc.w syw_f5-syw,syw_f6-syw,syw_f7-syw,synth_wfend-syw dc.w synth_wfend-syw,syw_fa-syw,syw_ff-syw dc.w syw_fc-syw,synth_getwf Tycmd-syw,syw_fe-syw,syw_ff-syw syw: syw_f7: move.b -8(a0,d0.w),d1 ext.w d1 add.w d1,d1 add.w d1,d1 movea.l 120(a0,d1.w),a1 addq.l #2,a1 move.l a1,trk_synvibwf(a5) bra.s synth_incwfc syw_fe: move.b -8(a0,d0.w),d0 ;jump (JMP) bra.s synth_getwfcmd syw_fc: move.w d0,trk_arpsoffs(a5) ;new arpeggio begin move.w d0,trk_arpgoffs(a5) synth_findare: addq.b #1,d0 tst.b -9(a0,d0.w) bpl.s synth_findare bra.s synth_getwfcmd syw_f0: move.b -8(a0,d0.w),trk_initwfxspd(a5) !̔;new waveform speed bra synth_incwfc syw_f1: move.b -8(a0,d0.w),trk_wfwait(a5) ;wait waveform addq.b #1,d0 bra.s synth_wfend syw_f4: move.b -8(a0,d0.w),trk_synvibdep+1(a5) ;set vibrato depth bra.w synth_incwfc syw_f5: move.b -8(a0,d0.w),trk_synthvibspd+1(a5) ;set vibrato speed addq.b #1,trk_synthvibspd+1(a5) bra.w synth_incwfc syw_f2: moveq #0,d1 ;set slide down move.b -8(a0,d0.w),d1 synth_setsld: move.w d1,trk_wfchgspd(a5) bra.w synth_incwfc syw_f3: move.b -8("͎k;a0,d0.w),d1 ;set slide up neg.b d1 ext.w d1 bra.s synth_setsld syw_f6: clr.w trk_perchg(a5) ;reset period move.w trk_prevper(a5),ac_per(a3) bra.w synth_getwfcmd syw_fa: move.b -8(a0,d0.w),trk_volcmd+1(a5) ;JVS (jump volume sequence) clr.b trk_volwait(a5) bra.w synth_incwfc syw_ff: subq.b #1,d0 ;pointer = END - 1 synth_wfend: move.w d0,trk_wfcmd(a5) synth_arpeggio: move.w trk_arpgoffs(a5),d0 beq.s synth_vibrato moveq #0,d1 move.b -8(a0,d0.w),d1 add.b trk_pr#Β 9evnote2(a5),d1 movea.l trk_periodtbl(a5),a1 ;get period table add.w d1,d1 move.w 0(a1,d1.w),d1 add.w trk_perchg(a5),d1 move.w d1,trk_prevper(a5) move.w d1,ac_per(a3) addq.b #1,d0 tst.b -8(a0,d0.w) bpl.s synth_noarpres move.w trk_arpsoffs(a5),d0 synth_noarpres: move.w d0,trk_arpgoffs(a5) synth_vibrato: move.w trk_synvibdep(a5),d1 ;get vibrato depth beq.s synth_rts ;0 => no vibrato move.w trk_synviboffs(a5),d0 ;get offset lsr.w #4,d0 ;/ 16 and.w #$1f,d0 $AEL ;sinetable offset (0-31) movea.l trk_synvibwf(a5),a0 move.b 0(a0,d0.w),d0 ;get a byte ext.w d0 ;to word muls d1,d0 ;amplify (* depth) asr.w #8,d0 ;and divide by 64 move.w trk_prevper(a5),d1 ;get the old period add.w d0,d1 ;add vibrato... add.w trk_perchg(a5),d1 ;and pitch change... move.w d1,ac_per(a3) ;change. move.w trk_synthvibspd(a5),d0 ;vibrato speed add.w d0,trk_synviboffs(a5) ;add to offset synth_rts: move.l (sp)+,a3 rts ENDC sinetable: dc%.b 0,25,49,71,90,106,117,125,127,125,117,106,90,71,49 dc.b 25,0,-25,-49,-71,-90,-106,-117,-125,-127,-125,-117 dc.b -106,-90,-71,-49,-25,0 _Wait1line: move.l d0,-(sp) ;d1 = vsync counters to wait - 1 wl0: move.b $dff007,d0 wl1: cmp.b $dff007,d0 beq.s wl1 dbf d1,wl0 move.l (sp)+,d0 rts pushnewvals: movea.l (a1)+,a5 lsr.b #1,d0 bcc.s rpnewv move.l trk_sampleptr(a5),d1 beq.s rpnewv movea.l trk_audioaddr(a5),a0 move.l d1,(a0)+ ;0 = ac_ptr move.w trk_samplelen&Ԝ+V(a5),(a0) ;4 = ac_len rpnewv: rts _StartDMA: ;This small routine turns on audio DMA move.w dmaonmsk(pc),d0 ;dmaonmsk contains the mask of IFNE MIDI beq.s sdma_nodmaon ;the channels that must be turned on ENDC IFEQ MIDI beq.s rpnewv ENDC bset #15,d0 ;DMAF_SETCLR: set these bits in dmacon moveq #80,d1 IFNE SYNTH add.w d1,d1 ;sometimes double wait time is required ENDC bsr.s _Wait1line move.w d0,$dff096 ;do that!!! moveq #79,d1 bsr.s _Wait1line lea trackdat'Ϫ8aptrs(pc),a1 bsr.s pushnewvals bsr.s pushnewvals bsr.s pushnewvals IFNE MIDI bsr.s pushnewvals sdma_nodmaon lea bytesinnotebuff(pc),a0 move.w (a0)+,d0 beq.s rpnewv bra.w _AddMIDIData ENDC IFEQ MIDI bra.s pushnewvals ENDC IFNE MIDI prevmidipbend: dc.w $2000,$2000,$2000,$2000,$2000,$2000,$2000,$2000 dc.w $2000,$2000,$2000,$2000,$2000,$2000,$2000,$2000 ENDC ; TRACK-data structures (see definitions at the end of this file) t03d: ds.b 20 dc.l $dff0a0 ds.b 64+(vs>20 dc.l $dff0b0 ds.b 64+20 dc.l $dff0c0 ds.b 64+20 dc.l $dff0d0 ds.b 64 t415d: ds.b 4*T415SZ t815d: ds.b 8*T415SZ ;8 bytes * 12 tracks = 96 bytes trackdataptrs: dc.l t03d,t03d+T03SZ,t03d+2*T03SZ,t03d+3*T03SZ dc.l t415d,t415d+T415SZ,t415d+2*T415SZ,t415d+3*T415SZ dc.l t815d,t815d+T415SZ,t815d+2*T415SZ,t815d+3*T415SZ dc.l t815d+4*T415SZ,t815d+5*T415SZ,t815d+6*T415SZ dc.l t815d+7*T415SZ numtracks: dc.w 0 numlines: dc.w 0 nextblock: dc.b 0,0 _IntHandler: movem.l d2)/-d7/a2-a5,-(sp) movea.l _module(pc),a6 ;a6 = pointer of MMD0 move.l a6,d0 beq.w plr_exit tst.w mmd_pstate(a6) beq.w plr_exit IFNE MIDI clr.l dmaonmsk ENDC IFEQ MIDI clr.w dmaonmsk ENDC movea.l mmd_songinfo(a6),a4 move.l a4,d0 beq.w plr_exit moveq #0,d3 move.b mmd_counter(a6),d3 addq.b #1,d3 cmp.b msng_tempo2(a4),d3 bge.s plr_pnewnote ;play new note move.b d3,mmd_counter(a6) bne.w nonewnote ;do just fx ; --- new note!! first get address of current*վaF block plr_pnewnote: clr.b mmd_counter(a6) ; --- now start to play it move.w mmd_pblock(a6),d0 movea.l mmd_blockarr(a6),a0 add.w d0,d0 add.w d0,d0 movea.l 0(a0,d0.w),a2 ;block... move.b (a2)+,numtracks+1 move.b (a2)+,numlines+1 move.w mmd_pline(a6),d0 move.w d0,d1 add.w d0,d0 ;d0 * 2 add.w d1,d0 ;+ d0 = d0 * 3 mulu numtracks(pc),d0 adda.w d0,a2 ;a2 => pointer of curr. note moveq #0,d7 ;number of track pea trackdataptrs(pc) plr_loop0: moveq #0,d5 move+=ok.l (sp),a1 movea.l (a1)+,a5 ;get address of this track's struct move.l a1,(sp) ; ---------------- get the note numbers move.b (a2)+,d5 ;get the number of this note move.b (a2)+,d6 ;and the 4 numbers containing fx move.b (a2)+,trk_cmdqual(a5) ;get & save the fx numbers ; ---------------- clear some instrument # flags moveq #0,d4 ;d4 is a flag: if set, instr. is moveq #0,d3 ;in range G-V. If clr, it's 1-F. ; ---------------- and set them, if needed bclr #7,d5 ;d3 is ,׵also a flag. If it's set, sne d4 ;the instr. is in range 10 - 1V bclr #6,d5 sne d3 ; ---------------- check if there's an instrument number move.b d6,d0 and.w #$f0,d0 ;d0 now contains only the # of instr bne.s instnum ;instrument number is not 0 tst.b d4 ;maybe it's G (instr. #0, d4 set) bne.s instnum ;yes, it really was G!! tst.b d3 beq.s noinstnum ;it wasn't 10 - 1V either.. ; ---------------- if there was, get it instnum: lsr.b #4,d0 ;shift it right to ge-؈8ft number 0-F tst.b d4 beq.s nogtov2 add.w #16,d0 ;if G-V, add 16 to the number nogtov2: tst.b d3 beq.s no10to1v add.w #32,d0 ; ---------------- finally, save the number no10to1v: subq.b #1,d0 move.b d0,trk_previnstr(a5) ;remember instr. number! IFNE HOLD ; ---------------- remember hold/decay values lea holdvals(pc),a0 move.b 0(a0,d0.w),trk_inithold(a5) move.b 63(a0,d0.w),trk_initdecay(a5) ENDC ; ---------------- get the pointer of data's of this sample in Song-s.Ptruct asl.w #3,d0 lea 0(a4,d0.w),a3 ;a3 contains now address of it move.l a3,trk_previnstra(a5) moveq #0,d0 ; ---------------- get volume and make it relative (1 - 100 %) IFNE RELVOL move.b inst_svol(a3),d0 mulu trk_trackvol(a5),d0 lsr.w #8,d0 move.b d0,trk_prevvol(a5) ;vol of this instr ENDC IFEQ RELVOL move.b inst_svol(a3),trk_prevvol(a5) ENDC ; ---------------- remember transpose move.b inst_strans(a3),trk_stransp(a5) ; ---------------- check the commands n/nXoinstnum and.b #$0f,d6 ;now check only the effect part move.b d6,trk_cmd(a5) ;save the effect number beq.w plr_nocmd ;no effect move.b d6,d0 move.b trk_cmdqual(a5),d6 ;get qualifier... ; ---------------- there was a command (effect), but which one?? cmp.b #$0f,d0 ;yes effect...is it Tempo??? bne.w not0f ;not Tempo ; ---------------- it was tempo (F) tst.b d6 ;test effect qual.. beq.s fx0fchgblck ;if effect qualifier (last 2 #'s).. cmp.b #$f0,d6 ;..is zero, go t0۸}o next block bhi.s fx0fspecial ;if it's F1-FF something special ; ---------------- just an ordinary "change tempo"-request IFNE CIAB moveq #0,d0 ;will happen!!! move.b d6,d0 bsr _SetTempo ;change The Tempo move.b d6,msng_deftempo(a4) ENDC bra.w plr_nocmd ; ---------------- it was FFx fx0fspecial: cmp.b #$f2,d6 bne.s isfxfe ; ---------------- it was FF2, nothing to do now move.b d5,(a5) moveq #0,d5 bra.w plr_nocmd isfxfe: cmp.b #$fe,d6 bne.s notcmdfe ; ------1|---------- it was FFE, stop playing clr.w mmd_pstate(a6) IFNE CIAB movea.l craddr(pc),a0 bclr #0,(a0) ENDC bsr.w SoundOff addq.l #4,sp bra.w plr_exit notcmdfe: cmp.b #$fd,d6 ;change period bne.s isfxff ; ---------------- FFD, change the period, don't replay the note IFNE CHECK cmp.w #4,d7 ;no tracks 4 - 15 bge.w plr_nocmd ENDC movea.l trk_periodtbl(a5),a0 ;period table subq.b #1,d5 ;sub 1 to make "real" note number bmi.w plr_endloop0 ;under zero, do not2ݬͻhing add.b d5,d5 move.w 0(a0,d5.w),d0 ;get the period movea.l trk_audioaddr(a5),a0 move.w d0,ac_per(a0) ;push the period moveq #0,d5 ;and clear it so that it won't be replayed bra.w plr_nocmd ;done!! isfxff: cmp.b #$ff,d6 ;note off?? bne.w plr_nocmd move.w d7,d0 bsr.w _ChannelOff bra.w plr_nocmd ; ---------------- F00, called Pattern Break in ST fx0fchgblck: addq.b #1,nextblock ;next block... (F00) bra.w plr_nocmd ; ---------------- was not Fxx, then it's some3fthing else!! not0f: cmp.b #$0e,d0 bne.s not0e cmp.b #4,d7 bge.w plr_nocmd move.b d6,trk_wfcmd+1(a5) ;set waveform command position ptr bra.w plr_nocmd not0e: cmp.b #$0c,d0 ;new volume??? bne.s not0c ;NO ; ---------------- change volume move.b d6,d0 bpl.s plr_nosetdefvol and.b #$7F,d0 IFNE CHECK cmp.b #64,d0 bgt.s go_nocmd ENDC moveq #0,d1 move.b trk_previnstr(a5),d1 asl.w #3,d1 move.b d0,inst_svol(a4,d1.w) ;set new svol bra.s plr_setvol plr_noset4胐=defvol btst #4,msng_flags(a4) ;look at flags bne.s volhex lsr.b #4,d0 ;get number from left mulu #10,d0 ;number of tens move.b d6,d1 ;get again and.b #$0f,d1 ;this time don't get tens add.b d1,d0 ;add them volhex: IFNE CHECK cmp.b #64,d0 bhi.s go_nocmd ENDC plr_setvol IFNE RELVOL mulu trk_trackvol(a5),d0 lsr.w #8,d0 ENDC move.b d0,trk_prevvol(a5) go_nocmd bra.w plr_nocmd ; ---------------- tempo2 change?? not0c: cmp.b #$09,d0 bne.s not09 IFNE CHECK 5yWe and.b #$1F,d6 bne.s fx9chk moveq #$20,d6 ENDC fx9chk: move.b d6,msng_tempo2(a4) bra.s plr_nocmd ; ---------------- note off time set?? IFNE HOLD not09: cmp.b #$08,d0 bne.s not08 move.b d6,d0 lsr.b #4,d6 ;extract left nibble and.b #$0f,d0 ; " " right " " move.b d6,trk_initdecay(a5) ;left = decay move.b d0,trk_inithold(a5) ;right = hold bra.s plr_nocmd ENDC IFEQ HOLD not09 ENDC ; ---------------- cmd Bxx, "position jump", like Goto, yk!! not08: cm6#Zcp.b #$0b,d0 bne.s not0b move.w d6,d0 and.w #$00ff,d0 IFNE CHECK cmp.w msng_songlen(a4),d0 ;test the song length bhi.s plr_nocmd ENDC move.w d0,mmd_pseqnum(a6) st nextblock ; = -1 bra.s plr_nocmd ; ---------------- try portamento (3) not0b: cmp.b #$03,d0 bne.s plr_nocmd subq.b #1,d5 ;subtract note number bpl.s plr_fx3note ;there's a note... tst.b d6 ;qual?? beq.s plr_endloop0 ;0 -> do nothing bra.s plr_setfx3spd ;not 0 -> set new speed plr_fx3note: IF7ݠNE CHECK cmp.w #4,d7 bge.s plr_endloop0 ;hey, what are you trying to do?? ENDC movea.l trk_periodtbl(a5),a0 add.b msng_playtransp(a4),d5 ;play transpose add.b trk_stransp(a5),d5 ;and instrument transpose bmi.s plr_endloop0 ;again.. too low add.w d5,d5 move.w 0(a0,d5.w),trk_porttrgper(a5) ;period of this note is the target plr_setfx3spd: move.b d6,trk_prevportspd(a5) ;remember size moveq #0,d5 ;don't play this one ; ---------------- everything is checked now: play o8昨r not to play?? plr_nocmd: tst.b d5 ;Now we'll check if we have to play a note beq.s plr_endloop0 ;no. ; ---------------- we decided to play move.b d5,(a5) move.w d7,d0 move.w d5,d1 moveq #0,d2 move.b trk_prevvol(a5),d2 ;get volume moveq #0,d3 move.b trk_previnstr(a5),d3 ;instr # movea.l trk_previnstra(a5),a3 ;instr data address ; ---------------- does this instrument have holding?? IFNE HOLD move.b trk_inithold(a5),trk_noteoffcnt(a5) ;initialize hold bne.s plr9緗_holdok ;not 0 -> OK st trk_noteoffcnt(a5) ;0 -> hold = 0xff (-1) ENDC ; ---------------- and finally: plr_holdok: bsr _PlayNote ;play it!!!!!!!!!!! ; ---------------- end of loop: handle next track, or quit plr_endloop0: addq.b #1,d7 cmp.w numtracks(pc),d7 blt.w plr_loop0 addq.l #4,sp ;trackdataptrs ; and advance song pointers lea nextblock(pc),a2 move.w mmd_pline(a6),d1 ;pline addq.w #1,d1 ;advance line cmp.w numlines(pc),d1 ;advance block? bgt.s plr_chgbloc:Ö)k ;yes tst.b (a2) ;command F00 ?? beq.s plr_nochgblock ;no, don't change block plr_chgblock: moveq #0,d1 ;clear the line number tst.w mmd_pstate(a6) ;play block or play song bpl.s plr_nonewseq ;play block only... move.w mmd_pseqnum(a6),d0 ;get play sequence number tst.b (a2) bmi.s plr_noadvseq ;Bxx sets nextblock to 0xff (= neg) addq.w #1,d0 ;advance sequence number plr_noadvseq: cmp.w msng_songlen(a4),d0 ;is this the highest seq number?? blt.s plr_notagai;Cmn ;no. moveq #0,d0 ;yes: play song again moveq #0,d1 ;...forever plr_notagain: move.b d0,mmd_pseqnum+1(a6) ;remember new playseq-# lea msng_playseq(a4),a0 ;offset of sequence table move.b 0(a0,d0.w),d0 ;get number of the block IFNE CHECK cmp.b msng_numblocks+1(a4),d0 ;beyond last block?? blt.s plr_nolstblk ;no.. moveq #0,d0 ;play block 0 ENDC plr_nolstblk: move.b d0,mmd_pblock+1(a6) ;store pblock plr_nonewseq: clr.b (a2) ;clear this if F00 set it plr_nochgb<ATlock: move.w d1,mmd_pline(a6) ;set new pline IFNE HOLD movea.l mmd_blockarr(a6),a0 move.w mmd_pblock(a6),d0 add.w d0,d0 add.w d0,d0 movea.l 0(a0,d0.w),a2 move.b (a2),d7 ;# of tracks move.w mmd_pline(a6),d0 ;play line move.w d0,d1 add.w d0,d0 ;d0 * 2 add.w d1,d0 ;+ d0 = d0 * 3 mulu d7,d0 lea 2(a2,d0.w),a2 move.b msng_tempo2(a4),d3 ;interrupts/note lea trackdataptrs(pc),a0 subq.b #1,d7 plr_chkhold: movea.l (a0)+,a1 ;track data tst.b trk_noteoffcnt(a=`1) ;hold?? bmi.s plr_holdend ;no. move.b (a2),d1 ;get the 1st byte.. bne.s plr_hold1 move.b 1(a2),d1 and.b #$f0,d1 beq.s plr_holdend ;don't hold bra.s plr_hold2 plr_hold1: and.b #$3f,d1 ;note?? beq.s plr_hold2 ;no, cont hold.. move.b 1(a2),d1 and.b #$0f,d1 ;get cmd subq.b #3,d1 ;is there command 3 (slide) bne.s plr_holdend ;no -> end holding plr_hold2: add.b d3,trk_noteoffcnt(a1) ;continue holding... plr_holdend: addq.l #3,a2 ;next note dbf d7,p>Nlr_chkhold ENDC btst #5,msng_flags(a4) ;FLAG_STSLIDE?? bne.w plr_endfx ;yes, no effects this time... moveq #0,d3 ;counter = 0 nonewnote: ; *********************** This code produces the effects ** moveq #0,d7 ;clear track count moveq #0,d6 lea trackdataptrs(pc),a2 plr_loop1: movea.l (a2)+,a5 moveq #0,d5 moveq #0,d4 move.b trk_cmd(a5),d6 ;get the fx number move.b trk_cmdqual(a5),d4 ;and the last 2 #'s IFNE MIDI tst.b trk_prevmidin(a5) ;first: is it MIDI?? ?*MPKbne.w midicmds ENDC cmp.w #4,d7 bge.w endl ;no non-MIDI effects in tracks 4 - 15 IFNE HOLD tst.b trk_noteoffcnt(a5) bmi.s plr_nowaitoff subq.b #1,trk_noteoffcnt(a5) bpl.s plr_nowaitoff IFNE SYNTH tst.b trk_synthtype(a5) ;synth/hybrid?? beq.s plr_nosyndec move.b trk_decay(a5),trk_volcmd+1(a5) ;set volume command pointer clr.b trk_volwait(a5) ;abort WAI move.l trk_synthptr(a5),d0 bra.s plr_gosynth ENDC plr_nosyndec: move.b trk_decay(a5),trk_fadespd(a5) ;set @],ifade... bne.s plr_nowaitoff ;if > 0, don't stop sound bset d7,d5 move.w d5,$dff096 ;shut DMA... moveq #0,d5 ENDC plr_nowaitoff: IFNE SYNTH move.l trk_synthptr(a5),d0 beq.s plr_nosynth plr_gosynth: move.l d0,a0 bsr.w synth_start ENDC plr_nosynth: IFNE HOLD move.b trk_fadespd(a5),d0 ;fade?? beq.s plr_nofade ;no. sub.b d0,trk_prevvol(a5) bpl.s plr_nofade2low clr.b trk_prevvol(a5) clr.b trk_fadespd(a5) ;fade no more plr_nofade2low: ENDC plr_nofade: movea.lA4; trk_audioaddr(a5),a1 add.b d6,d6 ;* 2 move.w fx_table(pc,d6.w),d0 jmp fxs(pc,d0.w) fx_table: dc.w fx_00-fxs,fx_01-fxs,fx_02-fxs,fx_03-fxs,fx_04-fxs dc.w fx_05-fxs,fx_xx-fxs,fx_xx-fxs,fx_xx-fxs,fx_xx-fxs dc.w fx_0a-fxs,fx_xx-fxs,fx_xx-fxs,fx_0d-fxs,fx_xx-fxs dc.w fx_0f-fxs fxs: ; **************************************** Effect 01 ****** fx_01: sub.w d4,trk_prevper(a5) ;slide up move.w trk_prevper(a5),d5 cmp.w #113,d5 ;too high? bge.s fx_01_pushper move.w #113,d5BMX ;too high move.w d5,trk_prevper(a5) fx_01_pushper move.w d5,ac_per(a1) bra.w fx_xx ; **************************************** Effect 02 ****** fx_02: add.w d4,trk_prevper(a5) ;slide down move.w trk_prevper(a5),d5 bra.s fx_01_pushper ; **************************************** Effect 00 ****** fx_00: tst.b d4 ;both fxqualifiers are 0s: no arpeggio beq.w fx_xx move.l d3,d0 divu #3,d0 swap d0 tst.w d0 bne.s fx_arp12 and.b #$0f,d4 add.b (a5),d4 bra.s fx_doarpCeT fx_arp12: subq.b #1,d0 bne.s fx_arp2 lsr.b #4,d4 add.b (a5),d4 bra.s fx_doarp fx_arp2: move.b (a5),d4 fx_doarp: subq.b #1,d4 ;-1 to make it 0 - 127 add.b msng_playtransp(a4),d4 ;add play transpose add.b trk_stransp(a5),d4 ;add instrument transpose add.b d4,d4 ;shift to make index for UWORD movea.l trk_periodtbl(a5),a0 move.w 0(a0,d4.w),ac_per(a1) bra.w fx_xx ; **************************************** Effect 0D/0A *** fx_0a: fx_0d: move.b d4,d1 move.b trk_preD@ޜvvol(a5),d0 ;move previous vol to d0 and.b #$f0,d1 bne.s crescendo sub.b d4,d0 ;sub from prev. vol bpl.s fx_0d_pushvol moveq #0,d0 ;volumes under zero not accepted bra.s fx_0d_pushvol crescendo: lsr.b #4,d1 add.b d1,d0 cmp.b #64,d0 ble.s fx_0d_pushvol moveq #64,d0 fx_0d_pushvol move.b d0,trk_prevvol(a5) move.b d0,ac_vol+1(a1) bra.w endl ; **************************************** Effect 05 ****** fx_05: move.w trk_prevper(a5),d5 ;this is very simple: get the oE ld period cmp.b #3,d3 ;and.. bge.w fx_05b ;if counter < 3 sub.w d4,d5 ;subtract effect qualifier fx_05b move.w d5,ac_per(a1) bra.w fx_xx ; **************************************** Effect 03 ****** fx_03: move.w trk_porttrgper(a5),d0 ;d0 = target period beq.w fx_xx ;no target period specified move.w trk_prevper(a5),d1 ;d1 = curr. period move.b trk_prevportspd(a5),d4 ;get prev. speed cmp.w d0,d1 bhi.s subper ;curr. period > target period add.w d4,d1 ;add the peFg]riod cmp.w d0,d1 bge.s targreached bra.s targnreach subper: sub.w d4,d1 ;subtract cmp.w d0,d1 ;compare current period to target period bgt.s targnreach targreached: move.w trk_porttrgper(a5),d1 ;eventually push target period clr.w trk_porttrgper(a5) ;now we can forget everything targnreach: move.w d1,trk_prevper(a5) move.w d1,ac_per(a1) bra.w fx_xx ; **************************************** Effect 04 ****** fx_04: tst.b d4 beq.s nonvib move.b d4,trk_vibrspdsz(a5G5ꘪ) nonvib: move.b trk_vibroffs(a5),d0 lsr.b #2,d0 and.w #$1f,d0 moveq #0,d1 lea sinetable(pc),a0 move.b 0(a0,d0.w),d5 ext.w d5 move.b trk_vibrspdsz(a5),d0 and.w #$000f,d0 muls d0,d5 asr.w #5,d5 add.w trk_prevper(a5),d5 move.b trk_vibrspdsz(a5),d0 lsr.b #3,d0 and.b #$3e,d0 add.b d0,trk_vibroffs(a5) move.w d5,ac_per(a1) bra.s fx_xx ; **************************************** Effect 0F ****** fx_0f: cmp.b #$f1,d4 bne.s no0ff1 cmp.b #3,d3 bne.w fx_H<zxx bra.s playfxnote no0ff1: cmp.b #$f2,d4 bne.s no0ff2 cmp.b #3,d3 bne.w fx_xx bra.s playfxnote no0ff2: cmp.b #$f3,d4 bne.s no0ff3 move.b d3,d0 and.b #2+4,d0 ;is 2 or 4 beq.s fx_xx playfxnote: move.w d7,d0 ;track # to d0... moveq #0,d1 move.b (a5),d1 ;get note # of previous note beq.s fx_xx moveq #0,d2 move.b trk_prevvol(a5),d2 ;get previous volume move.l d3,-(sp) moveq #0,d3 move.b trk_previnstr(a5),d3 ;and prev. sample # movea.l trk_previnst/""!      I6qra(a5),a3 bsr _PlayNote move.l (sp)+,d3 bra.s endl no0ff3: cmp.b #$f8,d4 ;f8 = filter off beq.s plr_filteroff cmp.b #$f9,d4 ;f9 = filter on bne.s fx_xx bclr #1,$bfe001 bra.s fx_xx plr_filteroff: bset #1,$bfe001 ; ********************************************************* fx_xx: move.b trk_prevvol(a5),ac_vol+1(a1) endl: addq.b #1,d7 ;increment channel number cmp.w numtracks(pc),d7 ;all channels done??? blt.w plr_loop1 ;not yet!!! plr_endfx bsr _StartDMA ;turn oJ~wn DMA plr_exit movem.l (sp)+,d2-d7/a2-a5 IFNE VBLANK moveq #0,d0 ENDC rts _SetTempo: IFNE CIAB cmp.b #10,d0 ;If tempo <= 10, use SoundTracker tempo bhi.s calctempo subq.b #1,d0 add.w d0,d0 move.w sttempo+2(pc,d0.w),d1 bra.s pushtempo calctempo: move.l timerdiv(pc),d1 divu d0,d1 pushtempo: movea.l craddr+4(pc),a0 move.b d1,(a0) ;and set the CIA timer lsr.w #8,d1 movea.l craddr+8(pc),a0 move.b d1,(a0) ENDC rts ; vv-- These values are the SoundTrackerKVm tempos (approx.) sttempo: dc.w $0f00 IFNE CIAB dc.w 2417,4833,7250,9666,12083,14500,16916,19332,21436,24163 timerdiv dc.l 470000 ENDC IFNE MIDI midicmds IFNE HOLD tst.b trk_noteoffcnt(a5) bmi.s midi_nowaitoff subq.b #1,trk_noteoffcnt(a5) bpl.s midi_nowaitoff move.l a5,a1 move.b trk_prevmidin(a5),d1 beq.s midi_nowaitoff ;no note bsr.w choff_midi midi_nowaitoff: ENDC add.b d6,d6 ;* 2 move.w midicmd_table(pc,d6.w),d0 jmp midifx(pc,d0.w) midicmd_table: dc.wLX mfx_00-midifx,mfx_01-midifx,mfx_02-midifx,mfx_03-midifx,mfx_04-midifx dc.w mfx_05-midifx,endl-midifx,endl-midifx,endl-midifx,endl-midifx dc.w mfx_0a-midifx,endl-midifx,endl-midifx,mfx_0d-midifx,mfx_0e-midifx dc.w mfx_0f-midifx midifx mfx_01 lea prevmidipbend(pc),a0 moveq #0,d1 move.b trk_prevmidich(a5),d1 ;get previous midi channel add.b d1,d1 ;UWORD index tst.b d4 ;x100?? beq.s resetpbend move.w 0(a0,d1.w),d0 ;get previous pitch bend lsl.w #3,d4 ;multiply Mbend value by 8 add.w d4,d0 cmp.w #$3fff,d0 bls.s bendpitch move.w #$3fff,d0 bendpitch: move.w d0,0(a0,d1.w) ;save current pitch bend lsr.b #1,d1 ;back to UBYTE or.b #$e0,d1 lea noteondata(pc),a0 move.b d1,(a0) ;midi command & channel move.b d0,1(a0) ;lower value and.b #$7f,1(a0) ;clear bit 7 lsr.w #7,d0 and.b #$7f,d0 ;clr bit 7 move.b d0,2(a0) ;higher 7 bits moveq #3,d0 bsr.w _AddMIDIData bra.w endl mfx_02 lea prevmidipbend(pc),a0 moveq #0,d1 N[7 move.b trk_prevmidich(a5),d1 add.b d1,d1 tst.b d4 beq.s resetpbend ;x200?? move.w 0(a0,d1.w),d0 lsl.w #3,d4 sub.w d4,d0 bpl.s bendpitch ;not under 0 moveq #0,d0 bra.s bendpitch resetpbend: tst.b d3 ;d3 = counter (remember??) bne.w endl move.w #$2000,d0 bra.s bendpitch mfx_03 tst.b d3 bne.w endl lea prevmidipbend(pc),a0 moveq #0,d1 move.b trk_prevmidich(a5),d1 add.b d1,d1 move.b d4,d0 add.b #128,d0 lsl.w #6,d0 bra.s bendpitch mfx_0d tst.Ohlb d3 bne.w endl lea noteondata+1(pc),a0 ;CHANNEL AFTERTOUCH move.b d4,(a0) ;value bmi.w endl move.b trk_prevmidich(a5),-(a0) or.b #$d0,(a0) moveq #2,d0 bsr.w _AddMIDIData bra.w endl mfx_0a tst.b d3 bne.w endl lea noteondata+2(pc),a0 ;POLYPHONIC AFTERTOUCH and.b #$7f,d4 move.b d4,(a0) move.b trk_prevmidin(a5),-(a0) beq.w endl move.b trk_prevmidich(a5),-(a0) or.b #$A0,(a0) moveq #3,d0 bsr.w _AddMIDIData bra.w endl mfx_04 moveq #$01,d0 bra.sP pushctrldata mfx_0e moveq #$0a,d0 pushctrldata tst.b d3 ;do it only once in a note bne.w endl ;(when counter = 0) lea noteondata+2(pc),a0 ;push "control change" data, move.b d4,(a0) ;second databyte bmi.w endl ;I said 0 - $7f!!! (for future compability) move.b d0,-(a0) ;1st databyte move.b trk_prevmidich(a5),-(a0) ;MIDI channel or.b #$b0,(a0) ;command (B) moveq #3,d0 bsr.w _AddMIDIData bra.w endl mfx_05 and.b #$7f,d4 ;set contr. value of curr. MIDI ch. Qx>move.b trk_prevmidich(a5),d6 lea midicontrnum(pc,d6.w),a0 move.b d4,(a0) bra.w endl mfx_0f cmp.b #$fa,d4 ;hold pedal ON bne.s nomffa moveq #$40,d0 moveq #$7f,d4 bra.s pushctrldata nomffa cmp.b #$fb,d4 ;hold pedal OFF bne.s nomffb moveq #$40,d0 moveq #$00,d4 bra.s pushctrldata nomffb bra.w fx_0f mfx_00 tst.b d4 beq.w endl and.b #$7f,d4 move.b trk_prevmidich(a5),d6 move.b midicontrnum(pc,d6.w),d0 bra.s pushctrldata midicontrnum ds.b 16 _ResetMIRìDI: movem.l d2/a2,-(sp) lea prevmidicpres(pc),a0 clr.l (a0)+ ;force presets to be set again clr.l (a0)+ ;(clear prev. preset numbers) clr.l (a0)+ clr.l (a0) clr.b lastcmdbyte lea midiresd(pc),a2 move.b #$e0,(a2) ;reset pitchbenders & mod. wheel move.b #$b0,3(a2) moveq #15,d2 respbendl: movea.l a2,a0 moveq #6,d0 bsr.w _AddMIDIData addq.b #1,(a2) addq.b #1,3(a2) dbf d2,respbendl lea prevmidipbend(pc),a2 moveq #15,d2 resprevpbends: move.w #$2000,(a2)+ S dbf d2,resprevpbends movem.l (sp)+,d2/a2 rts midiresd: dc.b $e0,$00,$40,$b0,$01,$00 ENDC ; ************************************************************************* ; ************************************************************************* ; *********** P U B L I C F U N C T I O N S *********** ; ************************************************************************* ; ************************************************************************* IFEQ EASY Tk0Q xdef _InitModule,_PlayModule,_PlayModule2 xdef _InitPlayer,_RemPlayer,_StopPlayer xdef _SetTempo,_ContModule ENDC IFNE EASY ; This is the Reloc function, included only if EASY flag is set to 1. reloci move.l 24(a2),d0 beq.s xloci movea.l d0,a0 moveq #0,d0 move.b 787(a1),d0 ;number of samples subq.b #1,d0 relocs: bsr.s relocentr move.l -4(a0),d3 ;sample ptr beq.s nosyn move.l d3,a3 tst.w 4(a3) bpl.s nosyn ;type >= 0 move.w 20(a3),d2 ;number of UvBwaveforms lea 278(a3),a3 ;ptr to wf ptrs subq.w #1,d2 relsyn: add.l d3,(a3)+ dbf d2,relsyn nosyn: dbf d0,relocs xloci rts norel addq.l #4,a0 rts relocentr: tst.l (a0) beq.s norel add.l d1,(a0)+ rts _RelocModule: movem.l a2-a3/d2-d3,-(sp) movea.l a0,a2 move.l a2,d1 ;d1 = ptr to start of module bsr.s relocp movea.l 8(a2),a1 bsr.s reloci rel_lp bsr.s relocb move.l 32(a2),d0 ;extension struct beq.s rel_ex move.l d0,a0 bsr.s relocentr ;VEjNJptr to next module bsr.s relocentr ;InstrExt... addq.l #4,a0 ;skip sizes of InstrExt ; We reloc the pointers of MMD0exp, so anybody who needs them can easily ; read them. bsr.s relocentr ;annotxt addq.l #4,a0 ;annolen bsr.s relocentr ;InstrInfo addq.l #8,a0 bsr.s relocentr ;rgbtable (not useful for most people) addq.l #4,a0 ;skip channelsplit bsr.s relocentr ;NotationInfo move.l d0,a0 move.l (a0),d0 beq.s rel_ex move.l d0,a2 bsr.s relocp movea.l 8(a2)W^#,a1 bra.s rel_lp rel_ex movem.l (sp)+,d2-d3/a2-a3 rts relocb move.l 16(a2),d0 beq.s xlocb movea.l d0,a0 move.w 504(a1),d0 subq.b #1,d0 rebl bsr.s relocentr dbf d0,rebl xlocb rts relocp lea 8(a2),a0 bsr.s relocentr addq.l #4,a0 bsr.s relocentr addq.l #4,a0 bsr.s relocentr addq.l #4,a0 bra.s relocentr ENDC ; ************************************************************************* ; InitModule(a0 = module) -- extract expansion data etc.. fX[rom V3.xx module ; ************************************************************************* _InitModule: movem.l a2-a3/d2,-(sp) move.l a0,d0 beq.s IM_exit ;0 => xit IFNE RELVOL movea.l mmd_songinfo(a0),a1 ;MMD0song move.b msng_mastervol(a1),d0 ;d0 = mastervol ext.w d0 lea msng_trkvol(a1),a1 ;a1 = trkvol lea trackdataptrs(pc),a2 moveq #15,d1 IM_loop0 move.b (a1)+,d2 ;get vol... ext.w d2 move.l (a2)+,a3 ;pointer to track data mulu d0,d2 ;mastervol * trackvolYN̿3 lsr.w #4,d2 move.w d2,trk_trackvol(a3) dbf d1,IM_loop0 ENDC lea holdvals(pc),a2 movea.l a0,a3 move.l mmd_expdata(a0),d0 ;expdata... beq.s IM_clrhlddec ;none here move.l d0,a1 move.l 4(a1),d0 ;exp_smp beq.s IM_clrhlddec ;again.. nothing move.l d0,a0 ;InstrExt... move.w 8(a1),d2 ;# of entries beq.s IM_clrhlddec subq.w #1,d2 ;- 1 (for dbf) move.w 10(a1),d0 ;entry size IFNE MIDI movea.l mmd_songinfo(a3),a3 ;MMD0song ENDC IM_loop1 IFNE MIDI cmp.wZ #2,d0 ble.s IM_nsmnoff tst.b 2(a0) ;suppress MIDI note off? beq.s IM_nsmnoff bset #7,inst_midich(a3) IM_nsmnoff addq.l #8,a3 ;next instr ENDC move.b 1(a0),63(a2) ;InstrExt.decay ->decay move.b (a0),(a2)+ ;InstrExt.hold -> holdvals adda.w d0,a0 ;ptr to next InstrExt dbf d2,IM_loop1 bra.s IM_exit IM_clrhlddec moveq #62,d0 ;no InstrExt => clear holdvals/decays IM_loop2 clr.w (a2)+ dbf d0,IM_loop2 IM_exit movem.l (sp)+,a2-a3/d2 rts ; *************************[ߌv************************************************ ; InitPlayer() -- allocate interrupt, audio, serial port etc... ; ************************************************************************* _InitPlayer: IFNE MIDI bsr.w _GetSerial tst.l d0 bne.s IP_error ENDC bsr.w _AudioInit tst.l d0 bne.s IP_error moveq #33,d0 bsr.w _SetTempo ;set default tempo moveq #0,d0 rts IP_error bsr.s _RemPlayer moveq #-1,d0 rts ; ******************************************************\******************** ; RemPlayer() -- free interrupt, audio, serial port etc.. ; ************************************************************************* _RemPlayer: move.b _timeropen(pc),d0 beq.s RP_notimer ;timer is not ours bsr.s _StopPlayer RP_notimer: bsr.w _AudioRem IFNE MIDI bsr.w _FreeSerial ENDC rts ; ************************************************************************* ; StopPlayer() -- stop music ; *************************************************************] "************ _StopPlayer: move.b _timeropen(pc),d0 beq.s SP_end ;res. alloc fail. IFNE CIAB movea.l craddr(pc),a0 bclr #0,(a0) ;stop timer ENDC move.l _module(pc),d0 beq.s SP_nomod move.l d0,a0 clr.w mmd_pstate(a0) clr.l _module SP_nomod IFNE MIDI clr.b lastcmdbyte ENDC bsr.w SoundOff SP_end rts _ContModule move.b _timeropen(pc),d0 beq.s SP_end movea.l craddr(pc),a1 bclr #0,(a1) move.l a0,-(sp) bsr.w SoundOff move.l (sp)+,a0 moveq #0,d0 br^ ca.s contpoint ; ************************************************************************* ; PlayModule(a0 = module) -- initialize & play it!! ; PlayModule2(a0 = module) -- play module (must be initialized) ; ************************************************************************* _PlayModule: st d0 contpoint movem.l a0/d0,-(sp) bsr _InitModule movem.l (sp)+,a0/d0 _PlayModule2: move.b _timeropen(pc),d1 beq.s SP_end ;resource allocation failure move.l a0,d1 beq.s SP_end ;_ ^Gvmodule failure IFNE CIAB movea.l craddr(pc),a1 bclr #0,(a1) ;stop timer... ENDC clr.l _module IFNE MIDI clr.b lastcmdbyte ENDC move.w _modnum,d1 beq.s PM_modfound PM_nextmod tst.l mmd_expdata(a0) beq.s PM_modfound move.l mmd_expdata(a0),a1 tst.l (a1) beq.s PM_modfound ;no more modules here! move.l (a1),a0 subq.w #1,d1 bgt.s PM_nextmod PM_modfound movea.l mmd_songinfo(a0),a1 ;song move.b msng_tempo2(a1),mmd_counter(a0) ;init counter btst #0,msng_fl` ags(a1) bne.s PM_filon bset #1,$bfe001 bra.s PM_filset PM_filon bclr #1,$bfe001 PM_filset tst.b d0 beq.s PM_noclr clr.l mmd_pline(a0) PM_noclr move.w mmd_pseqnum(a0),d1 add.w #msng_playseq,d1 move.b 0(a1,d1.w),d1 ;get first playseq entry move.b d1,mmd_pblock+1(a0) move.w #-1,mmd_pstate(a0) move.l a0,_module IFNE CIAB move.w msng_deftempo(a1),d0 ;get default tempo movea.l craddr(pc),a1 bsr.w _SetTempo ;set default tempo bset #0,(a1) ;start timer => PLAY!a ! ENDC PM_end rts ; ************************************************************************* _AudioInit: movem.l a4/a6/d2-d3,-(sp) moveq #0,d2 movea.l 4,a6 ; +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ alloc signal bit IFNE AUDDEV addq.l #1,d2 moveq #-1,d0 jsr -$14a(a6) ;AllocSignal() tst.b d0 bmi.w initerr move.b d0,sigbitnum ; +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ prepare IORequest lea allocport(pc),a1 move.b d0,15(a1) ;set mp_SigBit move.l a1,-(sp) suba.l a1bQk,a1 jsr -$126(a6) ;FindTask(0) move.l (sp)+,a1 move.l d0,16(a1) ;set mp_SigTask lea reqlist(pc),a0 move.l a0,(a0) ;NEWLIST begins... addq.l #4,(a0) clr.l 4(a0) move.l a0,8(a0) ;NEWLIST ends... ; +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ open audio.device addq.l #1,d2 lea allocreq(pc),a1 lea audiodevname(pc),a0 moveq #0,d0 moveq #0,d1 jsr -$1bc(a6) ;OpenDevice() tst.b d0 bne.w initerr st.b audiodevopen ; +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ open ciaa.recesource addq.l #1,d2 ENDC IFNE CIAB cmp.b #50,$212(a6) ;ExecBase->VBlankFrequency beq.s init_pal move.l #474326,timerdiv ;Assume that CIA freq is 715 909 Hz init_pal moveq #0,d0 lea ciabname(pc),a1 jsr -$1f2(a6) ;OpenResource() tst.l d0 beq.s initerr move.l d0,_ciaresource ; +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ attach interrupt addq.l #1,d2 moveq #2,d3 lea craddr(pc),a4 move.l #$bfdf00,(a4)+ ;Initialize Timer B addresses move.l #$bfd600,(a4)+ move.l #$do8*bfd700,(a4) move.l d0,a6 lea timerinterrupt(pc),a1 ;Attempt to get timer B moveq #1,d0 ;Bit number 1: Timer B jsr -$6(a6) ;AddICRVector tst.l d0 beq.s gotTimerB ;succeeded!! moveq #1,d3 lea timerinterrupt(pc),a1 ;no. Get timer A then... moveq #0,d0 ;Bit number 0: Timer A jsr -$6(a6) tst.l d0 bne.s initerr move.l #$bfd500,(a4) ;Set Timer A addresses move.l #$bfd400,-(a4) move.l #$bfde00,-(a4) gotTimerB: movea.l craddr(pc),a0 ;get Control Register addrese~s and.b #%10000000,(a0) ;clear CtrlReg bits 0 - 6 move.b d3,_timeropen ;d3: 1 = TimerA 2 = TimerB ENDC IFNE VBLANK moveq #5,d0 ;INTB_VERTB lea timerinterrupt(pc),a1 jsr -$a8(a6) ;AddIntServer st _timeropen ENDC moveq #0,d0 initret: movem.l (sp)+,a4/a6/d2-d3 rts initerr: move.l d2,d0 bra.s initret _AudioRem: move.l a6,-(sp) moveq #0,d0 move.b _timeropen(pc),d0 beq.s rem1 ; +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ remove interrupt clr.b _timeropen IFNE CIABf< move.l _ciaresource,a6 lea timerinterrupt(pc),a1 subq.b #1,d0 jsr -$c(a6) ;RemICRVector ENDC IFNE VBLANK movea.l 4,a6 lea timerinterrupt(pc),a1 moveq #5,d0 jsr -$ae(a6) ;RemIntServer ENDC rem1: IFNE AUDDEV movea.l 4,a6 tst.b audiodevopen beq.s rem2 move.w #$000f,$dff096 ;stop audio DMA ; +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ close audio.device lea allocreq(pc),a1 jsr -$1c2(a6) ;CloseDevice() clr.b audiodevopen rem2: moveq #0,d0 move.b sigbitnum(gpc),d0 bmi.s rem3 ; +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ free signal bit jsr -$150(a6) ;FreeSignal() st sigbitnum ENDC rem3: move.l (sp)+,a6 rts IFNE MIDI _GetSerial: move.l a6,-(sp) ;Get serial port for MIDI bsr.s GetSer2 tst.l d0 ;got the port?? beq.s rgser ;yes movea.l 4,a6 ;no..try to flush serial.device: jsr -$84(a6) ;Forbid lea $15e(a6),a0 ;ExecBase->DeviceList lea serdev(pc),a1 ;"serial.device" jsr -$114(a6) ;FindName tst.l d0 beq.s serdhnotf ;no serial.device!! move.l d0,a1 jsr -$1b6(a6) ;RemDevice serdnotf: jsr -$8a(a6) ;and Permit bsr.s GetSer2 ;now try it again... rgser: move.l (sp)+,a6 rts GetSer2: movea.l 4,a6 moveq #0,d0 lea miscresname(pc),a1 jsr -$1f2(a6) ;OpenResource() move.l d0,miscresbase tst.l d0 beq.s gserror move.l d0,a6 lea medname(pc),a1 moveq #0,d0 ;serial port jsr -$6(a6) ;AllocMiscResource() tst.l d0 bne.s gserror moveq #0,d0 ;TBE lea serinterrupt(pc),iRa1 move.l 4,a6 jsr -$a2(a6) ;SetIntVector() move.l d0,prevtbe move.w #$8001,$dff09a ;TBE on!! move.w #114,$dff032 ;set baud rate (SERPER) st.b serportalloc moveq #0,d0 rts gserror: moveq #-1,d0 rts _FreeSerial: move.l a6,-(sp) tst.l miscresbase beq.s retfs tst.b serportalloc beq.s retfs movea.l 4,a6 tst.b $126(a6) ;interrupts disabled? bge.s fs_skipwait ;yes, can't busy loop... fs_waitempty move.b buffempty(pc),d0 beq.s fs_waitempty fs_skipwait movjO)se.w #$0001,$dff09a ;disable TBE move.l prevtbe(pc),a1 moveq #0,d0 jsr -$a2(a6) ;SetIntVector() fs_noptbe movea.l miscresbase(pc),a6 moveq #0,d0 ;serial port jsr -$c(a6) ;FreeMiscResource() clr.b serportalloc clr.b lastcmdbyte retfs: move.l (sp)+,a6 rts prevtbe: dc.l 0 SerIntHandler: move.w #$4000,$9a(a0) ;disable... addq.b #1,$126(a6) (Interrupts are enabled anyway...) move.w #1,$9c(a0) ;clear intreq bit move.b 8(a1),d0 ;bytesinbuff beq.s sih_buffe ;buffek,Hr empty movea.l 4(a1),a5 ;get buffer read pointer move.w #$100,d1 ;Stop bit move.b (a5)+,d1 ;get byte move.w d1,$30(a0) ;and push it out!! (SERDAT) cmpa.l a1,a5 ;shall we reset ptr?? bne.s norrbuffptr ;not yet.. lea sendbuffer(pc),a5 norrbuffptr: subq.b #1,d0 ;one less bytes in buffer move.b d0,8(a1) ;remember it move.l a5,4(a1) ;push new read pointer back exsih: subq.b #1,$126(a6) bge.s exsih0 move.w #$c000,$9a(a0) exsih0: rts sih_buffe st 9(a1) bra.s exslwuih _AddMIDIData: tst.b serportalloc beq.s retamd movem.l a2/a6,-(sp) movea.l 4,a6 move.w #$4000,$dff09a ;Disable interrupts addq.b #1,$126(a6) ;ExecBase->IDNestCnt lea buffptr(pc),a2 ;end of buffer (ptr) tst.b 9(a2) beq.s noTBEreq clr.b 9(a2) move.w #$8001,$dff09c ;request TBE noTBEreq movea.l (a2),a1 ;buffer pointer adddataloop: move.b (a0)+,d1 ;get byte bpl.s norscheck ;this isn't a status byte cmp.b #$ef,d1 ;forget system messages bhi.s norscheck cmpm+.b lastcmdbyte(pc),d1 ;same as previos status byte?? beq.s samesb ;yes, skip move.b d1,10(a2) ;no, don't skip but remember!! norscheck: move.b d1,(a1)+ ;push it to midi send buffer addq.b #1,8(a2) samesb: cmpa.l a2,a1 ;end of buffer?? bne.s noresbuffptr ;no, no!! lea sendbuffer(pc),a1 ;better reset it to avoid trashing noresbuffptr: subq.b #1,d0 bne.s adddataloop move.l a1,(a2) ;push new buffer ptr back subq.b #1,$126(a6) bge.s retamd1 move.w #$c000,$dff09a ;ennܡable interrupts again retamd1 movem.l (sp)+,a2/a6 retamd rts sendbuffer ds.b 128 buffptr dc.l sendbuffer readbuffptr dc.l sendbuffer bytesinbuff dc.b 0 buffempty dc.b -1 lastcmdbyte dc.b 0 ENDC IFNE AUDDEV sigbitnum dc.b -1 ENDC EVEN IFNE AUDDEV audiodevopen dc.b 0 ENDC serportalloc dc.b 0 _timeropen dc.b 0 even IFNE MIDI preschgdata dc.w 0 noteondata dc.l 0 miscresbase dc.l 0 ENDC dmaonmsk dc.w 0 IFNE MIDI bytesinnotebuff dc.w 0 noteonbuff ds.b 18*3 ENDC even IFNEor CIAB _ciaresource dc.l 0 craddr dc.l 0 dc.l 0 ;tloaddr dc.l 0 ;thiaddr ENDC _module: dc.l 0 timerinterrupt dc.w 0,0,0,0,0 dc.l timerintname,serportalloc,_IntHandler IFNE MIDI serinterrupt dc.w 0,0,0,0,0 dc.l serintname,buffptr,SerIntHandler ENDC IFNE AUDDEV allocport dc.l 0,0 ;succ, pred dc.b 4,0 ;NT_MSGPORT dc.l 0 ;name dc.b 0,0 ;flags = PA_SIGNAL dc.l 0 ;task reqlist dc.l 0,0,0 ;list head, tail and tailpred dc.b 5,0 allocreq dc.l 0,0 dc.b 5,127 ;NT_MESSAGpE, use maximum priority (127) dc.l 0,allocport ;name, replyport dc.w 68 ;length dc.l 0 ;io_Device dc.l 0 ;io_Unit dc.w 0 ;io_Command dc.b 0,0 ;io_Flags, io_Error dc.w 0 ;ioa_AllocKey dc.l sttempo ;ioa_Data dc.l 1 ;ioa_Length dc.w 0,0,0 ;ioa_Period, Volume, Cycles dc.w 0,0,0,0,0,0,0,0,0,0 ;ioa_WriteMsg audiodevname dc.b 'audio.device',0 ENDC IFNE CIAB ciabname dc.b 'ciab.resource',0 ENDC timerintname dc.b 'MEDTimerInterrupt',0 IFNE MIDI serintname dc.b 'MEDSq8\erialInterrupt',0 miscresname dc.b 'misc.resource',0 serdev dc.b 'serial.device',0 medname dc.b 'MED modplayer',0 ;yeah, our name ENDC IFNE SYNTH _synthper: dc.w 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032 dc.w 1920,1812,1712,1616,1524,1440,1356,1280,1208,1140 dc.w 1076,1016,960,906 ENDC _periods: dc.w 856,808,762,720,678,640,604,570,538,508,480,453 dc.w 428,404,381,360,339,320,302,285,269,254,240,226 dc.w 214,202,190,180,170,160,151,143,135,127,120,113 dc.w 214r,202,190,180,170,160,151,143,135,127,120,113 dc.w 214,202,190,180,170,160,151,143,135,127,120,113 dc.w 214,202,190,180,170,160,151,143,135,127,120,113 holdvals: ds.b 63 decays: ds.b 63 IFND __G2 section "datachip",data,chip ;for A68k ENDC IFD __G2 section "datachip",data_c ;this is for Devpac 2 ENDC xdef _modnum IFNE EASY easymod incbin "module" ;<<<<< MODULE NAME HERE! ENDC _chipzero: dc.l 0 _modnum: dc.w 0 ;number of module to play ; the track-data structure desNfinition: trk_prevnote equ 0 ;previous note number trk_previnstr equ 1 ;previous instrument number trk_prevvol equ 2 ;previous volume trk_prevmidich equ 3 ;previous MIDI channel trk_cmd equ 4 ;command (the 3rd number from right) trk_cmdqual equ 5 ;command qualifier (infobyte, databyte..) trk_prevmidin equ 6 ;previous MIDI note trk_noteoffcnt equ 7 ;note-off counter (hold) trk_inithold equ 8 ;default hold for this instrument trk_initdecay equ 9 ;default decay for.... trk_stransp equ t r10 ;instrument transpose trk_pad0 equ 11 trk_previnstra equ 12 ;address of the previous instrument data trk_trackvol equ 16 ; the following data only on tracks 0 - 3 trk_prevper equ 18 ;previous period trk_audioaddr equ 20 ;hardware audio channel base address trk_sampleptr equ 24 ;pointer to sample trk_samplelen equ 28 ;length (>> 1) trk_porttrgper equ 30 ;portamento (cmd 3) target period trk_vibroffs equ 32 ;vibrato table offset trk_vibrspdsz equ 33 ;vibrato speed/size (cmd 4 qualifu!ier) trk_synthptr equ 34 ;pointer to synthetic/hybrid instrument trk_arpgoffs equ 38 ;SYNTH: current arpeggio offset trk_arpsoffs equ 40 ;SYNTH: arpeggio restart offset trk_volxcnt equ 42 ;SYNTH: volume execute counter trk_wfxcnt equ 43 ;SYNTH: waveform execute counter trk_volcmd equ 44 ;SYNTH: volume command pointer trk_wfcmd equ 46 ;SYNTH: waveform command pointer trk_volwait equ 48 ;SYNTH: counter for WAI (volume list) trk_wfwait equ 49 ;SYNTH: counter for WAI (waveform list) trk_v"yCsynthvibspd equ 50 ;SYNTH: vibrato speed trk_wfchgspd equ 52 ;SYNTH: period change trk_perchg equ 54 ;SYNTH: curr. period change from trk_prevper trk_envptr equ 56 ;SYNTH: envelope waveform pointer trk_synvibdep equ 60 ;SYNTH: vibrato depth trk_synvibwf equ 62 ;SYNTH: vibrato waveform trk_synviboffs equ 66 ;SYNTH: vibrato pointer trk_initvolxspd equ 68 ;SYNTH: volume execute speed trk_initwfxspd equ 69 ;SYNTH: waveform execute speed trk_volchgspd equ 70 ;SYNTH: volume change trk_pwsrevnote2 equ 71 ;SYNTH: previous note trk_synvol equ 72 ;SYNTH: current volume trk_synthtype equ 73 ;>0 = synth, -1 = hybrid, 0 = no synth trk_periodtbl equ 74 ;pointer to period table trk_prevportspd equ 78 ;portamento (cmd 3) speed trk_decay equ 80 ;decay trk_fadespd equ 81 ;decay speed trk_envrestart equ 82 ;SYNTH: envelope waveform restart point trk_envcount equ 86 ;SYNTH: envelope counter trk_split equ 87 ;0 = this channel not splitted (OctaMED V2) end NTH: volume change trk_p#$|Jj&%$vmodplayer.a.info#%߈jHExx8Ab`=E`   <1" 1!*! *!$! $"$<   ? #&gE   I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   p#u}om}om}om}om}om}omppp :c/muchmore  p'(P\9876543210/.-,+*)(!l modplayer.doc')fuJ Instructions for using "modplayer.a", the stand-alone playroutine. ========================================================================== "modplayer" is a piece of code (about 3 - 5 KBytes, depending on your needs) which is linked with your program and plays modules made in MED. "modplayer" contains the following routines: InitPlayer RemPlayer PlayModule ContModule StopPlayer SetTempo The arguments are passed in registers, and return values are returned in d0. These '*routines will trash registers d0-d1 and a0-a1. And now the descriptions of each one: -------------------------------------------------------------------------- InitPlayer -- initialize everything Before you can call the other functions, you must call this function. It allocates the audio channels, timer, serial port (if MIDI) etc... ARGUMENTS: none RETURNS: 0 if everything is ok, otherwise something failed. If something failed, you can still call the other routines - they jus'+1 ?_JIHGFEDCBA@?w modplayer.h>@ڛ/* C definitions for using the 'modplayer.a' and 'mod8player.a' play-routines of OctaMED V2.00 and MED V3.20 */ #ifndef EXEC_TYPES_H #include #endif /* If "libproto.h" has been loaded, we don't define the "modplayer.a" functions. */ #ifndef MEDPLAYER_LIBPROTO #ifdef LATTICE /* In 'modplayer.a' */ LONG __asm InitPlayer(void); void __asm RemPlayer(void); void __asm PlayModule(register __a0 struct MMD0 *); void __asm ContModule(register __a0 struct MMD0 *); void _>A3Gw_asm StopPlayer(void); void __asm SetTempo(register __d0 UWORD); /* In 'loadmod.a' */ struct MMD0 * __asm LoadModule(register __a0 char *); /*void __asm RelocModule(register __a0 struct MMD0 *);*/ void __asm UnLoadModule(register __a0 struct MMD0 *); /* These are the definitions for the 8-channel OctaMED routines, in 'mod8player.a' (not provided with MED). */ LONG __asm InitPlayer8(void); void __asm RemPlayer8(void); void __asm PlayModule8(register __a0 struct MMD0 *); void __asm >BpKContModule8(register __a0 struct MMD0 *); void __asm StopPlayer8(void); #endif /* If you're playing multi-modules, set the 'modnum' variable to the number of the song you want to play before calling PlayModule(). */ #ifdef LATTICE_50 extern UWORD far modnum; /* 'modnum8' is the equivalent in 'mod8player' */ extern UWORD far modnum8; #else extern UWORD modnum,modnum8; /* for less intelligent compilers */ #endif #endif MEDPLAYER_LIBPROTO /* This is the main module structure */>C` struct MMD0 { ULONG id; /* "MMD0" */ ULONG modlen; /* module length (in bytes) */ struct MMD0song *song; /* pointer to MMD0song */ ULONG songlen; /* length of song (not currently used) */ struct MMD0block **blockarr; /* pointer to pointers of blocks */ ULONG blockarrlen; /* length... */ struct Soitin **smplarr; /* pointer to pointers of samples */ ULONG smplarrlen; /* len.. */ struct MMD0exp *expdata; /* pointer to expansion data */ ULONG expsize; /* lenght again.>D֚. */ /* The following values are used by the play routine */ UWORD pstate; /* the state of the player */ UWORD pblock; /* current block */ UWORD pline; /* current line */ UWORD pseqnum; /* current # of playseqlist */ WORD actplayline; /* OBSOLETE!! DON'T TOUCH! */ UBYTE counter; /* delay between notes */ UBYTE extra_songs; /* number of additional songs, see expdata->nextmod */ }; /* These are the structures for future expansions */ struct InstrExt { /* This>Eyk struct only for data required for playing */ /* NOTE: THIS STRUCTURE MAY GROW IN THE FUTURE, TO GET THE CORRECT SIZE, EXAMINE mmd0->expdata->s_ext_entrsz */ UBYTE hold; UBYTE decay; UBYTE suppress_midi_off; /* 1 = suppress, 0 = don't */ UBYTE pad0; /* This may be used in the future... */ }; struct MMDInstrInfo { UBYTE name[40]; UBYTE pad0; /* two pads? */ UBYTE pad1; }; struct MMD0exp { struct MMD0 *nextmod; /* for multi-modules */ struct InstrExt *exp_smp; /* point>FKner to an array of InstrExts */ UWORD s_ext_entries; /* #of InstrExts in the array */ UWORD s_ext_entrsz; /* size of an InstrExt structure */ UBYTE *annotxt; /* 0-terminated message string */ ULONG annolen; /* length (including the 0-byte) */ /* MED V3.20 data below... */ struct MMDInstrInfo *iinfo; /* "secondary" InstrExt for info, that has no affection on output */ UWORD i_ext_entries; /* # of MMDInstrInfos */ UWORD i_ext_entrsz; /* size of one */ ULONG j>Gżg-umpmask; /* jumpmask for Topi (aaaarrrgh!!!) */ UWORD *rgbtable; /* pointer to 8 UWORD values */ UBYTE channelsplit[4]; /* for OctaMED only (non-zero = NOT splitted) */ /* leave these to zero! */ struct NotationInfo *n_info; /* OctaMED notation editor info data */ /* This are still left, they must be 0 at the moment. */ ULONG reserved2[10]; /* better have enough of these... */ }; /* Info for each instrument (mmd0->song.sample[xx]) */ struct MMD0sample { UWORD rep,replen; > HF/* repeat/repeat length */ UBYTE midich; /* midi channel for curr. instrument */ UBYTE midipreset; /* midi preset (1 - 128), 0 = no preset */ UBYTE svol; /* default volume */ BYTE strans; /* sample transpose */ }; /* The song structure (mmd0->song) */ struct MMD0song { struct MMD0sample sample[63]; /* info for each instrument */ UWORD numblocks; /* number of blocks in this song */ UWORD songlen; /* number of playseq entries */ UBYTE playseq[256]; /* the playseq list *> IA5 / UWORD deftempo; /* default tempo */ BYTE playtransp; /* play transpose */ UBYTE flags; /* flags (see below) */ UBYTE reserved; /* for future expansion */ UBYTE tempo2; /* 2ndary tempo (delay betw. notes) */ UBYTE trkvol[16]; /* track volume */ UBYTE mastervol; /* master volume */ UBYTE numsamples; /* number of instruments */ }; /* length = 788 bytes */ /* FLAGS of the above structure */ #define FLAG_FILTERON 0x1 /* hardware low-pass filter */ #define FLAG_JUMPIN> JuܚGON 0x2 /* jumping.. */ #define FLAG_JUMP8TH 0x4 /* jump 8th.. */ #define FLAG_INSTRSATT 0x8 /* instruments are attached (sng+samples) used only in saved MED-songs */ #define FLAG_VOLHEX 0x10 /* volumes are represented as hex */ #define FLAG_STSLIDE 0x20 /* no effects on 1st timing pulse (STS) */ #define FLAG_8CHANNEL 0x40 /* OctaMED 8 channel song, examine this bit to find out which routine to use */ /* flags in struct NotationInfo */ #define NFLG_FLAT 1 #define NFLG_3> YA%_4 2 struct NotationInfo { UBYTE n_of_sharps; /* number of #'s (or b's) */ UBYTE flags; /* flags (see above) */ WORD trksel[5]; /* selected track for each preset (-1 = none) */ UBYTE trkshow[16]; /* which tracks to show (bit 0 = for preset 0, bit 1 for preset 1 and so on..) */ UBYTE trkghost[16]; /* ghosted tracks (like trkshow[]) */ BYTE notetr[63]; /* -24 - +24 (if bit #6 is negated, hidden) */ UBYTE pad; /* perhaps info about future extensions */ }; efine NFLG_3KL|Jg\NMLvlmodplayer.h.infoKMZn,{HEǂǍR0b}=E P   <1" 1!*! *!$! $"$<   ? KNwE  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pKu^}om}om}om}om}om}omppp :c/muchmore  pOP ђba`_^]\[ZYXWVUTSRQP$,wLobjconvOQb*H~$H$I,xG(r <`&Q)Oh)N`Bdp"<0NCpN)@fpd`&&n)k\Jg 8)@, k"h r)IpЁ^@)@xH@@"<N:Jf </g @)@tL Sԁ SQ S"  Q"/`r)k:,pRѬ,A\NA\N)@d/$@ *$g,l @"()A\N"* g$<N)@lg @'h ld/Hl( h$)hpNN pp` // ,Tg @NN$,x"lNbNJdg",lgN,xN|"ldN` ,xg"lORaltN. .lhL~Nudos.libraryNUH?.-&m AW@gU@g W@g:`8|`2| -gro$p-gr+ffp`p, m N.SA!0xf m p`B -r N"t‚Ё+@ m N.Sg A!0xf gJjDJg R - `Jg R -0` R `~p0mp7o m p`rB -"t‚Ё+@ m N.Sg p0mp7o g0Jf R - ` R `Jfp+@A!0xf m p`* m N. -groRp@Eg@ g` m+H` m +H` m+HR` m+H`R mB+H`N$gr gr g r gR`Jf`B`& ,"f ld`A*)H&Jf|C$M,,,,<"ld i$Hx(/(HlN,O A"$<,lO YUr4N)@)@r)A)@)A+@,xN m"@#h~+@`*,lN)@N)@A"$<N)@~ @ @Jgp` <.B| @)@xp)@ @)@p)@ @)@A )HX/,&/,"NBN bLLN]Nucon:10/10/320/80/*pa/ &oJg +fp`4/,$N >XO'@'@f p )@p`'l$pp'@ '@&_NuNUH/.-&m (p1gp`d+VDHH,Jf+fvp'@ rg6/ NRXOJg p`O ZTJg +"D'A ` +'@ S m kR r` r/ /aVPO" `+gXpfp` @Jg"p fp/Hz/++@NO *`p/Hm/++@NO *~`JgNpgHT r f" kR "+ Jk / /aPOR kR  + Jj `~ ++@gr+gRHxB/+NO +@Jg8Sm2B/-/+NHxHm/+NtOJ@f -rg/-/+/+NO *`zpf` gJg"+$D'B `+gr'A `"+'A k'Hg*S m kR rO [ ` r/ /aPO"p0gp` pfp` LN]Nu H&o+VDHH.p0g Bp`F+g+g / HxN.POJf4B+gp'@A 'H`v/ NXOJgjp`JgZT +nP kR| r gr g$`.Sm kRp`/ a Can't open inputOb1B file Source length = %ld (0x%lx) bytes Enter the name of the symbol (without the leading '_'). =>%sNo errors! Error: Failed to write a zero longword. Error: Failed to write the symbol name. Error: Failed to write the HUNK_EXT data. Error: Failed to write the object file. Error: Reading the input file failed. Error: No memory for buffer. Error: Failed to write the header. Can't open output file (OP^ ((((( H ((((( H `cd*@ gfedwreloc.ace6]; Small reloc routine for those who include the module directly in ; the program code. ; NOTE: THE MODULE POINTER IS PASSED IN STACK, SO THIS IS COMPATIBLE ; WITH C-PROGRAMS. section "text",code xdef _RelocModule reloci move.l 24(a2),d0 beq.s xloci movea.l d0,a0 moveq #0,d0 move.b 787(a1),d0 ;number of samples subq.b #1,d0 relocs: bsr.s relocentr move.l -4(a0),d3 ;sample ptr beq.s nosyn move.l d3,a3 tst.w 4(a3) bpl.s nosyn ;type >= 0 move.w 20(a3),d2 ;nucf]6kmber of waveforms lea 278(a3),a3 ;ptr to wf ptrs subq.w #1,d2 relsyn: add.l d3,(a3)+ dbf d2,relsyn nosyn: dbf d0,relocs xloci rts norel addq.l #4,a0 rts relocentr: tst.l (a0) beq.s norel add.l d1,(a0)+ rts _RelocModule: move.l 4(sp),a0 ;get module pointer from stack movem.l a2-a3/d2-d3,-(sp) movea.l a0,a2 move.l a2,d1 ;d1 = ptr to start of module bsr.s relocp movea.l 8(a2),a1 bsr.s reloci rel_lp bsr.s relocb move.l 32(a2),d0 ;extension struct beq.s rel_excg)C move.l d0,a0 bsr.s relocentr ;ptr to next module bsr.s relocentr ;InstrExt... addq.l #4,a0 ;skip sizes of InstrExt ; We reloc the pointers of MMD0exp, so anybody who needs them can easily ; read them. bsr.s relocentr ;annotxt addq.l #4,a0 ;annolen bsr.s relocentr ;InstrInfo addq.l #8,a0 bsr.s relocentr ;rgbtable (not useful for most people) addq.l #4,a0 ;skip channelsplit bsr.s relocentr ;NotationInfo move.l d0,a0 move.l (a0),d0 beq.s rel_ex move.l d0,a2 bsr.s relc]'ocp movea.l 8(a2),a1 bra.s rel_lp rel_ex movem.l (sp)+,d2-d3/a2-a3 rts relocb move.l 16(a2),d0 beq.s xlocb movea.l d0,a0 move.w 504(a1),d0 subq.b #1,d0 rebl bsr.s relocentr dbf d0,rebl xlocb rts relocp lea 8(a2),a0 bsr.s relocentr addq.l #4,a0 bsr.s relocentr addq.l #4,a0 bsr.s relocentr addq.l #4,a0 bra.s relocentr end ople) addq.l #4,a0 ;skip channelsplit bsr.s relocentr ;NotationInfo move.l d0,a0 move.l (a0),d0 beq.s rel_ex move.l d0,a2 bsr.s relhiгkjiv reloc.a.infohj?xpEQ‚8 E   <1" 1!*! *!$! $"$<   ? hkaE  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   phuA}om}om}om}om}om}omppp :c/muchmore  plm*J5mwreloc.olзreloctext- *g. @p)Sa(&(g&CJkj4+GSBכQQNuXNuJgӘNu oH00$H" aP"jaa2 * g& @aaXaXaPaXa @ g $@a""j`L Nu *g @0)SaQNuAaXaXaX`_RelocModuleBJq-aMED3.22--no*ponwPlayerLibrary.info~np9_p)WO@~Z(90 $ $ $ $$$ ?03777*77?76?95UUUUU\@@@ @ @ @@n-*?0"UUUUUP????*????90 $ $ $ $$$ ?03777*77?76?95UUUUU\@@@ @ @ @@qndztr- 5 PlayerLibrary~rs"s?wInstall_Libraryqr?)echo "Copying to LIBS: ..." copy #?.library LIBS: echo "Done." s-_Install_Libraryqtu=yxwvuw `Install_Library.infoqtvR: 0d `0`0`0`0`0`0`0`0`0`x0`8000`000`癟0p0`00`8000`x00`0`0`tw%-80`0`0`0`0`0`088tx [-H`0`0`p>~0```00`~0```00`Hur to resend the preset values SYNOPSIS ResetMIDI() FUNCTION This function resets pitchbenders and modulation wheels on all MIDI channels. It also asks the player to send again the preset change requests for all instruments, so that the presets will be correct if the user has changed them. It performs the same function as MED's Ctrl-Space. --------------------------------------------------------------------------- --------------------------------------------------------------0}------------- NOTE: THE FOLLOWING FUNCTIONS ARE ONLY AVAILABLE IN MEDPLAYER.LIBRARY V2 OR LATER, BE SURE THAT YOU'RE REALLY USING V2 OF THE LIBRARY e.g. MEDPlayerBase = OpenLibrary("medplayer.library",2); --------------------------------------------------------------------------- --------------------------------------------------------------------------- SetModnum NAME SetModnum -- select the number of the song (in multi-module) SYNOPSIS SetModnum(modnum) D0 FUNCTION Use this function to set the number of song you want to play. Call this before PlayModule(). 0 is the first song, 1 is the second, and so on. If the module is not a multi-module, this function has no affection. --------------------------------------------------------------------------- --------------------------------------------------------------------------- RelocModule NAME RelocModule -- relocate module SYNOPSIS RelocModule(module) A0 FUNCTION This function relocatesBM the module. It should be used if you've incorporated the module with Objconv program before using the module. Note that LoadModule() automatically relocs everything. --------------------------------------------------------------------------- *************************************************************************** ---------------------------------------- RelocModule NAME RelocModule -- relocate module SYNOPSIS RelocModule(module) A0 FUNCTION This function relocatesdvlibrary.doc.infoqkQvE`H``NR@x E   <1" 1!*! *!$! $"$<   ? E@  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pu}om}om}om}om}om}omppp :c/muchmore  p<5*g Tmedplayer.libraryq+Ɏ#@#pNuJ lNUH8I&H$@%K"| %|l |5|5|%|A.C+|A +I m`SdA ѭ m.+HJo -" mҘ"AёS+A+H` LN]NuHI&NRk  LXNuHI&N~Sk f+g,Ka . LXNuH#I&N~Jk f<.+"/"K,xN,_p0+r2+$ԁ, Kr2/"H ,xN.,_ LXNuH $,yN|J,f,a2#,Nv NJgB,`BypL@NuNvp`/,y ߓN,_NuH瀀a谺ZfLNuLXNuaB,BfNaNaNaNaNaNa3Nu 9fNuaNvC"Q)gB)AAB(p`<lB"B)Iri3Nu/t aQAB$Nux nCC*00fJ+g,+<l"EJgJ-Io ig3B"-g"B-A4B-HpaLJ+f(|lB-Qm PB- y ESJhkB-IJj `<>o x0(fB AD+HJ:0 @\"86+`x  $H~> *HE"<f9<\` 86+|;plki;pЈ\C;p:1PL"m"|b+|;|2`JDg2`2؄Є+@;C22;EJ-IfNuj kSjtz+j B-`ASE+g(;PDg"CP>SA<p?a2JgA"HgVQNuB-NuAG+H" hf PI h``|IC+IJA21"m;A3ABC&BBBBBB"BY m"2B -fm// &mS-*n"mD*-Fg-Hjp<@op@@H@ "-8g$"A@H@ R-VjB-V"mR+I80-,J-0g S-@90o`RR0k AHA `A2;N" 8NZvvv,tvvt0`pD`p0R`^pF`0DAF`p/B-1`0a$BR+I8B-V`p0a+IR`B8`^HAAC"QTNuS;@,mHS-+nmE+0-.2-4gm6;A6m|qlrq7AJ-1g S-1g`RR0kHAA"px7Y&`A2;N".8ZhBLr0HAA"pxT+I>`0`;@(;@&RJ0j`pE`~p1R`Np=`jp3R-3`\r0;A4`N0DH`Bm67m`8p-B-0`>7v(S;@.0-&g0r0-G"mJA21m6;A7ARJ0j0-(;@&2-0H@2-@m67A0-2mB&_Nu1GZju}}ujZG1Ϲ/99gQ Nu*Yd"-g m 0Nu0:g rPAa3rOaCnaaaaA0g` :y B   ( : L ^ p H?<,z P gJn(gB(n gv.2R,lC2P=f$B.20.* n@@$p  0.,2@A~HzJz"W*Y.ZxvVV@fJfJgHJg@Jg@ S@AZpp? @G+K p+H@k Fgz-<fJg~<bpaF`R<fz`D<fBn( z a*X`d<f&|l mJSk:00P m1@z`<f0a`R9 `<f<lF/`ʰ< fFj<@n4r-A`,f <@b H@`~< ff| F`h<fF @`P<h2 f0@lb>=@.P `2<f,SjJgN`|lF mJ,- k8E;pPFNzJg&02t-v-&m mfPaRz^mXEX2.,RAzLnJg6rJn(j,0..JkR@lmpr@/A0,mp@+B=A, n0.*@@$p0.,2@AE,AS"XJ)k&f *g`?g *Wf)VQ,fLv~|EV*Zzx--J-fv|lJ-k.S-j(J-IgmP-B-0 -"`mPQf 3z -"g @aV-Qg-jB-B-Q"m0;`N"(hh"m we:-|ql:<q;E3E`tm:-`Jgd H@J@f` Sf `S,-  mJ3p@`*-fjp` <@op@@@ `:-<lD3E`0-g2--N@bD@l`D@n2-Bm;A3A`JgD!- @rA0H-!@Em-!>- 3E`n<f <fb`<f <fR`<f*g@0rg8t-/v-&m a&`$<g<f`m RzZmaL"@ )g6 @4)g.SB0) &k|o J(gPh?Q`p>BZQL NuJgadJfaJf p!a0pNuapNu:rga aaNu:`g$ z :g @Bh(BfB9 aNu:4g"zx/a _p`PH瀀aL: g"g"zLBfB9 29gJ g"h Jg QSAn"hi2)f `JgB,2(.A1A+1|(#f0)"za2NuH0 t,yRpNJk C@/ N"_#@A  XB!HRCAprNDJfPR .2g #<pCNJgh#VRvI2(((,@C*pNJg"vCpNJf(()<)< zpLP Nu `/p:gB9,yVCSN,yJ9g3CN>B9p:=k NP ,_Nu/a.Jg&,yN|A^CPNJg"@NJNva,_Nu,ypCN#Jg@,@C&pNJf0pC>,yN^#33r2PpNupNu/J9gBJg:,yJ.&l:yg3"z"pN^,znpNB9 zJB9 ,_Nu1|@R.&1|)g.*i2<1A0fKS@#MS.&l1|NuP `J9ghH",y3@R.&EJ* g B* 3"Rj<b :g A R*fCSf$S.&l3LDNu )_Daudio.deviceciab.resourceMEDTimerInterruptMEDSerialInterruptmisc.resourceserial.deviceMEDPlayerLib ` @ phPLt4X(\:}hS@. xqxqxqxq{RH>:|(H,yCpNJg&@,@" $<N(g`"tvN"vFN*,yrN:Jg0$@"$&,KNְf MMD0f Ja|, `"J ,yN.,K"N"K,yNb L\|Nudos.library *g. @p)Sa(&(g&CJkj4+GSBכQQNuXNuJgӘNuH00$H" aP"jaa2 * g& @aaXaXaPaXa @ g $@a""j`L Nu *g @0)SaQNuAaXaXaX`/ g,y (g"HN.,_Nul&medpTlayer.libraryVersion 1.0Vd`\XTPLHD@<840,($   ( b h F x&Pfv~tx| ~V< f"F$ ˥&@1.0Vd`\XTPLHD@<840,($   ( b h F x&Pfv~tx| ~V< f"F$ LQw (medplayer_lib.fdq:e* prototypes for MEDPlayer.library V2.00 ##base _MEDPlayerBase ##bias 30 ##public GetPlayer(initser)(D0) FreePlayer()() PlayModule(module)(A0) ContModule(module)(A0) StopPlayer()() DimOffPlayer(dimlength)(D0) SetTempo(tempo)(D0) LoadModule(filename)(A0) UnLoadModule(module)(A0) GetCurrentModule()() ResetMIDI()() * functions below in V2.00 or later SetModnum(modnum)(D0) RelocModule(module)(A0) ##end aMED3.22-- .&Read Mep|8e**************************************************************************** *** +------------------------------------------------------------------+ *** *** | MED - music editor V3.22 - by Teijo Kinnunen | *** *** | | *** *** | This version released 28.01.1992 | *** *** +------------------------------------------------------------------+ *** **************************Y************************************************** Welcome to use MED V3.22. First I should note that this file contains some important information, so please read this file carefully before doing anything else. MED is an all-purpose music editor which can be used to make music for programs (games, demos...), but works well as a stand-alone music program, too. Here are the contents of the complete MED distribution disk: Demos (dir) Some demo songs (try these first) Docs (dir) Documents (remember to read) Synthsounds (dir) Some synthetic sounds Programmers (dir) Stuff for programmers PlayerLibrary (dir) medplayer.library stuff MODPlayer (dir) linked module player/loader stuff Examples (dir) some examples in Assembler & C MED The music editor MEDPlayer The player program Read Me This file... ReadMe.OctaMED Another file to read. If you start using MED frequently, you should ma^Bke a backup copy of your MED disk, and save the original in the safe place. You can also install MED on hard disk. Just remember to copy 'MED.gfx1' into the same directory. It is a data file required by MED during startup. The icons on the MED disk were designed for WB 2.0 colors, so they may look "inversed" on 1.x. Below is the copyright statement, PLEASE read it carefully: ist MED V3.22 is copyright 1989-1992 Teijo Kinnunen MED V3.22 is NOT public domain. Instead it's freely distributable. This means that you are allowed to distribute MED freely, if the following conditions are met: 1) no profit is made. Coq=mmercial PD-distributors are allowed to take small fee for copying, mailing and media costs, but no profit must be made!! If somebody gets profit of this program, it must be the author, nobody else!! 2) all distributed files must remain unmodified. 0b= 3) this file (Read Me) MUST follow every copy of MED. 4) if MED is distributed on a disk magazine/cover disk, it must be clearly stated that MED is freely distributable. 5) MED may not be included in a commercial package without written permission from the author. However, the player routines/library and synthsounds provided on this disk can be used anywhere without permission. MEDPlayer may be freely distributed. MED is provided "as is". The author tries to keep MED as bug free as possible, but if there are bugs that cause you lost something,  hV the author is not responsible for the damage. Although MED is not really shareware, I would be happy to get any kind of donations (money, candy, or anything else), as I have done lots of work for MED. If you don't want to send me anything, please at least consider buying Oct |EaMED (you'll get some nice features with it, AND you'll also support the author...) V3.2 is probably the LAST freely distributable release of MED (excluding bug fix releases). From now on I'll be developing only OctaMED. (Look out for OctaMED Professional (distributed by Amiganuts United), will be released on Spring 1992!!) ============================================================================== If you want to contact the author of MED, you can write to: Teijo Kinn ?-unen Oksantie 19 SF-86300 OULAINEN FINLAND Please remember to indicate the version number of MED you are using!! I'm sorry, but I may not be able to answer all letters I get. I've received a great amount of mail (thanks to everyone!!), but my time is unfortunately so limited that I don't have lots of time to write the answers. Anyway, even if I answer, the response time may be rather long... ============================================================== C~================ Additional credits: ~~~~~~~~~~~~~~~~~~~ Marcus Pol - the big MED-text that is displayed after loading MED. Steve Hayes - the Electronic Arts' public domain IFF-loader (as found on Fred Fish disk #64). Frederic Bouquerel - the MED-logo on the title bar. Triox/Sauria - MED logo picture (displayed upon booting), and the MED/MEDPlayer/document file icons. Alan Mackey - "Synth-a-sysmic", a cool son g. Distributed as a demo song of MED V3.21/3.22. Thanks to all of you!! ============================================================================== s' public domain IFF-loader (as found on Fred Fish disk #64). Frederic Bouquerel - the MED-logo on the title bar. Triox/Sauria - MED logo picture (displayed upon booting), and the MED/MEDPlayer/document file icons. Alan Mackey - "Synth-a-sysmic", a cool son#va Read Me.infop¡uV@UEǎ(ǎ@phiJE   <1" 1!*! *!$! $"$<   ? _A$EH  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pu }om}om}om}om}om}omppp :C/muchmore  p?A  (ReadMe.OctaMEDp}X, OctaMED ~~~~~~~ OctaMED is the "big brother" of MED, which contains a couple of new major features. As the name suggests, it can "split audio channels" in order to produce five to eight independent channels, without any external hardware. Those who have seen Oktalyzer or StarTrekker1.2 know what I'm talking about. What is quite unique when compared to these programs, is that OctaMED can multitask while playing in splitted channel modes. As users of the Ne&other 8-track programs know, the audio quality is a bit lower on splitted channels, depending on the instruments used. The CPU load and some technical reasons also cause some restrictions (some features, e.g. MIDI and synthsounds, are disabled when in splitted channel mode). Another feature in OctaMED (V2) is the printing display. You can print the notes in textual form (as normally displayed by MED). You can also print and edit using the standard notation! It'sȣV not like DMCS which allows you to place the notes in nearly any imaginable way, but more like Sonix. To help you to compose in splitted channel modes (5 - 8 channel modes), OctaMED can display eight tracks on screen at a time. This is helpful in MIDI work, too. For MIDI work, there's also (optionally) a 16-track display available, although it's quite difficult to read. In addition to the features listed above, OctaMED V2 contains all the features of MED V3.26!. To use OctaMED you should have at least 1 megabyte or more of memory. Now I hear you asking "Where can I get it from??". First, OctaMED is NOT public domain or freely distributable. OctaMED is a copyrighted program. I will get my share of the profits for every copy sold, so by buying this program you'll also support me (but this doesn't mean that you can't send money directly to me, too :^) OctaMED is exclusively available from a British PD-distributor Amiganuts Uniؔ)ted (you can't get it from the author, for example). The price of version 2 is 20.00 for European countries (add postage: 0.50 for EC countries and UK, 1 for non-EC), and 25.00 for non-European countries. The payment MUST be made in POUNDS STERLING, by International Money Order, Bankers Draught or Cheque (as long as it is in Pounds sterling). Credit card orders not accepted. NOTE TO OWNERS OF OctaMED V1: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Registered buyers of OcgtaMED V1 can upgrade to version 2 for half price (10.00/15.00). The original OctaMED V1 disk must be returned along with your order. CONTACT: ~~~~~~~~ AMIGANUTS UNITED 169, Dale Valley Road Hollybrook Southampton SO1 6QX ENGLAND Fax 0703 785680 STERLING, by International Money Order, Bankers Draught or Cheque (as long as it is in Pounds sterling). Credit card orders not accepted. NOTE TO OWNERS OF OctaMED V1: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Registered buyers of OĉHv,ReadMe.OctaMED.infopyV]UE£# JE    <1" 1!*! *!$! $"$<   ? GE  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pt}om}om}om}om}om}omppp :C/muchmore  p- sp>%d     t$dlogo.picFORMtILBMBMHD@@CMAP`pppPPP``` 00p@`PPP@P`p 0@P`pDPPSnh@Z@@@CRNG%CRNGtCRNGvQCRNGBCRNGiCRNG5CAMG@BODYsr@@%  ?????@<?<< ?pp|?p<?9]s8@@x@q,?  x?@88?8?8 ?pqǀ?T*p~À p?@?3 ? &p#9 ?s9tdpc~8sxp9O8@@q8?  q,0|` |1> ?@8x?8?|8 ?p8?p?p??@?x;qF?<x< ?x9?;3 @@ wg@  f  .8 >??@ ? 8q? 8<8  ? p ?px?? p8 @ ? 8 8<8  ? > T0cx @  w???  ? 8   1qπ?  0@ 5X>%|@? >}@@ >8? >?  >p| > wsq wp~?'? wp8' ? ?0 8H 8|H ? .%0 9pg ? @ pg s<??~?  8 ?{ ppnp  p na 888`?? 8 t` q΀>? >f@y 8h?8|hy 8|h ?y pq8pp8?pgy pp?p ?gy #q bwP?/` ?< `/y 8 ` ??/y p xpy @p y  9??h ??;  ?h ?; ;s 0 >{ fb >0 { w@ | |  8 ? >@  8 pp >@?pp 7?w  @|  @ x| bi  @ ߿$`p?p>q%`p@{۟?8> a8?r8 0 `sC'y<>Ya110 a sC'y< w8g | 0 `\s gy<|8a090 ` s gy< q < 0 `?sϼy<a0C50 `@ sϼy< 88ysq ? 8|>?? p|A ?|>??  ~ `@ Î9?? ?R? Á` ? ;s ~? @ s8   q8 >? > p?c ?|? | q8~p??@?pq? p?8p  ?89 8?p8@?s9?꿧? ~?? ?88s 8>?~?8>@ q8 |?|  q8 >?>Z}g 88p? 8|?8|? pq8 pp??@? |q? |8p ? 9 8?pT 8@? p9?? p~?? p ? 8s 8>?~? 8>@ |8 | |  q8  >?? > #q? ?|? | g8 ? ?@? Nq?` < Wd  ? 9   x ?@? s?? p?? p ? 8  > 8>@ q,@ !t|? |  x ? > 81? ??? | qǀ"? ~À>>?@ ??@m? d? |?   ? 9  ?8 @? s9?? ~?  ?8s >Gus >@ q8 |?| q< >?>88p? 8?|?8<?pq8? p~H+ @p??@?q~? <~   ~? 9< ?x<@< s90? ~0? 0 83 xhc /x>@>F<x q8@< |?`|.|q8~x??0x ?88q?8?x0 \e>??8x0? ? pqn> p~>?@?p?? ?>? px>  ϳ p<|'  ϳ3p 0L`cx>f8>cϳ389`00! 8?:b3k@!!!g 78 x@?`00 C!! s9??&L?#~?f1 &L >  ?s&L  8s?d fqc~d  7:@g?癎>b d  q8 ?9#@`Fc}?"=s99` ?~ ox?~@99 q?D*g9wH#>1c;c9# 0> ;{1?8N~9# 8`c?0?|`0 9w'9w | 13?x;9w q8~`? 0#@ ??? w9?p` 0  p? >99 9?0@ 8`@? s<? ? ~ $d"d> p>>@<? 8c`|?| c q΀>???|%qS? 8 0?@ ???sq8 p 7?x@8@? 9??&C A?  s !  @!@x7@ `C7c  `C7 x'8`C`? `'npq` ? ?|??*_cR@??@????? ?@@??  +r>@>@| | ???@,~[??? ??@?? @@ -a ?????@?? @?. d @@  ?????@?/lG? @? @@  ??0W!???@??? @? 1^@@@  ?????@???2] @? @@  ??3oi???@??? @?? 4K@ ?????@??? 5#&@?? @ ????6?@??? @?? @7^g ?????@??>? ?@8 #x? @ ?????@9 #o ?@? @  ????: bA*?@ ?@@?B    p gp1fK$P8cy ; =1鍴Scy=?@ @ @ ??u?)@startup-sequenceZNmsg showpic :s/logo.pic med v,ReadMe.OctaMED.infophl]twdSynthsounds.infopAC9 l'xBe',\?9& $ $ $ $$$ ?03777*77?76?9&5UUUUU\@@@ @ @ @@*?0"UUUUUP????*????& $ $ $ $$$ ?03777*77?76?9&5UUUUU\@@@ @ @ @@ )nD.03UW)BM!#%'F`\7:p@Sdfjl- Synthsoundspbt}w.info@Lqd -].infokw basschord37KFW^MSH @  e1Su{wsokgc_[WSOKGC{wsokgcXTPLHD@<¾{wsokgcRNJFB>:6{wsokgcKGC?;73/ÿ{wsokgcEA=951-){wsokgc?;73/+'#ǣ{wsokgc840,($ Σ{wsokgc2.*&"ԣ{wsokgc,($ ۣ{wsokgc%! ᣟ{wsokgc 磟pHw basschord47hEWMSH @  e1Su{wsokgc_[WSOKGC{wsokgcXTPLHD@<¾{wsokgcRNJFB>:6{wsokgcKGC?;73/ÿ{wsokgcEA=951-){wsokgc?;73/+'#ǣ{wsokgc840,($ Σ{wsokgc2.*&"ԣ{wsokgc,($ ۣ{wsokgc%! ᣟ{wsokgc 磟Iw FastLaser1I;%MSH @('FCP]krl|7<'#y~{Jq-]MED3.22--XLw,FX1rLб{MSH @({* $088ؤw basschord47  wFX23|MSH@"@hxDRHhxDRHhxDRHhxDRHhxDRHhxDRHhxDRHhxDRHIw FastLaser1!"~"wxFX3Y!^MSH@"@xBD8,"hZd"jT|Lb$h DPp4,d8Ą$4@ZT|z40 ddDdzT| ┘ DtT0jtl\Hx@L<4Lw,FX1#$ $Fwl HumanVox1+#F` MSH@`$O'-FoXqOY[E*ھϚÛy~{Jq-]MED3.22--%& J&fw HumanVox2%fMSH@0$ "(+-037983+"   "wxFX3'( <(Bw HumanVox3'BMSH@ ֬X]޽(eltMDC$y~{Jq-]MED3.22--)*&@ F*w LeadBell1)KMSH @@ Qs?aCGFR{ief²@EFT}jecò=CGVkd`IJ:AHXlc\Ų7?IZmcYƲ3=J\obVDz0;K^paRȲ-9L`qaOɲ*7Mb}r`Lʲ&5Ndyt_H˲+,by-,w `NoisyPulseVib2+-MSH(% 0   +Mo;]CUP16Gg=e05N & ۢƛéP.H&<x:?DuK!_P V!":ȁ)?,1S UXIw f1P 4>),)!O!;+k$H&,>H8swS"DP@/B ᗛ d,1[LkXao [&/9:J:?9_616/MgV +6@H  / KbdXS'6 &A5HW++C gd Z&^GUD )é#e016oO}/V:F 57)5'ߋ踟&Ew3 4'0R^G禄ԬéYG16o_5PGv;[0 J׸7NQU0;CkW<8LϖڄՒ쯲# 16omeXUNKF02 5ޱіջ&Q$P.Q;cBpW@d,1>?DuK!_P V!":ȁ)?,1S UXIw f1P 4>),)!O!;./ ~/w pulsevib1<.N\JMSH 0@ ` ,NprrrrrrrreeeeeeeeXXXXXXXXLLLLLLLL????????22222222̀&&&&&&&&ڀ瀀 􀀀+01 21w@ pulsevib2>02*~MSH(% 0   +Mo;]0*'34 654kw pulsevib335Q*&MSH @P  W[_cg@@xyyyzzz{}~~~~~qqqqqqqqooonnnnmxxxwwwvvssssrrrrcccccccdeefffggg@qrsstuuv{||}}}~~cccccccb_^^]]\\[qqpoonmmggffeeeeGGGGGGGHKKLMMNNO@jklmnopq36k7'yzz{||}}UUUUTTTTONMLKJJIjihgfedc[ZZYXXWW**+++++,11234567@cdfgijkmwxyz{{|}GGGGFFFE?=<;:987cb`_^\[ZONMLKKJJ@\^_acefhuvwxyz{| 88888777.-,*)'&$\ZYWUTRPCBA@>>=<􂃄@UWY[]_acstuwxyz{&'(()))*****)))(USQOMKIG754311//؃3f@NPRUXZ\_()+.0246qrtuwxy{BCDDEEEF ¿NKIGDB@=+)(&$$"!㹹֞@GILORUWZ@ADGIKNPoprtvwxz^_``aaab GDA?<974 񝝞@?BEHLORUXZ]`cehjlnprtvwyz{|}~~~?<9630-*'$! )*****)))(USQOMKIG754311//؃78? 98w SawSound179̬MSH@P o;])Km !)19AIQYaiqy !)19AIQYaiq !)19AIQYai !)19AIQYa !)19AIQY !)19AIQ !)19AI !)19A !)19 !)1 !)7+& !   !)19AIQYaiq !)19AIQYai !)19AIQYa !)19AIQY !)19AIQ !)19AI !)19A !)19 !)1 !):;? ;2w4 SawSound2Q:2UMMSH@ vfVF6&ƶRuy~{Jq-]MED3.22--<=%9 W=Bw SineBell1<Bg`MSH@ 1GZju}}ujZG1Ϲ=-/ SineBell1>?%8 M?Fw SineBell2>FܛrMSH@ 0$1GZju}}ujZG1Ϲ?- SineBell2@AfAw SinePulseI@>MSH@@$@NPTTYZ\_aabceeddZVRNJFB>941.,OPPPRSSRSSRQQON;62.)&" 21w@ pulsevib2>BC>>C:w@Siren1B:"BMSH 0(o_O?/Ͽ?Fw SineBell2DE0EIw SlowLaser1DI[%MSH @'FCP]krl|7<'#y~{Jq-]MED3.22--FGB(7HGw@smoothpulsevib2FH3MSH(% 0   +Mo;]?LXcltz~~ztlcXL?LXcltz~~ztlcXL>?LXcltz~~ztlcXL>1?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>F+%1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1%  ?LXcltz~~ztlcXL>1%  ?LXcltz~~ztlcXL>1%  ?LXcltz~~ztlcXL>1%  %?LXcltz~~ztlcXL>1?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>IJe=JwlStrange1I+VMSH @   0p8@NPTTYZ\_aabceeddZVRNJFB>941.,)&#MOPPPRSSRSSRQQON;62.)&" J- Strange1KLd=PL+wStrange2K+wMSH0'@wog_WOG?7/'ǿ||||||||||||||||wog_WOG?7/'ǿwog_WOG?7/'ǿ@|𴰰-UStrange2MNzFPONwSynLead1MOo^MSH@ @t:|BJR ?:50,'" lf`ZTNGA:3,%wnf^ULC:1' lbXMC8-"  ?:61.)%  mga[UOIC5.'  {tkc\SJA1( f]SI@6," ?;730,($ nhb]WQKE/)" wph`YPH?' _WNE=4+" ?;852/+( oid^YSMG*# sld]VNF= XQIA:2)! ?<9642/, pke`ZUOI$ ohaZSKC; QKD=6/(! ?<:86420qlga\WQK ke]WPHA9MP|d KE?93-' ?=;:9754smhc^XSM gaZSMF?7D?:50+% ?=<;;:98tojd_ZUO c]VPJC<5=951-($ ?>>===<81Ľ0-+(&$! ??@@ABCCwsnid`[VWRLGA;5/¼)'&$#!  ?@ABDEFGytokfa]XSNIC>93-"!!  ?@BDFHIKzuqlhc_ZOJE@;61+¼ Mb'r?ACEHJMO{wrniea\KGB=83.) ?ADGJMPS|xtokgc^GC>:51,' ?BEILPSW}yuqmie`C?;72.*%  ?CGKOSW[{wsokgc?;73/+'# 81Ľ0-+(&$! ??@@ABCCwsnid`[VWRLGA;5/¼)'&$#!  ?@ABDEFGytokfa]XSNIC>93-"!!  ?@BDFHIKzuqlhc_ZOJE@;61+¼ QR2Rw SyntHarp1Q&MSHT'91ZoR5¦@|dD, R- SyntHarp1ST STw SynthBass1SKMSH@0(j   $$(,,,0048<=75,--"!(",$ ˼   !*-0<<=::565,+++)*% %ǿ  #(-158:=>???>=:851-(#  :/"߭ ?7* NF=)# F;/* ۰2,"  KD=,( !@5*׳%!  !!"GB=0,#90& Ӷ  $%'C@\]hnt_^]!wSynthBell1-lowb\^MSH  @ M ը +YVLD=4Ϧ6ZWLD=2@۳,VSJD=5"۶ 4TQG?9/ˮ ,JG>70# Ū 5LKB;3$ @-RPHC=6%!2MJA:4+ж  :7/)"ŭ *?>71*@ .NMFB=7)%# /FC;5/'վ\_i*'  Ű 21,'" @/KJDA=8,)( !-@=50*# ų%%!@ ! !!"1GFB@=90.,# # *960*& Ķ  @ $$%%'2CC@?=:321*#$%%$ !&" (2/*%! Ĺ @  '')*+3@@>>=;7651,--.-$""!%(%"\Q \4 %,)$  ļ@  !%*+-.04<=<==<:::8566650,++++*+*)**'%# #%" Ŀ@  #&(*-/135689:<==>???????>==<:986531/-*(&#  1*#$%%$ !&" (2/*%! Ĺ @  '')*+3@@>>=;7651,--.-$""!%(%"`aѓaw Synthchord1`UMSH@@4~\$}}}}}}}}}}}}}}}}}}}$$$$||||||||||||||||||||||||--bcќcwd Synthchord2b`MSH@ @½K@#$/@ 5?0$ ?0 ýOvHK:1$?H*" '>@#c- Synthchord2de ew SynthOrgan1dTMSH@P$@$16316C,9>;9>K4AFCAFS';9>K4AFCAFS'2Ļ θi-1 SynthOrgan3jkGkw SynthOrgan4jZUMSH@@$@+@UKA6+ #/:E1"5GYL?1#)Ź)=QF;/#'1*=1% κ ɿw basschord47hlm❙mw4 SynthOrgan5l4 MSH @@ Qs?a! ,uhdhUC?@'؜̰ȼ .rh~fiW|D?=$ؠɮƽ!0nh|~ikZyE>:!ؤƬľ"2jg{~lm]uF=6بª#4fgy}oo`rG=3ج $6cfx}rpbnI<0ر %8_fv|urekJ;,ص&:[eu|xthgK;)ع'Sdqz~~xn`N9" ­noգobw SynthPiano1nbZQMSH@ )&3Ȱ/5M@+0 =I0 ٬  %#kw SynthOrgan4pq|pBBA<6+)$  #-6=BEED?8-*% )2;BFIHFA:.+&!$.8@FJLLIC<0,'!*4=DJNPOLF>1-'!&09BIORSROH@3.(",6?GNSVWUQJB40)"¿2|-s} [Text]Read/Write ErrorNeed arp for FileReqConsole problemMuchMore V3.0 1991 AMOKNIL: OK XFile: xxx % (xxxxxx of xxxxxx Bytes) xxxxxx Lines  MuchMore V3.0 Commands: Space, LMB: Start / Stop scrolling. Quit at end of file. BackSpace, RMB: Start /vynTN Stop scrolling backwards. Up/ Down: Move one line up or down. Shift + Up/ Dn: Start / Stop quick scrolling up or down. Alt+ Up/ Dn, PgUp/ Dn: Move one page up or down. T, Home / B, End: Goto top / bottom of text. F, N, P: Find string, Next, Previous occurance Shift + Fn: Set textmarker #n to current position Fn: Goto marker #n or set marker #n if it wasn't set yevz^5t G: Goto line #n NK 0: Display Filelength etc. Shift + Alt + O: Create print out of the text W: Write block between Marker #1 and #2 to file or prt L: Load new text (arp necessary) HELP, H: Show Commands. ESC, Q, X, NK 5: Quit. 1991 Fridtjof Siebert, Nobileweg 67, D-7000 Stuttgart 40 Please refer to MuchMore.ReadMe for a detailed copyright notice v{-g This is another product of the Amiga MODULA & OBERON Klub Stuttgart - AMOKTYPE "" TO PRT:asl.libraryarp.libraryPRT:?diskfont.libraryTopaz.fontconsole.deviceShow.MMFile emptyrootclassimageclassframeiclasssysiclassfillrectclassgadgetclasspropgclassstrgclassbuttongclassfrbuttonclassgroupgclassicclassmodelclassintuition.libraryutility.librarydefault.monitorntsc.monitorpal.monitorvga.monitorvga70.monitorgraphics.librarydos.libraryv|*E H <4"<&,xN:Jf,*nJfA\NA\NR.'"@NLpNu*@*KL+|f+Oa!l.mPa+d&C ,xN. NuNq~RG Gn<J3`f0NuNqY&o a?@BW on2(o>J4pg&>/mpl(o >/&o<`pRoRW` on (o >/B4pX _PNжf&|J-gB-||;| ;|LHLHp+|I+L+K;|;|t;|v+||H0HmHmp <r$<@vA&_"_,mNL `NH0,m(NL $@H0" $ H`aLH&,m(NLv}G+ ~ H0" I$ vNL B mNNuNqGgRG<m Fnm`4H0HoHxN+L fH0aL $+J;G(m<-GI` NuJg(m&T/ HmN+&_+K`;|NuNq/ m,mN./N"@,m N..Jg/(mA,Nn.Nu(m"l.-tއ r,m N(m"l .-tއ rNBm(mBl NuNq.-`df0"- I`$ &<,m(N+@dJdl GRaB`JdfB-`".-`I`txJ-f|R`Rm _XNOJdfp`Bo BoBm-g$-g >/ p ` >/ p Ro `-v~R+g>/ p Ro -g>/ p Ro -g>/ <-FmRFp Ro `& mfJmg>/ <-FmRFp Ro HWa- f?|HWa -0e\ -9bTRo>/GIBtp>/GI/om o l>/GI<4pJFfB-;|BmP"` Ff ` Ff;|P"` Ff`v Ff`h Ff P"`V FvV7m& F%n >/GI<4pFF;FP"`* F(m$ F/n>/GI<4pF(F;FP"Ro`/#-g o l-g -g >/ p `*>/ p `-g >/ p ` >/ p Ro -g /#f6 o l.>/ p Ro `/#g o l>/ p Ro J/"g o lv-g>/ <-FmRFp `>/ <-FmRFp Ro `<-  e b>/ p Ro Ro` e& b J-g- >/ p Ro Ro`z fJoonSo So`d  f2>/  p Ro Ro o gD>/mpg:>/ GJGv ~f f`, f>/  p Ro Ro`  g Jg  f`>/mpl o m\>/ a&.(W9m9o Jo oSo (W>/ <` p ` O$NuNqOJ-g$>-j2(oI L"m$mN(`?|(m>/G/ 4 p dtp J/g0/ f~`r f `b f `R f `B f`6 f`* e$ bS/BG/GBG/GRo`V(o>/Ip /L ?GRo(o>/ 4 p d"mr,mv s? N"m/H0N"m/H0N"m>-l0>-jmn2N"m(o L>/oH N>/oo`O _\NNqO>-mh?//$a>-H "-xN#-jk -a"(o L&o"K -x,xN(o L&o"K -xN`d?mj(mRl J-\g >/g~a(m>, G>(o&o(XX(o&o (XX SWJWfSoJofRm>-mhf Bm(mBl O _\NNqO(mHG~B&Q6&oaB;@>-mpm <-pSF;F>-RGB7v a@p ?m >-<(o`p J-g 7p c >-7 p SmJmlHW/aRO _\NNq(mPJfJ gP -,xNQ(mPJVNu/a.Jg>(mP+TPR|(mP<,Hݭ<-hH*-|m(mL+TL//-Pa.NuNqO(mLJgn&lJgb(mL+lL(mP>,HǟS|+lPJmf(m>-hj9G >-hSG;G`Sm?-(mL/,av>-H "-xN /@(m.,ޯ/G./ޭt/G ., ޯ/G./ޭt/GJ/gB&m>-jk -a(o L&o "K -x,xN(o L&o"K -xN`x.-x߯߯߯ ߯?mj(mv h^u+Sl J-\g >/g~a*(m>, G>Y Y(o &o(YY$o"o$SWJWfSoJofO _TNNqOJmf(m>-hj9G ;mhSm(mLJg?-/,a(` ?-/-Ha>-RGH "-xNL/@(m.,ޯ/G./ޭt/G ., ޯ/G./ޭt/G?mj(mSl J-\g >/g~a((m>, G>Y Y(o &o(YY$o"o$SWJWfSoJofO&Nu]>/o&oaİol on (o>/B4pSo(o>/ / r N|0҆p / r N/@ ogJ f>/ooSo(o>/ p`\v + _O NBB|gR|>+H߭&k`NuHabL~&mPmhl(mPJg (mP+TPRG`mhlJg&kRG`+KPHaLHHyPalLH/-PPa*L~mhl+KLH~aLRG`QNuJ gP -,xNQ _XNY(o)mP&L$kI~B(Q8G+KP>/o TG GlBW|>ol"(oI 4pd(oItpRW`(o>/IBF/zFp>o >o l(oRGI&o$k<` pRW`(o>RGIp(o>TGI&o$k<` pRW>SGGJ3pf(oJg &lI'LvhӋ(oJg &lI&X _PN(oJg &l'l(oJg&l& _XN(oJ, f,H,mNL(mLJf+LP` (mL+lPHaL(oJ, gH// a~L _XN(oBl &mP>+mpl9k` (o9mp(o&mP>, k lBl 9G(mP&o>+4p am zn $K:* 3PHfDRk Rk>* J3pHfah+mP(o&L>,k??,//a(oP p`(oRl `jp _XNLH`|`Hm`Hm\aHm`HyaB-Hm`HyaHm`?<$?< -rdNt"-N/aHm`?<+?</-vM'[aHm`?<5?</-aHm`?<C?<.-|S/a~(o9|O (o>, G` pRl l l>-pTG<, Gm(o>, G`B3pHm`B'aP _XN(m&L>+l L,mN;|d>-hjG]G(ml ;G>-G;G;| |+|@+| G+K+m;|*;|;|>-YG;G;|;|"J/g";|$I@+L6+o @>/ SG;GJ(oAN4)@D(oJDgpHm(o"lD _,mN2(o&lD$kV"kV)|"m iV( ,xN*g(o lD,mN(m&L>+G9G _O NaHyPavO-hGG9G (oJl oHyPa(oSl `(m lV,xN(m lVN+@(m,g lm "mN`"m,xN+mLPa _XN//ad+mXP(o9mh (o l o&mPJg(mP+lP(oSl `avlP _XN(olBJ f &mPJf(oJ,gp`H(oP`(oQ(oJ,gJ-fJ,g//abJ-W` (oPPp _XN(olBJ,f J-W`P(oQ _XNO(x&l*kX -,xNPQB/B/J-gQaJ-g/(GJGVB>/(G0JGVC/v;)WJ-f J/CfPB/%g*/(gHWaJg`/(gHWaN`/$g o&l>/& G@fHWaJgx`H GAf HWa`d GMg Gg GfhJ/Bg&J/gJ-g J-W`PPP`&J/Cf o&f >-hSG?G `?| J/BWa6So Jo fQ` GLg G>g G?fhJ/Bg&J/fJ-g J-W`PPQ`J/Cf o?&f >-hSG?G `?| J/BWaQSo Jo f`p GDg GCf~aQ`V G=f+mHPa`B Gf HWa`2 GPmd GYn^>/&GP?G J/Bf8>/ GIJpg(v h>/ GI+tpP(mPJg+lPa`>/ GI)Lp` G_f HWa` GEg G.f J/Cf`t o@&l>/&Itp / tf+mHPa.`p bf HWaL`` fg ng pf$ /f f`Ho?<PB'HoaBBo>/<I4` am zn pH 7pHc7 pH` >/J7pHgRo`aQ J/Hg?mh Jg(m+TJo o JPg.-Pg(mP+lPSo `.-PfJf+mLP /p gJPgHHWaJf>a|(mP+TP`(mPJg+lP(mP+lPJPgHWa`Jg`BPHWa`* wfJgve&JgJ-f J-fBB(m.(WJg.(W>,H߭`(m.Jg(W>,H߭.`.?mh o oJgSo (W>,H߭.`.-JoHm?<B'HoaVHWaP(mC -,xNa`J ofhJ/Bga~aP(mC -,xN -,xN>-gJ-f` gfFHo?< PHoah.-\H/G+mHPJoatJg(mP+TPS`a `L hf HWax`< qg vn[ixf.P(mC -,xNp,xN`HG\aL;@Jmo&<-I\ 4:`g<-I\ 4/`gSm`Jmf;|Bm<-mnI:E\P`Rm`<-IB4`Bm<-I:-E\P`RmRm<-SFI\J4`fH,mNLJhfHI"Lp$,xNL+@hJhgHp x h h: I!L!||!F !||!F!|!|,!| !|$!|(I!L,!| 0I!L4B8,mhNL&@fHaLH K,mhNLJVJg (kE|?$Q(kEv~|?$QH KNLJfx`FJdfHI"Lp",xNL+@dJdg8+|I+LI+LBHA,mdNLJf`HGdaLIE\|?$QHG\a|L;@Jmo,<-SFI\4` /g :g<-I\/`RmBm<-I\:-EP`I\J4`g Fg RmRm`<-I\B4`JgH m,mNLJg$H m,mN>LJg NuB mNNuNqRm mf N NXN;|+mLH;|(m+lP;|DB-G, K <,mN|J-V\p,xNv H;@Jml B mN>-|+FHmHHxN J-gZ+m(m~f.&l$+k &mE\~?$Q&l$"+,m(N`(m&l$",m(Na`~ma`+mBm(m  fR`(m  g(m "f8R(m "fR`L  f`D>-I\&mpRmR`(m  g  g>-I\&mpRmR`>-I\B4pI\G|f JgQJf G$aZ --\f8B-\-] sfh;|BmD>-I\ 49pb:I\ 40pe. mdDl&>-D <-I\BE4`GE0;EDRm` mdDo;|dD` fvrfD;|Rm>-I<TFG\`pTGI\J4pg m'f>-IB4p`x lfpJ-\W\`dI\" $<,m(N+@ J fa`J-\g;|(m >,G;G`;|(m >,G;G(m >,GG;G;|;|A,mN:+@JfSmJmfa`(mIT+LJ-glI+L;mDA,m N+@Jf2JlfI"Lp!,xN+@lJlgA,mlN+@Jg"m m,m N(m&l4;kl&l4;kj m2loD m2jo<+|;|A,m N+@Jf B mN"m mN`(m&l4;kn&m>+vxF H<-l:ƽEj *HEJEgSG;Gp>+GH:-j8ŻDj (HDJDgSG;Gh EH+Ex>-hH "-xN+@t+l mf $m"J%i (m+lPa.(m9| &m>-jh7G~a,mNzQ mjf mlfHmHx0N*JfaB-Bm| "mp,m N"mpN m l`Bm m0l>-I`pRmR-` -f|"mp>-nm2,m N"mI` Lp0NPm`(m l"m>-pN(P+| +m;|*;| ;m(m>,G ;G+| A,mN4+@JfaaI LpvNC8r,xNDJg Gza+mLh|pBm m@l(;mrAl>-ICpr ,mhNRm`I+LI+L+m|+|(m, RG+M,xN|CEޗNP(m&lVE'JNv;|BmB-~+Gd~+G`~+G|+mHX+mHP+mHLBBBm>-GIBpRm m fI\" t,m(N+@Jf Ga"-Hm$,m(NJf Gaת+m"-,m(NBJf GaׄPC -,xNa+@TJTf"- ,m(NB `(mT)mX&mX&+LXJ-gC -,xNJ g J-v[5fJ-gJ-gC -,xN -,xNJ-g^I" $<,m(N+@I" $<N+@I`" $-&-N""-NB"-NBQJ-gI\" $<,m(N+@Jf,mN`Hm/-N^JfaB"-$-v,m(N"-(m$ &-Nְg,mN"-,m(NB`d"-NBI" $<N+@Jf ,mN`2"-(m$ &-Nаg ,mN"-,m(NBHmNQJ-fRJ-gJ g"- ,m(NB a(mHBQaI\" $<,m(N+@ J g`vDNuSmfJ-g C,xNJg m,mNJg m,mNJg "m,m NJ g "- ,m(NJg "-,m(NJg "-,m(NJg "-,m(NJg "-,m(NJmm>-H ,xNJdg "md,xNbJhg "mh,xNbJlg "ml,xNbNNNNRm mf6N^NNNNI"Lp!,xN+@Jf B mNNuSmfJg "m,xNbN NNN6Rm mfN~NuSmfNH0J[jDJjFDH@HAJ@g JAg<`@H@4HAH@J@fЁkJgDL NuH<(jD*jD vgdb64B@H@"H@20BAHA`"&"ptփRBe` Ѐ⋶bRSBjJjDj DJgS҅L'qPPP1P`6`:PPBPPBPPBPPBPPBPPBPP4P1P`PPPPPPPPђ`P:PPPBPPPBPPPBPPPBPPPBPPPBPPP4P`D:PPBPPBPPBPPBPPBPPBPP4P1P`P:PPPBPPPBPPPBPPPBPPPBPPPBPPP1P`P:PPPBPPPBPPPBPPPBPPPBPPv!jIPBPPP4P`JPP:PPPPBPPPPBPPPPBPPPPBPPPPBPPPPBPPPPRR`j*_Nu?0<2A:<>EF GE dP ` p dP ` p dP ` p dP ` pP `pP `p dP ` p dP ` pR@2 A0g A`g Af 2AA0 @m$I0<v"$F$QONu900N0 ,!##%`%'((z)4)T)z**6j  $0<HT`lx$: NtXP ` pP `pP `p dP ` p dP ` pR@2 A0g A`g Af 2AA0 @m$I0<.##showpicrx :*&H~$H$I,xG`r <8`&Q)O)NBp"<0NCpN)@,l4 oL "o(L|,NL@|NupaNuNuH0./&o,/ /N8XO$@ fp`6*gHxB/NO // /*NXO *Jxgp` L NupaNUH!2&m lr g r gr fR`g",RA$Hr"frR K$+Hr"gPr*f>Rp@Eg@ g` m+H` m +H` m+HR` m+H`R mB+H`N$gr ggmr g r gR`Jf`B`& ,f l`A)HJf|C$M`,,,,<"l i$Hx(/(Hl`NO A`"$<,lB/N63$3&Hy NO )@0Jgx/Nr,.Hl/N09H29HHx//t// l0/(2//HlN l0.VNO0 l0/(VN|XO)@g /NJXO` , g/Nu^wXO ,0g/NXO ,,g/NXO/,4N.0NxLN]NuNDNxNN(NXN + o|`.Jo*// /+NO RgSg`|` |`߫ ߫ L NuNUdeN]NuNUؿdeH.-&m Hm/aPO,+KJfTHmaXO, CAT g0 -g g`, kHmNXO,` SHmNXO,` k HmNXO,HmaLXOJo| LN]NuNUԿdeH0&m$m |Hm/ aPO.Jg ` CAT f|`U+JHma^XO. CAT gN -g(g0fDJFg jHmNXO.`0~`, jHmNXO.` RHmNXO.` j HmNXO. PROPg|Jg~HmajXOJo~pfp` L N]Nude / &oB/ aPO&_NudeH&o / aXO. PROPf~'G LNudeH0&o$k/ aXXO. CAT g6 -ggf*~`& j/ NXO.` R/ NXO.` j / NXO. '@L NudeHH&o / aXO. CAT g -ggfp'@. LNuNxNLN0pa  *NUdeH0 m&P m $P:-8-;|;|JDoPSEJEkNHmRGGJEk@GJDk: JRSGn`0-Gg D@.RGSEJEkGJDk JRSGn`Bm m m 0-L N]NuNxpaXintuition.librarygraphics.library(Rªh L h rXD4hH ,y|A~DGJMRSUf}f Pr? $) $ $) $"'""'" %  $) $"'"")'?0 $ )@0)   $0 $ )@0)  $04 " '@0'   "0 " '@0' ' @@"0   %@0%   0 $ )@0)   $0 " '@0'   "0 u^" )@0'  @'@?0 'Q )S$  )0@ ) $0 $  )0@,P ) $) 0 +P"  '0@' "0 " +P '0@,P' .P"@0 0Ptd[   %0@% % 0 $ 0P )0@.P % ,P$% 0 ,P"  '0@+P' "0 ,P"  $0@.P' "@@? 0 0P$'  ,0@ $ ' 0 $'@%I  ,0@ $ ,Q' .S0 "  '0@ "0 " 1P %0@0P .P"@0 ,P $  )0@  $0 $  )0@ )P+P0 ,P     %0@ 0    "0@ @"@?l0 (P   #  0@ ( #  l0 /P   ## !# "0@ $( %## ' l(0 *! +%! 1P -! .0@/P 0* 1% 1P 3!/Pl40 6# 7'# | 9 R7# :0@| <-| =*# ,P ?'-Pl@0 -Q /S#  0@(# `0 ## # 0@(## `0 !%! !! 0@(P(%! !`0 (P" % *P`0@#'# *?`0 (P #   v80@(# `0 /P ## # 0@(## `0 !%! 1P! 0@/P*% 1P!/P`0 #'# |# 0@|-|*# ,P'-P`0 -Q /S#  0@(# `0 ## # 0@ u(## `0 !%! !! 0@(P(%! !`0 (P" % *P`0@#'# *?p0 ,P  % 0@%  0   % 0@*P%  ,P%P`0 !! %! 0@ !%!! 0 !! %! 0@'P%! (P %Pp0 ! % 0@%! 0 ! *P% 0@(P%! 'P`0 )P! $ 0@$! 0 ! $ 0@$j7! @?`0 .P"" &" 0@&"" 0 "" .P&" 0@0P&"" 2P" p0 0P" & 0@2P&" .P0 " & 0@.P&" p0 +Q-S ! 0@)P!| &P0  )P! 0@! +P`0 ! $ 0@$! -P+S0 )P! $ 0@$!  ?p0   @ !   8@&  ! 0    (0!    ! @&    !~X "`0   @ "  8@"  " 0    (0"    " @"   " " " p0    @ $  8@$  $ 0    (0$    $ @$     $  p0   @   8@    0  ]  (0   0    @  @   @ ?2Pp0pp p! @p p@ 8p! p& 0p& p!0 (p p p" p!@ p p& p 2P0` ! @ @ 8! " 0" !0 (  "" !@  "  lD0Pp0`p p @p p@ 8p p 0p p0 (p p p! p@ p p p 2Pp0pp p! @p p@ 8p! p 0p p!0 (` +P /@" 20!@ 6 @ 9 =@ @?&P0   @& & & 0ŷ$   @& & & 0 `$ $ @ $ $ 0 $ $ @ $ 0 0 `" " @ " " 0 " " @ "  0 piw& & @ & & 0 & & @11@,@,?p0 1P"" %" 0@)% "0 "" 5P%" 0@3P)%" 1P"`0 0P" % 1P0@*% 3P"0 d e5P" % 0@6P*% 8P" `0 :P $ ' 8P0@,' 6P$0 5P$ ' 0@3P,' 1P$`0 3Q5S " 3P0@'" 1P`0 0P! $ 0@.P)$ -P!@?p0 .R,S{6: 7 ,P: 7 .R0@,S,P: 7" .P71P0 5P3P: 7 5P: 7" 8P0@b: 7" 7`0 .R,S1 G ,P1 G.R0@,S,P1 G% .PG1S0 :S 8P1 G5S1 G 1S0@b1 G% G`0 .P3 G ,P3 G .P0@,P3 G' .PG,P0 .P3 G ,uP3 G .S0@3 GG p0 .P: 7 : 7 0@: 7" 70  : 7: 7 0@: 7" 7@?p0 .R,S: 7 ,P: 7 .R0@,S,P: 7" .P71P0 5P3P: 7 5P: 7" 8P0@b: 7" 7`0 .R,S1 G ,P1 N G.R0@,S,P1 G% .PG1S0 :S 8P1 G5S1 G 1S0@b1 G% G`0 .P3 G ,P3 G .P0@,P3 G' .PG,P0 .P3 G ,P3 G .S0@3 GG `0 1P6 G 0P6 G 1P0@0P6 G 1PG3P `0 5P 8 G3P8 G .70@1P@3P8 G@G@?`0 )P1 G% )PG% `0@'P'P8 G$ Gp0 %P: 7" 7" 0@" %P: 7'P7)P`0 *P6 G' *PG' 0@*P' 6 G)PG`0 )P8 G *PG 'P0@ )P8 GG*P`0 ,T1 G% G% `0̸@-T5 G G.Pp0 : 7" 7" 0@" .P8 G0PG1P`0 1P6 G G 0@ 6 G6 G0 8 G 1PG 0@3P 8 G6P8 G ?`0 -P5 G) -PG) `0@+P+P0 G( Gp0 )P2 7& 7& 0@nn%& )P2 7+P7-P`0 .P. G+ .PG+ 0@.P+ . G-PG`0 -P0 G$ .PG$ +P0@$ -P0 GG.P`0 0T5 G) G) `0@5P4P9 G 0RG5Pp0 2 7& 7& 0@& 2P0 G4PG5P`0 9P. G" G" 0@" Ά+{. G. G0 0 G$ 7TG$ 0@5P$ 7S0 G5S0 G$ 7P?`0 5P: G G 5P0@`5 G 0PG 0 5 G G 0@5 G G `0 2P: G" G" 2P0@: G" 0PG" `0 0 G$ G$ 0@{0 G$ G$ `0 1PG% %G% )0@,1PG% 0G% `0 .3PG% ,G% +0@)3PG% G% p0 0P7$ '7$ +0@.0P7$ 37$ p0 0.5P7 7 ,0@5P7 ,7 +?`0 )1PG% 'G% )0@'1PG% )G'`0 )3PG% 'G% )0@'3PG% )G'p0 )0P7$ '7$ )0@'0P7$ )7+p0 ,+5P7) )7) )0@+5P7' 7@,`0 ,1PG% )G% ,0@)1PG% ,G)0 .,1PG% +G% +0@+1PG% )CJG'`0 +3PG$ +G$ 0@3PG$ Gp0 0P7$ 7$ 0@$ 0P7@7@`0 )P1PG% G% 0@1PG% Gp0 )P5P7 )P7 0@+P,S5P7 7`0 ,Q.S3PG G 0@'P3PG G ґX0 5P7 7 0@3PG G ?`0 8 7 1PG 3 G 8 0@7 3 1PG 8 G7 0 3 8 1PG 7 G 3 0@8 7 1PG 3 G 8 `0 7 3 3PG 8 G 7 0@3 8 3PG 7 G3 0 8 7 3PG 3 G 8 0@7  3 3PG@7!G@7 p!Ӕ>f0 7 3PG$ G$ 0@7 3PG$ G0 7!8#3PG$ 7 G$ 0@3PG$ 5 G3#p0 5 0PX X 0@0PX X0 0PX X@0@ 0PX@5 X3 ?`0 1 % % @% 0 "ܡ% % @%  % p0 " " @" "0 " "@" @@" `0   @ 0   @   p0 .Q#Hs0S$ $ 0P@$ 0Ts`0 .S$ +P@$ )P@(S$ $P@$ "SP?(P0 p  @   0  @   0 p  @   0 $90  @  00 `  @   0   @   0 `  @   0   @ @ @ ?-P0 p%׮c  @   0   @  ,P0 p% (P% @ %P% % 0 % % @ %P% (P0*P0 `& & @ & & 0 *P& &FqC& (P@ !P& %P0 `! ! @ ! ! 0 ! ! @ %P@! @! ?&P0 p# # @ # 0 (P# # &P@ #P  &P0 p %P '9=@ P 0   @  0!P0 `& & @ & 0 -T& ,P& *P@ %P& %Q0 `(S( ( @ ( 0 @ @ (}( @( @( ?-P 0 ` -P  ,P  *P @& (P   -P 0`-P  -P  @( (P *P  (P -P 0 p -P  ,P  *P @% (P   -P 0p-P  -P  @ (P *P  (P  -P 0 ` -P 2 G ,P G *P @& )Wd ,P 2 G -P G 0`-P  4 G*P G ,P @( -P 4 G G /P 0 4 G G @ 4 G G 0P 0 ` 8 G G @ 8 G G ?-P 0 ` -P  ,P  *P @& (P   -P 0`-P  -P  @( (P *c5 *P  (P -P 0 p -P  ,P  *P @% (P   -P 0p-P  -P (P  *P @ (P  (P 0 -P 0 ` ,P   *P @& (P ,P  -P  ` 0-P  ,P   *P @( (P ,P  -P  0 `-P ,P % % *P @ +ӝ?,P % 'Q% )S0 % % @ @% K% Strkelsesirap, 1991 Teijo Kinnunen... g SyntHarp1SynthBass1BassDrum.u20SnareDrum.u20smoothpulsevib2MajorChorusMinorChorus,ގkm&noisehihatP P)P *P@ TT1ZoR5¦-6!@0`   $$(,,,0048<]NcfIVmXXdhWtDyeDylDyTSdHtDjYdFlalFpEgievEoLbHnEcaKwEuSR`nZk[eS[`tExQfVnExErjZgPI__`DP^-I)84(1$ - ʿХͥ¸۹Ĭ˳ûѯӽë̮М;ݹ/ qy!!E5'L+GB=/E*'A-;#'G2&@EA82=>.5 %C& %2() &(.(!(& 1 ѱи¥ ,5",&CD%>)I?H43A!D1=@1HU?>ߢܔSq=p6{ScAP]6g8!h@ Jo.-0_G/": oE"(12R7-GΚ۴ύ܌̓ضʑܐǓ߫A5?8'7=UDM.] q eU5O! ?@6*.Xq/%W;3(+N `I;Md)`,L33R=5H2O ⪶䭴଻ߢ̶ƚ̟ݭ:B?^8;WR(8Y:X,:>-%OA5VCk%%(iBI'O7B 6>98^B̨方ӧرƻګ0ھ ݚ:-4 4 :B-H>[B)Nf=`FgU&<CZ3@H@O47Ae318*B$63ҷתǧǦҵö˿ùβ圽'"$NC&J%^c&=^0H+-PT&M?"PW(.N&S3@aH (W0a!&N沰α ٹۨӵǵլɤջ.@&#B(-=;#+79%-/7T):9)W3\ N?2:(B8'H'9!5/!4=5.#(20ɰۭѥи²ۧۥϱK H + 6K G==9=D7=F>HQW'FWW'50D(49dt'+/%.K .7=2Ǹ ֪ * 2*D*>?BC0 9;C 67/7%< 29108;!"0C"L5)'߾-/:&EG1!E+$91E$MI857B1@17.22%80)  Ѽ$'1 &%*"B < <05'C-BE*:5&)/  & & #  0-:ZUt\58A? &,A7@@0 ?3>;@#4- =9"  8-#کݡ &ŷ!b/5+"MV*%n(.n qg;kdg :W?:ALP"=^Z97l@/] ȀM$ϸ$ޫĦѐ῕* m[ EB U 3( ;?cXTN/P-3?. :9 `:@AL"A =( = %԰  ڹ % $13,&J+L. )n^G%=!]*6'F!Id6((Y )-K!ѯެ-ͫռ;*&#ۺ׹5$3 22!>;?-)> 33!:4E @I O<f&:  &* Q1׶ % B++ =U19., 8;76%V#>2E# N  : % &22/ 4&$1#' $""/H 3<*' ;0ٱ d+!    <_^o(" 4  *< D A8+2)';)  ,-8"&/! ]QM> H6: %"+$&* -);664/>E,,?%D,A#""(  3  $% % 4&$6+ !    %  =>(73        '    '!    $  5          !(        "1#  ><           -& &"      & .(                  ?Z                                   @      $                   "        "   A);w                    $                B                      0CJf{0  Vx"Df2T?LXcltz~~ztlcXL?LXcltz~~ztlcXL>?LXcltz~~ztlcXL>1?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1% ?LXcltz~~ztDc|lcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1%  ?LXcltz~~ztlcXL>1%  ?LXcltz~~ztlcXL>1%  ?LXcltz~~ztlcXL>1%  %#1             E?"#"       !   $%"  "$# ##  !   %*-+$%'$    %('   #&%"         ſ &*-1452-( Fu *143-!     &,/.*&        $+11,& &2:;7.#  #)-/*+5984.#  *01-" "*/22.%  G. '1650( ",351(")042* !"#%$"   $! $-353/(        +9CGD9)         '.243, "*HL/-'    *:CE>3& &5?EC4´%&%%$" "#"   %& "(% !6EJF8# %9GLI=,̼ !(+,++++*'! ż"'$ )-+$     %'% ):CFD9& ³)/  ÿ  $-1/*%    (,(%bB     Iz#''# &+*&   !#    )142+$ #%$  #*,'  ""  #())'!ɾ '0562)     %.5:>?<6+ü "&+1696.# /LRMB3#»&.1-#  #'*)&#!!#$#$()% &)+-14421.()8>;1!'2:>=6*;)07=AB@=93+#!%#  !2AIIB5 Ŷ  '0553/(»)3996.#   ¼K 1BPXZXQF8,! ľ    !((     %*+)%!Ŀ     '5COVUND7(       "$#     %+./00/)# LOG5x  %'(&#!"%+05:=;3)ƻ"%()'$ !#   "$%$"  !#   "!  "'*+*'!  #"  !$&)-2685,   )/2452+"   "),-(    $)*%  M]cN )12-&&0782'  $-220+%    ")-,*)(&$!    &,/121*   !  $(+)!"-2/*%   !"  !  ! &4>A?:2' '4=A>7No,   !&'$  #,.*!#3?FH@3$ $/575.#  !+140$ú #&!  ! #06871&  0=CC=3*      $%"+5982&  ",363,##&$   "+//*! )495*O>%.%*'"    !$$""&'#  Ƚ $-243.&    ).-'(.00-%  '3=A?6( ˼ #$#!"')'!ĵ 3@C;/$  (00*!      )276, !2P :H?FE>2"ĺ     )8AC=2# &#µ  &&  +6>A<0! ķ .75-#3C?3"'-+#.9=;2"&,*! %=MRPI>.   ƺ)6<;1#  !1) ȶ $''$    *0, γ>7V Ts,ƾ!  &07;94-& #+-)! $*-+#+33+!()'!    " ̿'8BE>0$#!,0.)"     &.33/&$'"  ,462+ -;A@:0$     #+130*!  #,.,& W \p%29==;6.#  %W        !!     $&$       )/.% $''#   X X        "##!%,00+##.54.$     "$$  &/43.'   !&*.0/*  (5=?<4'  !!&-00+#  Y 0'&5@FGC:-  &2:>?:.%0893+      %))$¾  "+4;==:1#  !"$$$"!"&7BE@6'  ""      $'% (./*" $'*++*)+Z N.-( ž )252+#      Ǽ,;DIIC9*  '--( Ŀ!))%  ,5;=;3%μ"    *152*  ô #7FMLB4'    *12- 5GQPD0  [?6`!')% !,.)(,' 1CQXWOA0  ʹ)8=8,%+144/(!,7:4'ļ!+0-"!)-,*'# %..&ѹ/BMQMB4(   +340&%5;8,ƭ-2"\!%+03551)  %1796.! )4;@B<-Ѿ   !&+/352*ž )3=HPTRK@2%053+  +7?B?5%¹ #''"  ,8@B<0$ 0ALTWWSKD=7/%¶  #,49:6/' )03441+% ]F>.V !%%     (043.'ý  $0FJJGA8+ĺ    -9ADC=2# »#&')*' %'$  %)+)#  "*142^7*" '1992) '2A=2" %2<>;3*   "'(% _I$:L\egaT@,  $%#"#$#'0:BFIJD5 ̺ !#! +4;>=5( ¸    !"!  ʼ $(&  "$#      (.1210.(  "*/-% "*28974.& )7BINPNF;1,' `%Ľ    %03-$#'*(   $'$   )5<>9.  +AS_b]QA0" ʻ 1GG=. !'(" Ž/I]kqnaN7  &)& "%#  1=EE>5* "1;875/',6b=8. #*,,+(&%%''$½   ',*#!*+($  >XipkX?$  !%$ Ƽ (/220'ɼ '>Q[[P=#%((()**&ı%--'*/-$4BE=-"%! ̴Ehy}~~uY6 º  /BQ]ecU?' ۿ/DNL?)Կ #.7>EMQL>+Ů*;@;0"#$ cdCF  "   %%Ū@=4'!   .Cd3OTTM@1$ ʺ 2BOSOF;/%   #'))&# "/8961+! 3HTYXQB. $)+'  &41' &495-$ -563-# )-*"Ⱦ "),( ".7<><7-(/59:962.'  ʺ;Scg`P8 e %--(  /H[c`VE-ƾ#/573(ļ1 .@LOH9& '6BG?, *)  #5BIIC53DNOE5   ȳ*@OTQE5%   ,?PYYRG9+ 0CMOI=*#/43-"4CIIB5#   &=NSMA/%/2.(" í 4AFE>3%   '..) +24431/*"ù (+'h  $043-#0FXcfdZI4   !(/9AFGB;3*!  "0CEC>94.$  -BS^a]QA/  i:P] ӿ=]t|}veO6  )130+% '/32)%,-&ú,;GQZ\UF3ķ    "+0-% /98/!л&;JUZYRF5$ ¿ ",49>CFEB:/"    5FSZ[VI7$   #)-/.(!)04771(  j_ $(-252-)&$         Ŷ.=GKJGC=0" ſ  +6<;1!"" +9AC@9.   GW*|P|xZ{{5Ŧ\J{E5RP*yLxiax'H!W2ck? rrGY8qAHZfbUoɳDfnU"j1Nk;-7#Tji6iS-3 5F ']h <3`Z%M6#M< $>@/  2!llrrJI#B<B7%GGF=GE>")!/'D /&*C C9 $B0 ''!?: -!$ + (750:#5)"%7777. 66%1#55/"  #0 00 )  ++",,$!   ) ( ' &' &&%!$$ $$ m;x  !                         ' &' &&%!$$ $$  !* !qstrkelsesirap.info q*,+w`2A&(+ 1;?511`ñÆffaffaffcla?`0 `09`0?`0?`0?`0=``0=`3o`6`7ð`3`0`6`3`0`0`0``? :MEDPlayer-MED3.22--"H#e[jihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#4Synth-a-sysmick"$[MMD04Hw @@@@@@@@@@@@@@@@"%I:!/   #@@@@@@@@@@@@@@@@@ "( + .147:=@CFI L"O$R&U(X*Y\_behknqwt"&{R8,\''*0'**)%)0))*))*)%%) %0"'Ki))**))0%))*))*)%%"'*0"* "(g:* )%)0))*))*)%%") %0"* * ))0%))*")ݲ8),*,))''*0'**)%)0))*),*,)%"*ee()") %0%"' ' %)0%%%'%)')%%''*0'"+0>**)%)0))*),*,11.) %0.1 1 ." ,. <)0%.,,**))?'''@P*)"@*'@.`"@*1'@."@P''@*1."@P'@P1`."@*'@1"@/##@P'1@/#@`1@'/#@@P1##@" -4'/P*@''#@`@''#@(@)$ )@P+,,$@)@0`3$@,1)@0$@P)$ )@,+,$@P)@P)`$@,+)@*$@)%%@P), @)%@`% @)'%@P) @P,%%@), @*%@,%@`%@),&@`&@`?'''@P)" .2%**"@.'@'`)"@**'@."@P1''@*0"@P.'@P`"@*'@0"@5##@P'@#@6`@'3#@@P##@'P@'#@3`@'5#@@0$ )@P,1$@5)@`0$@,1)@5$@P0$ )@,1" /665$@P)@P5`$@,3)@1$@,%%@P) @%@` @)%@P @P%%@) @%@%@`%@)&@`&@`?5''@P*6"@3'@`6"@*5'@"@P6''@*3"@P6'@P5`"@*6'@3"@##@P6'3" 0Nh<@#@/`1@'#@6@P3##@'P/@'1#@`6@'3#@@0$ )@P5,$@8)@7`$@,0)@5$@P$ )@,87$@P)@P0`5$@,)@8$@5%%@P), @1%@`6 @)5%@P @P,%%@)1 @"1_Cy6%@5%@`%@),&@`1&@`?'. '@*0'@'@%@"@'@'@'@%@"@~'@"24'@   '@ %@"@'@'@  @ "@ll %@l0`"@`%@"@`''07'@P777'@'7`7'7'@7P73@'771@P7.@P"3ǫU*71@`7'7.@7*)%0G%@PG*GG%@))G`G)*G%@G%@P)G1@*GPG/@*G,@)%G/@`G)G1@G%%0I"@PI%III"@`I%I"@I"@P)I.@%II,@PI)@P*I,@`I)I)@I,@*)%0G%@PG*G%@G%@))G/@"4`G1@)*G%@PGP)G%@)G*G%@G%@)%G/@`G1@)G%@`G1@`"'07'@P7%7'@7'@"71@`73@"773@P7'@"7'@7P7'@P* 71@`73@"773@*)%0G%@PG*G%@G%@))G/@`G1@)*GG1@P)G%@)GPG%@*G%@)%G/@`"5BZG1@)GG#@%"%0I"@PI%I"@I"@"I,@`I.@"II.@PI"@"II.@PI"@P* I`I.@"I"@I*)%0G%@PG*G%@G%@))G`G)*G1@PG%@P,G)G1@*G%@G,)G1@`G,G%@`G`''07'@P7)77'@'7`7'"6А7'@7P73@'771@P7.@P*71@`7'7.@7*)%0G%@PG*GG%@))G`G)*G%@G%@P,G1@)GPG/@*G,@,)G/@`G,%G1@G)"%0I"@PI%II"I"@`I"I"@I"@PI.@"II,@PI)@P' I,@`I"I"7R)@I,@'%%0G%@PG'G%@G%@%%G/@`G1@%'G%@PGP)G%@%G'G%@G%@)%G/@`G1@)G%@`G1@`''07'@P7%7'@7'@'71@`73@'773@P7'@'7'@7P7'@P*71@`73@'773@*)%0G%@PG*G%@)G%@)G/@`G1@)*G"8G1@P,G%@)GPG%@*G%@,1G/@`G1@,GG#@1.%0I"@PI1I"@I"@.I,@`I.@.II.@PI"@.II.@PI"@P1 I`I.@.I"@I1.%0G%@PG1G%@G%@.,G`G.G1@PG%@P*G,G1@G%@G*)G1@`G*G%@`G"9ͯ`?''07'@P777'@7`77'@7P73@771@P'7.@P71@`2l77.@7%0G%@PGGG%@G`GG%@G%@PG1@GPG/@G,@G/@`GG1@G%0I"@PIIII"@`II"@I"@P":oѝI.@II,@PI)@PI,@`II)@I,@%~%0G%@PG G%@ G%@G/@` G1@G%@PGPG%@GG%@G%@ G/@`G1@G%@`G1@`?*0''@P*.'@'`.*0. '@'P3@.'1@P.@P60. 1@`*.@.'50, %@";XP),%@%`,)0, %@%%@P1@,P/@),@,)0%/@`)1@,%%0""@P%)""@`)%0) "@""@P.@)",@P)@P10) ,@`%)@),@"50, %@P)%@,%@%/@`1@,)0, %@PP%@,"<ɝ%%@)%@,)0%/@`1@)%@`1@`?'''@P*'@`**. '@P3@*1@P.@P). 1@`6.@,, %@P5%@`5*, %@%@P1@)P/@),@)%/@`)1@"""@P%"=Rb"@`%) "@"@P.@%,@P)@P") ,@`1$)@,@%, %@P5%@%@)/@`1@5, %@PP,%@)%@%@)%/@`1@),%@`1@`?3''@P*'@1`*.. '@P13@*3">Tq1@P.@P1. 1@`6..@1, %@P5%@,`5*, %@%@P,1@)P)/@),@,%/@`)'1@)""@P%,"@`%.) "@"@P).@%.,@P)@P1) ,@`10)@,@,, %@P5%@"?8x%@,/@`1@5), %@PP%@)%@%@%/@`1@)%@`1@`?'''@P)**"@.'@`'"@*)'@*"@P.''@*'"@P)'@P*`."@*'@0"@1**@P.0%@1*@`0%@.1*@%@P0**@.P.%@.*@"@d^`%@.)*@%@""@P%*@,"@1`@%)"@*@P,""@%.@P"@P`@%"@@%%@P) @%@` @)%@P @P%%%@) @%@%G` @)G%@`G @`?'7''@P**."@3'@'"A<7`."@*3'@'"@P'7''@*3'"@P*'@P'7`'"@**'@."@*G**@P..1%@6*@*G`1%@.6*@*%@P*G**@.6P*%@..*@*G`*%@..*@1%@"7""@P%%)@."@"7`)@%."@"@P"7""@%."@P%"@P"7"Bn%`"@%%"@)@%G%%@P)), @1%@%G`, @)1%@P% @P%G%%@)1% @)%@%G`% @))%@`, @`?3''@P.*1"@6'@`."@*1'@3"@P.''@*16"@P'@P6`8"@*6'@"@5**@P6.5%@6*@5`6" CĮ %@.5*@6%@P5**@.6P5%@.6*@5`6%@.5*@6%@:""@P%@"@`@%"@@P""@%@P"@P`@%"@@6%%@P) @%@5` @)%@P @P%%%@)" @#%@4`5 @)"!DplF%@`G @`?'@P*@$@%@`#'@*$%@5%@P#(@+45@PF@P4&@`E(@+F&@W&@E)@PV,W@h@V'@`g)@,h'@y'@Pg*@-xPy@-@x(@`*@-(@(@+@P.@@)@`+@.""E\&\)@)@P, @/ @P @P*@`,@/*@*@-!@P0!@!@+@`-@0+@P+@P."@1"@"@,@` .@1!,@`",@`?"""@%0"@"@"@""@%0'@%@ @"#FHV""@%0"@w"@"@jv""@%0wX'@ie%@FW @X4"@ 0EF"@'3"@4"@&""@ 0'@%@ @"@ 0"@"@"@"$G‚N"@ 0.'@%@ @?""@%0"@"@"@""@%0'@%@ @""@%0"@"@"@""@%0'@%@ @"%H.C"@ 0"@"@"@"@ 0'@%@ @"@ 0"@"@"@"@'@%%@+2 @l9l@?".7"@P77"@7"@ 7,@`7.@"7,@7,@7"@"&I67P7 7"@7"@"7,@`7.@$7,@7,@%,Y%@PYY%@Y%@$Y/@`Y1@Y/@Y/@%Y%@PYY%@Y%@&Y/@`Y1@Y/@Y/@'.X'@PXX'@X'@%X1@`X3@'X1@X1@X'@PX'X'@X'@X1@`X3@)X1@X1@*.8*@P"'JWq/88*@8*@)84@`86@84@84@*8*@P88*@8*@,84@`86@)84@84@?..7"@P77"@7"@17,@`7.@07,@7,@7"@P717"@7"@7,@`7.@37,@7,@5,Y%@PYY%@Y%@1Y/@`Y1@Y/@Y/@5Y%@PY"(KNY%@Y%@1Y/@`Y1@Y/@Y/@3.X'@PXX'@X'@5X1@`X3@6X1@X1@X'@PX5X'@X'@X1@`X3@3X1@X1@6.8*@P88*@8*@884@`86@84@84@:8*@P868*@8*@84@`886@84@84@?:.7"@P7")L)K7"@7"@87,@`7.@:7,@7,@7"@P787"@7"@:7,@`7.@7,@7,@8,Y%@PYY%@Y%@Y/@`Y1@Y/@Y/@8Y%@PYY%@Y%@6Y/@`Y1@8Y/@Y/@:.X'@PXX'@X'@8X1@`X3@:X1@X1@X'@PX8X'@"*MC\\X'@:X1@`X3@X1@X1@6.8*@P88*@8*@84@`86@84@84@88*@P88*@8*@584@`86@84@84@?%1~%@P)1@%@ /@` 1@) %@ 1@P P %@) 1@P %@) /@` 1@) %@1@' 0~ @P$ ,@"+N @*@`,@$ @,@PP @$,@P @P*@` @$'@*@" .~@P*'@@%@`'@*@'@P% @P"*@P@"(@`*@" @ *@" "@P % .@ "@ ,@` "@% ,@ "@P "@P "@%.@P"@P",O1E71@`"@%0@`"@%?1%G%@PGG1@G%@10G/@`G1@11G%@G1@PGPG%@10G1@PG%@11G/@`G1@0G%@G1@13$8 @P818,@8 @38*@`8,@38 @8,@P8P8 @38,@P8 @P18*@`8 @308'@8*@1."X@PX0X'@X@.1X%@"-P)dP`X'@.3X@X'@P."8@P838*@P8@.*8(@`8*@.8@8*@*."7"@P7*7.@7"@.7,@`7"@.7,@7"@P7"@P7"@.7.@P7"@P71@`7"@.70@`7"@.?1%G%@PG.G1@G%@10G/@`G1@11G%@G1@PGPG%@13G1@PG%@15G/@`".QpsG1@3G%@G1@53$8 @P858,@8 @38*@`8,@38 @8,@P88P8 @38,@P8 @P:8*@`8 @888'@8*@::"X@PX8X'@X@:6X%@`X'@:8X@X'@P:"8@P888*@P8@:58(@`8*@:88@8*@5:"7"@P787.@7"@:a7,@`7"@:"/R#ِ7,@7"@Pb7"@P7"@:a7.@P7"@P71@`7"@:b70@`7"@:""@P""3""@A3"@3A,@`$3.@'$,@6',@E6#@PhE#Uh#@#U#@Y-@`yY/@hy-@h-@x$@Px$@$@$u.@`$u0@.@v.@uv$@`bu`Sb$@DS$@`2D.@`!20@`"0SmP!.@`.@`?1%G%@PG.G1@G%@10G/@`G1@11G%@G1@PGPG%@13G1@PG%@15G/@`G1@3G%@G1@53$8 @P858,@8 @38*@`8,@38 @8,@P88P8 @38,@P8 @P.8*@`8 @808'@8*@.1"X@PX0X'@X@10X%@`X'@1.X@"1T`X'@P*"8@P8.8*@P8@*,8(@`8*@*8@8*@,."7"@P7,7.@7"@.7,@`7"@.7,@7"@P7"@P7"@.7.@P7"@P71@`7"@.70@`7"@.?)%G%@PG%~G1@~ G%@%~G/@`G1@%~%G%@~G1@PGPG%@%~G1@PG%@%~ %G/@`G1@%~$G%@~"2U ZG1@%~$8 @P8$~8,@~8 @$~8*@`8,@$~8 @~8,@P 8P8 @$~8,@P8 @P"8*@`8 @$~$8'@~8*@$~'"X@PX"~X'@~X@"~"X%@`X'@"~"X@~X'@P"8@P8"~ 8*@P8@"~8(@`8*@"~"8@~8*@"~ "7"@P7"~7.@~7"@"~7,@`7"@"~7,@~"~7"@P"3VUq~7"@P"~7"@"~~7.@P"~7"@P~71@`"~7"@"~~70@`"~7"@"~?%%G%@PG%~G1@~ G%@%~G/@`G1@%~%G%@~G1@PGPG%@%~'G1@PG%@%~ )G/@`G1@%~,G%@~G1@%~$8 @P8$~8,@~8 @$~.8*@`8,@$~,8 @~8,@P8P8 @$~,8,@P8 @P.8*@`8 @$~08'@~8*@$~."X"4WRc@PX"~X'@~X@"~X%@`X'@"~.X@~X'@P"8@P8"~8*@P8@"~.8(@`8*@"~8@~8*@"~ "7"@P7"~7.@~7"@"~7,@`"~7"@"~~7,@~"~ 7"@P~7"@P"~7"@"~~7.@P"~7"@P~71@`"~7"@"~~70@`"~7"@"~?%%G%@PG%~G1@~ G%@%~G/@`G1@%~%G%@~G1@PGP"5XxPG%@%~'G1@PG%@%~ )G/@`G1@%~,G%@~G1@%~$8 @P8$~8,@~8 @$~.8*@`8,@$~,8 @~8,@P8P8 @$~,8,@P8 @P.8*@`08 @$~38'@~08*@$~:"X@PX"~X'@~X@"~X%@`X'@"~.X@~X'@P"8@P8"~8*@P8@"~"8(@`8*@"~8@~8*@"~ "7"@P7"6YMY"~7.@~7"@"~7,@`"~7"@"~~7,@~"~ 7"@P~"7"@a`"~7"@a@~$7$@a "~7$@`~%7%@b "~7%@b@~&7&@b`"~7&@b?%%~%@P1~)%~1@1~%@%~ /@`1~ 1@)%~ %@1~ 1@P%~ P1~ %@)%~ 1@P1~ %@)%~ /@`1~ 1@)%~ %@1~1@' $~ @P0~$$~ ,@0~ @$~*@`0~,@$$~ @0~,@P$~P0~ @$"7Zѯ$~,@P0~ @P$~*@`0~ @$$~'@0~*@" "~@P.~*"~'@.~@"~%@`.~'@*"~@.~'@P% "~@P.~""~*@P.~@""~(@`.~*@""~ @.~ *@""~ "@P.~ %"~ .@.~ "@"~ ,@`.~ "@%"~ ,@.~ "@P"~ "@P.~ "@%"~.@P.~"@P"~1@`.~"@%"~0@`.~"@%?~'7'@P'~7'~3~7'@"8[ 3~'~7'@'~~71@`'~73@'~3~73~'~73@P~7'@P'~ 7'~3~ 7'@3~'~ 7'@P~ 71@`'~73@'~ 3~73~ '~73@'~ ~'Y @P,~Y,~8~Y @8~,~Y @,~ ~Y*@`,~Y,@,~8~Y8~,~Y,@P ~Y @P,~ Y,~8~ Y @P,~ Y @,~ ~ Y*@`,~Y,@,~ 8~Y8~ ,~Y,@,~~%G%@P%~G%~1~G%@1~%~G%@%~~ G/@`%~ G1@%~1~G1~ %~G1@P~$8 @P$~8$~0~8 @0~$~"9\N 8 @P~ 8*@`$~ 8,@$~0~80~ $~8,@$~~"7"@P"~7"~.~7"@.~"~7"@"~~ 7,@`"~ 7.@"~.~7.~ "~7.@P"~"7"@P.~7.@.~$~$7$@P0~70@0~%~%7%@`1~71@`&~&7&@`2~72@2~?3'7'@P7'~7'@3~7'@'~71@`73@'~73~73@P7'@P7'~07'@3~7'@P171@`73@'~ ,73~ 73@'~'Y @PY,~Y @8~Y @,":]>_~Y*@`Y,@,~Y8~Y,@PY @PY,~Y @PY @,~Y*@`Y,@,~ Y8~ Y,@,~,%G%@PG%~G%@1~G%@%~*G/@`G1@%~,G1~ G1@P$8 @P8$~38 @0~8 @P8*@`8,@$~080~ 8,@$~."7"@P7"~7"@.~7"@"~7,@`7.@"~7.~ 7.@P."7"@P7.@.~0$7$@P70@0~1%7";^%@`71@`2&7&@`72@2~?3'7'@P7'~7'@3~7'@'~.71@`73@'~*73~73@P7'@P7'~.7'@3~7'@P71@`73@'~ 373~ 73@'~0'Y @PY,~Y @8~Y @,~3Y*@`Y,@,~,Y8~Y,@PY @PY,~,Y @PY @,~.Y*@`Y,@,~ 0Y8~ Y,@,~1%G%@PG%~G%@1~G%@%~G/@`"<_ظG1@%~,G1~ G1@P$8 @P8$~8 @0~8 @P,8*@`8,@$~.80~ 8,@$~"7"@P7"~7"@.~7"@"~7,@`7.@"~7.~ 7.@P."7"@P7.@.~0$7$@P70@0~1%7%@`71@`2&7&@`72@2~?3'7'@P7'~7'@3~7'@'~.71@`73@'~*73~73@P7'@P7'~.7'@3~7'@P71@`7"=`133@'~ 373~ 73@'~8'Y @PY,~Y @8~Y @,~6Y*@`Y,@,~3Y8~Y,@PY @PY,~3Y @PY @,~6Y*@`Y,@,~ 8Y8~ Y,@,~5%G%@PG%~G%@1~G%@%~G/@`G1@%~3G1~ G1@P$8 @P8$~8 @0~8 @P8*@`8,@$~180~ 8,@$~"7"@P7"~7"@.~7"@"~7,@`7.@"~">a'!7.~ 7.@P"7"@P7.@.~$7$@P70@0~%7%@`71@`&7&@` 72@2~Synth-a-sysmic - composed by Alan Mackey. vk5th4th1stBassGuit2KickBDACsnaredrumrezonix2"?b{osmoothpulsevib2smoothpulsevib2SmokeGuit.synthSynthVioShakert t*u( *u 0@"@c:|BJ ---&ƽ'Uf[L;+ û 60# *%56 ,#70#E]bTD4$п 78,'A8 1D<. ȹHa\P>- ɽ ;6(  7E< RI:*'F_XH6%Ľ 91!ȽGIK XH6%л'EZP@0   5+ MWd TB1 "AdO ȴ 'EUH8( +$0$ѿ#&!/_pd P=) 'GPA1!50"* » '0)'?xr` I6"ѹ 'II;+;:- #̳'93-E[xmZ B0ȳ#HB4% '@8( DZ:;7O]XpdP 0@"Be,Q:`$J071%##/D4#̽=>70"3;*  ĸ;UM@0   0GA6& -! #DI@0 ! ƹ)VTH9) ʽ?P08( #+OM@- ¹##CJA6)) C\XI:0$+?`TB0 # #B<1$ ƹ '?RH:,0 !) Ƽ"Cfc7Wh\H5!  99.  # 'CE;-!0+)-#Ǻ 1Qj`P:% 3+ ĸ  %?80$05./(Ȼ -37_bT=(' *' ˽ #50)7<00-,ɽ+331?^T@* 72#"  '17JA50+0ʽ';71-3@P@-  B9)  1QPB5/"Dg  0@:\~(J        !  %   (!  ,$"EhZ0'#3*  Ŀ 7-# #:@.26@%@?G[qbZ}s-gc11lX9W-'ޞҢ 0+G"Fiu ýȎ#T1.) @$"HhO`oaFLL]xn8 @gV &J(ӨҜ/`$?0& +?QI лò # @/@^wf]jwwYPs^JHR^hmD+RR%' B8  &  *%(3* ѹ̼&@1?Uh_[ennZSjpnVGDIOTU7"98  (!  # ˾ '@3>LYXY_ee[W`a\ND@@@?<* "Gjݕ   (@5=CJQVY[\\[VQJF@;60*#¿  *:0000B0=4H`00.0R`@x4H^ZR"lx00@"Ϡ踀ɠ:^`"^00^xH[0R|x]^R^xyoo`R{H"^lWX[Q?LFH@?7300000 ٸ!0000"Hl4@./㘥˜Uff_sp||Lu|m~^1"NrH(7HdAc+1g7D<*9׳Я  # )8/Q25%2I.1((,,ٵ4!*!* (N*(&(  پ0/_ 5"<'-E.5H.2+3-, ۹ /"#$ 71*/ 4 E73)5 3     <$4 )N)O3 C+  "Os@ܮ " &  , !.' 4   @ jnrvz~   @ѿ "Pt1:/0 "(,     "@̚ȯܧնոĻķ?   @(/0:5    ި̯߼Юѿ׺H72 @%&Q(? -'4?P^?@=DO4+I9>ED7Q,/44 ?T ?@3/ $ڸ"Quɪ丿伿@  3()&%%$%"'K@ 34)46-5(%$+,?x m0 cDSH)+E<k` Wx+hO?0! !@D  + ('- *' !#&%#EG2'7 '4#!,#/0B9(8/RW@7QD19_P/=:>9=U\:/OH%0@ڲи  ) G@1 "  30 /!#1%"  ?4S4/M32 $'9<@̰ҶķθʨМح4/(0# +S"Rv +* +,0   /$ 5@:(25*Ĺеعؾ Ȱ̱Թ&"# @&.76 '-%109L /@($,'3C( $?$0 Ժɰĺٵ Կ̲@     C@! " $."'B0 #3 ( /OJ=N8;M4;B0ƿ,ֽ ɺ@ /:*5ZJ$42( ';&*! #% -:5 &"Swo4&$ % (" 1$?J(66"6*.*?D&$  )JF"@ش!7XJ=RD$-@( %    !34 +,!+) !"  $"%$  @ȶ =I4 ;WN0  =SP(3>1 !-(1?9#?@ @"& Ƚ   35 5<.@   "TxTdO  #!  !'#&    @     '*!    @3:4$  !&&    ;F@4* $,@"'#           (/+#"Uyf@           @@0  "Vz@Vx"Df2T?LXcltz~~ztlcXL?LXcltz~~ztlcXL>?LXcltz~~ztlcXL>1?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% "W{!,?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1%  ?LXcltz~~ztlcXL>1%  ?LXcltz~~ztlcXL>1%  ?LXcltz~~ztlcXL>1%  %0  Vx"D"X|}?f2T?LXcltz~~ztlcXL?LXcltz~~ztlcXL>?LXcltz~~ztlcXL>1?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1%?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1% ?LXcltz~~ztlcXL>1%  ?LXcltz~~zt"Y}slcXL>1%  ?LXcltz~~ztlcXL>1%  ?LXcltz~~ztlcXL>1%  %@   $ ( , 0 4 8 <@@"Z~!~\T:8 f  4PL< .22,($<<&&22" & Ģ.NL>8(ʺظ,*"RddH@\~輀NjhԒ0Jb~XЀ<&򮀔 48<@R:"ж 4("搜2<@2\ 6phZ"[{|e F~n,0DV@fp$글tؐ.*&" J>,  "$&&&T|҈ƀjjd\R<Ƞ\|0 ~t  @RTT^<2,$蘞BJNlJp( >| €hrnjd\TH⺼&BĊ HLPRT@>80("ތ JLNXL򲀀$6<>@6>j~DІֲ.xrhb\F􆪾$,4:>..*$ ࢲ06<@BDFHH @:0,& $(,.022䨮" 䦴044zvȀ"\-0th, @200J&*(,..,@064.4V ,,(L: .rlH€  B~~xvjZȬl~zvD􎀈<LH $$"О  @ & ~  , 憐  J *>zd Дξ8J|&,.8<<<:>BB86:62.tn`ഀ$&$ @ƨ°6@HJJJJJJJHF@ft2Ц&*,*4BHJLLJHD8(  谖rvph\P@ڄ@8BFJLNPPRV~~.6xj^RD̾0@::::6,6DLNPPPPX.HTNBȈھ@28>@D"^BE~HL\R444\nNl~zpbZRH:0 "(,0248>@DFJ`l>RN.¸\vl,ྮʺĶ@&,04:PhR66TzxndZPJD8, ࠐ긠̪&.488:<@DHLNPNN20($:b\J "V|p^ꚞ @ 6hzn`RDDB>4& ¬".>JB<::>BFHFB<:60(&*Xt`4"Fn\$<@&,8zn`N. ̪ *8:.((&$⸸Td8$"<@ BRPD"_MaHTNF<, ঀ@ (|xfP@0ⴖ P4"">LTZzRB>Jpzn^N\:̶NVTPJB$@ftpfN”2bhfb8 Ԫ4:>@>4 *rtd Ҩȸ$B<, 2:<<8,@ڸ"((ƶ &&$&^|tj`D>DD:$ &NfJZ"`^,:||vhZ> ̤JJ>മİ:VZVPLB$@".(ĸ 2nrndZ@֪0**" $TrnhT( .^d`X@侲@""   Ҷ " BDȺ" @*004<<40( ־"2JTF"̾&,0244>( ",@F>6,μ 6><0"ļ,6"ac$@    @ @"bԍF@:\~(J        !  %   (!  ,$0'#3*  Ŀ 7-# #:H$"c^#  %& *'a4B[ K=69?U&!: > 0$2-  R:'%&G5"U 0k$ L#3' =P9 p3Z?iJNECM/^)W/e)Dib{_E"9u $rJ$/WER (8:(" htuoU~'SYS:System/DiskCopy- Disk.infoptd Docs.infop_/)9QxP<!04!"\?9 $ $ $ $$$ ?03777*77?76?95UUUUU\@@@ @ @ @@-A?0"UUUUUP????*???? $ $ $ $$$ ?03777*77?76?95UUUUU\@@@ @ @ @@ qduh- kDocspG-~; @HistoryNThis file contains the history of MED/OctaMED: ------------------------------------------------------------------------- The history of MED began, when I got DOC SoundTracker VI in 1989. I found that it was really easy to compose with it, but the program itself was terrible: No multitasking, no Kickstart 1.3, no way to exit (or was there??? there was no instructions), no keyboard equivalents... Today Protracker 1.1b is giving good competition, but it still can't multitask, and it d\~oesn't work under Kickstart 2.0 (V37.175). == Version 1.00 - 1.11 (spring - summer 1989) =========================== Not released... V1.0 looks quite pitiful :-) == Version 1.12 (autumn 1989) =========================================== This is the first released version (on Fish #255). It contained some mysterious bugs that crashed the machine sometimes... I never found them, but they are gone now (maybe they were compiler bugs). == Version 2.00 (8 Apr 1990) ======================BQ====================== The version V2.00 was the second released version. When I started to program it, I thought it'll be V1.20. But finally the list of improvements grew so large that I decided it must be V2.00!! And here's the the list of the new features/fixes: - Nearly completely rewritten code - New player routine made in assembler - Fast screen rendering routines also made in assembler - New user interface with file requester - MIDI support and up to 16 tracks  - Extended keyboard, lots of new keyboard equivalents - Two equalizers (yes, imitating SoundTracker...) - Insert/delete to playing sequence list - Insert/delete blocks - Cut/Copy/Paste rectangular regions - Transposing and expanding/shrinking blocks - SoundTracker module load support - SoundTracker song saving - Can write icon with song - "MOD" save (song + samples) - Writes object files for your own programs - Song packing (not a real packer, but m[`maybe "optimizing save routine") - More octaves (5) - Supports IFF 3- and 5-octave instruments - New commands (filter on/off, note off, stop playing, repeat note) - Repeat with beginning offset 0 works - "Quick note" feature - Insert effects when entering notes with Left or Right Alt - An option to turn off automatic advancing to next line - And maybe something else I've forgotten to put here... == Version 2.01 (10 Apr 1990) ===================================Y======== Not a long time from previous release!!! I found few bugs: In Finnish version, version 2.00 didn't save the song to correct directory. In both versions, the icon did not go to correct directory. These are now fixed. What a pity I sent Fred Fish V2.00 (yes, the letter was posted today...my luck!!). == Version 2.10 (17 Jul 1990) =========================================== Again lots of new features... - max. 63 samples - block length is modifiable (1 - 256 lines) - relative volumes for each channel and master volume - samplelist - new commands (3, 4, B, FFA, FFB, FFD) - new MIDI commands (modulation wheel, pan, hold pedal) - saves now Sound/NoiseTracker modules (ST-song save removed) - programmable keys (Shift 0 - 9) can be edited/saved - real-time sample display (updated every frame), looks nice - new file format: module (MMD0) - intelligent sample loader, minimizes disk swapping, doesn't reload samples which are already in memory - automatic slide making (+ volume fade) - track numbers always displayed, can be scrolled one track at a time - free memory can be displayed - screen outlook a bit better (more space for sample name), many panels enhanced - an option to read volumes when entering notes with MIDI - each sample can be independently transposed (like play-transpose) - it's possible to highlight lines (reversed colors) for easier positioning of notes  \e - the player tries to flush "serial.device" if allocation failed - delete option in file requester - volumes (command C) can be hex or decimal - blocks can be splitted or joined (thanks to modifiable size) - filename paths can be added/removed when loading samples - better compatibility mode for ST/NT - detaches from CLI (uses cback.o) - a bug in MIDI preset changing fixed - small enhancements everywhere Also there's a new version of MEDPlayer, better instru +ctions (I hope) better playroutine, "medplayer.library", module loader....... == Version 2.11 (21 Jul 1990) =========================================== This version contains two small fixes to the previous version: - MED now doesn't insert entered MIDI notes with volume 0 (because it means "note off") - a very, very small bug fixed (when loading MMD0-module, instrument names were not always deleted) == Version 2.12 (25 Jul 1990) ==================================== ʍ======= - MED had a bug which affected command FFF with MIDI. It's now fixed. The "modplayer.a" was correct, however. (strange...) - There should be no files missing from the source archive any more (due to a bug in Lharc or me). == Version 2.13 (24 Sep 1990) =========================================== - MED loads now all 8 colors... - Block display correctly cleared after "Clr song only". == Version 3.00 (31 Jan 1991) ========================================= 2k== New major version featuring: - built-in sample editor with sample handling/sampling abilities - simple (C64-style) synthsounds, built-in editor - "hybrid"-instruments (sample with synthsound "programming language") - MED now uses CIAB timers instead of CIAA. This means that MED is now compatible with Kickstart 2.0. - better sample list - an alternative note-display method (more graphical) REMOVED IN V3.10!! - play-length timer - enhanced file-requester   (no need to wait until all names loaded, can list devices/assigns) - better control over playing speed (now TWO tempo-selection gadgets, (leading to minor compatibility problems with previous versions)) - option to start playing when a key has been hit (for real-time rec) - real-time recording works a bit better - "jump-to-last-used-sample-slot"-gadget - Hold/Decay implemented, allows accurate control over note duration (+ automatic decay after note endϮ). THANKS TO ZAP FOR THE IDEA! - Insert Line/Delete Line -gadgets - an option to use space bar as an empty note (DEL) - 2-option removed. Now there's "Spc" (space can be modified) - keypad working changed (can be used as track on/off switch or selecting instrument) - now a range of notes (instead of just a single note) can be assigned to Shift 0-9 - many other options are now also saved when saving keys (screen colors etc.), they're loaded as defaultꓵs during start-up - an option to use note B instead of H (in some countries (like Finland) it's H, in others (like USA) it's B) - Workbench screen can be opened/closed from MED - MED can be synced externally (through MIDI), or MED can send MIDI- sync pulses - active sensing msgs can be switched off - gadgets to reset pitchbenders/modulation/presets, send MIDI-reset, and turn local control on/off - MIDI-input channel can be specified (or data can be received from all channels) - MIDI key-up can be received (especially for long notes...) - range for all editing operations can be selected with mouse (dragging using right button) and is displayed - it's possible to select individually tracks used in editing ops - affection of editing ops can be selected: song/block/selected tracks/current track/range, current instr/all - it's possible to change/exchange notes individually e.g. F-2 => E-3 - instrumen&.t numbers can be changed or notes with a specified instr number can be deleted - it's possible to type a short "anno" text, that contains e.g. song name, composer, ... It's displayed when file is loaded (in MED and MEDPlayer) - option to automatically advance to many directions (up, down, next track, prev. track, next num, prev. num) - notes in one track can be "spread" to many tracks, similar to "polyphonize" in NoiseTracker... - chord-entering rmode (the tracks that are used in chord can be selected) - tracks can be turned on/off by clicking the track on the note display - gadgets to turn on/off all tracks, and select all tracks - player recognizes new commands: 8 = set hold/decay for note 9 = change secondary tempo - samples can be saved in IFF-format (optional) - outlook is now a bit better (gadgets are bigger etc...) == Version 3.10 (14 Apr 1991) / OctaMED Version 1.00 (02 Apr 1991) ==NS==== New features in OctaMED: - 8 channel playing with Amiga audio (like Oktalyzer etc...) - 8 tracks can be displayed at a time New features in both OctaMED and MED: - new look (in MED-res 640 x 200/256), looks more professional - volumes in Instr-panel are displayed in both hex and decimal - expand and shrink space can be controlled - option to use 4-color screen (8 colors are quite slow on std Amiga especially in 8-channel mode) - option to load 8-channel~& samples in fast memory (mostly for listening only, as they can't be played from keyboard) - changing play rate and pitch in sample editor is easier - sample editor contains a delta-filter that can reduce noise - changing play rate and stretching in synth-editor now do some anti-aliasing - status line contains a button (CHRD) to activate/deactivate chord mode - backspace key can be used to delete/insert editing of notes - horizontal note display of MED 3.0Hs0 was removed - many MED 3.00 bugs (hopefully) fixed including: * Ext Sync (caused an instant travel to India) * Synth editor range dragging (trashed the screen in some instances) * MODULE SAVING (MED 3.00 didn't always align the fields, causing terrible results (Guru 00000003) with programs using modplayer.a) * Hybrid sound saving in object files * More reliable old ST-song loader. Doesn't necessarily crash when loading e.g. text files (but don't count on this!!). == Version 3.11 (07 May 1991) =========================================== Minor perfections and bug fixes: - timer reset gadget area fixed (yes, you can reset the timer by clicking on it!!) - new Boost-option in the sample editor (the opposite of the Filter) - only Left-Alt+Cursor up/down now moves you to the 1st/last block (to avoid accidental jump when using Alt+Cursor left/right) - no more "Loading synthetic sound..." messages during xmodule/sng+samples load - a bug in the player routine command 3 (slide) fixed (in certain conditions the period got down to $ffff....) *** Release 3.11b (09 May 1991) / OctaMED Version 1.01 (20 May 1991) Some more fixes (these bugs were totally harmless, but I'm a perfectionist) - in addition: keyboard shortcuts of Cut/Copy/Paste range now work. They are Ctrl-X (Cut), Ctrl-C (Copy) and Ctrl-V (Paste). == OctaMED Version 2.00 (17 Aug 1991) / MED Version 3.20 (25 Aug 1991) == New features in OctaMED: - Notation editor/printer. - 5 - 7 channel modes. These allow you to use high quality, non-CPU- stressing audio and splitted channels at the same time. - 16 track display (for MIDI use). New features in both OctaMED and MED: - numerous bugs fixed!! (including some nasty ones). - MED_paths can be now loaded. - insertion/deletion of tracks is possible. - DEF gadgets for New block and New here create 64-line 4/8 track bl+;>ocks - MIDI note-off messages can be suppressed for a particular instrument - there can be multiple songs in memory at once, sharing instruments, can be saved as a multi-module. - new synthsound commands: envelope, set vibrato waveform. - proper loop markers in the sample editor. - no more "Sample too short" messages in the sample editor: the display is no longer limited to minimum of 624 bytes (the minimum is now 1 byte). - the sample editor can generate v Gnoise (e.g. for wind/sea effects). - a range in sample editor can be transferred to the synthsound editor. - the "red line" in the sample editor. - sample list displays the total number of samples in dir/memory. - the MIDI works now better: commands are handled BEFORE sending out notes, notes with volume 0 are not sent out, some new commands: channel/polyphonic aftertouch, pitchbender setting, controller change - most of the graphics data is now loaded into fastAh ram, giving more chip ram for samples (in addition, the S2FST switch was removed). - the range is now visible also on 2 bitplane-screen. - direct object saving removed - removing this seldom used feature made the program a couple of Kbytes shorter. There's now another method for incorporating modules into programs (requires a bit more work, though). - Topi, the jumping pointer, is now hidden if Jump setting is turned off. You can also save this (cliqNck Save prefs). Perhaps I'll "kill" Topi completely in the future (frees a couple of Kbytes)... - when you real-time enter with SPC on, the notes will be now quantized correctly. - an option to use the most common Protracker keyboard functions. == OctaMED V2.00 release B (21 Aug 1991) ================================ - a slight bug in the player routine audio channel freeing code fixed (didn't mark the channels as freed, could cause a crash in certain c 5zases). - some slight cleanup in OctaMEDPlayer. == Small bug fixes (16 Oct 1991) ======================================== - "medplayer.library" now clears the _modnum during GetPlayer(). - A minor bug in modplayer.a signal freeing code fixed. == MED Version 3.21 (01 Jan 1992, Happy New Year :-) ==================== A bug fix release of MED V3.2. Many bugs fixed, including: - if SPC was set to 0, a Guru appeared. - Range All + Show Range trashed the screen. - volumeN arrow gadgets had incorrect widths in their Gadget structs. - problems with saving extension struct in multi-modules...hopefully cured. - a minor bug found in synth editor JVS renumbering code. WARNING: A deadly bug found in MED 3.20 player stuff (MEDPlayer/modplayer.a/medplayer.library). The bug can cause problems when playing multi-modules or old (pre-3.00) modules. Be sure to use the new versions from now on! (Also, some minor bugs uhave been exterminated.) == MED Version 3.22 (28 Jan 1992) ======================================= Some more known minor bugs fixed: - state of the E3 switch is now correctly saved to prefs file. - ST-module saving may *finally* work perfectly. I'm not sure if it helps, but I added some code to ensure clearing the unused entries of the pattern sequence table. - two load error traps fixed. - a seldomly occurring minor playseq list display bug fixed. minor bugs {\v History.infoEb@bX&#E   <1" 1!*! *!$! $"$<   ? E`  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pr}om}om}om}om}om}omppp :C/muchmore  pH^MPHti MED3.2.doc*************************************************************************** ** ** ** MED - music editor, 1989 - 1991 Teijo Kinnunen ** ** ** ** Instructions for MED V3.2 ** ** ** ********************************z******************************************* Welcome to use the MED music editor!!! MED is an all-purpose music editor that can be used to compose music for demos, games etc., and works as a stand-alone program as well. First few words about editing. If you've used any Tracker, you probably know these things. MED can display "standard" notes, but often you'll use the "Tracker-style" editing, in which the music is represented by note names and numbers. For example: !S% 01 C-2 1000 --- 0000 E-5 K210 --- 0F20 02 D-2 1000 E#1 4000 --- 0000 --- 0000 03 --- 0000 --- 0000 --- 0000 --- 0000 In this form, the music is quite fast and handy to edit when you get used to it, but it's quite useless when printed (nobody could play it). The song consists of blocks, every block contains 1 - 256 lines. There can be up to 100 blocks and they can be played in any order and any number of times. In addition, there can be up to 99 songs in memoy)ry at once (sharing the set of up to 63 instruments). The user interface of MED is divided in ten "panels", each one containing different gadgets. Only one of these panels is visible on the screen. You can select the displayed panel with ten gadgets which are always visible. There are lots of keyboard shortcuts. After you've learned the use of the program, you probably want to learn these shortcuts because they make the program much more powerful to use. There are also some things which are available only by using the keyboard, so you should read the list of keyboard shortcuts at the end of this manual. There are also four different big displays. Normally the notes are displayed in this area. Optionally you can choose the synthsound editor, sample editor or the sample list to be displayed on this area. Entering the notes ================== Notes are entered with Amiga's keyboard (entering with MIDI-keyboard is also possible). The keys are ordered in piano style: 2 3 5 6 7 9 0 \ Q W E R T Y U I O P ] S D G H J L Z X C V B N M , . / This way you can enter about 2,5 octaves of the 5,2 octaves available. Keys F1 - F4 can be used to switch the octaves. The lower row of keys (Z - /) is the lower octave, Q - U is the higher octave and keys I - \ are part of even higher octave. If you have an instrument loaded, you can hear the sound when you press the keys. If you want[V to enter notes onto the block, you must turn on editing (Esc). DEL-key is used to enter the pause (---). The cursor can be moved with the cursor keys. Blocks and the playing sequence =============================== When you compose a song, you do it block-by-block. Fill a block with notes, create new block, fill it with notes... In order to get the blocks played in correct order, you must also create the playing sequence list. It is just a list of block numbers, which are @9then played in that order, from beginning to end. This way you can use the same block many times in your song. When the last block from the list has been played, the song will start again from the beginning (it's also possible to stop the playing). The maximum length of the playing sequence is 256 numbers. Status bar ========== Between the panel and the block display is the status bar, which displays some "strategic" information which is always good to be visible.  K Song/# of songs | Song selection gadgets | / \ | +-------+-----+--+-+--+----+--------+--+------------------------+-+-+-----+ |001/003|00/02|12|E|SP|CHRD|::::::::|01|AnalogString |<|>|01/02| +-------+-----+--+-+--+----+--------+--+ ºE------------------------+-+-+-----+ | | | | | | | | | Playseq-ptr | | | | | Tracks Instr # Instrument name | | | | Chord mode on/off Block # | | Insert empty space between notes | | Keyboard octaves Editing on Playseq-ptr: The first number is the current playing sequence number (starting from 1) and the second is the number of playing sequence numbers in the song. The  v~1st number is meaningful when you're playing the song or editing the playseq list. Block #: The first number is the number of the current block (starting from 0) and the 2nd is the number of the last block. It does not tell how many blocks there are, but if you add 1 to it, it does. In the example there are 3 blocks, and the first is currently displayed. Keyboard octaves: This number tells you which o ߾ctaves are currently in use when you play the Amiga keyboard. The first number is the octave number of the lower row of keys and the 2nd is the higher. It can be changed with F1 - F4. Editing on: This is a quite important option. When the editing is off, you can't insert notes or numbers to the song. To turn it on/off press Esc or click the "E" with mouse. When the "E" is highlighted, editing is on. SP:  ³c^ This switch activates the extra space between the notes you enter. It is useful when you're entering slow pieces of music. You don't have to hit DEL so often. CHRD: This turns the chord entering mode on/off. Tracks: It's possible to switch tracks on/off during editing. The 16 points represent the 16 possible tracks. When the point is red (default) the track is turned on. When it's white, then this s track is turned off. Instr #: The number of the current instrument. The maximum number of instruments is 63. The instruments are numbered 01 - 1V (01 - 09, 0A - 0V, 10 - 19, 1A - 1V). Instrument name: The name of the current instrument. Song handling gadgets are discussed below. You can change the instrument number, current block and current playseq ptr by clicking on the number you want to change with the mouse. Left button increa؊B&ses, right button decreases. This is the fastest way to advance playseq ptr for example by 100: click the 100's number with LMB. Instruments =========== As noted above, there can be up to 63 instruments in one song. There are currently four types of instruments: samples, synthsounds, hybrid sounds and MIDI instruments. Samples: These are the instruments which are played through four Amiga audio channels. They can be played only within tracks 0 - 3. A MED can load raw samples and IFF 8SVX 1, 3 and 5-octave samples. It means that you can load practically any sample to MED and use it in your songs. Note that raw samples and 1-octave 8SVX samples can use only octaves 1 - 3. Octaves 4 and 5 play from octave 3. Synthsounds: These are a special instruments, that allow you to construct a sound from simple pieces of waveforms, and controlling things like waveform #, volume, 4`pitch, arpeggio and vibrato using a simple "programming language". Synthsounds sound usually quite simple (C-64 style), but they don't take much memory, either. Hybrid sounds: This is a normal sample, but it can be controlled using the same "programming language" as synthsounds. MIDI instruments: These are not actually instruments. They are just few settings which cause the notes played with that instrument to be sent tǨ"1hrough MIDI-interface. They don't take memory like the samples. When you want some instrument to be a MIDI-instrument, you must set the MIDI channel which is used when playing notes/effects. You can also set the preset value for the instrument. Then the instrument is automatically played using that preset number of your MIDI-device (synthesizer, keyboard...). You can also set the preset number to 0. Then the preset which is alread[y set in that channel is used. Sample loading ============== Because many people have hundreds/thousands of samples, spread over many different disks/directories, the samples have to be organized some way. MED handles the organization using a file "MED_paths" (path file). It contains the name of the directory, names of the samples in that directory, name of another directory...and so on. This way MED knows what samples each of your sample disks/directories contaɦTin and can load samples from correct disks. The path file is loaded when starting up MED and it must be located in the current directory or S:-directory. This file can be produced with text editor, but it is easier to do it with MED. Detailed instructions later in this manual. Note ==== The note and the numbers: command | D # 3 5 1 0 F | | \ | note | \| instrument # data byte (more inOp5dformation about command) "note" is the note to be played (or "---" for no note) "instrument #" is the number of the instrument (01 - 1V). The leading zero is displayed as a space. The number can also be 0. It means that the note is played with same instrument number and with same volume as previous note in that track. "command" is the number of command/effect to play. If there are no effect or commands, command nisbble and data byte are zero. "data byte" gives more information about command/effect to the player. Effects/commands are documented later... The numbers can be changed simply with positioning the cursor over the number to be changed and typing the new number. If you have to change the 5th number (between the note and the other numbers: C-212000), which means that sample 10 - 1V is used, position the cursor over the first number that's always visible (the secondK '2' in above example), hold Shift and enter the 1st number. For example, to change instr. number to 1E, press Shift-E. Because Shift-0 - 9 have other use, press Amiga-Shift-0 - 9 to change the instr. number to 10 - 19. This is not very handy, but because there won't probably be a lot of songs which have over 31 instruments, it doesn't matter very much. Prompts ======= MED often (especially during file operations) wants to ask you something. For this purpose MEDֳv displays a line of text on the title bar e.g. Remap instruments (Y/N)? You always answer to these questions with keyboard, in this case you would press 'Y' for a positive, and 'N' for a negative answer. If you want to cancel the operation (loading, saving...), you can usually press 'Esc' to do that. Multiple songs ============== MED can have more than one song in memory at a time. However, all songs share the same set of instruments. This allows you to, for example,=)q compose different songs for each level of a game, without having to load or keep the same instrument in memory more than once. On the status bar there are two gadgets which control this feature (see the description of the status bar above). If you click the right gadget (assuming you've just booted MED), MED will request "Add new song (Y/N)?". If you answer 'Y', a new song will be created. You can now move from song 1 to song 2 with these gadgets. If you want to deleQ~te the last song, press the left gadget while holding the Shift key. Again, MED will request you before proceeding. Note: If you want to add a new song without the prompt, you can hold Shift while clicking the right song selection gadget. MED can automatically remap instruments while loading. This feature saves you from a lot of work. For example, you have one song in memory, and you add another (by clicking the right song selection gadget). If you now load a secoH-nd song from disk, MED will ask: "Remap instrument (Y/N)?". If you reply 'N', all previous instruments will be lost and the instruments of the new song will be loaded. But if you reply 'Y', some magic will happen. First, the instruments of the new song will be loaded to empty slots, instruments already in memory will be preserved. Second, the instrument numbers of the loaded song will be remapped so that they point to new places of the instruments. Sometimes, ц:;when there are unused instruments in memory, MED will ask if you want to flush them. This can happen when you Clear the song, or load a new song (replacing another). You can also save all the songs as a single multi-module. You have to select "Module" in the save format requester, and answer 'N' at "Save only current song" prompt. If you select 'Y', only the current song is saved (unused instruments won't be saved). To get rid of all the songs/instruments, click "Clear/ all" on Misc panel. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *************************************************************************** * * * +-------------------------------------------------------------------+ * * | Summary of the features | * * +-------------------------------------------------------------------+ * * ӈba" * *************************************************************************** =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=========================================================+ | Files +=========================================================+ This panel contains the tools you need when handling files. You can save and load with many different formats and alsoԚ_ delete them. First of all, there's a file requester. There should be no difficulties with using it. It is simple, but it works. Directory names are printed in white and files in black. There are three gadgets that allow you to choose what is displayed in the requester. If the Currdir is selected, files in the current directory are displayed. Devices lists all devices e.g. DF0:, DF1:, DH0: etc.. Assign lists all assigned directories (e.g. C:, S:, FONTS:). Y _Pou can also load a directory by typing its name on the Dir-gadget (and pressing Return). The File-gadget contains the filename. If you know already the filename, you can ignore the file requester and type the filename (with correct path from the startup directory). ------- Load Song: This is the gadget used to load songs. Loads songs with following formats: MED V1.12 - V3.20, OctaMED V1.00 - V2.00 (only 4 channels can be p!@flayed) MMD0 (MED modules), SoundFX/old SoundTrackers. The samples are automatically loaded after the song. WARNING: Don't try to load anything as a song!!! If MED can't identify the file, it is loaded as an old SoundTracker file. If it is an old SoundTracker file, it should load well, but if it isn't, you may meet the GURU!!!! MED can't load packed SoundTracker/NoiseTracker files. To "ׇ^ import songs, save them as modules, then load into MED with "ST MOD". MED also recognizes Noise/Protracker modules and prompts if you want to load it as a such (usually you should answer 'Y'). Instr: Loads the sample. The title bar will display the length of the sample if it loaded ok. This will load synthsounds and hybridsounds as well. ST MOD: With this gadget you can load 31-instrument Sound/Noise/Pro- #ؗۧ tracker modules. There are some differences between MED's and Tracker's commands, they're converted automatically. ------- Save Song: When you choose this one, a requester appears and asks you to select the save format. The save formats are described a couple of lines later. There's also "Icon" gadget. When it is selected, MED will create an icon file when saving Song or Sng+samples. If you don't need the icon, t$rZXurn it off to save some disk space. Instr: Saves the current sample/synthsound/hybrid sound. If you want to save samples in IFF-format, set the switch in sample editor. Delete: Deletes the file. MED requests if you really want to delete it. ======= Save formats There are several different file formats available: Song This is the normal song, which you will probably use most often. The song is saved using a highly-compress%Ving file format. The samples are not saved. They are loaded from your instrument disk(s) using the path list (or absolute paths if instrument names are e.g. ST-01:Ringpiano). Sng+samples Saves the song like the previous one, but also attaches the samples to the end of the file. The result is one big file which contains everything needed. This format makes usually a bit shorter files than Module, but I recommend that you &1fnow save your songs as a module, at least if they'll be distributed. Module (MMD0) This is the most flexible file format, which allows you to save all song information, like Sng+samples, but this format is most likely understood by external programs, because Sng+samples is quite tricky to load and use. Also, multiple songs can be saved in one module. In general, files saved in this format are longer than Sng+samples file' W~s. When you save a module, you'll be asked "Save instrument names etc". If you answer 'Y', all data is saved. Otherwise only the data required for playing the song is saved. The copyright/annotation text is always saved. ST-Module If you want to export music to Sound/Noise/Protracker, you can use this gadget to save the song as a module. NOTE: Because there are many things in MED that are not supported by(v%i Trackers, some information may be lost: - samples 10 - 1V won't work - only 4 tracks saved, no MIDI support - blocks longer than 64 lines will be truncated to 64 lines - no color or pointer jump information - no relative volume settings, no play/instrument transpose - no hold/decay - no support for synthsound/hybrid sounds NOTE 2: The resulted file will be a 31-instrumen)p-t module. If you try to use it with programs supporting only old modules, it'll most likely fail. +=========================================================+ | Play +=========================================================+ This is a very important panel. Here you can control the playing, set the playback speed (tempo), handle the playseq list... Beginning from the left, there is a tall box which contains numbers "00" if there's no *ߡ՘ song in memory. This is a window to the playseq list. As mentioned above, the playseq list is the list of blocks to be played. This window show 5 numbers of the list at a time. There are gadgets on the right side of the box which scroll the list up/down/beginning/end. The keyboard equivalent is to hold down the Ctrl-key and then press number 8 from numeric keypad to scroll up, 2 to scroll down, 7 (home) to the beginning, 1 (end) to the end. On the right side +yof the scroll gadgets are the following gadgets: + - Ins Del Ins (with small arrow pointing down) + increases the current playseq number (Ctrl - keypad 6) - decreases the playseq number (Ctrl - keypad 4) Ins inserts a new sequence number (zero) under the cursor (Ctrl - keypad 0 (Ins)) Del deletes the current sequence number (Ctrl - keypad . (Del)) Ins (w/arrow) inserts a new sequence number,>), the new number will be the number of current block (Ctrl - keypad 5) ------- Controlling the playing Play song starts playing the song from the beginning. Continue song starts playing from the current playseq entry and cursor pos. Play block plays the current block (starts from the beginning). "D" (next to Play Block) starts playing block when you enter a note (editing must be on). Continue block starts playing the current block from -!the cursor position. Stop playing stops playing the song. You can also use it to kill the notes played from the Amiga/MIDI keyboard. The shortcuts of these commands: Stop playing press just Space Play song press Space with Alt+Shift held down Continue song press Space with Shift down Continue block press Space with Alt held down Play block no shortcut, sorry. ------- Tempo (playing speed) To understand this compl.ebetely, you need to know some technical aspects. MED uses the CIAB timers for timing. They give "timing pulses" that trigger the MED's player interrupt. On each timing pulse effects are handled (e.g. commands 1,2,3,4,5,D, hold/decay, synthsounds), but new note is usually not played on each pulse. The time between timing pulses can be changed (primary tempo). The new note is usually played on every 6th pulse, but this can be changed too (secondary tempo), fo/x'r example, if new note was played on every 3th pulse, the playing speed would be twice as fast. This doesn't affect the speed of effects. Graphically: pulse \ PLAY NOTE the time between pulses can be changed (primary tempo) pulse / DO EFFECTS \ \ pulse DO EFFECTS \ The number of pulses between / notes can be changed (4 in this example). pulse DO EFFECTS / Thi0ts is the secondary tempo. / pulse PLAY NOTE ... The left proportional gadget controls the primary tempo. It can be 1 - 240. The bigger the number, the faster the speed. Note that tempos 1 - 10 are Tracker-compatible (but obsolete, because secondary tempo can be used now). The right one controls the secondary tempo (default = 6). It can be 1 - 20 (note: hexadecimal!!). The lower, the faster. This allows quite rough setting of p12laying speed (it's the way NoiseTracker etc. set their tempos). In MIDI use (especially for syncing), you should leave this to 6 and use the primary tempo instead. LP-Filter with this gadget you can turn on/off the audio filter built into your Amiga. When this gadget is selected and the power-LED is bright, the filter is on. If the LED is dim, the filter is off. You probably want to keep it off. T2NEthe state of this switch will be saved with songs. NOTE: With Amiga 1000's, it's not possible to turn off the filter without modifications to the computer. Please keep the filter off. E1, E2, E3 If you've played something with MED, you have found the three "equalizers" (in fact, they are not equalizers, but I'll use this word, because many others do so too...) E1 turns off/on the red bars at the b3Rottom of the screen (PAL machines only). E2 turns off/on the four colorful sprites. E3 turns off/on the signal "oscilloscope" displays. These all are turned off to save processor time when you click the right mouse button to show the title bar, but if you want to disable something, it probably is E3. The signal display eats lots of the processor time (on standard 68000). B4$ecause of that, the display is turned off during disk access to speed loading/saving. You may want to keep E3 disabled all the time. STS Normally effects are done on every timing pulse (see above). When this switch is on, the effects are NOT done on the first pulse (when the note is played). This is the way the Trackers do that, and this switch is for compatibility only. V: Hex/Dec This5Zgp is another compability switch. While the data bytes of the commands are usually hex numbers, it's possible to use the volume-command with hex or decimal argument. When Hex is selected, the acceptable volumes are 00 - 40. When Dec is selected, the volume can be 00 - 64. If you are not a programmer (and even if you are), it may be easier to think the numbers in decimal. It is the 6up default. The state of this switch will be saved with songs. You can easily convert all volume commands from decimal to hex and vice versa. If Dec is selected and you click Hex while holding the Shift key down, automatic conversion is done (works on the same way to the opposite direction too). I recommend using Hex volumes whenever possible. It is slightly faster (no77t noticeably, but faster anyway). Channels 4 5 6 7 8 These are the channel configuration selection gadgets of OctaMED. On MED, they just don't work. ------- Panic stop It's possible to make a song, which takes all of the processor time. It will therefore be impossible to stop it. This shouldn't happen accidentally, but if you fill a block with notes and command FF3 and set tempo to 240, you'll get the idea. To stop playing in this case, h8홵old both mouse buttons down about 5 - 6 seconds. +=========================================================+ | Instr +=========================================================+ Here you can load samples and alter some characteristics of them. First I should note out some important actions which are available on the keyboard: Shift-Cursor Left/Right = select previous/next sample Shift-Alt-Cursor L/R = 16 samples forward/backwards Amiga-I = activate 9 Isample name gadget Shift-Amiga-I = clear and activate sample name gadget Amiga-R = activate repeat gadget Amiga-J = jump on/off At the top left corner of this panel is the sample number (01 - 1V) followed by the sample name gadget followed by the length of current sample in bytes ("-" if no sample loaded). To load a sample, you can write the name of it in the string gadget, then click "^ Load Sample ^" (or just press Return). Above :Y the Load Sample gadget are gadgets that select first, previous, next or last sample. L.U. (Last Used) selects the last sample that is in memory. On the left side of them are two gadgets ("Jump", "Flush"). "Jump" causes jumping when this instrument is played. "Flush" removes this instrument. It frees the memory used by it (handy when you're very low on memory) and clears all the values. Jumpings will be saved with songs. "Transpose" is one of the new feat;lures of V2.10. It works like "Play transpose" but only for this instrument. So, if "Transpose" is -2, for example, then this instrument is played two halfsteps lower. Repeat means that when you play a note with some instrument, the note will play forever, until you play a new note. A picture tells more than 1000 words: the beginning repeat start offset the end v v v Sa<@>mple: | This part is played only once | This part is looped forever | | \__________repeat_______________/ \________repeat length______/ "Repeat" is the length of the part which is played only once (in bytes). "Repeat length" is the length of the part which is played forever (also in bytes). When you load IFF-instruments, these values are automatically loaded. They can be also set in path file, so that when you load a sample, you will also get the repeat values. Gad=$get REP/BEG is the repeat start offset, REP/LEN is the length. If the repeat length is lower than 4, no repeat will occur. The big proportional gadget controls the default volume of the current instrument: 64 = maximum, 0 = silent. It's displayed in both hex and decimal. ------- Hld/Dec (Hold/Decay) (again a thing, that is difficult to explain...) With Hold, you can set the exact duration of the note (in timing pulses). The note is then turned off (if decay is >}0) or decay is started. In this example, I assume that the secondary tempo is 6 (one line is one timing pulse) 1. no hold 0 PLAY+fx C-2 1000 <= play note 1 fx 2 fx 3 fx 4 fx 5 fx 0 PLAY+fx D-3 1000 <= stop previous and play new 1 fx ... 2. with hold set to '2' 0 PLAY+fx C-2 1000 <= play note 1 fx 2 STOP+fx <= stop it 3 fx 4 fx (silence here) 5 fx 0 PLAY+fx D-3 1000 <= play new note In example 1, (without hold) you can set the note duration only roughly (ac?lUcuracy of 6 timing pulses). In example 2, the note duration is only two timing pulses (because hold = 2). So, this allows a powerful definition of note length, but it can't be used with long notes, because the note stops immediately?? Wrong!! Look at this: 000 C-2 1000 / line# pulse# action 001 -|- 1000 / 003 0 continue note... 002 -|- 1000 / 003 1 continue note... 003 -|- 1000 => ZOOMED => 003 2 STOP NOTE 00@{4 --- 0000 \ 003 3 (silence) 005 D-3 1000 \ 003 4 (silence) ... So, the keep holding -symbol (-|-) allows you to make the note longer. The keep holding -symbol can be entered by clearing the note and setting the instrument number only, or easier: by pressing Return. If the decay is 0, the note is turned off immediately after the stopping point. You can set the decay to happen as well (1 = slowest). Decay doesn't work witAG+`h MIDI-instruments. If you're using synthsounds or hybrid sounds, see Synthsounds.doc, because the decay is handled quite differently with them. The hold/decay is a quite useful feature, so I recommend you learn to use it!! (Thanks to ZAP for suggesting me this feature!!) +=========================================================+ | Block +=========================================================+ This panel contains most of the block handling things and B?Kthe copy operations. Trk: Cut Copy Paste Swap These gadgets are used to cut/copy/paste tracks. Swap swaps the contents of the copy buffer and current track. The keyboard shortcuts for Cut/Copy/Paste are: Amiga-X, Amiga-C, Amiga-V Blk: Cut Copy Paste Swap These work just like the previous, they just affect the entire block. The keyboard shortcuts are also just like the previous except hold down the Shift key too CI3(Amiga-Shift-X...). Del buff When you don't need the contents of the buffer any more, you can click this gadget to free the memory allocated for the buffer. It's useful when you're very low on memory. The buffer is freed automatically when you exit, so you may not need this gadget at all. Then there are the block commands. Trks: 4 8 12 16 You can select how many tracks you want this block to have. Note that tracks 4 - Dl{F can be used only with MIDI devices. Note also that when you decrease the number of tracks, the higher tracks will be lost (no Are you sure? requesters). Lines: 64 < > These gadgets are used for selecting the number of lines in this block. gadgets increase/decrease the number by 10, < > gadget by 1. The preferred way is to write the number directly into the string gadget (less memory fragmentation). 1 2 3 4 8 16 C EoJN It may be helpful for easier positioning of notes to be able to "mark" lines some way (especially if the block is long). You can make some lines appear with reversed colors, if you want. 1 highlight every line, 2 highlights every other line, 3 high- lights every third line and so on. C clears all highlighting from this block. You can also mark individual lines with TAB-key. The highlighting can be removed by highlighting the lF+ine(s) again. The highlightings are saved with songs. New block This gadget creates a new block after the last block. The new block will have the same number of tracks and lines as the current block. DEF This is the same as 'New block' except that the block length is always set to 64 and the number of tracks to four (eight, if you're in 5 - 8 channel mode). New here Creates a new block here, shifts all following blGocks forward. The playseq numbers are corrected so that the song won't change. DEF Uses default length/number of tracks, see DEF definition above. Del last Deletes the last block (no warning messages, be careful). Del this Deletes the current block. Playseq numbers corrected. Split Splits the current block so that the current line will be the first line of the next block. Join Joins this block and the following block together. Ins.HdL. Inserts an empty line under the cursor. The block length is increased by one and the notes are shifted one step forward. Del.L. Deletes the current line. Block length is decreased and the lines are shifted backwards. Ins.Trk Inserts a new track. The subsequent tracks are shifted one step to right, and the rightmost track is lost. Del.Trk Deletes current track, and the subsequent tracks are shifted to left one step. Expand When you haHHEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      FIHUve created a nice-sounding block, but you would like to include e.g. some fast rhythm patterns, but you notice that the block plays too slowly for the patterns. "Expand" changes the size of the block and creates empty lines between notes. Now you can increase the tempo and insert the rhythm patterns. NOTE: The maximum length of the expanded block may not be greater than 256 lines. In that case, you'll get a warning, and expansionJHK is not done. Also, if you want to make fast rhythm patterns, see first instructions for commands FF1, FF2, FF3. They may be an easier way. Shrink When you have expanded the block, you can return it to the original state by pressing shrink. This function exists for symmetry. It has not much real use. The number gadget between these two gadgets is the amount of expanding. E.g. 2 doubles the length (inserts one empty line between each noKoLte). 3 would triple the length, and so on. +=========================================================+ | Edit +=========================================================+ Edit-panel contains functions that help editing. On: These are the switches that allow you to switch temporarily any track off and back on. The 16 lights in the status bar show you which tracks are on, when you're not using the Edit panel. ST setLls all tracks on, CL sets all tracks off. Edit and SPC at the right corner are the bigger equivalents of "E" and "SP" in the status bar. "Edit" turns editing on/off and SPC turns on/off extra spacing between notes. You can type the space value in the string gadget next to the SPC-gadget (1 - 16). When you enter notes during playing (in real time) with SPC on, the notes will be quantizedM.5 e.g. if SPC = 2, the notes will be placed only on even-numbered lines. Keyboard: Edit on/off = Esc, SPC = ~ (below ESC) 1+2, 2+3, 3+4, 4+5 on the left corner select the keyboard octaves which are used. This can be done also with F1 - F4 keys. ------- Programmable keys It's possible to assign 10 different notes/commands to number 0 - 9. Then you can insert the note/command with Shift- 0 - 9. You can also assign commands to LN3eft and Right Alt. When you then enter notes, holding down the Alt, command is inserted to the note. The programmable keys are especially useful when entering drum-rhythms etc. The definitions can be saved so that they're automatically loaded when you start MED next time. It's also possible to pick up a range of notes (they can't be edited after picking). "Edit"-panel contains gadgets, which you can use to edit the notes/cmds. Only one note/cmd of the 12 is displayed at a Otime. 0-9 Shows the current 'Shift-number key' definition, the number is shown above the arrow gadgets, which can be used to change it. L.Alt Shows the definition of Left Alt R.Alt Shows the definition of Right Alt The current definition of each key is displayed on the Edit-panel. If some number is marked as "x", it's "transparent", the existing number will not be changed when the note is entered to the block (with Shift 0 - 9). You can change the definition P8'by picking a note, but you can change it in another way as well. Click the number to be changed, and enter a new number from keyboard while still holding the mouse button, and pointing the number to be changed. If you want to change several numbers, you don't have to release the button. Just position the mouse over the number you want to change. For example, if you wanted to clear all commands from this track (but leave the notes) you could make a following definitiQTBSXon: xxx xx000 Because the note is "xxx" and instrument number is "xx", they won't be changed, and only the command is cleared. Then you can just hold down the Shift and the number key and let the key-repeat do the job. R.Alt and L.Alt are a bit different: the note number is always "xxx" and the instrument number by default is "xx". Pick note copies the note currently under the cursor to this key. You can also pick, for example #7 by pressing SRˡohift-Ctrl-7. Pick range picks the current range as a definition of this key Pick buf picks the copy buffer as a definition of this key Clr clears the definition of this key. SPACE=DEL Some people may prefer using the space bar instead of DEL when entering blank notes. This switch makes it possible. Keypad: Track on/off / Sel.instr This allows you to set the keypad operating mode. When it's set to "Track on/off", the keypad can be used toS G turn tracks 0 - F on/off. When "Sel.instr" is selected, you can select quickly the first 16 instruments. The layout is as follows: [ = 0 ] = 1 / = 2 * = 3 7 = 4 8 = 5 9 = 6 - = 7 4 = 8 5 = 9 6 = 10 + = 11 1 = 12 2 = 13 3 = 14 . = 15 Advance Here are some quite useful editing options, that control the automatic advancing of the cursor after entering something. (down arrow) When this is selected, the cursT ~or automatically moves to the next line when a note is entered. Shortcut: Ctrl-A (up arrow) Moves the cursor to the previous line, when note entered. This is probably not very useful (but interesting...) > When entering effect numbers, the cursor is moved to right (but not to next line). < When entering numbers, the cursor moU aves to left. (again, not too useful...) >> When entering notes, the cursor is moved to the next track. << When entering notes, cursor is moved to the previous track. +=========================================================+ | Misc +=========================================================+ Some miscellaneous and not very important things and a VERY important thing (quV `itting). On the left there are gadgets for changing the screen colors. No need to explain?? All right, I won't. But just remember that the colors are saved when you save your song (they can give some "feel and expression"). You can also set the default colors of MED by clicking Save prefs. Jumping: Off 8th Smp When you don't want to see the "funny" mouse pointer, select Off. When you want him to jump every 8th note, select 8th. When you want him tW |Oo jump when some sample is played, select Smp. The instruments which cause him to jump are selected from "Instr"-panel (gadget name: Jump). The name of the pointer is Topi (according to my cousin). Clear All, Clear song only, Quit These are very dangerous functions, in fact they're so dangerous that you must click 'Confirm' after you've selected one of them: "Clear All" does just as it says. Clears the song, removes all XH1 instruments from memory. In two words: clears everything. Note: This clears ALL songs. "Clear song only" is not as destructive. While it destroys the song, it leaves the instruments (if you want to create a new song without reloading the instruments). Note: This clears only the current song. "Quit" is the most destructive. It does everything "Clear All" does, but even worse, it quits MED!!!!!! This function wYa1~as made for program testing and it probably doesn't have any real use ;-) Paths: Add/Rem These affect the sample names when loading songs/samples. Add Adds the complete path of the sample when you load e.g. if you load sample "PopSnare2" from "ST-01:", the sample name will be "ST-01:PopSnare2". Rem Usually songs made with Trackers have sample names like "ST-02:AhhVox"Z<@. If you want that the samples are loaded using the path list instead of absolute names (if your samples are in hard disk, for example) you can remove "ST-xx:" from sample names and reload them, but when you "Rem paths" is selected, any paths before the sample names are removed quickly and easily during loading. Both of these can be active at the sam[6,Ie time. In that case the original path is removed, instrument is loaded using the path list, and the path name from the path list will be added. Note that the maximum length of a instrument name is 39 chars, so if the path name is very long, something may be lost. H->B: This selects the name of the note between A# and C. In some countries, it's H. In some other countries it's B. WB: Open/Close These gadgets allow you to\ easily close/reopen the Workbench screen to give you extra memory space. Save prefs This will save the default settings of MED to S:med.config. When you start MED next time, these settings will be loaded. The following things will be saved: Current screen colors as default colors H->B State of E1, E2 and E3 switches Screen depth (Dep2) NO16 Space = Del]a Keypad mode Automatic advance settings Current programmable key definitions Jump: Off PTKey Dep2 This changes the screen depth from 8-colors to 4 colors. This frees some chip memory, but most important: it releases lots of DMA-time. In plain English: MED will run faster (but looks less pretty). NO16 This gadget disables the 12/16 track display on OctaMED. On MED, i^t does nothing. PTKEY This switch changes the keyboard operation so, that the most common Protracker keyboard options will be recognized. This is helpful for those who have got used to Protracker keyboard layout. The following PT shortcuts are recognized: Right shift Turns editing on, starts playing the block (= record) Right alt Continue song Right Amiga Play block L-Alt+curs.L/R Previous/next block S_&'hift+curs.L/R Increase/decrease playseq position Space Stops playing/toggles editing. TAB Next track Shift-TAB Previous track Shift-F3 - F5 Cut/Copy/Paste track Alt-F3 - F5 Cut/Copy/Paste block If there are any other Protracker options you'd like MED to recognize, please let me (Teijo) know. +=========================================================+ | Vol +===========================`P==============================+ This panel allows you to set the proportional volume of each track. In addition you can also set the master volume. The proportional value can be 1 - 64. If both the master volume and the volume of a track are 64, that track is played on full volume. If the master volume was 32 and a track volume was 32, the volume of that track would be 1/4 of the full volume. There are two sets of < 64 > gadgets. The one on the right is a9U&sthe master volume. The left one changes the volume of the selected track. You can select the track, by clicking a number above the gadgets. The currently selected number is highlighted. This is quite easy, so no problems should appear. The track volumes and the master volume are saved with songs. +=========================================================+ | MIDI +=========================================================+ MED can output notes and some commands tobTGX external MIDI-devices (keyboards, synthesizers...). The MIDI-panel contains the MIDI-stuff which is needed for that. When you decide that some instrument should be a MIDI-instrument, you select the MIDI channel for it. "MIDI ch"-gadgets are used for that. If you select e.g. MIDI channel 2, the notes of the current instrument are sent in MIDI channel 2 (simple, isn't it?). Remember to set the default volume (Sample panel). Also, you need to activate MIDI (clickc;L "MIDI active"). If the serial port is used by some other program, you can't use MIDI. Then you must terminate the other program and try again. After you have activated MIDI, MED starts sending "active sensing" messages ($FE). Active sensing can be turned off with the "Act.sensing"-gadget. By default MED uses the default preset of that channel (which you have set on your MIDI device). If you want to use other presets, you can select them using the "MIDI pres #"-gadgets, indy that case the program change message is transmitted when a note is played. Preset number 0 means that the default preset is used (the preset is never changed for this instrument). If you want to send a preset change command, but don't want to play a note yet, use the command C00 with any note. In that case, the preset will be changed, but no note will be transmitted. You can have instruments with differents preset numbers, but which will use the same MIDI channel. eBhAIn that case, MED will automatically send the program change message whenever the instrument with different preset number is used. You can use MIDI-instruments on all 16 tracks (if there are 16 tracks on the current block). You can also freely mix samples and MIDI-instruments on the same track (tracks 0 - 3 only). One helpful keyboard command is Ctrl-Space. This command resets pitch- benders and modulation wheels on all channels. Also, if you have changed presets onf your MIDI-device, MED can't detect this and thinks that the preset is not changed. Ctrl-Space causes MED to resend program change commands for all channels, when playing. There's a gadget: "Reset pb+pres" that does the same thing. The "MIDI reset"-gadget sends a MIDI reset command ($FF). If you turn "Send sync" on, MED will send MIDI sync information, and allow other devices to synchronize with MED. When "Ext sync" is on, MED can be synced externally. You musgD!t also have input active when this is turned on. The synchronization works only when you play song, when you're playing a single block, the syncing is disabled. L.Ctrl on/off gadgets allow you to easily send Local control on/off messages. Suppr.N.Off suppresses Note Off messages of the current instrument. Some devices may have some instruments (e.g. one-shot drum sounds) which actually ignore the Note Off messages. When Suppr.N.Off is selected, Note OffhbAs are not sent for the current instrument. This reduces some unnecessary MIDI output (slightly faster). There are commands which control the pitchbender, modulation wheel etc. Detailed documetation later (again??). ------- Entering notes with MIDI You can use your keyboard, synthesizer or whatever, to insert notes (you don't need to use your Amiga's keyboard to entering). You must activate the "Input"-gadget. If editing is on and your MIDI-device is sending notes, ti?hey will be entered. You can also enter Amiga-samples with MIDI. Next to the Input-gadget, there's a integer gadget, that contains the number of the input MIDI channel. If it's 0, then MED will accept input from all MIDI channels. "Read volume" gadget may be sometimes quite useful. If you have a velocity- sensitive keyboard, the volume will be entered in the command-part when you enter notes and this gadget is selected. "Read key-up" is not as useful. When it's actij Rve, MED records key-up events. It can be used in real-time recording (and mostly for long notes). You may have noticed that you can't directly use all the octaves which are available on the MIDI device. "Instrument transpose" helps this. You can have two instruments with identical settings except for different instrument transpose. With instrument transpose you can reach nearly the full range of notes. NOTE: When you have a MIDI-instrument, its name doesn't really have anyk!g use. However it's good practice to type in the names of the presets. This way you can easily see the presets, and, if you give the song to somebody else who may have different MIDI-equipment, he/she can easily change the preset numbers to use the correct presets on his/her MIDI-device. +=========================================================+ | Trans +=========================================================+ Starting from the bottom, thel"g3re's a long string gadget that can hold an annotation text for the song. When you save the song, the text in this gadget will be saved, and it will be displayed when loading the song. The other functions of this panel has something to do with transposing notes. When you're doing some transposing, you should first decide which areas the transposing should affect. At the top of the panel there are gadgets to select this: Affect/song the functions of this pam#g>nel will affect the whole song Affect/block the functions will affect the current block Affect/track current track will be affected Affect/sel.trks selected tracks in this block will be affected Affect/range the range selected with mouse will be affected Instr/all all instruments affected Instr/curr only the current instrument affected First there are some simple transposing operations: 1/2 ^ (<-arrow up) transposes the affection arean$"< up one half-step 1/2 v (<-arrow down) transposes down one half-step oct ^ transposes one octave up oct v transposes one octave down ------- Note (ex)change Suppose you want to change all D-3's of instr 2 in your song to C-1. First you set Affect/song (affect the whole song). The you go to instrument #2 and select Instr/curr (to affect only this instrument). Now you click the box at the right of the text "Note", hold down the mouse button, and enter note D-3 fo%rom keyboard (D-3 will be displayed). This is the source note name. Then you click the box at the right of the source note box, hold the mouse button again, and enter C-1. Now you have set the destination note. Finally you just click the "->" gadget at the right of the dest. note box. If you had wanted to exchange the notes (D-3 => C-1 AND C-1 => D-3), you would have clicked the "<->" gadget instead. ------- Instrument deletion/changing The left instrument number is tp&ϵhe source number and the right one is the destination number. To set them, select the instrument (e.g. Shift- cursor left/right) and click on the number. Del Deletes the notes with source instrument number. -> Changes the source instrument number to dest. instrument number <-> Exchanges the source and instrument numbers ------- Play transpose This gadgets allows you transpose the whole song quickly. It doesn't change the notes, it only affects playing. +=====q'zH.====================================================+ | Range +=========================================================+ This panel contains many of the range-editing options. The range is a rectangular area of notes in a block. It is selected by dragging using the right mouse button and (then moving the mouse). It only works on vertical note display. The numbers at the right bottom corner show you the starting/ending tracks and starting/ending lines of the blor(ck. At the left side of the panel, there are gadgets "Select track" and "Select block". These allow you to select a single track or block quickly. To the right of them, there are gadgets for range operations. The simplest is "Clear". It clears all notes in the range. Above it is "Cut". It also clears the notes, but copies them to the copy buffer for later pasting. "Copy" doesn't clear the notes, just copies them to the copy buffer. You can paste the conts))ents of the copy buffer with "Paste". The copy buffer will then be copied starting at the cursor. If the copy buffer contains e.g. 3 tracks, and you don't want to copy them to consecutive tracks, but e.g. tracks 2, 7, and 9, You would select tracks 2, 7, and 9 with track-selection gadgets (at the top), and then click "Paste select". The notes will be pasted only to selected tracks. The "Cancel" gadget can be used to forget the range (e.g. if you've accidt* entaly hit the RMB). You can achieve the same effect with moving to another block. Spread 2/3/4 allow you to spread notes on one track to consecutive tracks. For example, get an empty block, fill track 0 with notes, select track 0 (with "Select track" for example), and try these gadgets. S1, S2 These gadgets can perform the quite tedious task of creating slides. Here's how it works (example): You want to make a slide from C-2 to G-2:u+\E 000 C-2 1000 001 --- 0000 002 --- 0000 003 --- 0000 004 --- 0000 005 G-2 1000 006 --- 0000 Move the cursor to the line where you want the slide to begin (in this example, line 002). Then click S1 or S2. Result: If you click S1 If you click S2 000 C-2 10v,00 000 C-2 1000 001 --- 0000 001 --- 0000 002 G-2 1306 002 --- 0108 003 --- 0306 003 --- 0108 004 --- 0306 004 --- 0108 005 --- 0306 005 G-2 1000 006 --- 0000 006 --- 0000 The better result is usually achieved using S1. S1 and S2 use the different sliding commandsw-. (that's the difference). With S2, the second note is also replayed. The commands itself are documented later. Keyboard: S1 = Amiga-T, S2 = Shift-Amiga-T VOL Creates a volume slide. With this option, it's possible to create easily fades etc. Example: 009 --- 0C50 <-start volume \ 009 --- 0C50 010 --- 0000 =================\ 010 --- 0C47 011 ---x.?m 0000 | Click "VOL" \ 011 --- 0C44 012 --- 0000 | / 012 --- 0C40 013 --- 0000 =================/ 013 --- 0C37 014 --- 0C34 <-end volume / 014 --- 0C34 The cursor must be positioned somewhere between the C- commands (on lines 10 - 13 in this example). Select: 0, 1, 2, ... E, F These gadgets are used to select tracks (not range). Some track- based operations may need thy/is (e.g. Paste select), or you can set the transpose operations to affect the selected tracks. ST selects all tracks, while CL deselects them. Chord This gadget can be used if you want to enter chords. First you should select the tracks, which the chord entering affects (with above gadgets). The chord always starts from the current track and then continues to the next selected track etc... After you've selected this gadget and z0=turned editing on, you can try entering a major C-chord (select all tracks now, because this is just an example!!). Press Q (C), hold it down. Then press E (E) holding both keys still down. Finally T (G). Now you can release the keys, and the cursor moves back to the starting track and advances line. Chord editing works well with MIDI too. ============================================================================ ===================={1Q)======================================================== Big displays MED has some panels, that are displayed in the large area (where the notes usually are). The rightmost strip of panel-selection gadgets are used to select one of the five possible big displays. The displays (gagdets) are: Vertical note display (Notation editor, in OctaMED V2 only!) Synthetic sound editor Sample editor Sample list *===========================|2I1f================================================ * Synthetic sound editor *=========================================================================== See the doc file "Synthsounds.doc"... *=========================================================================== * Sample editor *=========================================================================== See the doc file "Sample_editor.doc"... *==========================================================================}3-= * Sample list *=========================================================================== ------- What is it?? Sample list is a list of all your samples and sample disks/directories. You can easily scan through your sample lists and load a sample by clicking its name. When you've constructed the sample list, it is saved and always loaded when you run MED. You don't have to load directories of your sample disks more than once. Sample list (MED_paths) conta~4nh:ins the directory declarations, so MED can automatically load your samples from correct disks, minimizing disk swappings, when you load songs. ------- How to create a Sample list?? Using the filerequester, load the directory of your sample disk/dir. Then go to the "SList"-panel. Now click Dir/ADD. You should see the filenames of the directory to appear. You can now examine the list, and if there are files which are not samples, dest5oroy them from the list with Instr/DEL. Repeat this procedure for each sampledisk/dir you have. You can select the displayed directory with the right display, which displays the directory names. When you have made the list, you probably want to save it. Save/S: does the job. If you click CD, the path file will be saved to the current directory (be sure that it is the same where you started MED). If you click "S:", 6the file will be saved to the S:-directory. I prefer placing the file in S:, because then it doesn't matter which is the current directory when starting MED. The file is called "MED_paths". If you later want to add entries to the directory, you can delete the whole directory from the list with Dir/DEL. Then you must click the name of the directory to remove. Then you can reload the directory. You can also add entr7ies one at a time. If you click Instr/ADD, the name of the current sample is added to the list. Also the repeat/rep.length values are then added to the list (form: Asia::480/5362). Note that the previous entry with same name is not deleted, so you must delete it by hand (using Instr/DEL), if you want to add rep./rep.len values to the list. If the current instrument is a MIDI-instrument when you add the n8ame, the name will be a form E.Piano::M6/4 . The 1st number is the channel, the 2nd is the preset. When you later load instrument of that name, the MIDI-channel/preset will be set. Note that the instrument with this name doesn't really have to exist in that directory, it's like a "dummy" entry. You may want to create a "dummy" directory for these dummy MIDI entries (empty dir). At the top is the box displaying the9y. directory name and number. The right display only displays the last 16 chars of the dir name, because it's the most meaningful. For example some of my instruments are located in directory: work:samples/ST-01/ If the box showed the first 16 chars, it would be "work:samples/ST-" (which isn't as helpful). The instrument loading is simple. Just click the instrument name on the left display, and it's:Iw5 loaded. ------- Loading MED_paths You can load a new MED_paths file, using the file requester. If you select a file called MED_paths, you'll be immediately requested if you want to load it. If you press 'R', the list in the memory will be lost and the new one will be loaded. If 'A' is pressed, the current path list is preserved and the new one will be appended to it. Finally, I reveal the keyboard shortcuts... ;4V Alt-numeric keypad-8 = scroll the list up (very useful) Alt-numeric keypad-2 = scroll the list down (very too) Alt-keypad-9 (PgUp) = scroll the list up fast Alt-keypad-3 (PgDn) = scroll the list down fast Alt-keypad-7 (Home) = to the beginning of the list Alt-keypad-1 (End) = to the end of the list +-------------------------------------------------------------------+ |+-------------w&tch of the note quickly (6 times during 1 note). It can be used to create "chords" or special effects. If you've listened to music made with the C-64, you MUST have heard arpeggios. The pitch is changed between 3 different pitches during one note: the 1st pitch is the pitch of the original note the 2nd pitch is the pitch of the original note + the 1st number of databyte halfsteps up the 3rd pitch is the pitch of the original note + the 2nd n?ֳ( umber of databyte halfsteps up Note: 3rd pitch | 2nd pitch | 1st pitch | 3rd pitch | 2nd pitch | 1st pitch changed 6 times during note It may be a bit difficult to understand, so here's an example: You want to make an arpeggio which sounds like C-major chord. The lowest pitch is C (C-2 in this example). The second is E-2 (4 halfsteps higher than C-2). The third is G-2 (7 halfsteps higher than C-2). 4 halfsteps from C-2 -+ 7 halfsteps from C-2 @3: |/ That produces: C-2 1047 --- 0047 --- 0047 and so on... Data byte for a minor chord would be 37. The arpeggios sound better with some instruments than others. MIDI: See command 5 for a description. +---------------------------------------------------+ | Command 1: SLIDE UP MIDI: pitchbender up | +---------------------------------------------------+ This command slides up the pitch of the current track. With Amiga samples: A Decreases the period of the note the amount of databyte on each timing pulse. Sounds rather technical?? Yes... The instructions for previous (before 2.10) versions of MED contained detailed instructions for making good-sounding slides with this command. Because this version now contains the easy automatic slide making (Amiga-T), I felt that these instructions are not necessary any more. If you use this function for special effBxects (not real slides) then you can experiment with the values for the databyte. Example: A-1 1000 --- 0000 --- 010F <- slide up a bit With MIDI: This commands works very differently with MIDI. It actually "turns" the pitchbender 8 * databyte steps up on each timing pulse. Because the actual range of the pitchbender may be different with different MIDI-devices, you must find the rigC;ht value by experimenting. There's also one thing you should know: when a new note is played, the pitchbender is not resetted automatically. To reset the pitchbender, you use this command with databyte zero. Example: G-2 L1FF <-turn it up very quick --- 0000 --- 0100 <- then reset the pitchbender +---------------------------------------------------+ | Command 2: SLIDE DOWN MIDI: pitchbender dowDn | +---------------------------------------------------+ Not much about this command. It's just like command 1 except it slides down. +---------------------------------------------------+ | Command 3: PORTAMENTO MIDI: set pitchbender | +---------------------------------------------------+ This is another slide command (on some old MED versions (2.00) this was a vibrato command, see command 5 now). It can be used to make perfect slides more easily. First an example: Ek C-2 5000 <- played note C --- 0000 E-2 5305 <- this note is not played!! Instead, slide target is set --- 0300 to G-2 and slide speed is 5 --- 0300 <- when speed is zero, use the previous speed --- 0306 <- the speed can be changed, of course This example would slide from C-2 to E-2, but the slide stops EXACTLY when E-2 is reached. The remaining 3's have no effect. This command is easier to handle with automatic slide making (see EdiG(t/S1 above). MIDI: By using this command, you can set the pitchbender to an absolute value, instead of sliding as commands 1 and 2 do. The data byte is the pitchbender value, expressed as a signed hexadecimal digit (a nightmare to non-programmers!). 00 = center position 80 (-7F) = smallest value 7F = largest value Example: C-2 3000 --- 037F <- pitchbender to max. value --- 0300 <- reset +---------------------------------------------F[;cba`_^]\[ZYXWVUTSRQPONMLKJIHGH4------+ | Command 4: VIBRATO MIDI: modulation wheel | +---------------------------------------------------+ The first number of the data byte is vibrato speed, the second is vibrato depth. If the numbers are zeros, the previous speed and depth is used. Example: F-215000 --- 0000 --- 0433 <- slow, not much depth --- 0437 <- more depth --- 043F <- full depth --- 0482 <- fast, not very deep MIDI: This command affects the modulationIjg wheel of the current channel. The data byte can be 00 - 7F. 00 = no modulation, 7F = maximum. Values 80 - FF are reserved for future expansion (and won't work). +---------------------------------------------------+ | Command 5: OLD VIBRATO MIDI: controller number| +---------------------------------------------------+ This is the old vibrato command (previously it was 3). The command 3 is automatically converted to 5 when loading old MED songs. The pitch of the notJ [e is changed between two values, databyte is the depth. Example: A#1 J502 --- 0507 increasing depth --- 0517 v --- 0527 --- 0537 MIDI: Command 5 in conjunction with command 0 allows you to change any controller of MIDI (command $Bx cc vv, where cc = controller number, vv = value). First you set the number of controller you want to change with command 5. Then you can select the value with command 0. Subsequent uses of command 0 will affect the coK/ntroller previously set with command 5. Each channel has its own controller number. If the controller value is $00, you can't use '00', because the command '000' means 'do nothing'. Instead, you type '80'. Acceptable controller numbers and values are $00 - $7F. For example: (assuming instrument 3 is set to MIDI channel 1) C-2 3000 --- 0507 <- controller $07, volume, according to MIDI standard D-2 307F <- set max. volume ($7F), command $B0 $07 $7F is sent LE --- 0000 F-3 3001 <- small volume ($01) --- 055C <- select controller $5C (tremolo depth) G-4 3080 <- set to 0 (note: $80 = $00) +---------------------------------------------------+ | Command 8: SET HOLD/DECAY MIDI: set hold only | +---------------------------------------------------+ This command must be located on the same line with a note. The command assigns the hold and decay values for the note (see above for description about hold/decay). M hold value decay----------+| || Example: C-3 3824 -|- 3000 -|- 3000 --- 0000 +---------------------------------------------------+ | Command 9: SEC. TEMPO MIDI: no action | +---------------------------------------------------+ This command sets the secondary tempo (the number of timing pulses/note). The argument must be 01 - 20. Example: --- 0903 <= double tempo --- 0000 +--------------------------------NaU-------------------+ | Command A: VOLUME SLIDE MIDI: polyph aftertouch| +---------------------------------------------------+ This is the same as command D (for Noise/Protracker compatibility). However, please use D instead of this. If I some day find that there are no free commands, I'll use this!! MIDI: Command A changes the polyphonic aftertouch of the most recent note. The value should be $00 - $7F. Example: C-3 4000 --- 0A30 <- aftertouch $30 --- 000Oܲ0 --- 0A00 <- aftertouch $00 +---------------------------------------------------+ | Command B: POSITION JUMP MIDI: position jump | +---------------------------------------------------+ This command lets you make songs that have beginning which is played only once and then some part which is looped forever. Position jump causes the jump to playsequence number pointed by the data byte. If the data byte is 0, then the playseq jumps to the first entry. Example: --- 0B02 PZX<- start playing from playsequence number 3 +---------------------------------------------------+ | Command C: SET VOLUME MIDI: set volume | +---------------------------------------------------+ You can override the default volume of the instrument with this command. Example: A-3 4C20 <- played with volume 20 There are 65 volume levels (0 - 64), 0 = no sound, 64 = maximum. The data byte of command C can be 00 - 64 or 00 - 40 (decimal or hex). Non-programmers wiQG ll probably want to use the decimal numbers. See (Play/[Dec/Hex]). If you want the playroutine to have maximum performance, then use hex values. It is also possible to change the volume of already played note. Note that it doesn't work with MIDI-instruments. Example: A-3 4000 --- 0000 --- 0C10 <- volume to 10 It's possible to change the default volume of an instrument (MED V2 and later). The value must be between 80 and C0 (always hex!). Value $80 = voluRpV&me 0, and $C0 = 64. Note: This can cause trouble in multi-modules, because the set of instruments (and their default volumes) are common. I recommend that you change the default volume only on non-multi-modules. +---------------------------------------------------+ | Command D: VOLUME SLIDE MIDI: channel pressure | +---------------------------------------------------+ You can increase/decrease volume smoothly with this command. The data byte is divided in two parts: C-S:/3 3D01 || |+- Amount of decresdendo +-- Amount of crescendo If crescendo is zero, then the decrescendo is performed. Otherwise only crescendo is performed. Example: C-2 3C40 --- 0D01 <- a bit more quiet --- 0D01 <- even more --- 0D20 <- and crescendo back to original One unit in these commands means six actual volume units, so this example would look like this, when using the C-command (except that itT doesn't sound so smooth): C-2 3C40 (volumes are decimal in this example) --- 0C34 <- -6 --- 0C28 <- -6 --- 0C40 <- +12 MIDI: This command sends a channel pressure (channel aftertouch) message using the channel in which the most recent note was sent. The databyte should be $00 - $7F. D#5 J000 --- 0D40 <- channel aftertouch $40 --- 0D00 <- to $00 +---------------------------------------------------+ | Command E: SYNTH/JU@WDMP MIDI: pan control | +---------------------------------------------------+ When used with synth/hybrid instruments, this command triggers a jump in the waveform command sequence. The databyte is the jump destination (line number). Example: C-4 4000 <- this should be synth/hybrid instrument --- 0000 --- 0E05 <- cause a jump to line # 5 With MIDI-instruments, this command controls the stereo location of the sound. The data byte can be 00 - 7F. Vleft mid right | | | 00 3F 7F If you've used MED V2.00/V2.01 or Noise/SoundTracker, you may remember that this command controlled the low-pass filter. I think that it was unnecessary to spend the command E only for controlling only a single switch. See command F. +---------------------------------------------------+ | Command F: TEMPO/MISC. MIDI: tempo/misc. | +----------------------W-----------------------------+ Command F has many different actions depending on the data byte. If the data byte is zero (00), this command causes the immediate jumping to the next block on the playing sequence (or to the beginning of this block if you're only playing the block). This function is better to implement by making the block shorter (takes less memory). Example: C-2 4F00 <- this is the last note of this block When the data byte if 01 - F0, the command changes XOØthe tempo. This is the primary tempo (length of the pause between timing pulses). If the new tempo is 01 - 0A, it is compatible with Trackers, but now you should use the command 9 instead of this command, as it's directly Tracker-compatible (set the primary tempo to 33). Example: E-3 6FF0 <- highest tempo --- 0000 --- 0F0B <- slowest Data bytes FF1 - FFF are reserved for special actions, some of them are currently used: FF1 causes the same note played aY`xctually twice. This way it's possible to create fast rhythms. C-3 2FF1 is same as C-3 2000 C-3 2000 with double tempo FF2 plays the note only once, but it is not started immediately: C-3 2FF2 is same as --- 0000 C-3 2000 with double tempo FF3 works like FF1 except the note is played three times (very fast). FF8 turns off the low-pass filter (power-LED will dim). FF9 turns the low-pass filter on (bright Z}<LED). FFA sends MIDI "hold pedal on"-command (works only with MIDI-instruments). FFB sends MIDI "hold pedal off"-command (works only with MIDI-instruments). FFD works only with Amiga-samples. It causes the pitch of the channel to be set to the pitch of the new note, but the new note is not replayed. C-1 2000 <- play note --- 0000 C-2 2FFD <- don't replay the note, just set the pitch to C-2 FFE stops playing immediately. If you want to make a song w[Pzhich plays only once, put this command to the end of the song. This command can be easily entered: Click "Stop playing" while holding the Shift-key. FFF Stops the note on the current track. Works with both Amiga- and MIDI- instruments. Nearly identical to "C00" on Amiga-samples, but because "C00" doesn't work with MIDI, I made this command. +-------------------------------------------------------------------+ |+------------------------------------------------------\YS>-----------+| || MED V3.20 keyboard equivalents/functions || |+-----------------------------------------------------------------+| +-------------------------------------------------------------------+ Cursor up Cursor up Cursor down Cursor down Cursor right Cursor right Cursor left Cursor left -- then a bit more complex ones DEL Delete note or number under cursor ]# Shift-DEL Delete the note and the command numbers Alt-DEL Delete only the command numbers Backspace Deletes the note and moves following notes up Shift-Backspace Inserts an empty note slot Alt-Backspace Deletes the current track Alt-Shift-Backspace Inserts a new track Shift-Cursor up Previous block Shift-Cursor down Next block Shift-Cursor left Previous sampl^?,:e Shift-Cursor right Next sample Left-Alt-Cursor up First block Left-Alt-Cursor down Last block Alt-Cursor left Cursor onto previous track Alt-Cursor right Cursor onto next track Alt-Shift-Cursor right 16 samples forward Alt-Shift-Cursor left 16 samples backward Ctrl-Cursor left Previous screenful of tracks Ctrl-Cursor right Next screenful of tracks Space bar Stop playing (or d_ewelete note if SPC=CLR active) Alt-Space Continue block Ctrl-Space Reset MIDI pitchbenders/mod. wheels/presets Shift-Space Continue song Shift-Alt-Space Play song Esc Editing on/off ~ Extra space on/off F1 - F4 Select keyboard octaves 1+2 - 4+5. F6 Cursor to the first line of the block F7 Cursor `,dkto the second quarter of the block F8 Cursor to the middle of the block F9 Cursor to the last quarter of the block F10 Cursor to the last line of the block Ctrl-F1 - F10 Select displayed panel Ctrl-Shift-0 - 9 Pick note 0 - 9 Ctrl-A Automatic advance down on/off Ctrl-F Display free memory Amiga-F Low-pass filter on/off a* Amiga-I Activate sample name gadget. Shift-Amiga-I Clear and activate sample name gadget Amiga-J Jumping on/off for this sample Amiga-L Load song Amiga-P Play song (Shift-Alt-Space) Amiga-R Activate repeat gadget (in Sample-panel) Amiga-T Create slide using command 3 (transform) Amiga-Shift-T Create slide using command 1 and 2 b2 Amiga-X/C/V Cut/copy/paste current track Amiga-Shift-X/C/V Cut/copy/paste current block Shift-0 - 9 Enter note 0 - 9 TAB Highlight current line Numeric keypad (the non-shifted operations are described in Edit/pad on/off) Ctrl-8 Scroll the playing sequence list up Ctrl-2 Scroll the playing sequence list down Ctrl-4 Decrease the block number of the psl Ctrl-6 c Increase the block number of the psl Ctrl-7 Move to the beginning of the psl (psl = the Ctrl-1 Move to the end of the psl playing Ctrl-5 Insert this block to the psl sequence Ctrl-0 Insert number 0 to the psl list) Ctrl-. Delete the block number from the psl Alt-8 Scroll samplelist up Alt-2 Scroll samplelist down Alt-9   Scroll samplelist up fast Alt-3 Scroll samplelist down fast Alt-7 Beginning of the samplelist Alt-1 End of the samplelist Ctrl-5 Insert this block to the psl sequence Ctrl-0 Insert number 0 to the psl list) Ctrl-. Delete the block number from the psl Alt-8 Scroll samplelist up Alt-2 Scroll samplelist down Alt-9 de'gfevMED3.2.doc.infodf)REpM&GEר   <1" 1!*! *!$! $"$<   ? dg7iE  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pdqe}om}om}om}om}om}omppp :C/muchmore  phip*ponmlkji MEDPlayer.dochjkR MEDPlayer V3.2 instructions ~~~~~~~~~~~~~~~~~~~~~~~~~~~ MEDPlayer is a stand-alone player program for playing songs made in MED. You may freely distribute it with your songs, and it can be started from both CLI and Workbench. MEDPlayer V3.2 can load sng+samples-format and MMD0-modules made in MED V2.10 or later, or OctaMED (4-channel only). It can't load MED songs or files created with previous versions of MED (1.12 or 2.0). I think it is more important thhk+at MEDPlayer is as compact and quick as possible instead of the ability to load millions of file formats. You can convert older files by loading them to MED and saving them back again. Please note that there may be problems with playing speed when loading modules saved with MED V2.10. In that case, load the module into MED, correct the tempo2 (change to 6) and save it back. Also, a bug in module save routine of MED 3.00 causes some modules to crash when plahlZ;cyed. You can fix the modules by loading the module into MED and saving the file back. MEDPlayer can play "standard" four channel Amiga songs, MIDI songs, and the new "multi-modules". MEDPlayer has the "2.0-look" and it works fine under 2.0 (as well as 1.3, of course). And now, the usage: CLI: medplayer is optional. If not specified, MEDPlayer window appears and waits for your interaction. If is present, hmy&then the song is loaded. If it loaded OK, then the playing will start. Press Ctrl-C to quit. If the is a multi-module, you can select the number of the song you want to play. For example: medplayer multimod 2 ;plays the second song of "multimod" Workbench: You can run MEDPlayer by double-clicking its icon. To automatically play a song when its icon is clicked, set the icon default tool (thnzhe default setting is MEDPlayer). You can click the song icon and then shift-double click the MEDPlayer icon to play that song. MEDPlayer always opens its window when started from WB. The MEDPlayer window: When you start MEDPlayer from WB or CLI without arguments, the window appears. There you'll find some gadgets that control the playing. The string gadget This holds the name of the current song. hop You can load a new song by typing its path and filename into this gadget. Play Starts playing the song from the beginning. Cont Plays the current song starting from the point where you stopped it. Stop Stops the playing MIDI:Y/N This gadget allows you to turn MIDI on/off. Freq hp׷Allows you to load a song by using a file- requester. Note that this requires you to have ASL.library V37 and AmigaDOS V37, so you have to get Kickstart V2.0, before you can use it. < > With these gadgets you can select the song, if there's a multi-module in memory. There's now a some infoh%rmation displayed, when you play a song: Sg:01/01 S:001/010 B:00/08 L:000 "Sg" shows the number of the current song, and the total number of songs in this module. "S" shows the position and the length of the playing sequence list. "B" shows the current block number and the total number of blocks in this song. "L" is the current line number in this block. if there's a multi-module in memory. There's now a some infoqrZ KwtsrvMEDPlayer.doc.infoqsesEb‚ PE   <1" 1!*! *!$! $"$<   ? qtNE8  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pqqX}om}om}om}om}om}omppp :C/muchmore  puv:j~}|{zyxwv%tkSample_editor.docuwPM5Sample editor ============= MED has a built-in sample editor for sampling and simple editing operations. The sample editor is activated by clicking the SMPED gadget. When you load a sample, its waveform is displayed on the sample editor screen. At the right top corner of the waveform display, there's a number telling the number of bytes currently displayed. Initially it's the length of the sample (whole sample displayed). Below the waveform, there's a red bar. This tells you the sux[-ize of display relative to the size of the whole sample, and your current display position in the sample (this is meaningful when you zoom in). Buffer size =========== At the left side of the screen, there's a gadget labeled BUFFSIZE. This is the size of the current sample (waveform buffer). If you want to increase the size, you can type in a new value. You'll be asked if you want to clear the sample, or retain the sample already in memory. Also, if there's no sample in memory, youuy+ can create one by entering a size. Maximum buffer size is 131072. Selecting range =============== Many editing operations work with a specified range. The range is set in the sample editor by clicking the RMB and dragging. The RNGSTRT/RNGEND show the actual byte positions of the start and end of the range. You can also change the start/end positions by entering a new value into them. The RANGE ALL gadget selects the whole display. When you've selected the range, you can readjust uz{0> start/end point by holding the Shift while dragging with mouse. The other point is the left untouched. Playing ======= Next to the BUFFSIZE-gadget, there are gadgets PLAY DISPLAY and PLAY RANGE. "Play display" plays the current display with the current period value (see below). Play range plays the selected range. The whole waveform can be played simply with the keyboard (as usual). There's a red line showing the point currently being played. Zooming ======= For accurate editing,u{1 the zoom is very important. There are many ways to zoom into the waveform. 1. Use the ZOOM IN to zoom in, or ZOOM OUT to zoom out (I wonder if this is too complex...??? :-) 2. Select a range, then click SHOW RANGE. The range is then displayed on the screen. When you want to restore the whole waveform to the view, click SHOW ALL. These controls should be familiar to AudioMaster users. When you've zoomed in, it's often necessary to move around the sample. You can scroll the dispu|d layed area with cursor right/left-keys. Sampling ======== MED has the basic sampling operations built-in. The MONITOR gadget shows you the real-time waveform input from the sampler (multitasking disabled). Click mouse button to stop. The RECORD gadget is used for sampling. Click it, and the real-time waveform appears. Now you can click the left mouse button to start sampling, and right mouse button to cancel. When you click the left button, the screen blanks, and sampling starts. Tu}sbhe sampling stops when the waveform buffer is full. You can also interrupt sampling with the right mouse button. Sampling/playing rate ===================== On the right side of the screen, the current sampling/playing period is displayed (default 428). This is the value that specifies the pitch of the sound. You can change the period by entering a new value into the PITCH-integer gadget, and pressing Return. E.g. to double the sampling speed, you could type in the number 214. You u~m5vcan also change it by clicking on the note, holding the button and entering a new note using the keyboard. Changing the sample rate ======================== If you have a sample with period 428 (C-2), and you'd like to transpose it to play G-2 when you play C-2, then you do the following: 1. Make sure that the current period is 428. 2. Click the note of "Dest"-gadget, hold the button and press G-2 (if octaves 1+2 are used, it'd be T). 3. Click the CHANGE RATE -gadget. Now the sau \mple is transposed (its size will change). If you simply want to transpose the sample one octave up/down, there are two shortcut gadgets for that. Oct (up arrow) transposes the sample 1 octave up, halving its size, while the Oct (down) transposes it down (doubling the size). Selecting the save format ========================= On the bottom right corner, there are gadgets for selecting the save format, labeled RAW and IFF. These affect the operation of the filerequester option Su ave, sample. If raw is selected (default), no IFF chunks will be saved. When IFF is clicked, the samples will be saved in IFF 8SVX format. The repeat/ repeat length values are then included in the saved sample. Basic editing operations ======================== The sample editor contains the basic editing operations, that exist in every sample editor. They're located on the bottom left corner, and they are: CLR Clears the current range. DEL Cuts the range (it will not be copied tu `@Uo the copy buffer). CUT Cuts the range, and puts it to the copy buffer. COPY Copies the range to the copy buffer. PASTE Pastes the contents of the copy buffer to the position pointed by the cursor (range with length of 1 byte). If you want to get rid of the copy buffer (freeing the memory it takes), click DEL CB. Additional operations: S>CBUFF copies the whole sample to the copy buffer CBUFF>S copies the copy buffer to the sample These can be used for implementing a simple "Unu Lhdo". E.g. if you're experimenting with echos, you can quickly make a snapshot with S>CBUFF. Then you can do the echo operation, listen to it, and if you're not satisfied, you can quickly get back the original with CBUFF>S. Reversing ========= You can reverse a range with REV-gadget. The area is then turned backwards. This is useful if you want to search for hidden messages from a certain kind of rock-tunes. Anyway, it's fun to record your own voice and then turn it backwards. Mixiu Ing ====== This mixes two samples together. The source sample must be in the copy buffer. Then position the cursor (click RMB, but don't drag) to the point where you want the second sample to start, and click MIX. You can also drag a range and then click MIX. In this case, only the area selected in range is affected. Changing volume =============== This effect allows you to change the volume of the sample, and create fades. Next to the CHANGE VOLUME -gadget are two integer gadgets.uN] The left is the start volume, and the right is the end volume. Both are percentages of the original waveform. First you have to select the range to affect. Then look at these examples: 1. Double the volume: set both start and end volume to 200 2. Make the sound fade out: set start vol to 100 and end vol to 1 3. Make the sound fade in (starting from the half of the final volume) set start vol to 50 and end vol to 100 After you've entered the start and end volumes, click CHAuRM\NGE VOL, and the magic is done. If you increase the volume too much, the normal waveform limits are exceeded and distortion will occur. Echo ==== With echo you can do some special tricks to the sound. This feature is learnt best by experimenting. Some facts should be known though. The echo-feature in MED's sample editor is controlled with two values: Delay and number of echos. Delay is the distance (specified in steps of 8 bytes) between two echos. If it's very low, you can produceu some interesting results. Number of echos is the total number of echos. It should usually be quite low (1 - 10), but you can experiment with higher values. Usually you have to extend the workspace by inserting blank space for the echos after the end of the sample. This is can be easily done this way: 1. Click S>CBUFF. 2. Enter the number of inserted bytes in BUFFSIZE gadget. 3. Be sure that the cursor is in the beginning of the sample and click PASTE. Now, start playing. Activate uDLAY-gadget, enter value, hit Return, enter the number of echos. Finally click ECHO, and listen... Filter ====== This is a simple-to-use feature that allows you to smooth sample (reduces noise). Select the range to filter, and click Filter. Boost ===== This is the exact opposite of the Filter, and it works in the same way. It makes the affected area sound brighter. The noise becomes more audible, too. Setting loop points =================== MED has two blue loop markers for seluecting the range of looping. Click 'Loop on' to turn on looping. Click again to turn it off. When the looping is on, you can change the loop point by dragging the markers with the mouse. Some gadgets help you to find good loop points: S select start marker E select end marker < move start/end marker 2 bytes left > move start/end marker 2 bytes right <0 move start/end marker left until a zero is found 0> move start/end marker righu{t until a zero is found The S and E gadgets select, if the <, >, <0 and 0> gadgets affect the starting or ending point. The ZOOM IN/OUT gadgets are useful for finding the range, as they allow you to examine the waveform very accurately. Creating noise ============== This quite unusual feature allows you to add noise to your samples!! Select a range, enter the noise level (1 - 127) to the integer gadget next to it, and click 'Noise'. At first it may seem useless, but in fact it isnu",9't! First, you can easily make wind/sea effects etc.. Then, the noise generator can be a source for more complex instruments, when used together with filter, boost, echo etc.. It's possible to create excellent instruments even without a sampler (believe me!). R>SY ==== This gadget allows you to transfer the selected range to the synthsound editor. The range should be 2 - 128 bytes long. e integer gadget next to it, and click 'Noise'. At first it may seem useless, but in fact it isnƟvSample_editor.doc.infofREOS`8hGE   <1" 1!*! *!$! $"$<   ? Ep  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pq?}om}om}om}om}om}omppp :C/muchmore  p-oT4ttdSynthsounds.doc/x THE SYNTHETIC SOUND EDITOR *==========================* This is the editor, which is used to design simple pieces of waveforms and to "program" the volume and pitch altering sequences. Synthetic sounds don't take much memory (that's the main advantage of them). They can use the whole 5-octave range. Although they are quite simple, they usually sound quite "cool" (and remind me of the good old C-64). Getting started First load MED, select the Inst#4gr-panel, click the Synth-gadget to initialize a new synthsound. Then click the Synth-display selection gadget to display the synthsound editor. Please turn editing off. You can play the current sound with keyboard, like ordinary samples. Waveform editing There are two waveform displays, the left one is the "master waveform display" and the right one is for intermediate editing (it also serves as a copy buffer). Between the waveform displays are someKE gadgets, that are used for transferring waveforms between displays. First there are two copy gadgets. If you press the left copy gadget, the right waveform will be copied to the left one (and vice versa). Gadget "<- EXCHANGE ->" exchanges the waveforms on the left and right. "<- MIX" mixes the left waveform to the right waveform. It is a powerful tool that can be needed quite often. "<-ADD" is similar to the mix, but it doesn't produce any average between the wforms (= wav97eforms, from now on). The wforms are simply added together. It's possible, that the waveforms exceed the upper and lower limits (in that case, they are truncated). Two "<- EDIT" "EDIT->" gadgets allow you to select either of the displayed wforms as a current waveform, which is then used in some editing functions. Sometimes they're automatically set (when you draw the wform with mouse, for example). "UNDO" undoes your last editing operation. It can be /`quite useful. "RANGE ALL" selects the current wform, so that any editing operations affect the whole wform. Freehand drawing A very simple way to create wforms is to draw them from scratch. This is easily done. Just press the left mouse button and draw... There are two drawing modes. The default is "pixel". The other is "line". This can be used for drawing straight lines. There's also a mix-mode, that works in both "line" and "pixel" -mode z. It mixes the drawed pixels or lines with the already existing data. Mode-selection gadgets are located below "RANGE ALL". Waveform length Each waveform in synthsound can be 2 - 128 bytes long (it must be even, though). The shorter the waveform, the higher the pitch (it also depends on the wform itself). Usually, to make the pitches compatible with other instruments, you should use length 2, 4, 8, 16, 32, 64 or 128. The length can be changed with "LEN:򟃾" gadgets below the left wform, by typing in a new value or by clicking the single-step gadgets. Multiple waveforms Each synthsound can consist of more than one wform (the maximum is actually 64). On the left, below the left wform, there's a set of gadgets: curr. wform # | 0 < > / 00 |/ \| next/prev number of the last waveform The arrow gadgets select the next/previous waveform. As this is a operation that is needed often, there are keyboard sJhortcuts: Alt-cursor left = previous Alt-cursor right = next There are two Add gadgets that allow you to increase the number of waveforms. "Last" adds a new waveform after the last wform. "Here" inserts a new wform here, and shifts the others. Del gadgets: "Last" deletes the last wform. "Here" deletes the current wform. Preset waveforms There are some simple, often needed preset waveforms available at a single click. First make sure, that the destination w !t\form is the current wform (selected with the EDIT <-/-> gadgets). Then just click the preset waveform icon. The icons are located at the bottom of the editor. The available waveforms are: sine, saw up/down, pulse, random and triangle. The CLR-gadget clears the current wform. The ALL-gadget clears the whole synthsound (so be careful..) Range operations These are some basic operations, that are applied to the selected range (highlighted white). You c [Qean select the range by dragging the mouse over the wform with the right mouse button down. You can select the whole wform by clicking "RANGE ALL". The Range start/Range end gadgets at the lower right corner of the synthsound editor can be used to make small corrections to the area. When there's no range selected, there's a single horizontal white line. This is the cursor. Some editing operations need it. The cursor position can be set by clicking the right mouse button o n the wform area. There are also three narrow gadgets (on the left of the preset wform gadgets) for positioning the cursor: cursor to cursor to end start | | < + > | cursor to the middle (of the wform) On the middle of the screen, there's a word "RNG", followed by a strip of gadgets: RNG Cut Copy Paste Clr Dbl Rev < > Cut (works only on left wform). It "cuts" the selected area, which is then moved to the right wform display. Copy copies "K1 the selected range to the right wform, but doesn't cut it away. Paste copies the contents of the right wform to the position pointed by the cursor. Clr clears the range. Dbl "doubles" the range, making it play one octave higher. Rev reverses the range. < or > shift the ranged data to left or right. There are two other editing operations: stretch and volume change. Stretch allows you to stretch a point of the wform towards some other point (understand?? no?? then try this:) For ex ӎgample, select a sine wave. Then position the cursor on the middle of the waveform (there's a gadget for this purpose, see above). Now activate the "STRETCH:"-gadget (on the left lower corner of the synthsound ed). Type in the amount of moving, e.g. 32. This should demonstrate it... If the number you type in is negative, the point is stretched to left. Volume change allows you to increase/decrease the volume of selected range: First select a range. Then activate the "V>ںOL.CHG:"-gadget. Now you must enter the amount of volume change (in %'s). For example, to halve the volume, you should type 50. If you want to double the volume, type 200. The volume will be changed when you press Return. Transformation This is quite a powerful feature. It allows you to change a waveform to another smoothly (by creating the waveforms between them). Demonstration: Allocate 9 new waveforms (click Add/Last 9 times). Now you have 10 wforlbms. Move to wform 00, and select a pulse waveform, for example. Then click Transform: Start to mark the beginning of transformation range. Move to wform 09 (the last one). Put here a sine wform. Click Transform: Do, and the magic is done. If you view the wforms 01 - 08, you'll notice that there's now a smooth transition from the pulse wave to the sine wave. ----------------------------------------------------------------------------- THE PROGRAMMING LANGUAGE \======================== Note: please read this section carefully before experimenting, because you can lock up your machine with the synthsound programming language (as with any other language) The programming language is used for controlling the volume/pitch/vibrato/ waveforms/arpeggio/etc... of the synthsound. It consist of simple keywords, of which some have an argument. The programming is done using two lists of commands/numbers. These lists are disn/ stop changing volume 07 WAI <= Wait 08 70 <= 70 pulses 09 CHD <= Cmd: Set volume change down 0A 01 <= speed = 1 (2mslow) 0B END Third: 00 40 <= vol = $40 01 30 <= vol = $30 (without command, the values are volume changes) 02 20 <= vol = $20 03 END And fourth, finally: 00 40 <= vol = $40 01 CHD <+ <= change down speed.. 02 01 | <= ..= 1 03 WAI | <= Wait.. 04 20 | <= ..20 05 CHU | <= change up 06 01 | <= ..1 07 WAI | <= Wait.. 08 20 | <= ..20 again 09 JMP | <= Jump (= goto) 0A 01 -+ <= to line number 01 0B END Now some wform/pitch sequences. Wform/piJ)tch sequence is the "mastersequence" while the volume sequence is a kind of "slave sequence". First: (the simplest case) 00 00 <= set waveform #00 01 END A bit more complex: 00 VBS <= set vibrato speed 01 40 <= speed = $40 02 VBD <= set vibrato depth 03 02 <= depth = 2 04 00 <= waveform #00 05 END And very complex: 00 ARP <= start arpeggio sequence 01 00 \ 02 03 arpeggio values 0, 3, 7 (minor chord) 03 07 / 04 ARE <= end arpeggio sequence 05 VBD <= vibrato de4pth 06 06 <= 6 07 VBS <= vibrato speed 08 40 <= $40 09 00 <= set waveform #0 0A 01 <= set waveforms 01 - 0A (one timing pulse/waveform) 0B 02 | | 0C 03 \ / 0D 04 \_/ 0E 05 0F 06 10 07 11 08 12 09 13 0A and back to #01... 14 08 15 07 16 06 17 05 18 04 19 03 1A 02 1B 01 1C JMP <= jump 1D 09 <= to position 09 (restart waveform changing) 1E END ----------------------------------------------------------------------------- You can lKearn a lot by examining the example synthsounds and by experimenting. Now, some reference... About timing For both sequence lists, most of the commands are fetched, executed, and the next command is immediately fetched. There are also some commands that wait for the next timing pulse, this is important because the computer would otherwise send all its time executing the sequence lists (and would hang up). You should take care that all loops contain a c֋Mommand, that waits for the next timing pulse. These commands are WAI (Wait), vol chg (plain number in the volume list) and set waveform (plain number in pitch/wform list). For example, the following loops will hang up your computer: 00 JMP 00 CHU <-+ command CHU doesn't wait 01 00 01 02 | ... 02 JMP | 03 00 --+ While the following would not: 00 20 00 WAI 01 JMP 01 02 02 00 02 JMP 03 00 Execution speed The syN)nthsound handling routine is called once every interrupt. This means that the handling is usually done 6 times/note (can be changed with secondary tempo, see main docs). Both lists have an execution speed, that is the speed of the operation. When the speed is 1, the next command is fetched/pitch changed etc. on every interrupt. If the speed was 2, it would happen every second interrupt (runs two times slower). The initial execution speed can be set with the Bftwo speed gadgets. During executing, the speed can be changed with command SPD. VOLUME SEQUENCE LIST COMMANDS ============================= 1. Set volume Command: --- Keyboard: --- (key needed to enter the command) This is the default command (no command identifier). It sets the absolute volume of the synthsound. It should be 00 - 40. Note that the relative track volumes are not used in synthsounds (mostly because of performance reasons). Example: 00 30 ;volume = $30 Mo01 10 ;volume = $10 ... 2. End sequence Command: END Keyboard: --- This command terminates the volume sequence list. It's always there and automatically inserted. You can't insert commands past this one. 3. Set volume change down speed Command: CHD Keyboard: D This command sets the speed, in which volume is decreased each timing pulse. The volume starts changing automatically after this command. To stop automatic volume sliding, issue this command with speed 00. Exam|ple: 00 CHD 01 05 ;speed = 5 ... 10 CHD 11 00 ;speed = 0 -> stop sliding 4. Set volume change up speed Command: CHU Keyboard: U This command is like CHD, except it sets the volume change up. 5. Wait Command: WAI Keyboard: W This command waits for specified amount of timing pulses (pause). Example: 03 WAI 04 10 ;wait for 16 ($10) pulses to occur 6. Jump Command: JMP Keyboard: J Causes an immediate jump to another position of the volume list. Example:O{ 05 JMP 06 0A ;jump forward to line 0A 7. Jump waveform sequence Command: JWS Keyboard: Shift-J This command causes a jump in the waveform sequence. This can be used for example, to trigger a pitch change at the end of the vol seq list. Note that this DOESN'T cause a jump TO waveform sequence. Example: 04 JWS 05 0F ;Cause jump in waveform sequence list 8. Halt Command: HLT Keyboard: H This has the same effect with command END (halt execution), but it can be 6inserted in the middle of the sequence list. Example: 03 HLT 04 04 ;some other code (can be accessed with JMP instruction, for ... example) 9. Set speed Command: SPD Keyboard: S Sets the execution speed. Example: 0A SPD 0B 01 ;speed = 1 (fastest) ... (The following commands require OctaMED V2.00 / MED V3.20 or later.) 10. One-shot envelope Command: EN1 Keyboard: E This command allows you to draw the shape of the envelope with the mouse. When the end of th 'e envelope is reached, nothing occurs. 02 40 03 EN1 04 05 Waveform 05 is used as an envelope. Note that the envelope execution starts on next interrupt, so the volume is initialized to $40. The envelope waveform must always be 128 bytes long!! 11. Looping envelope Command: EN2 Keyboard: Shift-E This works like command EN1, except that when the end is reached, execution will start again from the beginning. WAVEFORM/PITCH SEQUENCE LIST COMMANDS ======================!0yp.=============== 1. Set waveform Command: --- Keyboard: --- This command is used to indicate the waveform number (starting from 00). After this instruction, the execution stops until next timing pulse occurs. Don't use waveform numbers that are higher than the actual number of the last wform. Example: 00 00 ;wform 00 01 01 ;wform 01 ... 2. End sequence Command: END Keyboard: --- This command terminates the wform/pitch sequence list. It's always there and automatic",ally inserted. You can't insert commands past this one. 3. Set pitch change down speed Command: CHD Keyboard: D This command sets the sliding speed for sliding pitch down. The sliding automatically starts after this command and stops, when speed is set to zero. Example: 00 CHD 01 03 ;set speed to 3 ... 4. Set pitch change up speed Command: CHU Keyboard: U Just like previous, but slides pitch up. 5. Wait Command: WAI Keyboard: W This command waits for specified#C8 amount of timing pulses (pause). Example: 03 WAI 04 02 ;wait for 2 pulses to occur 6. Jump Command: JMP Keyboard: J Causes an immediate jump to another position of the wform/pitch list. Example: 05 JMP 06 0A ;jump forward to line 0A 7. Jump volume sequence Command: JVS Keyboard: Shift-J This command causes a jump to happen in the volume sequence. Can be used e.g. for triggering volume changes after some wform event. Example: 09 JVS 0A 00 ;start volume$ry sequence from the beginning 8. Halt Command: HLT Keyboard: H This has the same effect with command END (halt execution), but it can be inserted in the middle of the sequence list. Example: 03 HLT 04 04 ;some other code (can be accessed with JMP instruction, for ... example) 9. Set speed Command: SPD Keyboard: S Sets the execution speed. Example: 0A SPD 0B 01 ;speed = 1 (fastest) ... 10. Begin arpeggio definition Command: ARP Keyboard: A This command %1:Kstarts the arpeggio sequence. The following values are the arpeggio offsets from the base note. The arpeggio sequence is terminated with ARE-command. The arpeggio starts automatically after the sequence is defined. Example: 03 ARP ;start arpeggio 04 00 ;offset values 05 04 06 07 07 0A 08 ARE ;end arpeggio definition 11. End arpeggio definition Command: ARE Keyboard: E Ends an arpeggio definition. See above. 12. Set vibrato depth Command: VBD Keyboard: V &ІI This command is used to set the vibrato depth (00 - 7F). Example: 02 VBD 03 04 ;set depth to 4 13. Set vibrato speed Command: VBS Keyboard: Shift-V This command sets the vibrato speed (00 - 7F). Both speed and depth must be nonzero for vibrato to occur. Example: 02 VBD 03 04 ;depth = 4 04 VBS 05 30 ;speed = 30 14. Reset pitch Command: RES Keyboard: R This command resets the pitch of the note to its initial pitch. (The following command requires OctaMED'U V2.00 / MED V3.20 or later.) 15. Set vibrato waveform Command: VWF Keyboard: Shift-W Sets the vibrato waveform. The argument is the number of wform. The waveform should always be 32 bytes long!! Note that it's actually played reversed (use the Rev gadget to reverse it). By default, sine wave is used. Example: 00 VBD 01 06 02 VBS 03 40 04 VWF 05 04 ;use wform number 04 as vibrato waveform ======================================================================(&J ======= Synthsound handling commands in the songs: Command E in the songs controls the MIDI pan, if used with MIDI, but with synthsounds, it is used to trigger a jump in the wform/pitch sequence list. For example, if you wanted to decrease the pitch of the sound after a certain point, your wform/pitch sequence could look like this: 00 VBS 01 40 02 VBD 03 06 04 00 ;play wform 00 05 HLT 06 CHD ;pitch changing entry point 07 02 08 END Now you could com)R6pose a track like this: C-2 3000 ;this is the previous synthsound --- 0000 --- 0000 --- 0E06 ;cause a jump to position 06 (pitch starts to slide down) --- 0000 ... With command JVS, you could make the command affect volume sequence too. Hold/Decay: =========== Hold/Decay work well with synthsounds too. The decay value in synthsounds is, however, a jump address in the volume sequence list. When the decay should start, the execution will jump to this entry in the vo*2l seq list. This means that you can handle the decay on any way you want. You can also make it affect the pitch/wforms using the command JWS. Example volume sequence list: 00 40 ;volume 01 HLT ;end 02 CHD ;decay handling (entry point) -> cause decay 03 03 04 END The decay value for this synthsound should be 2. When you save/load synthsounds, the decay values are saved/loaded with the instrument. ============================================================================+= Saving/loading synthsounds Synthsounds are saved using the filerequester panel, "save instr". They usually take very little disk space. Synthsounds can be loaded just like normal samples (filerequester, sample list, typing sample name). ============================================================================= HYBRID SOUNDS Hybrid sounds are much like synthsounds, except that there are no waveform pieces. Instead, there's a n,#ormal sample. All commands of the synthsound handling programming language can be used with hybrid sounds. There's only one thing you should know: Don't use "Set waveform". Because there's only a single waveform, there's no need for that (and it wouldn't work anyway). ============================================================================= Final note: Don't be afraid if you didn't understand everything described in this file (I hardly understand it myself ;-) All thi-Tzls information is not necessary for using the synthsounds (only for designing them). sed with hybrid sounds. There's only one thing you should know: Don't use "Set waveform". Because there's only a single waveform, there's no need for that (and it wouldn't work anyway). ============================================================================= Final note: Don't be afraid if you didn't understand everything described in this file (I hardly understand it myself ;-) All thi6v Synthsounds.doc.info(xEbb N( E   <1" 1!*! *!$! $"$<   ? ܹEH  I$I$ I$I$ I$I$ I$I$ I$I$ I$I$   pq }om}om}om}om}om}omppp :C/muchmore  pQ T LearnMED.txtp=4I just got this latest release of MED from Teijo. Looks like 3.2X may be the last update of MED. He is concentrating on OctaMED now, the commercial 8 channel version. --Doug Nakakihara WANT TO LEARN HOW TO USE MED? Read on... "You've heard the songs. Now get the book! Unleash the musical power inside every Amiga. Learn how to use one of the most incredible public-domain programs available for the Amiga!" * The book details *all* you need to know about MED and makes it easy tû%o use and understand. * Step-by-step you'll learn the basics of creating songs playable on any Amiga. * Over 60 pages of information. * Filled with many easy-to-understand examples and illustrations * Includes a comprehensive tutorial. * Compose original scores for video work and forget about copyright infringement. * Learn about undocumented features. * Also included are many hints and tips. * Includes detailed index. * An indispensible reference to MED. * Companion disk (pCnot required) includes example songs plus many instruments you can use. * You should already have a copy of MED version 3.2, which is available on most BBSs etc. For a limited time I am offering the book *with companion disk* for $10 which includes shipping and handling (in US). Add $2 for foreign orders. Send your order to Douglas J. Nakakihara 2762 Goldfield Place Simi Valley, CA 93063 Personal checks OK, money order prefered. Send cash at *your own risk*. Companion disk (]y(HLearnMED.txt.infop'FHS5͘͟@@)qGјj5 <| y 9 9 9 9 = y  ? 8 ? ? 8 8 0= UVffff@WWWWWWWWWWrǔbWWWNWWWWWWWWWW5 3` 1>?s9Ch ~p??@  UVffd̀SUV߽W}W3WWWWWWWWx"GWWTWv뚷WpݪxWv@WvWWW :c/muchmore 3` 1>?s9Ch ~p??@  UVffd̀SUV߽W}W3WWWWWWWWHl     MEDpʥ/kQHA PJ"H,xHE6 a2L/&IP .P,SN @I (g @BI',@IPAE C8 #5n&GSп@'@$HZA4QX$_o"ItM(SQ<vZz5DH0h}3(DYG@#tH<țɂ 8@.& X"Ԇe, ah@Ԗ%"H@גpl!{<&P`}tФj3Ą'a 񝅶6aedH9>"LVF_C0/ C>w8˃:\zmXqx'L`]0  V6x)p0 fؑ%z(!zb$E%É@'/%#wK$Ja < "Cc'A$38&h0?pd -P@i&4x2 0iF Vr+`W!Z-A"L@4btO SGe0 0x \`3(H?ICW0pXd-Aw@x8L|h7nG(Yy96s*J4Fk(1Dh #"bB/p). A#(!F{.^:.{'Π[oa'+OYaPZ! aYgH4 *d/ J f40K xjl-2!$ha84pbYФS@)@ = Jч&(gcN}PH  D Z8"v Ta 1!=d'…#h6@> 򀈹 s4*2s@A\  Js\1aǠD@hzP8Ʉ@SAr c"`F\ |lfdf@f̞&610FynAp4; &e؈#1Ly5?ɨA㱰!KD^$~P,aEZV:  `p FM%8FQ<0DsGB"h6[|$CN\AY@,@+)d@Rv^Ǖ!@<`?p I K ۥp8SAe .a x󀾛(P&Xz`dD^@L!(@tj"f * 2wB+X$2 ę_< /0pϤ7:p$)DFxqfd~ dAЧ|0?c 1TY bPL"xS5eG,IXLv'&J_OQ^2D3Nb$ ;#$PF%Ld 2ǂ}8^ g*`O𯜜Wxs75!Yp*3q eRbfXwx.XhRV@j'4RPٷ(e(.P ;g ĆFSmO\ LP*a.S?HR4 0`@P ft%ȑ[H#s `Q pA" .iA5u K@6I!2 50z2 ޠ"@4H!IQ8x%B,XMfj@6)NԝX?0kh` `N%<el Aȥ7fh'O"H$ ~tT Wjցp-sOZ0a` ܯ:j\&\O' F!)Z^H mP{H\.D+ח`FH%jxHܸQS@Fb0uF.b L^4mH 5% @&.{W0B @p qP@"'Ko|+s : \BE4 :>dwK@`oE Oi|(؃rOF炀Lf /J6 K0tJA5H Qx+ ?} =\6 | *FDr`'?'!A/($(da%)!M!#aEN%_:#Pa`@H$ .S'P zL0 8X`p(Ԁ3(`}fS _)φD AU ,2j8'$^BIÝY99Fe^"6 Ia8@6xpJ @k.^?"@ FTRAJ0c á ٬ 9wGANI.b'0}1"VA]c,gnw?s1O,ˆ# ,*Pp"ZBL#H N#*l8@@|f5HF @R_D<$Y*2U "g ~ZttkCu] )pUl u i0 d19$JO=a!]GO@KrXxv܀0+ =t_4AЉ)Y@2x2 0U1 L^G$'@d *MpIbYC54b2I(PQ*:@-?x6*Bh5lU&6 UD\sJ%Gc3$10U:q A= w  p"RbXSDaln8c|0g Vrts YdNOJׄ/w 9 ?jA d +ɓԎ5azrqOaѣ6 YnȖD`R@RRڣx3%@ `)k xa .?uuM %l090,9(X H|@;(JqX2H1S | π) 0Fa%BxK@cH<$_X*YOxmox7@E@4Dd Kkqa[f@z->Ǡpx DsDHJ+ \@rN`8M]"pHA!H߀; ^H1]| @-. 2p!H! Wݬ?TB?sdI͡$e' )7qΣey@!MBN8|8Q6Bψ'BႆoNЗ@LD'$hŐ8cLrX. B\ϚQpxB_J xBcGou"fT &t3D4GjcyG X<>‚p0( H {c#<2Gp}cȂt4:@AuA~7\ @4@BH(E=> _"r>/j<ФlY`k z<@#ON ֢F Y QCiAab "SȤ@,_U@2P|fLHj3'Be8,$5H{O6A^F_fF8=XE `hN`mz&ɠ<LrƦ-!/0@|`X&pÇy&dY%@O'O;tԽ85Ѡ# 8/Hk'[\~!(:g(@Nǃ ek Y T# h<7,+eV0 2Q(ؒˏHƗhc d!ɻ@  `)P;N;c N8@Ku ;C_@% F& =ݚ4x852b慹S !*L~#8& y8u@̿I>Bm4@cO@br5(gwTY1UDGT9`lS,ߔ `d`^3g2I *%[Xe KgD0z3آsD#3 9Dj 8aF~KFy4gK :@j`(:#Er ]T P|`!&%+l#aPO)r` b3"[dhpE` ;Q!" '?@,.Py,|Y~\dR:L3Cmxhv&ł2HbE1>=@a遷-ИkKn oɐ@.30J_|j'1XsP!vƫl fxx ` 9Ft|}a̹>Ke[~Zp=  Dϖ`@-XFd8[| hm`h!X dQeKJ{1"^ !gA@J@\@oC9w҆ ^3Ɛ ͆q,2ّ- ˄ :NPS.`P1 .O$Ug_Vd -Ĺ3R: W!"D1a 6f:*bR'Ѱ5mS4yL",A ƎBpp)Ivؐ<( D #9gF@B 8wB3bwR0`jXGͩ9;cQ`07$vX`jD e@b gP @J\% Bl* r 0gޝJ K T@PpUfUQR/ŢO,\D-tDUaH $kl!Gaa`->@Rt!Jd5XB5@蒠qB@Mg HY:k.NډY G~ S lF6n2QYG@h<DOC<8 0/iP4H7A"3B0' Fډ,\"w^FXb!`$QA1B{3 E?BJb=@B@F Xr"K-G-:.&/`1Nh #J#9` \ BAQ8\h؄0xnV>g,` P =>4]OoBl0wN0 X@ , Lf *h*QYV š-?pGZ`ĊЂ| -?^Da 8@ϧ1`}ڋ_i>AGzjаÉ8B` -cƓp @")s_ @ 5@(g@J#]bxC1GprDAOXfB f>JpXSm, (S"c a?P Vp|Pn4J?ÁoH@. `8aQ~0¸)R 1 1O~@4]PO~@}n9$ NictrNr!K+"´~0:TE.xjj(j`'`K`x/} xfŁ.hG`*~G|5z0RB`M/`N HtSœ4]C f;R`@J`@i oJPxpMSzp?fqވfWq3!i0 ` \!YJ@1BLoOfH y2SŠ*yC sΔ'.)@,xs \^qHbpgNqenҏWVK}"O`XG9p`AeA'83bŹ&#ʕ֝pD6M8OE% A!m< O @O< {>O@xX'q<E<\2`"DACJ,MKЀAxInhSj*S s4* H/x$Q;r \k˕A>sݼِIP1b 3g`ۆ( :" VxC 'S#(#K1.Iyb4aeI)%s?;.tf:$Th\'ɡ7Ey`O`s@H"b*TŠ,1$8öH064407paZXĬ` HSRױJu E:Z:1>p{@  N͠ PB P2T}=9P~D~ G1(HH((PjDu(IbTis thNbĠ<3 $q@IX{d, @+ ,oC0@/S†)K) j> Pn^ x`\C/%BS(q0>8`  IJMQp(#D U B! TR`u:@,TƠC "}qm*!d4'8Bp6?dkA7 nK <BT0+yt bT&n*~ P%KAL11&0$I2$)aV PXe0[G) '[nXHy 2][)K*oG'T|HG(x1aa`#NH:` !'%wR8(C\_ybDT 4J%AA:ؽڃln5"A;#(X$_t &T$u &cjҡuQ8Y8 eZ PVd ?fVxӨԹ \o|  #0c 8  87ĀEbPjL*ő01ZEJlkMrMi<+R:@:t D$7+ĐϮ%Лt18 '8$ԢKL4XC6 h6J  `r߿mY <M&a&H:ikɆ@>EZ 1@)iE @шPV@2H)@  ԸCܮ- D 5 M$ ~D< C'daC( 8!c RO"i~. R0@'$T@" _ v5 Lh(10&@āl2 vZPfjP0"]@Y1P,IJN htفswn0Ҁ:zd"+2,R% 2$3PuDlPDm"hc nzA,JJ,A9J;9OC hjQ *$|*`t4)_0=*`qì$Qr#=7ˢUb1D%L8 ~@/KCwjՁl/X \#^2@9*0'T"Q\ 0 V'AB P4fd r?5 ZeH):A`h&IP}0\`&[ŕKD0?a`i(B"IFt *3S%aNC  ,@4`)_"@ b.o&0 #$#`<("|ZX%QW ڛW,Ljǯ folxߨW@ @ZcSPbY]X%Z5__BtF_6Pz0@WQ$ E=xO<-}֡< 3Nj̲7՛ BItѐ B u29"Aan@(P ۠8|XS# MBtP߸ ̀ @6I'zހjLix`T mH-rZ .؟X[@&lX[@TX[ E`%FWbn :X[GPBaoinu,|X[/M,-fzN> s`1'F ڏZy)MB֭ Fa;֭ f/Aj :^a+֭9ZD/ L/4`pjg PF|Z @ X.Jj`cPfTrPW{>P\&qB#֭Ө֭3 uz'jޠ_5 '֭1#_-[ < @Z@JP@Z0 bJ@Hڅ_QdJfPFnOlS 3P  3d1P O^!xjgC3ԯG`[5ۨ'q`4aq=a.dVۀ oMM y\{"d;A0Q7٨Z_L.=Mr(SGﲥ0}PeS13~!c~p+l  QuNh}T8@1?SĈ(` Mv]}V(`Z䄨 uW现} >`U oVdY*o_0`R2-OE.mjcH%FNa ]^" 5bl.V,5 #d}L"jSꘂP_bLp LBp|A(#:<K5:<M ?S@?S?S L?S@3ў߄2ՓAP@#k}<_o肓Ph~U5 'և3P+և膰 F$ ?; Au!ɤz'p@N?0N?-x使hah~HanևCS CB`$ f0CٻS0B,y?Syq:蕐8?Sy 6?y@5Lw%=!u= |jbk$`n>E6BSjw d0Nd30NdVB]E/I?N 0N>0N0N+0NhCH/]S]0&]⁰& Q|]waju|d鹙@oW]w~|^ $ 3 /]%O<+ PG(OZg@.'u`NT<@. " 5B CjN`-L uCy]A? CjȠ+."À!@+-]F#d&0Pc Tz`F.o 3qBru`I3C j`N3 cyASjN4%6 @?LZ `/ MB@#jN560N95 A 44..a]|t~mBƛAHP_}PKAjP A4NtR?z?VB?SͨC:?C?S@ SHC 30Nz@_M@/< 60&Ta ` F@& f5`?>naZ$?tCY ?S03H?SL?S` @-u`l+ua+uy!M`P=`>XY=K u`4p#PN,1.0N,u66   ?S  ?S8 S<|Z~Z7*:˜jNP @ \ O $+EMB_¬~q I lB_BAІ`  `\_O l0K#mPPNfjfCljcèojd@ֿ`\ }AZUcɐQ΢gㆳ Q %2~jdQP|@Z@7(gQu_L"-L$eTs WS S0YZ"u O-LjL`-L$k93 /"Y]kF.aQ|q˶ʿ# Bb jy  > <#?u9@ /ojg$||je +Pbj`Tg&֑#h|:4_Q h.~Twp .0A0-LƆz`P NJ$mjbd QE.ZgS0\N?O>UD,QD`BFնS%toj`pV%F)Je¬8 ֡!v m@3\@S9EO@-LLuOS(_S SqSސB2њ#?1 U\02X4?S S 7_Џu SY7r2[#2 0%C1 m 5er믠{aiQ ƥ[Ռ '&"g3\ٟNb-LF`PNJLڄ7S S0kC71M<jOS S ]7SD S?S'=+ ! Zha͠'`Ojc0 KP9݂Q ^O(%؃ 3 d6@`JBHF#AG]%=ltnT|Fp -\O6@!EՒ BщMB?8+ӐQ BA/Z$Ϡ+45 B H6jW(_u? AC F G3_JHjпL -L j0N -LjM -LXjpO -LjO܀B QB B B X93Z511Y=*?܀bX]NZAPEojc ?2QWpJ\ u 4_(:tj}+ *< h:4~6$MDZ" A ’˿@Po+!VC|Y d7o#!FC|i 7Ho-!JC|) R;Hw)!RCyI$;Hw!!BCyq 7%z"No&!LC|1 bD7ʈo*!TC| "D7Ȉo"!XC|a 7o$!HC|! 7o(!PC|z;w/_y~ 7o'O|^ x7o#G| <x7po-[|n \;pw%KyN8;pw!Cy;˰w`.]y6l3ɰg`&UX;ʰw`"Ey,X;0w`,Yyf0w`$IyF;0w` A<y 3w/A^: t3g'AV<yZ hg#AF<y ;Pw-AJy*T;P{Ԡ)AR<yJ& (3Pg!AB<3ːg .AL<y2 d3ɐg *ATyR$H;Ȑw "AX|b 7o $AHy";w (APy;w /_y|7o'O|\ p7o+G| 8p7`o[ylX;`w%KyL0;`w!Cy 05g@.]y4h;ɠw@*UyTP;Ƞw@"Ey; w@,Yy$H50 QyD ws g@ Ay;w/^3g'N<yX `3g#Fy;@w-)'%c: 90`F S0X` DFX:@`f4 `#AC0Lf0`p!!Gl0.0 8$`0!Ft00` CcF*(0 u(,`(!0::!My0 ?!a*oZe 1&; Z0 W.IZԙ.!\I.: `pJSAG-i\l\`ANSj3LuQ` G |6Q`I: M,@/T&Za !@B>mN F80PHt#..cu74%J3>T, TZ 40 ``~LB^(sQ)~d#yE(񧣓(8!t  C(0(3p$GmÌR,­Hw9tY!Xe|b2h50̒Z̘. @A2kH @!\J035 \B0l&>h ܭSq.|D/͠[è%_583H]4oC@]Yli@3(\8C0'y`ɰD!~:jJMAIBN+?1z :B}n46~r C8T%*S؝:amN`I2\kk'P @ۥ-|r(J(5 g?h1[`hG+,LZ^"2,,{2?Ƣ0D < <U0}L%@=xA =EnfKUP)8_ M g~Ш@B w|p1wS}Z0H`@e PP 040`T?c`Łqd`ኈ؋GlRFTl~rJR!T_ y{ jC"@AC#,CV*4(BY'p3D sR,c`j&ȥEo %$]:]AK4g l0ct?pvQE^q㭸@00E%Mb~E: IN7 @<. p74kV? WZqxe~)Tӹ$`ΊY4 KPgTuDHE$l `'/mD Hd6pf_bF`I}`cdU,\u%CQ/JH `6aAHkүH\C,:D*هjzˬnP ;Qbt! I] 1)ySc- 2)TZe؝4[ PIۼ"!a FT=Jx6Ae 4's)Y0V)<&@̢.9 8FDH@4p+ yR*+N @zLx'ф-&a( P/PC9 ( L( bP`}Gwa}('9 D ^Q=ȷ >"0S@P =#X6  r]ds_:"68S1hm*R HtR fltx``"O~ %Zl82aPGTgTn@ +2; ,_(`AK>+ۉ8%W;FQW^\:4|AAk0C%+okOf4LJC}f8cf 0J & && I I: V~IiK'yBo*pN !xA8[)@qY/b:8Da*G$MRA|s. Wl3RaƒRYOl Ap`M5b80!HY8`"ca 'Q,2-.4`/¸GAcLoz"k~_!Cv M! S Hn ϳ&f$=F;4,{g,x -I(>@v}3p6b$n/NZ@s4]Nz@`ztx[9AB A )1s0!`9V^ٱ՞@ b6I-)coB8CT1D<)((n}MŚe "PNx*1~&GQ:-sީEBH(%`W9ʁD;Č+)`(@ rqm(ג1# !r^ Jtw ' Ts ` C( >0^W. G l+i?2jt[ :TD0 G4~#H #=צpn\HH.AD'8(2:15dž 8vBqp m e [G DW oD@$ dv=+DcPN HQD1HׁrHI$86 _Tf 7Ơr0dE# rX 8PEoQ6g`XZ"g;]qtvt3 $))Q4} 2TH!{O-@~ eY4p%`FPFs  nr e? fU!943(H`@5gvJӀn4e 5 n^ B[G X8ba[F ff;*y$4@ B`"[2HH7BZ~/e_ yp:`e*Xd1V0vR`ag~q3\ȻQ^W`fZ @(qp3\r\)s?,4h$jBpCb65XbЅM+#t e: A%N K`#A^:#-j*S` /HI CpV 1[ݕ0(M0B@XQ g{LMuCy=Ah,8F z;vAb&&T`Ya9¨^1Y\A0h+T qU?p?rCD ty@`?:_d W 1 @O:\N`E%30[p_31'x,XNE0@7xZ`lj?"_! 67)PPnat@v$+Mc?chq }ft[*,lΈXA#7}@C7` 4,E,}f>` 07Sh`1UNq8*qs(>"@? d 1C$ iĠ, 09{\p>t'3 Z3m Fz7 8ʔ‡[F!Gbo b`bc#bbTyBBdB97%j #n^x  ;P>38`!yW(=4m@(5-Z K@OG@ 0 l—SqqA6[S-PT%aj <'-'2c^ ZahwP2GQ !ٌ \&GC'g eL[PAwBpAw|t' B sSܚc؟ ~rz;p>VD@8A>8b  ɀVl nb}`S@ 0H'fŭr7 S!8M45rgsp9$T3z ,ь$'F*uaՕ*dԐHq'p681La衉b sK JRePtnfpE P0 W!t 1^Tf6fYb8Å b.3%I0ڂgÃkpAJ V pEn USd#p( LB Ni t\P]A\SE)'c(w~2C^BÃ.c&fx!cEr ; )7HG ܋;4&)b.MBf0>/ PNC(`N5L@`7PDKw A+`#pp@ ؁рA5?ހ*=s0=<BXHbF`#H4@@6gBB.i[`|d .0brl 1$a0qIJaP9nE SM}& &B)\h(K(`fl : kT&* a0^bFLF <@c-,)@(# ,Rt8r`Cd`) "`c uKPel@p9Do!&~~FDKR1LP>X BQ'UXf_ :*LDP$ ?u.g#* YF=0̙xtjtf0T4&Ƹ:DېTiTx3B @ dk@dbO , ᓊuWs<)[(s * P?Hl젨(hQH` XlPdE?^Jgkb(ARAM %Aɸ  $fP@TTiR&Ty(2TYO}M pLd5XFl\€@waaz . >L C? t=J@ 7H=zK"Bވ-g.J BLJ$Q)@?v:)w)gp:86(,Ԝ:tK|Q}/x!0`I#Ce7Ob 􂶀NP.dgգڧL5B~7 (`fzL4s' ,e`^vC( \@ ݃Ԡ4[cldH[ Ġ ȠL C !<#< ta4/AF\ {W/F J#@B96E̐[ЎQ jkA[tH0 ćs$H9s䮁]tt v`.$4h2yQ. 43) `/j@*U SF 5*{Հثz x *0. =i`&)7Da`<͚` fs`P}|4( "p0"L%) : щ rA@2 ^3!sv.8>b* 0 p~kѲh>x '00 I)" )0`(g"6`ph.""+0 @` =4Xd`F2 `zTOB(Jd3 E 'E 99oF=qBuq^ C,`'x t `"&o4 ,z5x(&:,V9SRPhN?Á"OH L QЙab@ s$ ULLŐ <W FoP& .H<^˄sy%|X R @Ie mlv%E*-P X<P1h51Qh֓@%@`\~.8"XH9܀XW% E&ן2u.U gH0 q!!H j c\Y) T i hnvj@J Y/€%JCD4g4c`XNXcZ R0qO P|O$3IcHFG'jK+%SfaBuKOaLn%ؘ$ l  r9xlL TFlG03&!n!X@N@0# Fh0u @v8h"ߤpO Ry+y ZYQNNG7 #B 0f8?HqIpMSR_@2 #K^hPC#QLR@<(P&61&h:#/9ra&v@GPܓ:F3CUJf?J?@p9S@14vZ'V"a80 `  &!`yp'1"_ :,h/| eQ¢" [7 ]bL͟@uF}/R< aBr{^P+ˋR$a8`&Wh Ju 0lPh!p Ll8 !$$qv8t'`I)?J$ x vjh0Fy A@ E1q DLap'J_+[CA<5@@ |\JB\dYL :j T &Ӕ<@ jS `p+tSfD0`'; WG@T`P$Pd6|7щ4 -8 ߟ$IX;RW a͏‚` @!@kH "(XD5&@A5fikH~DgdюHFdcw UfOoUNCxI IτdDAq@y]WEH` ֠ v0L1 `%- 9  0`- :0(*zT 4)P81 F. P3'aE@IȊ4*5S@D` D\ !Il\NC@ MtV涋Sv%nቒjqwd-3}@> ? *s<P L$H# A%T=9. y;8|LhF N lR9P,BYpx†`.H-:!usU3>( x&sa ><<.A {  TGQQ =B{R}v3C8z`9c~&MQ4;$"AP +0ZrjD"SJT D&T!=R[Dh@ @p@@<D ol {LNi̠9I)D  q `!?4#"'x9.1u#<'%J+JpbY< c0M@0h /;I*#pL}fvsHm$ A A=ː'RH\gPK*ŠՄ2? 8@菚/ ЄAHBW`?ag6IEMH#z ro=C:0%xhJxԀYXk/<@J ,a\],,Jt3D9J@nNu=\OVL VplJY<WXR]ij|` P@*p(& tXGyqJK6YPIvC`2G:Ԡ~| K]$  (":""D, -@T@ ")D9Ihd>8`%,txlanCH9$|,pȁvwc $lpA.}vGe/Q4qWSLVX:8`Td8e)/ah0 `dDFK TR%l 0_`[magac'~n~~[7d0yak9ĄGӀ2rAb'e~YmLoz'Te`r&M&%p~>S|F>=&?ޠ&AjxK4tZ w  х!3SN \hbo lCbMc?Q&dXDbHoX`2;36xbgw@cE`#C{Dٕ,: OLL= X089iQG,|HzsCm6x>$8)B 13'NSX#dn"xaB 5O*C20[2 #` O(/ m.u8L.m 8G+."0b4@&h#0@ppND46"hꑫ@B' 0(;Fh\j1%RbtAh (c !8"RxDD y, ]JEc.%sf<t@,8ihTp}n:!@h(h.2AP ?T #J5%3Y aK7+s"gHPt. H HC8K fGu&fMkPH Y DI+D HI`V@JG82TY{j+tǃI&4MNm+~N Q:1`uBscCInPOD?Ȓ@8&bD܏}c/s :8`El`ۀ⛈.LN f( GB6|@X `jPP PPVPvPP0M@BW)]D:}W5= H˫f<8'98Y3F' 99@s.0@/Nc0` se0` & 0 VF:qxu%<@ ,d /df| q&Ax{Ɓ. ff0 d41 1\~AOc@ wQ@LPsOOPGOPh 'S ;0C>q#D NhCG#`?zj e'o0 p%AF 4 < ,F`x L_K J?S? k_33ϟ'֑g9 =L3'.S; 4g?g5L' O;L.q?<qSp??3f2y?6|~?L?9 1 39m̹ s{}2~%|ǿAzpyfq8 A 3).s}6>e,f|x}8< ;| o6~ns6oſs3L>ٜ?s Nu??s Ao? |X^|x;^Y-L%̜9W3sG\O9'N~|81ψ~/9I|96ߜ_~9gN7L|& AsCx>~Ddrzφp%?4i3OS?<˷M!&z S?&xY;L.q<qSp6o81|O?9 1 B .Z{=8s.~\ϣSo/V @ڝgq{8y8w/9x??scX8 9ُ50o9?2?~@3Og|<88sO_ˆDQg_N{/?_?;Jop.~y8rz9aIz {q=Y09ٓa֟s8z9#ae 1||_f<`~LJ Co`ߟ߁ϵ]O`b'Xw.?c`bP` ?ca9A Ï2~Sʬ%u>s8>D`0L3so?Ϟ=b=zp Y΀"|x42̓|=x{@Գ\bw?g:\Y=5Ş.M qa  & sGA~W <2N saڟpp&g9g>C?8&Y< όll` x& m[9ә{=2e9͗A|3Ō&j|D 8+VpA36>kίBqc3$3t53x8"e Oa^ڞ?!N pO &psŜL5Oxɝ887N|_~y;;NNpg>Np4Ǚ85Y|ɛǟG9 Ni?mg?2iSgȰN#ッy?88<  /:(8{Cy,UH_~:>I 3$xÏX 3@,3>ws?aD% y J p y/N \#ui?>>}81J#_/gi IN\ϟ2p?'c9Os|><N_bt9S=<||' s ?>_78:D~g?]A~gI{S zX?rs|s<Ϝq?8&Yc06s7;>1''32VADfl|y_.FC_129Œ, ?p8Y sC9@ '@^sG9PEp`'Dsc3{6C$ǟlj1&!N9|%3w>ę;?;<Ȝ3u2 ;9sG';>#=ą࿿לAYxzsy3}8.Gx ,`3pp>H'26o{Zdpp0@ÁԷ;9\LӀEje;?3Oj11.A;,Nqq092@s2~p3o`9Ygg#8 3'P9Nrs ;|>30@ y2s9Nwp>8GggNc?e<9sOuhY908HxU=<;:9876543210/.-,+*)('&%$#"! ZI?g_zR /~> y^a~yLqx~pp2 s7 ^sT?z2j=wǝ|O/s+7ժ|_Ly#jx,?S QxdLjgc~q `9Ibw'B /sƜ >Kv}fa9o@ N]'40#3s2Nw33"75$z~pqjYP#9px3xև˜꣺U9Z-^7-W;}  @9@ z;L s';N8֣KQڈ`d\p/f.q!{Br+:sc3+Û8| j>pʌS6GH6pIADNxN|y>@G3_6x=bN|qx0~"p`8z@ yV_Ɛr={ }W>!~{{Ds{ |!Ѐϝ̃x3{v2g?>cg<989os i2<; (0Oδ@96{q%b4N`bp~y_f~?(|K^?:ٽs0rd3$Nah=Q~@}H <.^+ϔ|A^8W/2SgLpp8tv889L#~i3:Sӄp'N|?!Μ(7? g<'?8QVw*p߿#U2'>syTig- L9ffNLps>8Lߜ瓉_sQ : CGyaʉwPF/HKNy| +j@O>0P CiϏ98#'sAp~x9nr>3ts~'q~,77ÇN bp$qrdgLO̞O^oN U0< 8,f'!`:e#?<g@|''g`qG?9z2 U)Ty  т lqAJWs@2R RqIM{O5v`H<.0p|KQ; /ȯ/֔gop|O·G9xpZpa`/i 37zJ£#| #<1'>8<|fpM#'>.?TCo,{ u/%W)=S0q`d6o8p`nqs |!ЀM)J8E3;31pDQ38uH 1:ӄdy6w ,8O̧ gI&$?1? ENps2b(|?s?Ë9?4 L'08 `% you:L|>;KX~tjLqag8?8L 9 fLLA9 )$D@)m9ft L: 9߀q ?ύO N`bdfJ#7cU3?32z'd'{9ffNLp'xa1c `yp?q >ZIޠt y| N`}+ԋ??J@@(dfnj㏎pyA>@p+?3l3s ,%̿˝9L"py`>|7a,~18x$'G&K1? $x(gpCI 3ÁH/~p0<~g~p~0Og9?s~p)G}71x=5XY*!N}nmSP L?j;Qf@ڜ,N 2 @ft 93w8S~qsɜgS_"{Q; s]<83NesP@MK.|u}oH_ϝCr`s88uy?ppagss{")ڑ/yxO3 Qɘahy,O.͝' %g+gʜ{Q a'3_ 3 2CÁ{_'pCpRs\_N zo4^s(׉'/ RۤsvmN?>iw~< C'?8\|4 N YѓfdPsZ#; ps8P{| ͜fw, &N xjpSߝ!fpgP| Q<=hvp  pӀp<*D1 ɳ?8`px',NMi8䊯ϝx8v%F|¿e{pLM~cәϼ 3<2`Pxiߍ?Ogcy!'qg@1¿38L8<GsYوEap&L.|sǸf`H>MNq80`JD8 ç<ɋ~p,90N ͚zC8^yspy93`a~afp =~|Xx 9ta^g<gjIpe [78Q5+x\N:lޙ |n'\ b_3FrP@D@sj,ڣ18#|(SARZ83:\圍 ‡~qsɜ_"{Q; sQ.-J'0Ȋ?% 8i9 @< 78Zӝ|>}9e@} y C Or>΂3seM Ze@Tgڎ? >{ 9̞yqg 3g }Zp|<`Tog p(LZ_s&( @<N9x Sf qy;>~_"s9s0`2lp  B8!Ց'xLj d~`?~~sj<689,Gv &Wy7Kn>y| ،S  Ay9/N8y!'qgcgNh82fg >v3,LjDNa! ~.I>~8'80%"fFZ<ٓ!p` |sf=zp#&~jp< ?̴C?`>o0sN x<8:N383aDI wK`5m H O yqO]@֡6c#T@i oG 5aJ| Ɛ ڨ > zr{:|S30` G)`@ *I ",Ӭo/*CC ,hP^AnT Pxp H  ܲ r 3@kP%;l ܰ< ^'`Z2&?a*Xk[`\U \#P#4:<`d$? $2Dݷ@F[20a^ i!h1 >ː&Gaa3p:|9W9Us_Y9 ^T2 {mPJIrzk(` YfV˜e 0Q&=( Ɨ@@Ƈb(1408@z D ẁ^ _\VImin0GZ!nhiA½ XiB/o@)FA.. WO. XۑHItcl n0: <h{ U4/Fah45 q5\nέ&!! XNS IA2?b@<'Fؘ]J p,,BC> T>?c4 ޠn42 ,/>'г01 `Pj $5!GI48H…S8iP~XzZ`)?/2а-$\3I:JH@(D/O]B&sB'$jBVMCo&4rԩxInHd0O9&&8 MR~k~jGHsCYti`10'(^  h> mˆ8NrM!hzssD?ҡv m0M@p rP 850h5hFd bC\ 3™4,kL2M 2Ġ$@%L" ~8VZ$y;Ғ|I@vO@be oUs$:> H.-C ''"-&n09o!*++?   ;  );`< ! 8)(>BwwaK#~ghcAb8 #XS#BHE:8"QTHUkj -$z ]՟&x0 ')Ȣ *HCʁ2 2<^2x- hhP%"rX3WpypB!!K',+~A\BUxqSA膥ps/,HBFJ ?Шk{V}1@G\iaЇ8 4`%P~Nnb D<} %H LB񠇄@shJM,RNIPm[%n鿊YZ.B Qd$%MZ:b2 :4 r0`k%Nb l^hYhY9 頚R=`rmo3 &ˀ iZ2YMfX.uB `z>B" >'#   P&d" n 0<&5&8 X&p3!RIB: @sO,'/S01q=Ƙ.l eqq(eQ? `e"P9/< !Ƒy $]O)@1V2səJLoŠMN$ *OJ԰($p4$AF#!@T ) 8"\'QCWK? ֈgb,$:"LB:052',j@^Fx)5H#\& D$g af:@ $ 3.S`@g;p'e "4iJqfШj2V+ `I 2L'7cp%pD)`@EQx03T<)hr5^@O|xj6Xe  I7 qr񄏀4M?sD|A :a7.?!p,J,H> z@@L w a`@@<1nA0z .= a>Tf 6)Jnl}% .aCjg0t P/FK[q 8 : %DN@ ) 8LJhx$}W s:||O?B,3Pi[ < ;HA ]'Z`A@F)9'`C;ގXAB@p rP 850h5a84+bA mp6dJⰍS'Ie8^!赢 Z1Bxf#Drd&QOcE>i2R|Ä9@BF h&fRpC'AZ:PXi3z2BJpeh~k~`0jXT0DN"oI ~X@L3Z/)js'^f ('oHB $401= .@l1W/`U_ݜvh " ~B2O{\(FdHp,BLs0$ de QJʏ7`>VGOC f@]e#~O@ fUL'@d}s A+# ^(iȤ8 k)&g5G!NCH9b#px: $QI"9R ).FaDw:TJp=1+6 Hk &%TRaf Rx`+ 4X`%r@@b; AN`h8(21@x(4(1(7P(6@(7(4(=GtP$ (aDG,PQlhqi]>" 1XG@LʖϮ2H*|vp@s@rP#^Ә(PR,'I^\ %5I/]͌؁)vE@`RNw[}rk(2zpCECPՠ!QhLbP1 <&:E? DK dK|Ȱ%,0`Y A RH;p*/G y $y I%Q6_)_8dB*F ~p`z[ +%E#vp.;ςqdȝbY:WB̘D <ht㯊Y0*`Z0( eŒ$" /wJQ RL SM(]A DG҄\/`li69>tfj SWD {X !* 4{FE5P:!@u9B^ $!a_S`Ƒ5 qUH~` NU)f1@Z M MINa1)R 3К܀RSf@%~L0(Fz2= 0 E\"-sS1ÈA6T"s7:F^ hm8 "HA1 8L@2081Ct`*,q2QMe.as&  `r߿P` ( *@P0x1@!X A2`A 3!M㠰'D|fzP_$qJY:`PATAVbjq4N]D6 KJ O "acP`"8HaDgc /,}a723AHdSxL8_*Jst`8B$: *Rg/kAQr?4ʟ>@8䀘f0 p'd`fc֔X!!)І4m#o(mB$0Dt01XY& $C02P[@e%@HdžZ̀gSE`~G~ȨYI?̜ fGqKRhRa1% PIt"-`f״wa+">TwZj6&`$:2(z<NŠ `xDh P}fP F4,'ap .<9 Ƃsh0 4x/a6j֯FJ6ϐ1. BE?v ڮA\h2 *U9K`Yb=I{T APu;`}a]a4 hP8nU@*UJ((18w A@T1q-J\  5H@P!IND 1@mALP 2 ¤w*ATI-R H<ʐt.R@NeDyB@ $\4+H0dfvHa,(j얡.)N0 `X c-2|dF@v Qbhf B w_`b[֭EI6 %5 6o,AXf<,G\d0 P}(|R<]S  2 zr&V< ,t~/]?0r0!!D:X4`8'1E#`E@/a*0< 0-! ԟc\LQh0 a .j?M#>`.j!"0Ξ@8 JƁwl FC2 n,TƑ,BJXR<:,0s3(``.APB-20p`g%h{0F _&Z\JWnό7+M`X&?g>s*)0t.8OѲ Ns7ɲ?k B 4rJDP2h <hd. _gIA'cޣux؉ s'X ڈB A6##-?B ɼ Bñ àK 7PDS}M $%[ǐ@RnZBA!BΠd@=CaP$&AXa:n"13*``H *l8pa @$n$P &` 'CN0?so`U7dkY&g4x8y=P[.dNl<J<Ģl RcgSf 3 [3$LaqUk8`\ q K h7! NED.)<A"A^ @- > Kf }07(SfhNc4Q $E$y&DO@ί\(@) ?Re/kJTB0Axx_UbF`{4M69%$ TF#&"g?') @Hf" .C|)p!K /?@_ĈĎ!QKmlv`6@DHLԽaEZ5.}G( ;Ĺ> /³)ԉ*502!dY?R1la| ӪpqZ6&CQQ@PJm  9 =?=fHo3xE%GW=h.5J0*@JNXvhX6A0s.EF0T@N7x^X ʠ?R]DM D zlz\ `" p D |@,8 yК$g/t`%S@Խ c_f0a=" )<DE$ff'!O#h8m(V}< cr ywD6"AO? 2130rr JIKH*)+(>>^x 8//}}}p _A@= ^x 8/>0zPp _A/}}`.x 8hq8 `+Jŀ<0`!@K+Lppp,~]:ξ!س|8?>Pǒ9??+Rn~ǹ,~p T@ZJ;0:B?#JhQ"D2[}G^<Z`tо80 p)<P@ G@*  bHH }a fd̼~`G}GqPg <6@62!N!@r!7i #==] ==ţah FD CF@ungf@&h2&I  !/zcu(gH!pB p 3@V .ul$=45( e$"##+axiIp N26X' H*B3Q$ ATmnd4V1'[A"P 蕅$" P ~L0,Y+%!c7#=T)\arAtHhG_KUkgpVC':*>sI()s ȧV#H/hV6z80,P jPP@.PuH8JF$R0H8*@x}`p!f:LXON H:t3w% HpH# AOb$-&$,)(P@2<kf1p bԣBLD,);@`>ߟ+ OUʝz {."}ς{os K(*<%Hޔ#%>[S5jr1{.-H8=/i R)G5b]Hk3 2a43/@ pe:XǓX*Zj 32 PADjq!`.ATذ 4llCz.\$ 0YpF*2 AZZ :@0Ba`!Alw(+l6a<qp0CV8o*PC;4H1!@TRۋ\xkc4%+ػ!;3bCU.TwPTV:JjD+H&M@@Cg RS֤ deR}@-%oY4@B<s P@ Т\v{Ǩ##ßk=fIR]aʈ+٘ISꨓ`&y@㸻;ix4rv `r4 rhy< J}h`nTm١Hcp8v hMw0 |uW& @.1bx8 !D0=J`r*]hu0 MSRd 6KSܖ XH4 S0`p|!y\0< S04m7̪`vQ#IFC,r30 G1e"Y^< T#a_ 30iX'LcGA4$0 QE#0"MD5`@"Ec@At s蕇x= HX+#aPp$P=/Bl!q X(90 t` f np&X|`>O.n:'t=ߪO,\vDM k`E,_d,{Nj| ,meǍy*p@tHBxy>X?Qc 0LZlBc>C.5=@ &Y*Co @|)p>O@E sa 4a,H?u g"+܊^'4$sl,51>on8q)q8D6T겤4`(b1BOh2d(rI/%1^$MjI~"3&DA 0RR$$fx՝X\@D Թt=)a[ |<"4$a`'4AhAW37Ia/\Ҥ00̄"?H$6\ڸ p _ @P$!:tUb0QP {аACI[~kk)$')fVEQ7DrH0%bANA,-"=&`f| [(QKb!1 N0$.AHY!ڄ^*0@0u4$ AfKhoEE#ك@S^88rq )p"^ Nc:-4eM+@CST_ЄJIo93&Spg 1&H`䛃( MHO5$ >Ǟ nz +7`kzG3Ѓ`?NЃ 6ӡG7PyvQ!f( C0:'+.Afe{3g @axU>l1.@"pMv Q@>Fz;>N8g_|WYHy2|J[ÿ= 9$ҠIh `64 @w\`EUAtcHAH۪3ٙ@%Y6fS02 ѧb:|  =Q2?.Rf ,i00Ai=] -@hpu힐!/"E&̆,@KYCuSU(4aQp>4gn9 MpRA TLD |<6@p * !0e|DN4*Ȃ{" h&"1AFЏ9pFPwl2bRC12be'2w #BH FHȫ\ *"Y@WeT #e&U"@M³XN @OZ%I?plZ_E6T\,K (rT|"' .h.1 PrhC .J!9". j(FB  /%O@Щ,.!J#DK2 q 7Etfv8a&ҋtv<9g =Jih~,᩼ ) B[S8S}T9Ý^s2R8 8%Ag9 , up-$ZR䂠+DRκ1g=%4r iӣgBT؄&0(cDD"e/ezJǁ*CbFQMa8GLl;Ur8=g>Js8$*XA8C#s [>z4 TcRy O GfMx,QP!J4@٭ }JTkt W zQ~'*B!Gdp*H<ȗ>9T(QgFVZ""Peaa~ū&ڞ2w@KBqh`sJ 4JcEDB0ε}ru? Ϲ` &@yr'`B:9\@*Ga$^V;ȐqU@ WN>cdY'$ 11 B g=5P \_ȑ*e.5*qT bFc vyJFW8)O h JJ P h1J`.[]!hDc$tCTh8 )]4/Hm´Eђ* ARdTH@Ht}A( Hu B18Eo:vYtO <4HM$<pnFz09+p,c#sK a43 2 4l_pVhWZD>.OA2Z>'`Aރ*F8?@#U =xlNyޑ8&ĺ2l!v@%M*@0 P80 q!F)2 'xb]6b=;Oi{hR PV$z4s ) Q*B`۰+5klc\pOr@r蔅e\oA>F3K'=y@$(A|ʏS`z k\j@8wA1qHbD}T%OkiHxGXC ?T gOA7u#4\KP ]~g(_o5a23Yhd@(Eʺ+ExK0a*4r:&J2{'H 7!eKp ++tT@04g. w[ :3b]d~+##dGBV!`VySE >[(n_Bx1fDR Z'`vc@J;@l2g҈`O=T! .aQA1T2ǘi6 xB)i%X0An"t4}ʈU`\qG\e] !;J "hg>>}.]e<~A! ߦ/ dW ^q+ $ ߄J>?F$-͍'q6`8$k:@oN% Iö냘(_H<=Leq> K TuS $e =T4YȂS`0/Sl0i˚x$biՎ`ȉc%&s(:ɷœ@%EH#a<ȷ `hbhb PM8UHh xQHL̆ AHBBGp ޟ:@ BFܠO{uh? @(1uL pyC,ί%@@)1+> bHPUF 2@} ^9 " c "(D> 6`b)C>*) bS '0N )F f=:V kw ?2D<'dܥ",<<Τ !p>%i i#`)4T,-><8 +ݘ_1!829H@Po\cRq0@F[BW5x瓎<8_t5΃t'5( 'QlPHW7nhU6 ` t%T'RMK"NZ pjp\- M0$0z!f?C5 S \F"5"11ǝ"qm[E@$bq'_p< @x7/ph4s zDq3pb#w0ab@ ߣ60i3*_2P (tzj0!,=CJcpF 5>egEdD"83B/σɅC% pr9vadR(&]J ft=  HP4w@@=cXY p p , 7bTq<!c`gd$B~Sl b?씇uP*eQ)31 0"L,?,Y@e+@@/um 57 S޸\l@\icq?&p-4-4A(=!|)K/DM`\H򂟄`LFAؽ?y8E' 6`dz#u($NaZ$Y_R)%F#F8`} de2(1!@QLjp`CC@@E @> R\5 YJ=bT\ 5d2 삜CQ\$8L "Ȧ#٨ a쀚HO6~LهmQ9' OB9&j*XichЀId0\`1>A8h1hx @N(D?LBy{}W;h6B\&Z&b(%cl&%@X>Yp$GrQdL|FyXO n70 t'Ksa+ ``0.a Bg60 `@( b0 `"V1P0hl$LPOJ| `&nXR (!ybc CCr'߄{ۋY Sp8 ɒb.f H9'.zx"f,q@aPT PrM 0+GwGX&wx=n/(zI3wѠPO V:5mϝā5^z,ʖppF@YBFG uנIU S&ϣ$A D8 i0 P:kP?kK҅0{Wـ ]}ȎDR_(~`Z([w A<0C:.ITj& |; %0p1(V`' p5$d*K@|!Q/'`4 p~1T ƇcP?p" Z|E0#^C0Jr >`HR6I`@ J@f@ ( ` ä<`.A&SÎ#@B0?$CHMNCoB'M5A@ @AߥG ]'' p%rXhAXD"0V{"HDZ)8=O`~s=8Y. Bsg3;x0 0`e&g'J'<_#B/ ; o; v ?`IJ݂\ U tക=0} s&j;?> !S8DD-q 8N+$H= $:L  "0""E\޹$\`e-@$(I;n*OwAR6_tBI'H-@NKa?CY_r1"[jp6A-M+^flr$v!)pJFƠTPSyyp3KsAr_B;!~h 1 笊HP'HKP#<v^|P.Ch> @~/tZ?1!H@^'[d H&H$&$88)8/8PalR1w S'j A"Œ=)RjJ7l3h1@3dX=%PB.Cl Az׈/r@&Q?.,V@A Ԑ &t/~9^xxéSp Qw H}%OqeDqoGa P@(O`!nn%BG1Ecl/vp+Gf|AD2`y,1@`sdUL @`*lJV]a;qNK= A! ]Znw:'f!GqkGTUJHk _ߘxg _4Ȧ #*P3@P3y>v" ')#܂Gz"ZAL>6 HR %#A,>x7 `ƈI$)@dttOni4 d\@cCH+|HċŴ5@L JPiGQHhNNNϖG8, t#/Qna#![HYs;&vFE Y$x @X U@^6xo0ف=bn$%lNB+ex#|K}<@qdM]OB?#jT!FA%A@ 9@l "`(,gI=VlV{ UU%q=f5H\h3AB UO!QwӜa0Qt/G03T;:D4ӧ xEAp" A\$AY c|pd I #w@,WD4䓠 8pMq,`B%..`_ }xgFIM} , JVJ037pJta#*daq4ڛr[ќ-NJI!@xDqYtMh)pL'3fmeGӾ_0oypqn8Ȩ "6 ]UZGw뻯@)j­ƴ{})ÄHaZR ,@cАhb@P iOTI_2s@ aHhRiIfr: kTP"Uu Dt50Å3dC/^9KHb,{0vqAu4DfGRI,2ϭ &h0@F@2ʖ;㻃FfhXCPa/U XD4l$vHnsM-#W/B4LNHOI)*A-8D'`QrD$o٨,7Tg_'hH_k`mH.ZHȋJix$H%@.ۉC PKV~8??%MJ}{R?J *ɈvQ<PP;O>; Oٻگp}Xbő5 mJa5^2ӈ 0d$A(tPa>r=iqŇ{KrFfI<;4,P;t-:/?C]<@t.~G A%h?'a 8  ~Rf4 0zR'%`vxuBse@ 9K(T:ڰ ÄjNH.tCc3X$u 8`2Y r3G Yv d#B0M@`R[g1 `Hi]M.IBH1 '/߮cQecZ']JNgDQ!iq<ӍU.E58 ˂+^QRWrW4ð>=!?=B -@-x{ Ԁ Qt+@4R.% K B|V9@AK+i< `< D K0bs*@mNhCD-#k0~ hWtlS@@F7Jпh3E H#A=fI;!"B2| ?Aɼ^oc8([L[CA`^@I$VȀ~\ }#y`!b창VyIPodbO9`"au_@s8CCc%Z'0)%0s4:A:i)0@42!!C H~n\N%%@dth_x\fȟ3]E#p544Rve1@3A龻8al6mɅ%PEMߪ]&s@Α'C>'Q SN'\w:  B DK~10YFOIBV oN'E! IIzMRTlN`DV(9 rD웢ӉDtO! kA ;܆!@ap S B@ #AVn(ʉ5Y(2Sa{<R# d3cGyDMrq9_ڂ`ƴ@r 2*C+ Lm FL7Z+r, |o0< u=7#iK? ?  @ tJ5!;u-|sI?Ɩq`0il`C;'q2gN[kj{([S8[>"SfM"Sؠؠ_S>:9䞳GϏ7@R ;5 QK >Z | Bd #)0[<a$M"c  )q>݄p `m>C2pbiJ@/ Q&R Axl Lxh<@6 @X #LJX@ 41f8?jې=ߓ+LT' 2"' KopBG> OZ.Ue㰷p$ d= D289t7p[9;dā/`QbàyZ&\AJhZ 6 ]rUb k Ww0U&j )@RgGR>=xA a"5eI)dsi?pUXظR Nl")@QpJ6P YeLh G? Bҡuu(:xClȸ6Ag ԞXl=Dtd Jx$ s H xd ?a!21{6)p3^x!h#u]7 d+f 1B(p(Uf~(p(%((hS(p`((((`(L>e?H?PK-OXSt/4ر)b3 3p0Ll^@"JaeHq0 (`&ѤA, 0 `<0h(H@F 6`F<8$`vI$ -BWv'p^ BC4 D ңl gu%ip&H$DF?BDpF"=c44@fb@tҀR=GƄZDJE@E%IP=iTFd$a$M!bV( N? PcEق KUtfI^(FbahABr>/Ĕ@߽I+K(D-8/sdQOsVmבg?`@+q  d5nP ý& 7AkO}0I* @#5R@uHfQ żNQ1oQ&2<95EoAOR]Y})N|\Q0 `{CBߗDnoo~>00z)370T^yR籃!jd2kh38 9!H6A'O~9\L#@$Nuj@W3z8/D % 0O- A><%)u& ]8 Q'A`@aiB<2 :6 Q:I? X@5_$Pb=?]@RODҝ8#C }Ju9*[Lc᥀LA|p=s?K8z7X|W}L `}&(f 8DWMΞ0'FCP@$*%( !m4u0R 4,7p ̀ڧL.T HfB}PO;⚀F"`'Paݲ qVtM9Rd G JQ8aSApC<_J"|$e&k"nf'81x!\7$1gR:7#.0ЎkXCt 1n>E; y@\ex M%YI#!T&&RN`@b@E@ a[4Kt%|piWfwG'!(%S0J&A)z|"%61AWy)@#z`` J#$1J;W^*1> -iZDM~њBH( ?;,<@.̂(ǰd XTLGcRD$RAD/(~vgFLZS$,Yv" !$CCȈlJ5DC0|1]$#^n)| L1.ZNEcc9ʐCRQ\^%7Qr Tm}0Jd͜"I9@eB܀`ـI`MM?04&tp1iP2B莐 }/m1bA9A ĀF2H<"^ l(,/ l@`h1 `\ ("cM"^E-9B LX$IxChCe3,r>/P ̠踁b (BfL@$Au(%2t$NT7AiYh+2``LzD8n1&S V3 .H} ∀-5 Y`.ì@/$un%LpҰ @ai ԀjI%$Gn]5-  ~0$ _%$vDx xn<Āƒ˿RtPwr,E%KB83A3%ï8 ~8+Hٓ`uEXybvY=!JB,A]P[r D"Cm͎!k^|kbyqs.36M0 I"ɀD2嬉N|b9@ |`b1g3>S.(P/Gy0 ACe0`GsӐ'M%: ɬj l(sA+$cW@6M@>. ChsA:`G0Y0 p`o= V)L1djp ydD X;HjAˮPmU]&F‰&+H b +@Aʫ׳2*|gr HA 0$ ,J( 2j&T7T)7)j3)>T!0LcsX L JjCiPAf)zFdvN0D3## :8X p03oYfVlrf@T@>@  Q?@OE9@x`3}-KSr hmxzIk)7 - ́gK? titA$v'D8(n[*9oȸ e52.R ($5g@@@ҧL8>=@r@NC$l !+>#@6JXm#!969C/ *sCְ7|@O|Q|@CE#hV3lPz Pk%`{E !< B7< @` ' &;&8 "$1V.AB#3<`+M0th^! JSNlT5 |` HH tr'ɠ $XՈ%A((\f`cƣ8 -Pye aOv* '|!t@Z(:0t z^B@ ^|݄Ԗ~`y6 N~뀒6, 0]H AT} @,`g>!x$ ɠedchߖ s&:i)lZjAI'%>Ѐ%A(LBK; bQ<!@ɡD,|p):6 mKT/|cP 5G?T*HQ3C!!1&pdf=%8+BMmiH%"\wo@44xQyFm@ 'w`dG`"7`va3e!Q Qfx9[$qLVcG\o@>" 7_;ǘI_],Uab@ EaCJg"2^Z? [ḏ8`bp [ZL@bx|Z/>u׶FD )J`>f,9}HH`S]3)$41 9Pw> RU:⦎@  N FDSe@ZEAO e S|j* $*||Z9BU GgrA+3G(`fmͺ3 R4TrtFtA%)N̩0I9?A@O8۾K?W_}0 J ~GRs#'JC_ O'}mI /PX@XbAO8Ԏ;KC" |N.`Ss%  d@5 JJb fUؖ' w.YHC$Mt1Lu $ &H]VkxN/T @L0o ?IlF@,cM  *:B,;Rr| 3 ;^RY VߗIBTfuXֿ@Oz?lu+gbv BSH< a=B2 )d[(.9Nq9 p6@!R?H(@ $d%A߄V =J-k`(A'DT l`?cxCdXZ!ᢏ fŒ`TP4vF =I@RPbq0!Ca'wU@> 8U %M(B6pD6 ?,2ԭy/XA2.}_at\v < 0Sa")x,RYz# JA4J)JJ:9Ozn/Ȼ3N L CH26P448Gf_UF %@2 ``'I#@ 4`*AEj0 p  Cx `+ʠ UJS?#~O{'$8' ?ÛO~g3/'|?^DK0oR>C^g_| n9g?( ~G{Np<ss3y~'.<⃀[{O~?=|vzi<{;6faQs-/8?p?'~w~O=S>b<~O| HE,wO/^C o{$fd / xY˺G˰??@{v98~^^~ဃĀċh`QռKx}?m`IC h+լ 叁( 9 ~GgF>r|?2ApD>GsM Ae)s{lES|113y0?9^''#ς^\Px >yg?ͣ@>y9ad|3|n2 9`XAw:ǀA|ߏn@&P1ݿ|0AųzaSqyXx 0037(rsp@pb~O'X'ߐM?8#w_O,dpr xy 0Gp8 <pˏ?ȱ_m@N`yxB\>G~<<0gy~ z7{nLlq89>2B03 2~9 󗙟ΖsOs'͆癙„]}|@s|?o? Z+< /o,_~yw7=ž~_]2Owhow}~$L)Ğ\*g-疍_] 9ppzdXA<j>շicy _=J^O/=0LwmS'Ő qa3 V?K.A߃@'E0e/?BY|(Ϲu }9|>< /0rWq 8f^[7# 8gBgx<?ˤ0qG?@. ~~9<ן`~@rgfq@ yMSE w>a0~o< {0ݤ9!<Ošo??/>GC09??%O?m|gA/Y<ncg&<ϿOC  D|g<x?3ԃ_}y{'?l\>h@!/e;?4']/.M'?vvltFB 7s/C=w<}M'~w_~O=1?'<`WO "?d9- O  <10!;ǎq/8?w @{9<_3_ ( O8 [H?cͳ~q~'{/^|<'8z3x>G1;0 =XO?sϙM 燗R'a8?q> ~:q2 ߔx|=/yd@Afcsmyn#yy+6r;\ ~EB3Exym,?Dxcɋ''>Ǯ TxC @p~\(94`r?p~٦Y ]o0- `<_Csr?N91_/'ߐM?'0DVE|g7#r@y}|0%4O-RCy07s<y>=.#?ay~ z7{nLl|q8}?>2=3yfx7ƅ~< 9AgL\:<`_7ϋx ym\E5&E8.0}#w~ {o}~O?_nm f 2#( lGG=󯐉|^X4rp8@N# 0,_>x @\|t?9ǂy)ֻ噄?8<た9"agyfy~p pm"(_qv,??m'/Ǘh2kF6dX3yw!x,_)1 sɁ2 o!_^kǗ'lF>c&P9 o5͚[~c8y?4gs?'Hwz~ҟNoߴ?,3(>oN\H!ːq |ݓ_>.yp0= 2xq!eCYrs<|yp@^~q=?˔R}|oG<B~ȸ ~GA|# ~C3 <dg?|fy|Wy*3AË|GoÙ<~ <)0? 0*<~ß?-? ` 1@ -h}sf_}_̿ d~m.o H0:?@3 3~Fe"x0p9|'SO?9#&Mma S䙟v&l?S`81M<2E0 ~p`DfpsrKl+6RADg^Y03&}o ϳ / ͌y O̘|qˑ7=^49yL%?8}?p<fp8s2?_@Vn4kfn oxw #(|_Ï #84ɾKyIX83Gr;9s?#9G1? G٩grg>9 >n FrosG})߽qGoo~t`gjY3ܧNs9?(W!6.1=?_82< 韓_/?!DɡyP )双LC@Do@E2<09ϑ叟A bg(>A9=|PG2|R33spt&fL`\O'dݏ/,Q !T=U7}7pŇ@Śޓw/~Q/~O_8go/<g!@}|=?s+p' 0ebx"733S^C?1]_}?^p|C6g2gi]5Հ31PO>'?sLrk$*\> 75 iz<!g0g[;󟁟x|{~xxy˨a 2G= @x =׎8|`W}DM#|9`럓 僇ZO2c1#2P3Ȱx }>'dOG~ff_!<-,:|ܣ?#y?ǐ~>83s=&σP 9Ơ-{y<$?>sA0^@!E/_ >gxÚsO f><<<?s<@ffNgG׏)R X?8`ǧ9~slx?J@ϙslE$yſ#2m~N8Cy)'_|&ds)L]|͘o=l0q xe`<|;0[gY B 'gC?/4y}y|,vlcy~fgEgMc}a"r@}8pu|ǀp<fp8?s2?.|c@޿~c3{?;>-~GP9俑AFph?| pg#ù?w}sGs|>b.φ?#9S~yr i|'͟Ù(rx .c@~G;321|{;77 ß<>yyt[e^xo,Pys3s.0?<^s8>' y|_񅹔xq nƶcdu`wuX޿p'8gOr~P8l|3?m\(c {~$?#G qe8x@ ?&^(~C1)偁C,{̄ffgωL̘٧Ϳs!?nbk#qG~~l2*/~?o% ' .f7ߧ(#/x/< Gȿ+w>~J៘ cGug( /Ǹ~7Q 0ebx"73/My<Ǖy/yy 3R 34.fߜ?8΂~f 3D'e8<36wa9qxp>?/ yk'P0ʘ:!P{xA~ .u0užgh %'&*(82wÙp,99X8xx85)f>0ox83/<-|2'#?33/?  <8ngD03|`J^[4^[OB: 2LOy O-{=y3?73~gy@~_/\&0~E >`vOns^93ffNy?єؽ t ŀ|yE] @ a*Gh ;m|{/Eǻ#`Oa0K|g5x("ċ0gy~913ea"L&2O")/cxϳ&d~?=p mˏ~p10;Œ?xK|@>s<)+p3 A#.y>xy|bDas ~$\a;!1%`߃oܤy <9OȠ0/0s/d?/w`d?~D|<G#A'rs|<y41{?9M?8>Ld O3y |CY# ?'#`N0^OXaK\!,#6N /mAꇲvC|0>f,s4%Z^~g$>?2` 3 ?wAr@e =и x|L/@.Kwg{0&GdC0dӢ&ixBp[>NA>'=&' g13<'9y袒q9!2wb1>D y?!@/? _p 0dYϕmE<0!b`_%xɞfnn{y089σ5KqǻD;#>AG"̙?%7xLτ~G9Ƀ7 39}h~G` w~܏p 2#$~g?|0LLd_0~}!C(o@!p|.fC<|s%O ȳzA!#/"'CC lyD0 ȀsχAzb2 `g`8@py>HL>^ }9n).t_#05ԃ0t0 P[; 9\}ٍs}?,? s |ǐ܈qP3C<yÿ!^_0L=LG>de{'ȏt0>EcXRH:x0$qLȲ>>fexr d9tC!C NNy ϒ q|chf<4&glNbXĔ2y >pnL 9s ?_ϡsÿ'Ov?ǀ^|x,0/<fx,{cS ~ ?؈ O=\ SE@o$0%20LKA6 mYP‡÷`D3C< 1$ V>k' (ygٚ؀A:  yZP96  \Tfd2q ]FQs"`f^#KAl, ^ "WRe /Q0!P- hpZ!@H (g(h"꩘ mU; PF @ ((\RNtc^Cc;B=f Th̰%4=tCPd&!Wޱ4A,%ߖ. N<^@fJ(k@2d;1H(kN!̰kE"PIl Ԥb|䏱ǘTAQ@`WuJ wdv;m|p̠{Q$)\8"pJS%A-qZdXhއ'CnA$G{\_P(304c 8D%lH0AYRH)2ĸ0  tP1_`F. `&ӂr]"ږ,ݣʸKHca p g(p 3G- @@ /x@ |b) x XXXX 888-2<@ /,1ڐ +[N0?q ɭh‡2 -qx&8qYH]Ə H7n^@ߠ}Ts5D20p FǬ.XItf 6qX18>jk .b\~t@)ByI?\'7|81],7rw{+X(Ԟܞ{RD4" 8D b)[{8##߫dBPbtvBt@ߣ:a`QE{J.[\s:7- o1FsWrGDDIY$_8"!JCF B$8REH0K#\n9h s@tEEFdldm2m/ p"2p h%q 3Re?#UJP>e<&2@f6C(y͐ N0~'^E0s@<5TaBeF ++)Q*!Q PF Pkh-ҍ i339Ub&ISaNpf XX`"G0xGCℙ=aiE-Y@9 ?"Z ,JD&'ܹ9!6g ADZa|A%P;F z @ !Ӡ{,Er*gҰN dm$Fy' 4]D?XK.Y$FppGǞН2z00C" 'ݦX[K&ܮ0a&"C>C/7Q4'.@S.@XOd! ؄~,$}8@ m JLⓀ |Z!Q@\UCaŀjf%`A4m># @Q$ x6j+PnhwZكLD%i) @"0$ҫRUuXO#J}"&0 H V  "%H!(e0T#@H1/', sAI03 E`Bb`({(x @8 2s^ xiy;{3̅7g0_àp&')P0;gaAa_0lq@onh7'~51@>L_7 rJ(*Ĩi`w N0+ X$$v5<#W 1x%wo8{A$n@ :ׂ[lI{"0x"8%C"~~OO q, T8@dPza xX_^Gnu0~ Nf 9XZTݐ.tABbBoSp@JBJ&@7M  HB !1ఽhL(JeCBnaiQp   l* [@, 0 !?ltMx-HL r$BdA|9b쭄+|p vZ j ƔDǔ> tĀ b5 Ѡ.q/f^0 ` wy3v58F{Ą41'4Ϟo8ކD6Di\A^S<ӄ2F@wlBc}pO* r Ha 9'0904@1L&L@007{\|W^).?H%T&%X ^tQxc^4~@ 91t ـˆ+J;u뿛\MI h0`0zx%,&I`m-86h{ DL_A'A),=gddGujZajlr>I`R#/lV_ZJEx[3wh@I`\"@H 9$p< ̺/xg:.(/Rhd@(KP|TXuOp` C՟p h1ۘ FÈe|CDm#)*|xP'ߩAB1 K@8Du/n2sN : B}בYd_Ĉ7R6ZJS2Iش sl\XȁO=`B`d`B0&R(&Z`o`E=y+ x} 63s9A(P rC?E0(c$ྔj3K,l;ۆ2 )a0or1w61q~pt 5J#@XHm[HmThzl0^ s=IJs6A#LaJ누P; <0 tЛm\jsc<Ej@O`F=C27ȀuQ093S/X!'3A<68H_PVТcd @{.&dʠo݀}2檓'uEPsT} HgБ4 /%82Ȋ 8vEF*HnY A# sJBt)D$aOSJ NAH p,mh1d@/sJ$@,Xm(4$X- 0> 4L(zC@ZnJR%I$j> 5h{Jb=6k_W>u"pek"$PX~(Whhuj LH|QB=`,F'O,іb6h+9ϟp4)I`~uOFs?ң*#>`gyk@A3@9X%Pfd`p9BT H%ކp'*ǟqT)όN@8O 15FcŔPJP3#"APD|R3px`xb `O'<'(,<c AA?Lpt08z OP[TAEh(j{`2= r3.-0@K +@N$nk?.Y='a܃&q{Ȱ2?ͥP} bހƈХzQ pYPN0i7a7%C㔌F{!pPdʥHnAvA+6(2`8cȨTy~^?H~xy 4-4޸Ƀ%,L/#8p4(!8\btT@M@bߥb RBV TG頦,Ћ`, 3M1\)Q\Q&dX.b/csq_FyBa@ p_F&PShkp KQP0Wܽ,Jp?`;؂HjeFGp3/]"%0 s_6I͎&0bA4gr [ F1Fd#֒8& ks]BhϊGH)pRw0+B09D x&W/ᝅ 3ģ`8NF}eAB`8mlG^N$q"j8H NP =M0ʂ=]H7ަ'=ĹXBV k "3ӭ%0ZƐڡ :`A "ѯAe C''=<\oh6p`$K v1# q@x 8Y\=4a&FC"%0w: -(8RpB*j0$F%4X<"H :@]񂟅65!\ƨA`&N _FSZBm'# jS4c$ApDH!nfA>̤Q"lFIK1ʲ&n0 ,̦mv  io`FJ:6} `݄x((;5630 $KV],SxDR@&đ>5l_Å!O@c%JSӈ99+NqPNq1R Rd6@JD#g{;Ćxm lC xx P&؏ZPxa)'> !њ54~/8IR rT$ҫ$'!n8 J]ʹʫK!z@üПcf$eU` 3|@'7)"Pt@o~=qFdpG^r9c~:Pߎ@5zf @U+c@(#D6hAN@4e-6璣$G'򣿄E'J-I^Pr (5.R XC:| 2 ljP{UcM6@Ir]z4nTSAʜeRP&i hs**Tp/#0ߚ|Gc??}qh1@i\LˇKpMсm6X}T ] Y|0@@@j2 r 'L⬝@uJ'.Z4X!N&=`. a<* Cq`$n2-Ԉ!k〗?N~8 Xp$a[〖J8 nPBGS4! OuҏY \\WK"#310a,E$M#pP q&&`0$I ձZ D {Lwms&k8-01`"7`b7HK/bAɓ$ѐ~ @q DHA,2IghA0 ASOa&ԋذ3Ths  JȒa"F/D#׀? 8D-U DpoA3HD@4A@âA(EP4LBHy< t5xSgH 4by  <O%C8jOrX0㭗ތHl 4IpzNMY>̟tA4RfP"];-;-́-|H! ;@* 90*D6TL֜;ן1E*G# .gAgҖ d{p,<8 1>r u%uLd/}%ʩ^4PA uVX P$2! ,j(TO gR ,Dr >‹3!#ٰ@2M8%&dN C+`3Cʁ(XJ-j~=pO.! ^#Z{R`f tA'2J ozAz Ush#HCp;JDa'A|pi@OCY>@e24 /T@" 3 &Id|Ka(i}@I]f@#ha CD$9#s K ᕘhES8< XlDְB(- TS;i` Jυx pB\R Hۍ83<4Z0 4XhM v2Pe> t QP(8 r!!VYNU ȼ<3vF Jc!qF 4 1`cܐvp2[1 vbvA!ܨ #.=Ѓ՛d"ڦ8CN$DJ3948) z@({s)/L`A0@d|ZlA7PijNГnOV|^ |2V $c 0&QC@m 8o2wf&a ÃbrO!7%E=`t8J!lAxLVnlo/H=-DAD["rR{T'3$!$=@#qp$THWi% '@e5I:A`&Ì){tO#lRR<3"bY5w4OB$]Ȕ)6# |*A2K/mg!}!zC p|RqPfN#ҍ3 ")BlP& L&Q\3 .)! PnF)(@JP4$tG5 t,J \&/ "PA+UdHFת|6h9 Ӳ rd$\YsG NwNL4OLjk=4aEObhSNn_%%Q_:D`4ܜ  iM#4`P %A 3AÔ@Lp$R55Te>_$۹ x*΂^p@smd#Hq<`d=&Ƌ]@ 6}j'PHhV%2Fݽ[ \_h0{ 6H2Y@ԋFD+@`dbtl0a|_!8&h?L- 8WHndE%ơ(d @:2Q`MX`"4j0p\  rxB8s3fcm# 2"t%14? ~Iln" I[;  JiO:=_\.to:%3 d.E#A4`]M}ÅCCSe@8 U@ 2K~.1Bg/DDvDg5 1 IٴH@'1SȞ'P Jprf@@G@IJ/6 $aRaf-|,0'U#d;JAn-hdA9}Hϱ(UPL&P)i @A@ I4@ y}C|_s:Gd @[7H6HTf@ a`>?A?N;E Ф(j7tsq:= , ׿`H"`E 0Xe/~_b`XP|r3#((4؀ЀҀQ4 -(0'A90wVxe. x$6%h޺&iAI1 sT "CTt@Q=GO?tC#8{c"h Gp%s&%rYW(9.Ef}prsJK@%&HY(b pC$*vIߵf|8 1PG1O3$O0$$Ne@Z 9H5weFi \$ gP -7PP0((hk/@ ~ph"<{ÀӀ  /o? =jE\1G G< HHpx&a\2T%bXSGOx;Y4X`1s@-I`,E9jP z6II%(;T2@$PJja2\+AԹ@@+l 'hN〴$8 MTmb30S'N QD uHqDa-h0-0|K,@K_  3n1 > ;8^,E7՟1'!::3&PpF0GALb-Ah;Dp)nz؉GRD4 __8o!?d0{E$i41l3a㰀3ڃ&Ct"(Ib L(kvwg`Naā݌x)"  zd)P%I|fDL" ~p* e0'$ [Ӟx9.|KOdz0"ЛRW04}bf@Jb?//B&e$$酀 E$$R9=$Qp73IbI¹0b" xB(Ġ&d  _O:;C1%xt*ӓ) ;&0I1!֧z715X'#INr Gf0$&M|A O6@2+F6} Q0BVI&!aL? iM5 Z . CkNa@ <X),dG$R??=D-gn!:' 2 i3B!`M+pl7V_Hх&6N |4z/yw>TȢBRy6̀F'ٌ%4v 4EƦA&mh]C`u3 C"޾3xzWHdA&]HvH. @<ĉ&fd v$^cE1xV0.I(?.o B』ӏmdC㠾Dtȟwtq@"~8hHҸA8f@S?c,K*BD+d IHgMKi0 _b'~&~1 'xqATxup#;L Ø2NA-?J >>yAҌD@ НhE!k!mlDK*P:φ pa$KHm@UK B, AvZe09N 4]$,x.n/a*/꤃0(22~`@ o"{g%E9b4))A 8GJ`d#$u' %".g O;@(!2x% TA$s'98ru 7(2itV~ +0BE!DR*6ءIFL`t T*)(xM(*[ ZbBn"Bm"HbGR<iP~x"`EE 9"Ҹ"f;`@ ց1j p `2ĒPi ok KY Y: ܔ~ {Ȗ@[z*X@%(Gt4%LFP@&IniA H"sZ >;N@. ^pX@ %&HY(@M[@x"w.pvqq0dМǡ@KBxbZLV#cDK@`Q 6 `J !-,-vPj` o"8 EI& 0 PS$0X`]tRhSj0 MhHF` &@0 `X3\ 0(-P0`"P$`P0 `$MG4@0l$XF!> pF*0 x ?Y8*@ #_oW׾GG^G~tu|nOב>GG^G|<y?'@g@g|/#o##>py?2?>z?c#>?9_Aq~tu¢Aid! G%vp?a0I>OG  dܘ83<zށ3^Da`a}|!XO@yy~_̰9OGI?0ALN' 0q?& ܽ?3tNG&dΏdL ?>}yـxO>e98,x <@d`sg~g_?:3{GF@р`~s#*t|b"<^?>ɧF"b C{?y3_l l';!Py w(b(b_s7kyx 8ן}f  F~ @IW? A ,WP1 8(c ?Ͱ>Yp@Bq }=p0r`fpekf M@S;3p 0(Z#K(8%P cff6c6x 2@ V7w N~h t J ? ^ {B t@co74@|}3o6j h`A.sx,qYIC)Xsyw: qY> 3?Ϙn׏?58?x|?x׏W~W8?GhmNpdG܇gwfD\g(po~vCcϼ?><#߃?E['0@{@Ly0/_#I q  {8O{~` &x  6| οz$|~w3`fC烃7s?j?8 3 6,_gIl' Ipcs8C8by`>s|>S| 8~yf}Nl ͛9|`z~eYK0 ?^?_(<==$<ノparY9lj?#;Ƨwf2c2pqa3P f ĜѾCp:ϜN !?79<y}fl#>|ﰚߎ?:Ls~>`}S %s9?N?`'8pqGGj>A<|pJJ߇f#?3ds!<|8xpj9s?S=9f81X!XT >?hx;!3&/!XE񃜰")_f1~0ÞSt&y{ 8 Krc8ess@U>p~1 8Dp!p0g3?8g'9EfH9@Øjuzf6_j88\@Jb[QEjp1P#p7qLql9`ʁPHAB39pgpQ9aM@ c"`3̦N L?(p&^f-;S'?fdg?(ph'`|'˃ p<Ӂ oGΠ&8* C P#A1KrA4v }dj~ ;y8? xR8 f=Ss8>oۜ^n'Mw33p|VY|S@ ;x858E"??ِ geyN;x0^g]?~e9g?N|ُs Y 8OLp<<3gy\ 3p??e sPa/?ο32O_/x"?O2 =}Qxp w'x̅V<G{ٜl>s%_80`=r*q] Q6wӘgs_8x?I͂2s-o?E|P'7oC989<3ss"ڟ㇅q;0\0<Ӄ<s4~6)*|p'󐳁ß}gg g??nA903gp;q9A-d aHYߐ#s}o?R9waR5>p<8{8|~!"ha98? Q'<<{pP@8PfD|VY!8vdg8E"??ِ g~INp z`939f?Ӂ''~}ӄ1B@! 0)<3gy\ 3p??e s` seڞ^8x0O3?; <7 <0x [%{ٜlv =7SK8+Rq&\'? g / 2dd|?]N(382aSr8/pf>3Lާ9&lɉ.y1͘s8g1va=!'/.1w~p3cYs>8<'S8sLӃ~SFpY D=s33sg?OPmxl0uI0'l1ĜZ!<~0e9 iE / s" ]3p8p`qpΩ̄<+8`hbz'h@<m;>SU8Gcf;8{39>3cfZ9yyI9>{99焸͜ej}sm < ,|Ÿœl lߜ~p8gp'`#=?> ,$x?N`jv>p OVL μg3?s~>Pt_# X|o:MNRE?-Zr~' /a'/,+^?O8|8Ng8s ࣉgf#;`$ +>IN' jXWOm> >x9)Á)bdJa9ޠZB`Dljgg&f9'1#bpE 48<&p?NH>MN&1N!'9 %pyρ11pϘ3=W>~ds17п1g?86g8<Xq| 3?y70c@OPǫQ냼U @O~`| sܿϟJBt%ix >.qS4,p;s8 Q-Fpsdvso8f9Nx3 8FGNgpJ[L|p@ ={ӂ3bg3xx`B d`AX_ ͐*E ;9A&op'Ã?sp l ߜ~p8`y@ϐ s0338Ϧ`?:A64? ˞48jrpp>e' =Z0':q>L4p d\P/N|?7˸0|ޜ y&/ Ӟ|'#Ї8_@g=;p v'?f~c/nsy̜y gg~xT緑ڎ xiC_O߁p/\`Qmpp,N88y82far8Z' \ 3@?8x@gpN"`Ol3 ~| 3|q5' Oϡ3#$3gW>93~p~<3 s:=Qk 9!9 j|%|yO:< s88Qqᖣ892?[ssi3Lfq!@H'##'38e% -#3=p(FCd=i1?Rs3<<]#O@3{p~dϝ? 7 |frpfpBop' T3|g@y, @13A=N睍#8ìl3fvfpfAsO̹?C>wf~x`3q93g9GRoLue3v~!Lv+9s῜ -83p (?sڟ.G8_~ᛁq)a!`~w;ߞfy̗B>v'gLsxS~>h AP*a >cfl `Ӂ|?@gy朿 '?G"sa~??0-3}c9)h@0 Ax@aC7>0RD'?F7O982ypqfc8Lfg?N( 8?83N \38|*yx А8„$獟 zN ;s^?j|3gp~pp_<9:sϟs ,?739.o 0\  |/<ݴL~wx' Oo'gG;0ɿ9~!)bF Lq~R_Of,ss: 3L?,_ʅ;̘2ߘ |&pgOHgp<s]82& o`6W{29/8 #H#&d|f>|g@yD p~gsgxus Ӄs<2 Ý0"~fex53'&~Pr dtG'(>GLy`H @"   e>}?s?Eg6pp1Xp'8|g,lt#lp^C89@)?4 0!86>cś<-|4|??34U ߇? (Nl/y1a'`FO=?‡ .eaC7#8(ώ|_sL~pÙ`p<8@p81&Fph33v '~ijN CL'?1'ps*$<3gp~pp>~s0>8Vwǝ$x9p+ yjz/3Y'?ysy0?9w_?l3P T?j;Qf@ڜ8z&|ԹÓA9x圉 Nq_~'p<Vڏ9fv1a ?35ԢsZ/ʠ0" fࢆ1~9'8 `Y0T~'t||7'8P! b |?@<?=]>1hK;sM7 O^~\`q"N0g8 @aC?pqj8E/;} 'g8w˿LԦsÓ 1™Os<Ӂs8G^"pCܔ\&Ns?wQY838} ϜYD(q8pej3!88<>ϽQ\!hp@N 0(~ ,gf1?38gsh;~a矞}92`oÀ!Д9ß~|8'p,70)<@xPD``yCBĀyȜ'11" w铜|>9 gDz @ ss9pd3>C$ @'pO8/#|qÁͰù8<8 s\'8hw3~ 8?8r >8|PAp> N<l ze]'|Z,|`3Jo?ϗ 'd vl{t98'rg33ˣ<yA933@8=c37701s?|>9y?~Ζ<@:8p K E@7Px~8!x p㡁;1O I_ɟaN~fNa8<Ĝ<@0`_?>35I`K*= X` W2ƨ>΄.]e !^({W E(0O.Lo-:1PAG0+Q^4P3W@AxkX{GHI}lqs`e lٽbZ "DS X% Dw@7fzw3fF)v`T[9`sq*W ]B@O:3/ t+w' "ϵۅd =`\DNnq@K^ i8 fD7l2,Oтs IH,2<@c4k%@2 싚%2YOJ$rGFʁ.,ojsĸ` P4Yy "2N-K4H !"@$E  + <0U0"1XBM" àXd@;,Q#R2yp^"A; #B2)gdM̀iL$)Bjo >4 5BWzh-:\i{錟FStQ ҡt f@e !T DX %@ MbC#@yB<̡(fD ЧQ6Db ,o`m 򂝄2 ٬HKԃEÐmJZ30ğ]fN("4) )3$T'6_R1L=̹~TtR81hDAL 3bΝ$APX$ %% @?_^ L '*LB}ag@%pGB (#I+5ɍ`2àBh}1DSDaGKcuPh A%ɦ*A[őjˣDs)v$O %p\lvi(H@@^c&A fCiQld.(0B1 !߆*Y dy+oHiBz$zgF\90C h0#qa@OA Z͠pA,4F xCkCH^Vh *km F7'~ $*BXi pqPޡvnjh`Bpd~XxãAH=0U\ KpRl0ҸAX @}RFC0R<@ ̋ܮ@B@@i@i@A@)78P%x%pefbAjC :pp$#>A@0 0(<jJ`Ȅ\@&!Mhs``RSWAo1 {G& A^1CK pݥ(0MHFPkIF11k=5Q%.:f &N&J(DO0Y /eS3Кȣb1@v6[ez)p %(NEUÒts`5@?w` `s$0B)v4 FbB7}6m,m+4N$0F ||j.iaE,B$( A!7`{G eDD=6PΞúYc{0m'=q  Koe6\ƲY ц(~>L9ze,,y {w!A,8zpqE6vt757/QA{8Y \ A EL]\~Q/AS''! p@hjQy9y/!$eD"li6CRR@M Li#W(٤VgW3-a-L]je <) @Lٛ8Td94~PD_Vp)@H Kk\V@I118O +1(pS-aX^`E|ےTJ*< TTx 8X h (H IGkS}-q?#LTx:3ACJ Dc)13t0&7h,mL@ x0t 'QL~r'O!?`f^ ДRXA d p X0_o'BNba!&Rc!Ar d&*jy&''L?|uE|u?sh''[z ǴL?4qh:hxz, TXhOz'0YcqCp` A@xj̢(.^tLƎ10Cо L,4B"bR2r J*j?ڌ~ {`l >`䓭Uh{` GKj?utq Ks V?39j (NbOh4@C '$G( p)،(<@@_{i "`>b6NuJCbiCBtĴ< ƌ FTLGءL123 +;'7/=A wA s_bY}:W~.#dI \l`ȽA7!7G``qxCiАϳTJD4l|E…s:{$4G$n(xsxY_SyQZQW0wzct@ kMeiYqMiQQgQeQ@/m]!f}Oկ !G]adgy`)+Yΐ @'EѽzA.pHZ&֠惆=Y 3sRxh<ai!Ux [GWWVWþx?X4!C|ϟ¸JrٳpBNPtR@eYED=?<_<(Tvr"Uq %p2Lh(Ch0INUid71`,hE%*Θx9x efTKj B<"It[NX" e!B9;R芸&XP܆K GH=~:ْba{&v'LH9Lt swU P%COS'c>GP u6a&o 0ܔxRO#'C.! MAt ~Tr a?3#sCh(sc @.UЁ߀y' Rg&+`xf½^G؞$Aj. `_Ֆtr[MBiRhJ2¤r;0zt&\,?A?J@Jce#DN*8lsX02,% ;*dĈdC\".οၳ'` HƮNN6sA р`@#2&!L]/u!-U{ BGT(%B@qA6p"jhPNcc`DcA.tv Mz9J~:@A#{'aoKZ+I WM\lj6~. @OwJIm-M u5Ue%Ey9Yi)I q1Qa!A?_o/Ow7Wg'G{;[k+K s3SKrq#i 195=3;7?0xt|rzv~qyu}s{wpXT\RZV^QYU]S[W_PGA=g D&caUR32i\<|NJ`u23TQdf'A}<>_o*+NHM  B#bҲ˫[;FWn^@ `P0pH(hX8xD$dT4t L,moCEAFBD@Gceafbd`g#%!&"$0$"&!%#' dbfaecg`Y_n` _xk3xw#UŢĮv|_ g qvӄ e^m9Ylzbh.'64^f|={=5̯`aF{ / 98`gBJBiW Ea(a"3 2Td%Fub?wq"54,p^Bqq`qr4oCP<-P( K~Nl7]M3`%$e` $$1u3b;wt}ЍR K[S[𥇢PCY !{;.b6.5a Y|[83<\vt5PPL A34 bd$ 'ʆ6&?ۜdi94$Dz@rr0l0ї:ELmLzDC(#&ڛ `UJ, \]г G)O3ޏ8AP)'@.Nv.6.4?@vFN.&t?( NƦ.Y~3Oh nj:ÀP^ E0@208?@@%C'4/BNCrrӀ'Cvut'SZUu eP@ A3FUTȅ0 h*A@^p.E4 ~@qx##c,0@&iNP0 Vs`[0 VЬaX L+1F0svL/ai02#F0 Z%30 Zp{ @`C(P'%S8JpD(L%?`!qBc Ft0.QX$:2V2 D0 ``@$NEYh8χeK`C N N  r" QXh}`[h tyl7wH"`'H~\0:tC=-<[t`Ћ^``0` 1bXisz j-J,2)P8;>FhrDFAA>GZ r&bAɱ"H7 ^@$ ^B>A ` eh!h:ѹBea@C4Fۮ&h8:]2> 2$K1A e#H jRU0-xC(S-Fm@] j@hH$v/,)h(1& GP7p(K |) )iG@@ E@r5(~̰z0t" ԂB( y.CO RLY*-A%T ʹFR0q ( ; 8x$VH+pRIЦQԌ4)9yp ʂfTC0?h2ZÿD(#)|V JD+ X JӀ{ >9 & 'X8@YR|* twOi0'0_D8&QD9 @ pMèph@ΨHnrt56" Y PlTT28OD3 at+P&/З{~djN" ,aJ;@l;aJ,4T0$be6@NDTL2nBedO dY^/jXAD1%KL`rDrG<`H &48~B p@T0 s8FE(R?z3 2 og($=`BfqS0F Z`#!((gt# ``ٰes'4~ ,B $I #~p`%Ո2nOH. sRb< P@H  0KK6,A2Yȹ>ZVVZ⌘eiieh=,(4\B81B%G3! JF[,9W.ds,_N}Bf%e8a8f8b8%fgA  f y`% phxXdDTԣ X L,\<B"R2rJ*j:z/QT>uz+NoN, W$`( р[*P)9PH`x } !J#*_0"dr\%y{tJ+3CIR` 3l w^Ac;{q dddC7~'hOXCwOP\E# ҕ! Rx?w_N)P ) 9l7İ7C[vC!Bax/8C1*gG3Cj`@4/ĬK f[(A p I6bZ (3N%43$ 8jg"aUpbXl2Df^믿tB'RӤnH<g Db6 Xsvh<@́ɭ/9@2!`) E򘴄XqQ@=0}Es#ʈ֠%= A nrG00Kf acCƸBIzc5 O&DXd=IDA@ %AiS|T0CZ G`Tnp.âbR``@Cc;DvPpn!;I,{ R    Gx2!dw*@N2R-e vw 0g d ƙT L@KN >lE2؊maź-@aՑJb2K- Vuydѯ%̄$Ga N B(mi ] d c;bOyAn`īyq 40tQ2 e@~;~gpjG "HK2p@|tI\Y\JN-fDkh?`"`gگ:jQs4,2`@n~s_`TZup 8Ȕ @e #5P`3J* ܰ qs! tx]B 8̣67W'$VV| %P$)  =A ˰9Ɓmp9 =0# &`0C= ?}@b$0a&8` uHa!J@u@s2EL'A+x|6+ڂ ,2`PHhD 9ݠ`$udDHD`{[DT3!DD%DSa/תbG߷U̐c٨I_g#1AAO=7_Y@B@E!0 ߄6M]G22Q f%" tpy Ed0QIʻB9"*0pH(H% pw ;` `rD 5H"tzL #T?  ``00HI$pp 2Qpۙ~K1@ˋl5G ph zH@;cPV"4+n$ lA )EHԍ@`oy̡TQ㭠A_BN +tA@@:#k !uA8 t2#t % +[?^ Č9uB@ ` Œ d'\an Q\Ei.A%>Vq~80B/M"Њ> j gI0LgNV* FP) Bn S/ iNH=ƀFr!"/ ä!2jDW(9φ#0qt,I$CArβ%@ 0=\:n JJ*u u8È IB@ޑDJ+& Pk83Fӆ By0+8[лхmp@NPY! P2AP@+ඖA#du f`FfMD`1.C0E\nN箖 xuQ'\> 0yi~Wb"c ;E^0w"Q\gEIclt.# ݓUH~\2IJT#K#K@ nk9 'c@EiC`KR`#{"R@°Bi2mԋ@ iJlK@ d9N oee'~?>@ TjPKD"ABz$] bnjH\?ttHs j#G4$x*B ,ҐuhA$\ \M-lvΉΦN6t&nƦ"cClR8|X<&A=(Wk nLɒU@Hδ3(3`w  yY@"L3BCZ/P*ÆW@Ĺ "w~xJ5]AzYB 2xf$hg \(i$ I:&'ޚl \DB?\dgGSb{iJ?RPA/7D$rqdv—3u#0 jEK [F p9d}hO$CE<#@` %M܅6jг+'ӑzP\ Bя8p* IF2   ;M Olo34 jGԿ`Ϣ4  3SBLh^S 0OQ6D,  #ѯѸrhU?pK/K1"ԄQT$gk e:l)Np3.?V``<БyI0]W,s % A82P7tBŀ,N5~!ב:̠rl1%p+xO/^v``^Ѱ+y`k@ !;#6T A5 9 +bG 2e am= B!RxnjHM(` G 0UW|: ǖjG&((L~ ZΊj)Ps P3O2d~S3'6?0 ! i($EA{ :A Ė $H`\jۉ@( R.@/5jp,=! ?. Zq7ID@ XbX{ .@TmPKh817Nd.fCssX[C_" ڐ<ߧ0K⒈+3~cJahc0$Z92]>]:=qcW Ld[`"1 h!̡X:0GbD 7Ô|ax1?'?19G'M|<I"kUf^$LJ@> @ ,`5J"nK׿Xh5h7h[by8L[yu M3ca>2YX99 ML@FA82x!x @#-oA9Б<>S 4  ԀY!dٯC QxRJe8$6 LC3C@^@ `|+QD %G2W|b/أdK;_F`{e($'z^%b ]ICa=#z8#" 'w-NfB(H `2!Z cH s., љ Il>"$I$IIHa(F%L@] 42&_B`JZN 4!u0!rӁ>n@4>j6CA/))xd }qKH=8p}j+Rx@A%ZVFY7D={t@Zʤԃe116`mnbTNp#{@wjBA)9,9ĀۍA)]~jq"0^~ -fD`8&Nc)X2P=A*Vs b\fhkB@β,`!l!!1|~%u' d<(CH l#8L[7GN8# !J/vOt`y`yi@ܹ pz e"iJ;"0&h1PSvr CI 9 H6RP 3q'莋@BBNrD&*6ozP)Т {IkB go5q zdGHJfe" "r)$ J*I@I{() =$ZH0d KH9C@I\8- Kغ\l` z`T&87 l 3E_ %HbVAV슑G`.(n9s0'"a}8@hJ_ |""BhFPKб^1cm+-$-71HӓPJS%Y=J[pR BjlR00/(0*A:W vncP"@kޫc P73G21B}ݔ XZ  FЄAE 輀1 D$3 aXAH L .y{pqBz> ,JD+UkHdȑ:A'X E#L0AJ$B $@},„:u 4<=iOG(z?@`: @(c_1bp%pnN}VVcn&Gq{8= l 02-y bmK~9P V`( ap} @@ S}~0ؑ(@Cc3h20Y~mj (.8t DqlD2IdhNi$_lh`8:0q ,Gdj &NLd$?O A P df Y%]G0<71.a 3ؗ9$_ ?D=8%\CYՐԃap7?HO |p-R)p)O3Z Jr Rf@PB?}%/ =r5 pF-U!J!d~"%4Af`,^PL% E'%KmB¦L0 J`>)gt/q2L1(iU@*Vh B0`8 dA.X b(y*Id7BZ(Jp&p$6 a@ҫN㐺9 R`}1i#Q\"Pe<z.a C"Eqs hЮAF@15J@2`4HLD0H` EC L0 RH40'NcJ0(B#D404`y]¨`!aCFy V`p4 "0d"ABF0 4`h"1Bc-*!{a`@ ` D  =r5 pF-U!J!d~"%4Af`,^PL% E'%KmB¦L0 J`>)gt/q2L1(iU@*Vh B0`8 dA.X b(y*Id7BZ(Jp&p$6 a@ҫN㐺9 R`}1i#Q\"Pe<z.a C"Eqs hЮAF@15J@2`4HLD0H` EC L0 RH40'NcJ0(B#D404`y]¨`!aCFy V`p4 "0d"ABF0 4`h"1Bc-HӘJ)9<;:9876543210/.-,+*)('&%$#"!  ,MED.gfx1p=-?gg~ xgxy營`?0 y矞~y៞`a8<0 3 gxx`~36l͛0xpfg xxf~`1<Ǐ  pfx~y~矀16  gxyxy燀`c8>g`?  @eM ? 038? ?>1s ?~2Nx|? ?3 ?3s? ?038 ?? ?0O@ ? ?c8 G? ??#qsy3? ?q3y3? ????q3g33? ???n#qGs9? ???`8 c<~ ???8c? ??#? ???# ???x?`8#?? ?xx`<|1s<>| ?>?8?,|2Ns>| ?>?x?4~|3s>| ?<x?ǎ?8>|3s>| ?|??ǎ?)<~|30| ??~??ǎ?? ??~?y?ǎ?@ ?~?y? ??~?3?? ??~?3?8 qAG90 8

|33 ???>G?9y>|8$0| ?χ??~AGϙy>||3< ?<~;?~8 q`08?>|<8<  ???~?? ?> Ua@ ??? ?? ?0<003