Home » Archimedes archive » Acorn User » AU 1993-06.adf » !Tracker_Tracker » !APTracker/!RunImage
!APTracker/!RunImage
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Acorn User » AU 1993-06.adf » !Tracker_Tracker |
Filename: | !APTracker/!RunImage |
Read OK: | ✔ |
File size: | AE50 bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM >!RunImage 20: 30menuspace%=4000 40sprsize%=FNfilelen("<Obey$Dir>.Sprites") 50codesize%=FNfilelen("<Obey$Dir>.TrackCode") 60: 70DIM q% 256,q2% 128 80DIM code% 160 90DIM temp% 300 100DIM block% 1000 110DIM spname% 20 120DIM menuaddr% menuspace% 130DIM copied% 8*64*4+8 140DIM mainsprites% sprsize%+16 150DIM trackercode% codesize% 160: 170tuneloaded%=FALSE 180saveheader%=TRUE 190trackertune%=HIMEM 200justloaded%=TRUE 210delvoice%=1 220delpat%=1 230savepat%=1 240copypat%=1 250copiedlen%=0 260patlen%=64 270update%=4 280muscounter%=0 290oldpos%=-1:oldevent%=-1 300freemem%=0 310playing%=FALSE 320: 330DIM sampaddr%(36),sample$(36) 340DIM slen%(36),svoladdr%(36) 350DIM pattaddr%(64) 360DIM onoff%(8),event%(8) 370DIM stereovals%(7) 380stereovals%()=0,-126,-70,-40,0,40,70,127 390notes$="---C-1C#1D-1D#1E-1F-1F#1G-1G#1A-1A#1B-1C-2C#2D-2D#2E-2F-2F#2G-2G#2A-2A#2B-2C-3C#3D-3D#3E-3F-3F#3G-3G#3A-3A#3B-3" 400sample$()=STRING$(20," ") 410defvoices%=4 420: 430wbcol=0:mbcol=2:wfcol=7:tfcol=7 440: 450ON ERROR PROCerror 460: 470$q%="TASK" 480prefix$="<APTracker$Dir>" 490SYS "Wimp_Initialise",200,!q%,"AP Tracker" TO version%,task% 500PROCloadsprites(prefix$+".Sprites",mainsprites%,sprsize%+16) 510PROCloadwithpathvariable(prefix$,"TrackCode",trackercode%) 520PROCloadwindows 530PROCsetstereoESGs 540PROCassemble 550iconh%=FNiconbar("!aptracker") 560SYS "XWimp_SlotSize",-1,-1 TO appsize% 570PROCmain 580PROCshutdown 590END 600: 610DEFPROCshutdown 620abort%=FALSE 630IF tuneloaded% THEN 640errorexit%=FNerrorbox(17,"Data will be lost - are you sure ?") 650IF errorexit%=2 THEN abort%=TRUE 660ENDIF 670IF abort% THEN ENDPROC 680PROCstoptune 690$q%="TASK" 700SYS "Wimp_CloseDown",task%,!q% 710ENDPROC 720: 730DEFFNiconbar(sprite$) 740$spname%=sprite$ 750block%!0=-1 760block%!4=0 770block%!8=0 780block%!12=80 790block%!16=64 800block%!20=&2102 810block%!24=spname% 820block%!28=mainsprites% 830block%!32=LEN($spname%) 840SYS "Wimp_CreateIcon",,block% TO icon% 850=icon% 860: 870DEFPROCloadsprites(file$,addr%,size%) 880!addr%=size% 890addr%!4=0 900addr%!8=16 910addr%!12=0 920SYS "OS_SpriteOp",256+10,addr%,file$ 930ENDPROC 940: 950DEFPROCloadwindows 960DIM T% 5000 970maxws%=5000 980DIM indir% maxws% 990ind%=indir% 1000spr%=mainsprites% 1010SYS "Wimp_OpenTemplate",,prefix$+".Templates" 1020info%=FNgetwindow("info",spr%) 1030savetune%=FNgetwindow("savetune",spr%) 1040tuneinfo%=FNgetwindow("tuneinfo",spr%) 1050samples%=FNgetwindow("samples",spr%) 1060savesample%=FNgetwindow("savesample",spr%) 1070newtrack%=FNgetwindow("newtrack",spr%) 1080stereo%=FNgetwindow("stereo",spr%) 1090savepattern%=FNgetwindow("savepattern",spr%) 1100savepatterns%=FNgetwindow("savepattns",spr%) 1110copypattern%=FNgetwindow("copypattern",spr%) 1120savehelp%=FNgetwindow("savehelp",spr%) 1130setvolume%=FNgetwindow("setvolume",spr%) 1140player%=FNgetwindow("player",spr%) 1150settings%=FNgetwindow("settings",spr%) 1160savedump%=FNgetwindow("savedump",spr%) 1170amendtrack%=FNgetwindow("amendtrack",spr%) 1180SYS "Wimp_CloseTemplate" 1190PROCseticontext(info%,11,FNicontext(info%,11)+" #1") 1200ENDPROC 1210: 1220DEFFNgetwindow(wtitle$,spr%) 1230SYS "Wimp_LoadTemplate",,T%,ind%,indir%+maxws%-1,-1,wtitle$,0 TO ,,ind% 1240T%!64=spr% 1250SYS "Wimp_CreateWindow",,T% TO handle% 1260=handle% 1270: 1280DEFPROCmain 1290quit%=FALSE 1300REPEAT 1310SYS "Wimp_Poll",0,q% TO reason% 1320CASE reason% OF 1330WHEN 0:PROCshowmusicpos 1340WHEN 2:PROCopenwindow(q%!0,q%) 1350WHEN 3:PROCclosewindow(q%!0) 1360WHEN 6:PROCcheckmouse(q%!0,q%!4,q%!8,q%!12,q%!16) 1370WHEN 7:PROCdragfile 1380WHEN 8:SYS "Wimp_ProcessKey",q%!24 1390WHEN 9:PROCmenuselect(q%) 1400WHEN 17,18:PROCmessage 1410ENDCASE 1420UNTIL quit% 1430ENDPROC 1440: 1450DEFPROCcheckmouse(mx%,my%,b%,where%,icon%) 1460IF b%=1 THEN mredo%=TRUE ELSE mredo%=FALSE 1470CASE where% OF 1480WHEN -2: 1490CASE b% OF 1500WHEN 1:PROCedittracker 1510WHEN 4: 1520IF tuneloaded% THEN 1530PROCpanelstatus 1540PROCopenwindow(player%,0) 1550ENDIF 1560WHEN 2: 1570PROCmainmenu 1580PROCopenmenu(101,mainmenu%,mx%-86,376) 1590ENDCASE 1600WHEN savetune%: 1610IF icon%=0 THEN PROCinitiatedrag(savetune%,0,1) 1620IF icon%=4 THEN PROCquicksave 1630WHEN savesample%:IF icon%=0 THEN PROCinitiatedrag(savesample%,0,2) 1640WHEN savehelp%:IF icon%=0 THEN PROCinitiatedrag(savehelp%,0,4) 1650WHEN savepatterns%:IF icon%=0 THEN PROCinitiatedrag(savepatterns%,0,5) 1660WHEN savepattern%: 1670CASE icon% OF 1680WHEN 0:PROCinitiatedrag(savepattern%,0,3) 1690WHEN 1:PROCincsavepat 1700WHEN 4:PROCdecsavepat 1710WHEN 7:PROCstorepattern 1720ENDCASE 1730WHEN tuneinfo%:IF icon%=6 THEN PROCnewpattern 1740WHEN samples%: 1750IF b%=2 THEN 1760PROCmakesamplemenu(icon% MOD 36) 1770IF slen%((icon% MOD 36)+1)>0 THEN PROCopenmenu(106,mainmenu%,mx%-86,my%+24) 1780ENDIF 1790WHEN newtrack%: 1800CASE icon% OF 1810WHEN 2:PROCcreatetune(defvoices%) 1820WHEN 3:PROCincdefvoices 1830WHEN 4:PROCdecdefvoices 1840ENDCASE 1850WHEN copypattern%: 1860CASE icon% OF 1870WHEN 3:PROCinccopypat 1880WHEN 4:PROCdeccopypat 1890WHEN 2:PROCcopypattern 1900ENDCASE 1910WHEN setvolume%: 1920CASE icon% OF 1930WHEN 2:PROCincvolume(sampleno%) 1940WHEN 3:PROCdecvolume(sampleno%) 1950ENDCASE 1960WHEN player%: 1970IF icon%>0 AND icon%<(!mvoxaddr%+1) THEN PROCtogglevoice(icon%) 1980CASE icon% OF 1990WHEN 16:PROCplaytune 2000WHEN 17:PROCstoptune 2010WHEN 21:PROCrewind 2020WHEN 22:PROCfastforward 2030ENDCASE 2040WHEN settings%: 2050CASE icon% OF 2060WHEN 3:PROCincpatlength 2070WHEN 4:PROCdecpatlength 2080WHEN 6,7,8:PROCmakeselected(settings%,icon%) 2090ENDCASE 2100WHEN savedump%:IF icon%=0 THEN PROCinitiatedrag(savedump%,0,6) 2110WHEN amendtrack%: 2120CASE icon% OF 2130WHEN 3:PROCincdelpat 2140WHEN 4:PROCdecdelpat 2150WHEN 5:PROCdeletepattern 2160WHEN 8:PROCincdelvoice 2170WHEN 9:PROCdecdelvoice 2180WHEN 11:PROCamendvoice 2190WHEN 14,15:PROCmakeselected(amendtrack%,icon%) 2200ENDCASE 2210WHEN stereo%:PROCalterstereo(icon%) 2220ENDCASE 2230ENDPROC 2240: 2250DEFPROCopenwindow(handle%,pos%) 2260LOCAL b% 2270IF pos%=0 THEN 2280b%=block%:block%!0=handle% 2290SYS "Wimp_GetWindowState",,b% 2300ELSE 2310b%=pos% 2320ENDIF 2330block%!28=-1 2340SYS "Wimp_OpenWindow",,b% 2350ENDPROC 2360: 2370DEFPROCclosewindow(handle%) 2380IF handle%=tuneinfo% THEN 2390mname$=FNicontext(tuneinfo%,7) 2400aname$=FNicontext(tuneinfo%,8) 2410ENDIF 2420block%!0=handle% 2430SYS "Wimp_CloseWindow",,block% 2440ENDPROC 2450: 2460DEFPROCinitiatedrag(window%,icon%,myref%) 2470savehandle%=window% 2480globalref%=myref% 2490!q%=window% 2500SYS "Wimp_GetWindowState",,q% 2510z%=q%!16-q%!8 2520x%=q%!4:y%=q%!8:q%!4=icon% 2530SYS "Wimp_GetIconState",,q% 2540q%!8+=x%:q%!12+=y%+z% 2550q%!16+=x%:q%!20+=y%+z% 2560q%!24=0:q%!28=0 2570q%!32=1279:q%!36=1023 2580!q%=0:q%!4=5 2590SYS "Wimp_DragBox",,q% 2600ENDPROC 2610: 2620DEFPROCmessage 2630yourref%=q%!8 2640CASE q%!16 OF 2650WHEN 0:quit%=TRUE 2660WHEN 2:PROCsavefile 2670WHEN 3:PROCloadfile 2680ENDCASE 2690ENDPROC 2700: 2710DEFPROCdragfile 2720!q%=0 2730SYS "Wimp_GetPointerInfo",,q% 2740q%!32=4 2750q%!28=!q% 2760q%!24=q%!16 2770q%!20=q%!12 2780q%!16=1 2790q%!12=0 2800q%!36=100 2810q%!40=&C00 2820$(q%+44)=CHR$(0) 2830!q%=60 2840SYS "Wimp_SendMessage",18,q%,q%!20,q%!24 2850ENDPROC 2860: 2870DEFFNstringfrommemory(addr%) 2880LOCAL byte%,temp$,out$ 2890byte%=0 2900temp$="" 2910out$="" 2920REPEAT 2930temp$=CHR$(addr%?byte%) 2940IF ASC(temp$)>31 THEN out$=out$+temp$ 2950byte%+=1 2960UNTIL ASC(temp$)=0 2970=out$ 2980: 2990DEFFNstringwithlimit(addr%,maxlen%) 3000LOCAL byte%,temp$,out$ 3010byte%=0 3020temp$="" 3030out$="" 3040REPEAT 3050temp$=CHR$(addr%?byte%) 3060IF ASC(temp$)>31 THEN out$=out$+temp$ 3070byte%+=1 3080UNTIL ASC(temp$)=0 OR byte%>=maxlen% 3090=out$ 3100: 3110DEFFNicontext(wh%,iconnumber%) 3120!temp%=wh% 3130temp%!4=iconnumber% 3140SYS "Wimp_GetIconState",,temp% 3150it$="" 3160byte%=0 3170WHILE ?((temp%!28)+byte%)>31 3180it$=it$+CHR$(?((temp%!28)+byte%)) 3190byte%+=1 3200ENDWHILE 3210=it$ 3220: 3230DEFFNiconval(wh%,iconnumber%) 3240=VAL(FNicontext(wh%,iconnumber%)) 3250: 3260DEFPROCerror 3270SYS "Hourglass_Off" 3280CLOSE #0 3290SYS "Wimp_DragBox",,-1 3300SYS "Wimp_CreateMenu",,-1 3310!block%=ERR 3320$(block%+4)=REPORT$+CHR$(0) 3330SYS "Wimp_ReportError",block%,1,"AP Tracker" 3340PROCmain 3350ENDPROC 3360: 3370DEFPROCseticontext(wh%,iconnumber%,text$) 3380!temp%=wh% 3390temp%!4=iconnumber% 3400SYS "Wimp_GetIconState",,temp% 3410$temp%!28=LEFT$(text$,temp%!36-1) 3420temp%!8=0 3430temp%!12=0 3440SYS "Wimp_SetIconState",,temp% 3450ENDPROC 3460: 3470DEFPROCmakesamplemenu(samp%) 3480sampleno%=samp%+1 3490menuptr%=menuaddr% 3500menend%=menuaddr%+menuspace%-1 3510LOCAL i$,m$ 3520inst%=samp%+1 3530IF slen%(inst%)=0 THEN ENDPROC 3540mtitle$=FNleafname(sample$(inst%)) 3550IF mtitle$="" THEN mtitle$="Sample" 3560mtitle$=LEFT$(mtitle$,12) 3570PROCseticontext(savesample%,3,mtitle$) 3580mainmenu%=FNmakemen("|winssSave,|winsvVolume,Delete,"+FNtic(saveheader%)+"Header",mtitle$) 3590IF menuptr%>menend% THEN ERROR 17,"Not enough menu space" 3600PROCseticontext(setvolume%,1,STR$(!svoladdr%(sampleno%))) 3610ENDPROC 3620: 3630DEFPROCmainmenu 3640menuptr%=menuaddr% 3650menend%=menuaddr%+menuspace%-1 3660LOCAL i$,m$ 3670savemenu%=FNmakemen("|winsa"+FNlit(tuneloaded%)+"Tune,|winsp"+FNlit(tuneloaded%)+"Pattern,|winap"+FNlit(tuneloaded%)+"Patterns,|winsd"+FNlit(tuneloaded%)+"Text Dump,|winshHelp","Save") 3680tunemenu%=FNmakemen("Info,Samples,Stereo,Copy,Amend","Tune") 3690mainmenu%=FNmakemen("|wininInfo,|winsmSave,Settings,Create,"+FNlit(tuneloaded%)+"Clear,|wintn"+FNlit(tuneloaded%)+"Tune,Quit","AP Tracker") 3700IF menuptr%>menend% THEN ERROR 17,"Not enough menu space" 3710PROCseticontext(newtrack%,5,STR$(defvoices%)) 3720PROCseticontext(savepattern%,6,STR$(savepat%)) 3730ENDPROC 3740: 3750DEFFNlit(test%) 3760IF test% THEN ="|lit1" ELSE ="|lit0" 3770: 3780DEFFNtic(test%) 3790IF test% THEN ="|tic1" ELSE ="|tic0" 3800: 3810DEFPROCmenuitem(text$) 3820LOCAL menuflags%,iconflags%,submenu% 3830ii%=FALSE 3840submenu%=-1 3850IF text$="" THEN ENDPROC 3860menuflags%=0 3870iconflags%=&07000021 3880WHILE LEFT$(text$,1)="|" 3890CASE MID$(text$,2,3) OF 3900WHEN "lit": 3910iconflags%+=(1<<22)*(1-VAL(MID$(text$,5,1))) 3920text$=MID$(text$,6) 3930WHEN "tic": 3940menuflags%+=VAL(MID$(text$,5,1)) 3950text$=MID$(text$,6) 3960WHEN "win": 3970CASE MID$(text$,5,2) OF 3980WHEN "in":submenu%=info% 3990WHEN "tn":submenu%=tunemenu% 4000WHEN "nt":submenu%=newtrack% 4010WHEN "sa":submenu%=savetune% 4020WHEN "sm":submenu%=savemenu% 4030WHEN "sp":submenu%=savepattern% 4040WHEN "ap":submenu%=savepatterns% 4050WHEN "sh":submenu%=savehelp% 4060WHEN "ss":submenu%=savesample% 4070WHEN "sv":submenu%=setvolume% 4080WHEN "sd":submenu%=savedump% 4090ENDCASE 4100text$=MID$(text$,7) 4110ENDCASE 4120ENDWHILE 4130IF LEN(text$)>menumax% menumax%=LEN(text$) 4140menuptr%!0=menuflags% 4150menuptr%!4=submenu% 4160menuptr%!8=iconflags% 4170IF LEN(text$)<12 THEN 4180$(menuptr%+12)=text$ 4190ELSE 4200menend%-=(LEN(text$)+1) 4210menuptr%!8=(menuptr%!8) OR %100000000 4220menuptr%!12=menend% 4230menuptr%!16=-1 4240menuptr%!20=LEN(text$) 4250$menend%=text$ 4260ENDIF 4270menuptr%+=24 4280ENDPROC 4290: 4300DEFFNpar(sep$) 4310i1%=i%+1:i%=INSTR(menu$+sep$,sep$,i1%) 4320=MID$(menu$,i1%,i%-i1%) 4330: 4340DEFFNmakemen(menu$,menutitle$) 4350LOCAL menumax%,wasptr% 4360wasptr%=menuptr% 4370menumax%=10 4380i%=0 4390menuptr%!20=40 4400$menuptr%=menutitle$ 4410menuptr%?12=tfcol 4420menuptr%?13=mbcol 4430menuptr%?14=wfcol 4440menuptr%?15=wbcol 4450maxaddr%=menuptr%+16 4460menuptr%!24=0 4470menuptr%+=28 4480REPEAT 4490item$=FNpar(",") 4500PROCmenuitem(item$) 4510UNTIL item$="" 4520menuptr%!-24=(menuptr%!-24) OR &80 4530!maxaddr%=menumax%*16+32 4540=wasptr% 4550: 4560DEFPROCopenmenu(our%,m%,x%,y%) 4570menuhandle%=our% 4580menux%=x% 4590menuy%=y% 4600SYS "Wimp_CreateMenu",,m%,x%,y% 4610ENDPROC 4620: 4630DEFPROCmenuselect(menus%) 4640LOCAL redo% 4650SYS "Wimp_GetPointerInfo",,q2% 4660redo%=(((q2%!8) AND 1)>0) 4670CASE menuhandle% OF 4680WHEN 101: 4690CASE !menus% OF 4700WHEN 2: 4710PROCseticontext(settings%,5,STR$(patlen%)) 4720PROCopenwindow(settings%,0) 4730WHEN 3:PROCopenwindow(newtrack%,0) 4740WHEN 4: 4750PROCcleardata 4760WHEN 5: 4770CASE menus%!4 OF 4780WHEN 0:PROCgetnames:PROCtuneinfo:PROCopenwindow(tuneinfo%,0) 4790WHEN 1:PROCsamples 4800WHEN 2:PROCstereo 4810WHEN 3:PROCopenwindow(copypattern%,0) 4820WHEN 4: 4830PROCseticontext(amendtrack%,2,STR$(delpat%)) 4840PROCseticontext(amendtrack%,10,STR$(delvoice%)) 4850PROCopenwindow(amendtrack%,0) 4860ENDCASE 4870WHEN 6:PROCshutdown:redo%=FALSE 4880ENDCASE 4890IF redo% PROCmainmenu 4900WHEN 106: 4910CASE !menus% OF 4920WHEN 2: 4930PROCdeletesample(sampleno%) 4940WHEN 3: 4950saveheader%=NOT(saveheader%) 4960PROCmakesamplemenu(sampleno%-1) 4970ENDCASE 4980ENDCASE 4990IF redo% THEN PROCopenmenu(menuhandle%,mainmenu%,menux%,menuy%) 5000ENDPROC 5010: 5020DEFPROCseticontype(window%,icon%,type%) 5030q2%!0=window% 5040q2%!4=icon% 5050SYS "Wimp_GetIconState",,q2% 5060iconblock%=q2%+8 5070iconflags%=iconblock%!16 5080eorword%=type%<<12 5090clearword%=15<<12 5100q2%!0=window% 5110q2%!4=icon% 5120q2%!8=eorword% 5130q2%!12=clearword% 5140SYS "Wimp_SetIconState",,q2% 5150ENDPROC 5160: 5170DEFPROCwriteable(window%,icon%) 5180PROCseticontype(window%,icon%,15) 5190ENDPROC 5200: 5210DEFPROCunwriteable(window%,icon%) 5220PROCseticontype(window%,icon%,0) 5230ENDPROC 5240: 5250DEFPROCmakeselected(window%,icon%) 5260q2%!0=window% 5270q2%!4=icon% 5280q2%!8=2^21 5290q2%!12=2^21 5300SYS "Wimp_SetIconState",,q2% 5310ENDPROC 5320: 5330DEFPROCmakeunselected(window%,icon%) 5340q2%!0=window% 5350q2%!4=icon% 5360q2%!8=0 5370q2%!12=2^21 5380SYS "Wimp_SetIconState",,q2% 5390ENDPROC 5400: 5410DEFFNisitselected(window%,icon%) 5420q2%!0=window% 5430q2%!4=icon% 5440SYS "Wimp_GetIconState",,q2% 5450iconblock%=q2%+8 5460iconflags%=iconblock%!16 5470IF (iconflags% AND 2^21)=0 THEN =0 ELSE =1 5480: 5490DEFPROCmovecaret(window%,icon%) 5500p%=(LEN(FNicontext(window%,icon%))+1) DIV 2 5510SYS "Wimp_SetCaretPosition",window%,icon%,,,-1,p% 5520ENDPROC 5530: 5540DEFFNfilelen(file$) 5550C%=OPENUP(file$) 5560len%=EXT#C% 5570CLOSE #C% 5580=len% 5590: 5600DEFPROCsavefile 5610pathname$=FNstringfrommemory(q%+44) 5620leafname$=FNicontext(savehandle%,3) 5630IF leafname$="" THEN ENDPROC 5640fullname$=pathname$+leafname$ 5650CASE globalref% OF 5660WHEN 1:PROCsavetune 5670WHEN 2:PROCsavesample(sampleno%) 5680WHEN 3:PROCsavepattern(savepat%) 5690WHEN 4:PROCsavehelp(fullname$) 5700WHEN 5:PROCsavepatterns(leafname$) 5710WHEN 6:PROCsavedump(fullname$) 5720ENDCASE 5730ENDPROC 5740: 5750DEFPROCloadwithpathvariable(variable$,filename$,addr%) 5760OSCLI("LOAD "+variable$+"."+filename$+" "+STR$~addr%) 5770ENDPROC 5780: 5790DEFPROCsavewithpathstring(filename$,path$,addr%,bytes%) 5800path2$=path$+"."+filename$ 5810SYS "OS_File",0,path2$,0,0,addr%,addr%+bytes% 5820ENDPROC 5830: 5840DEFFNdigit(d$) 5850IF d$>="0" AND d$<="9" THEN =TRUE ELSE =FALSE 5860: 5870DEFPROCsettitle(block%,title$) 5880addr%=block%+72 5890len%=LEN(title$) 5900c%=0 5910WHILE len%>0 5920addr%?c%=ASC(MID$(title$,c%+1,1)) 5930c%+=1 5940len%-=1 5950ENDWHILE 5960addr%?c%=0 5970ENDPROC 5980: 5990DEFFNreadstring 6000LOCAL out$,byte% 6010abort$=CHR$(0) 6020IF EOF#handle% THEN =abort$ 6030out$="" 6040REPEAT 6050byte%=BGET#handle% 6060IF byte%>31 AND NOT(EOF#handle%) THEN out$=out$+CHR$(byte%) 6070UNTIL byte%<32 OR EOF#handle% 6080=out$ 6090: 6100DEFPROCwritestring(write$) 6110FOR char%=1 TO LEN(write$) 6120BPUT#handle%,ASC(MID$(write$,char%,1)) 6130NEXT 6140BPUT#handle%,13 6150ENDPROC 6160: 6170DEFPROCsetfiletype(fname$,newtype%) 6180SYS "OS_File",18,fname$,newtype% 6190ENDPROC 6200: 6210DEFPROCwritestringtofile(ch%,str$) 6220IF str$="" THEN ENDPROC 6230FOR l%=1 TO LEN(str$) 6240BPUT#ch%,ASC(MID$(str$,l%,1)) 6250NEXT 6260ENDPROC 6270: 6280DEFPROCloadfile 6290filename$=FNstringfrommemory(q%+44) 6300loaded$=filename$ 6310filelen%=FNfilelen(filename$) 6320CASE q%!40 OF 6330WHEN &001:PROCloadtracker(filename$,2) 6340WHEN &364:PROCloadcocotrack(filename$) 6350WHEN &365:PROCloadcocotrack(filename$) 6360WHEN &701:PROCloadprotracker(filename$) 6370WHEN &CB6:PROCloadtracker(filename$,0) 6380WHEN &CB5:PROCloadsample(filename$,0) 6390WHEN &CC5:PROCloadtracker(filename$,2) 6400WHEN &D3C:PROCloadsample(filename$,2) 6410WHEN &DF9:PROCloadsample(filename$,6) 6420WHEN &ED0:PROCloadsample(filename$,1) 6430WHEN &FFA:PROCloadmodule(filename$) 6440WHEN &FFD:PROCloadpatdata(filename$) 6450ENDCASE 6460ENDPROC 6470: 6480DEFPROCloadmodule(module$) 6490C%=OPENIN(module$) 6500PTR#C%=&88 6510a$="" 6520FOR byte%=1 TO 8 6530a$+=CHR$(BGET#C%) 6540NEXT 6550CLOSE #C% 6560IF a$="SampConv" THEN PROCloadsample(module$,8) ELSE PROCloadsample(module$,7) 6570ENDPROC 6580: 6590DEFPROCloadtracker(tracker$,modtype%) 6600modtype2%=modtype% 6610IF modtype%=0 THEN 6620C%=OPENIN(tracker$) 6630read$="" 6640FOR char%=1 TO 4 6650read$+=CHR$(BGET#C%) 6660NEXT 6670CLOSE #C% 6680ENDIF 6690: 6700abort%=FALSE 6710IF tuneloaded% THEN 6720errorexit%=FNerrorbox(17,"Existing tune will be lost - are you sure?") 6730IF errorexit%=1 THEN PROCreturnmemory ELSE abort%=TRUE 6740ENDIF 6750IF abort% THEN ENDPROC 6760: 6770IF modtype%=0 THEN 6780IF read$="FTMN" THEN ERROR 17,"Sorry, can't load 'Face the Music' files" 6790IF read$="MED"+CHR$(4) THEN ERROR 17,"Sorry, can't load MED3 files" 6800IF read$="MUSX" THEN modtype%=1 ELSE modtype%=2 6810IF read$="OKTA" THEN modtype%=3 6820ENDIF 6830PROCstoptune 6840aborted%=FALSE 6850CASE modtype% OF 6860WHEN 2: 6870IF modtype2%=0 THEN 6880errorexit%=FNerrorbox(17,"Convert from Sound Tracker?") 6890IF errorexit%<>1 THEN aborted%=TRUE 6900ENDIF 6910: 6920IF NOT(aborted%) THEN 6930freemem%=0 6940gotit%=FNgrabmem(filelen%*2+10*1024) 6950IF gotit%=FALSE THEN PROCnotenoughtoload 6960tempload%=trackertune%+filelen%+10*1024 6970tempload%=(tempload%-4) AND &FFFFFFFC 6980OSCLI("LOAD "+tracker$+" "+STR$~tempload%) 6990A%=1 7000B%=tempload% 7010C%=trackertune% 7020D%=filelen% 7030SYS "Hourglass_On" 7040CALL trackercode% 7050SYS "Hourglass_Off" 7060PROCminimise 7070ENDIF 7080: 7090WHEN 1: 7100freemem%=0 7110gotit%=FNgrabmem(filelen%) 7120IF gotit%=FALSE THEN PROCnotenoughtoload 7130OSCLI("LOAD "+tracker$+" "+STR$~trackertune%) 7140: 7150WHEN 3: 7160errorexit%=FNerrorbox(17,"Convert from Octalyser?") 7170IF errorexit%<>1 THEN aborted%=TRUE 7180: 7190IF NOT(aborted%) THEN 7200freemem%=0 7210gotit%=FNgrabmem(filelen%*2+10*1024) 7220IF gotit%=FALSE THEN PROCnotenoughtoload 7230tempload%=trackertune%+filelen%+10*1024 7240tempload%=(tempload%-4) AND &FFFFFFFC 7250OSCLI("LOAD "+tracker$+" "+STR$~tempload%) 7260A%=8 7270B%=tempload% 7280C%=trackertune% 7290D%=filelen% 7300SYS "Hourglass_On" 7310CALL trackercode% 7320SYS "Hourglass_Off" 7330PROCminimise 7340ENDIF 7350: 7360ENDCASE 7370: 7380IF NOT(aborted%) THEN PROCjustloaded 7390IF aborted% THEN PROCcloseall 7400ENDPROC 7410: 7420DEFPROCjustloaded 7430tuneloaded%=TRUE 7440playing%=FALSE 7450oldpos%=-1:oldevent%=-1 7460PROCseticontext(savetune%,3,loaded$) 7470PROCgetmusicinfo 7480PROCtuneinfo 7490PROCupdatestereo 7500PROCwritesamplenames 7510PROCinitialisevoices 7520justloaded%=TRUE 7530delvoice%=1 7540delpat%=1 7550savepat%=1 7560copypat%=1 7570PROCseticontext(copypattern%,5,STR$(copypat%)) 7580PROCseticontext(amendtrack%,2,STR$(delpat%)) 7590PROCseticontext(amendtrack%,10,STR$(delvoice%)) 7600PROCredocaret 7610ENDPROC 7620: 7630DEFPROCredocaret 7640SYS "Wimp_GetCaretPosition",,q% 7650cw%=q%!0:ci%=q%!4 7660IF cw%=tuneinfo% THEN 7670IF ci%=7 OR ci%=8 PROCmovecaret(cw%,ci%) 7680ENDIF 7690ENDPROC 7700: 7710DEFPROCloadsample(sampfile$,samptype%) 7720withheader%=FALSE 7730window%=q%!20 7740icon%=q%!24 7750IF window%<>samples% THEN ENDPROC 7760IF icon%<0 THEN ENDPROC 7770SYS "Hourglass_On" 7780samppos%=(icon% MOD 36)+1 7790sampfilelen%=FNfilelen(sampfile$) 7800actualsamplelen%=sampfilelen% 7810IF samptype%=2 THEN sampfilelen%-=1 7820IF samptype%=6 THEN sampfilelen%-=712 7830IF samptype%=7 THEN sampfilelen%-=1408 7840IF samptype%=8 THEN sampfilelen%-=660 7850sampfilelen%=(sampfilelen%+3) AND &FFFFFFFC 7860IF samptype%=0 THEN withheader%=FNheadered(sampfile$) 7870IF withheader% THEN 7880PROCloadheadered(sampfile$,samppos%) 7890ELSE 7900PROCloadunheadered(sampfile$,samppos%,samptype%) 7910ENDIF 7920SYS "Hourglass_Off" 7930PROCupdatesize 7940PROCminimise 7950ENDPROC 7960: 7970DEFFNheadered(samp$) 7980C%=OPENIN(samp$) 7990read$="" 8000FOR char%=1 TO 4 8010read$+=CHR$(BGET#C%) 8020NEXT 8030CLOSE #C% 8040IF read$="SAMP" THEN =TRUE 8050=FALSE 8060: 8070DEFPROCloadheadered(what$,where%) 8080abort%=FALSE 8090IF sampfilelen%>(slen%(where%)+92) THEN 8100toinsert%=sampfilelen%-(slen%(where%)+92) 8110at%=sampaddr%(where%) 8120IF NOT(FNinsertbytes(at%,toinsert%)) THEN abort%=TRUE 8130ENDIF 8140IF sampfilelen%<(slen%(where%)+92) THEN 8150todelete%=slen%(where%)+92-sampfilelen% 8160at%=sampaddr%(where%) 8170IF NOT(FNdeletebytes(at%,todelete%)) THEN abort%=TRUE 8180ENDIF 8190IF abort%=TRUE THEN VDU 7:ENDPROC 8200OSCLI("LOAD "+what$+" "+STR$~sampaddr%(where%)) 8210PROCreadsamples 8220PROCwritesamplenames 8230ENDPROC 8240: 8250DEFPROCloadunheadered(what$,where%,stype%) 8260abort%=FALSE 8270IF sampfilelen%>slen%(where%) THEN 8280toinsert%=sampfilelen%-slen%(where%) 8290at%=sampaddr%(where%)+92 8300IF NOT(FNinsertbytes(at%,toinsert%)) THEN abort%=TRUE 8310ENDIF 8320IF sampfilelen%<slen%(where%) THEN 8330todelete%=slen%(where%)-sampfilelen% 8340at%=sampaddr%(where%)+92 8350IF NOT(FNdeletebytes(at%,todelete%)) THEN abort%=TRUE 8360ENDIF 8370IF abort%=TRUE THEN VDU 7:ENDPROC 8380CASE stype% OF 8390WHEN 2: 8400C%=OPENIN(what$) 8410SYS "OS_GBPB",3,C%,sampaddr%(where%)+92,actualsamplelen%-1,1 8420CLOSE #C% 8430WHEN 6: 8440C%=OPENIN(what$) 8450SYS "OS_GBPB",3,C%,sampaddr%(where%)+92,actualsamplelen%-712,544 8460CLOSE #C% 8470WHEN 7: 8480C%=OPENIN(what$) 8490SYS "OS_GBPB",3,C%,sampaddr%(where%)+92,actualsamplelen%-1408,1408 8500CLOSE #C% 8510WHEN 8: 8520C%=OPENIN(what$) 8530SYS "OS_GBPB",3,C%,sampaddr%(where%)+92,actualsamplelen%-660,660 8540CLOSE #C% 8550WHEN 0,1,3,4,5: 8560OSCLI("LOAD "+what$+" "+STR$~(sampaddr%(where%)+92)) 8570ENDCASE 8580sname$=FNleafname(what$) 8590sname$=LEFT$(sname$,20) 8600rlen%=2 8610rofs%=0 8620at%=sampaddr%(where%) 8630at%!4=sampfilelen%+84 8640PROCwritewithzeros(sname$,at%+16,20) 8650at%!80=rlen% 8660at%!68=rofs% 8670at%!56=sampfilelen% 8680at%!88=sampfilelen% 8690CASE stype% OF 8700WHEN 1: 8710A%=5 8720B%=at%+92 8730C%=sampfilelen% 8740D%=0 8750CALL trackercode% 8760WHEN 2,6,7: 8770A%=5 8780B%=at%+92 8790C%=sampfilelen% 8800D%=1 8810CALL trackercode% 8820WHEN 3,4,5: 8830A%=5 8840B%=at%+92 8850C%=sampfilelen% 8860D%=stype%-1 8870CALL trackercode% 8880ENDCASE 8890PROCreadsamples 8900PROCwritesamplenames 8910ENDPROC 8920: 8930DEFPROCwritewithzeros(w$,a%,l%) 8940FOR c%=1 TO l% 8950b%=0 8960IF c%<=LEN(w$) THEN b%=ASC(MID$(w$,c%,1)) 8970a%?(c%-1)=b% 8980NEXT 8990ENDPROC 9000: 9010DEFPROCedittracker 9020IF tuneloaded%=FALSE THEN ENDPROC 9030PROCstoptune 9040oldmode%=MODE 9050PROCrewritestereo 9060MODE 15 9070A%=trackertune% 9080B%=0 9090IF justloaded% THEN B%=1 9100CALL trackercode%+4 9110*FX 15,0 9120SYS "Wimp_SetMode",oldmode% 9130PROCreadmusicdata 9140PROCreadsamples 9150PROCwritesamplenames 9160PROCtuneinfo 9170justloaded%=FALSE 9180SYS "OS_Byte",4,2,0 9190ENDPROC 9200: 9210DEFPROCnotenoughtoload 9220PROCreturnmemory 9230PROCcloseall 9240ERROR 17,"Insufficient Memory Available" 9250ENDPROC 9260: 9270DEFPROCreturnmemory 9280SYS "XWimp_SlotSize",appsize%,-1 9290tuneloaded%=FALSE 9300ENDPROC 9310: 9320DEFFNgrabmem(amount%) 9330oldamount%=amount% 9340IF amount%<freemem% THEN freemem%-=amount%:=TRUE 9350REPEAT 9360grabable%=FNgrabmem2(32*1024) 9370IF grabable% THEN 9380freemem%+=32*1024 9390amount%-=32*1024 9400ENDIF 9410UNTIL amount%<0 OR NOT(grabable%) 9420IF amount%<0 THEN freemem%-=oldamount% 9430=grabable% 9440: 9450DEFFNgrabmem2(amount%) 9460SYS "XWimp_SlotSize",-1,-1 TO size% 9470SYS "XWimp_SlotSize",size%+amount%,-1 9480SYS "XWimp_SlotSize",-1,-1 TO size2% 9490IF size2%<size%+amount% THEN 9500SYS "XWimp_SlotSize",size%,-1 9510ENDIF 9520IF size2%<size%+amount% THEN =FALSE ELSE =TRUE 9530: 9540DEFPROCgetmusicinfo 9550PROCreadmusicdata 9560PROCreadsamples 9570PROCreadpatterns 9580ENDPROC 9590: 9600DEFPROCtuneinfo 9610PROCseticontext(tuneinfo%,7,mname$) 9620PROCseticontext(tuneinfo%,8,aname$) 9630PROCseticontext(tuneinfo%,9,STR$(patterns%)) 9640PROCseticontext(tuneinfo%,14,STR$(voices%)) 9650PROCseticontext(tuneinfo%,15,STR$(seqlen%)) 9660PROCupdatesize 9670ENDPROC 9680: 9690DEFPROCgetnames 9700mname$=FNicontext(tuneinfo%,7) 9710aname$=FNicontext(tuneinfo%,8) 9720ENDPROC 9730: 9740DEFPROCsamples 9750PROCopenwindow(samples%,0) 9760ENDPROC 9770: 9780DEFPROCwritesamplenames 9790FOR sample%=1 TO 36 9800icon%=sample%+107 9810sname$=sample$(sample%) 9820slen%=slen%(sample%) 9830slen$=STR$(slen%) 9840IF slen%=0 THEN slen$="" 9850slen$=STRING$(5-LEN(slen$)," ")+slen$ 9860sname$=sname$+STRING$(22-LEN(sname$)," ") 9870PROCseticontext(samples%,icon%,sname$+" "+slen$) 9880NEXT 9890ENDPROC 9900: 9910DEFFNfindword(start%,end%,word%) 9920A%=start% 9930B%=end% 9940REPEAT 9950C%=!A% 9960D%=A%!4 9970A%+=8 9980IF C%<>word% THEN A%+=D% 9990UNTIL A%>B% OR C%=word% 10000IF C%=word% THEN =A% 10010=FALSE 10020: 10030DEFFNword(word$) 10040word%=0 10050FOR byte%=1 TO 4 10060asc%=ASC(MID$(word$,5-byte%,1)) 10070word%=(word%<<8)+asc% 10080NEXT 10090=word% 10100: 10110DEFPROCreadmusicdata 10120absstart%=trackertune% 10130absend%=trackertune%+(trackertune%!4)+8 10140absstart%+=8 10150mlen%=FNword("MLEN") 10160mvox%=FNword("MVOX") 10170pnum%=FNword("PNUM") 10180mnam%=FNword("MNAM") 10190anam%=FNword("ANAM") 10200plen%=FNword("PLEN") 10210ster%=FNword("STER") 10220sequ%=FNword("SEQU") 10230mlenaddr%=FNfindword(absstart%,absend%,mlen%) 10240seqlen%=!mlenaddr% 10250mvoxaddr%=FNfindword(absstart%,absend%,mvox%) 10260voices%=!mvoxaddr% 10270steraddr%=FNfindword(absstart%,absend%,ster%) 10280pnumaddr%=FNfindword(absstart%,absend%,pnum%) 10290patterns%=!pnumaddr% 10300mnamaddr%=FNfindword(absstart%,absend%,mnam%) 10310anamaddr%=FNfindword(absstart%,absend%,anam%) 10320aname$=FNstringwithlimit(anamaddr%,32) 10330mname$=FNstringwithlimit(mnamaddr%,32) 10340pattlen%=FNfindword(absstart%,absend%,plen%) 10350seqaddr%=FNfindword(absstart%,absend%,sequ%) 10360ENDPROC 10370: 10380DEFPROCreadsamples 10390absstart%=trackertune% 10400absend%=trackertune%+(trackertune%!4)+8 10410absstart%+=8 10420samp%=FNword("SAMP") 10430snam%=FNword("SNAM") 10440slen%=FNword("SLEN") 10450svol%=FNword("SVOL") 10460start%=absstart% 10470FOR inst%=1 TO 36 10480sampleaddr%=FNfindword(start%,absend%,samp%) 10490sampaddr%(inst%)=sampleaddr%-8 10500searchaddr%=sampleaddr% 10510snamaddr%=FNfindword(searchaddr%,absend%,snam%) 10520sample$(inst%)=FNstringwithlimit(snamaddr%,20) 10530slenaddr%=FNfindword(searchaddr%,absend%,slen%) 10540slen%(inst%)=4*((!slenaddr%+3) DIV 4) 10550!slenaddr%=slen%(inst%) 10560svoladdr%(inst%)=FNfindword(searchaddr%,absend%,svol%) 10570start%=sampleaddr%+!(sampleaddr%-4) 10580NEXT 10590ENDPROC 10600: 10610DEFPROCreadpatterns 10620LOCAL start%,pattern% 10630absstart%=trackertune% 10640absend%=trackertune%+(trackertune%!4)+8 10650absstart%+=8 10660start%=absstart% 10670patt%=FNword("PATT") 10680FOR pattern%=1 TO patterns% 10690pattaddr%(pattern%)=FNfindword(start%,absend%,patt%) 10700start%=pattaddr%(pattern%)+!(pattaddr%(pattern%)-4) 10710NEXT 10720ENDPROC 10730: 10740DEFPROCnewpattern 10750IF patterns%=64 THEN ENDPROC 10760PROCmakeselected(tuneinfo%,6) 10770eachpat%=4*patlen%*voices% 10780start%=pattaddr%(patterns%)+(4*voices%*pattlen%?(patterns%-1)) 10790IF FNinsertbytes(start%,eachpat%+8) THEN 10800start%!0=FNword("PATT") 10810start%!4=eachpat% 10820start%+=8 10830FOR word%=0 TO (eachpat%/4)-1 10840start%!(word%*4)=0 10850NEXT 10860pattlen%?patterns%=patlen% 10870patterns%+=1 10880!pnumaddr%=patterns% 10890PROCgetmusicinfo 10900ENDIF 10910PROCmakeunselected(tuneinfo%,6) 10920PROCtuneinfo 10930ENDPROC 10940: 10950DEFFNinsertbytes(where%,howmany%) 10960IF NOT(FNgrabmem(howmany%)) THEN =FALSE 10970from%=trackertune%+trackertune%!4+8-1 10980to%=from%+howmany% 10990copy%=from%-where% 11000A%=from% 11010B%=to% 11020C%=copy%+1 11030IF C%>0 CALL insertbytes 11040trackertune%!4+=howmany% 11050=TRUE 11060: 11070DEFFNdeletebytes(where%,howmany%) 11080A%=where%+howmany% 11090B%=where% 11100endaddr%=trackertune%+trackertune%!4+8 11110C%=endaddr%-A% 11120IF C%>0 CALL deletebytes 11130freemem%+=howmany% 11140trackertune%!4-=howmany% 11150=TRUE 11160: 11170DEFPROCassemble 11180fromreg%=0 11190toreg%=1 11200countreg%=2 11210link=14:pc=15 11220FOR pass=0 TO 2 STEP 2 11230P%=code% 11240[OPT pass 11250.insertbytes 11260LDRB R11,[fromreg%],#-1 11270STRB R11,[toreg%],#-1 11280SUBS countreg%,countreg%,#1 11290BNE insertbytes 11300MOV pc,link 11310.deletebytes 11320LDRB R11,[fromreg%],#1 11330STRB R11,[toreg%],#1 11340SUBS countreg%,countreg%,#1 11350BNE deletebytes 11360MOV pc,link 11370.claimRma 11380MOV R3,R0 11390MOV R0,#6 11400SWI "XOS_Module" 11410MOVVS R2,#0 11420MOV R0,R2 11430MOV pc,link 11440.copybytes 11450ADD R11,R2,#3 11460MOV R11,R11,ASR #2 11470.copybytesloop 11480LDR R10,[R0],#4 11490STR R10,[R1],#4 11500SUBS R11,R11,#1 11510BNE copybytesloop 11520MOV pc,link 11530] 11540NEXT 11550ENDPROC 11560: 11570DEFPROCsavesample(sample%) 11580leaf$=FNicontext(savesample%,3) 11590path$=FNstringfrommemory(q%+44) 11600path$=LEFT$(path$,LEN(path$)-1) 11610IF saveheader% THEN 11620start%=sampaddr%(sample%) 11630length%=!(sampaddr%(sample%)+4)+8 11640ELSE 11650start%=sampaddr%(sample%)+92 11660length%=slen%(sample%) 11670ENDIF 11680PROCsavewithpathstring(leaf$,path$,start%,length%) 11690PROCsetfiletype(path$+"."+leaf$,&CB5) 11700SYS "Wimp_CreateMenu",,-1 11710ENDPROC 11720: 11730DEFPROCsavetune 11740PROCwritewithzeros(FNicontext(tuneinfo%,7),mnamaddr%,32) 11750PROCwritewithzeros(FNicontext(tuneinfo%,8),anamaddr%,32) 11760PROCrewritestereo 11770leaf$=FNicontext(savetune%,3) 11780leaf$=FNleafname(leaf$) 11790path$=FNstringfrommemory(q%+44) 11800path$=LEFT$(path$,LEN(path$)-1) 11810PROCsavewithpathstring(leaf$,path$,trackertune%,trackertune%!4+8) 11820PROCsetfiletype(path$+"."+leaf$,&CB6) 11830PROCseticontext(savetune%,3,path$+"."+leaf$) 11840SYS "Wimp_CreateMenu",,-1 11850ENDPROC 11860: 11870DEFPROCdeletesample(samppos%) 11880at%=sampaddr%(samppos%)+92 11890todelete%=slen%(samppos%) 11900dummy%=FNdeletebytes(at%,todelete%) 11910at%=sampaddr%(samppos%) 11920PROCwritewithzeros("",at%+16,20) 11930at%!4=84 11940at%!56=0 11950at%!68=0 11960at%!80=2 11970at%!88=0 11980PROCreadsamples 11990PROCwritesamplenames 12000PROCminimise 12010PROCtuneinfo 12020ENDPROC 12030: 12040DEFPROCupdatesize 12050size%=trackertune%!4+8 12060ksize%=INT((size%+512) DIV 1024) 12070PROCseticontext(tuneinfo%,19,STR$(ksize%)+"K") 12080PROCseticontext(tuneinfo%,20,STR$(size%)+" bytes") 12090ENDPROC 12100: 12110DEFPROCquicksave 12120save$=FNicontext(savetune%,3) 12130PROCmakeselected(savetune%,4) 12140IF INSTR(save$,".")=0 THEN PROCmakeunselected(savetune%,4):ENDPROC 12150PROCwritewithzeros(FNicontext(tuneinfo%,7),mnamaddr%,32) 12160PROCwritewithzeros(FNicontext(tuneinfo%,8),anamaddr%,32) 12170PROCrewritestereo 12180start%=trackertune% 12190length%=trackertune%!4+8 12200OSCLI("SAVE "+save$+" "+STR$~start%+" +"+STR$~length%) 12210PROCsetfiletype(save$,&CB6) 12220PROCmakeunselected(savetune%,4) 12230SYS "Wimp_CreateMenu",,-1 12240ENDPROC 12250: 12260DEFPROCincdefvoices 12270IF defvoices%<8 THEN defvoices%+=1 12280PROCseticontext(newtrack%,5,STR$(defvoices%)) 12290ENDPROC 12300: 12310DEFPROCdecdefvoices 12320IF defvoices%>1 THEN defvoices%-=1 12330PROCseticontext(newtrack%,5,STR$(defvoices%)) 12340ENDPROC 12350: 12360DEFPROCcleardata 12370abort%=FALSE 12380IF tuneloaded% THEN 12390errorexit%=FNerrorbox(17,"Data will be lost - are you sure ?") 12400IF errorexit%=2 THEN abort%=TRUE 12410ENDIF 12420IF abort% THEN ENDPROC 12430PROCreturnmemory 12440PROCstoptune 12450PROCcloseall 12460tuneloaded%=FALSE 12470ENDPROC 12480: 12490DEFPROCcloseall 12500PROCclosewindow(tuneinfo%) 12510PROCclosewindow(samples%) 12520PROCclosewindow(stereo%) 12530PROCclosewindow(copypattern%) 12540PROCclosewindow(player%) 12550PROCclosewindow(amendtrack%) 12560ENDPROC 12570: 12580DEFPROCcreatetune(v%) 12590abort%=FALSE 12600IF tuneloaded% THEN 12610errorexit%=FNerrorbox(17,"Existing tune will be lost - are you sure?") 12620IF errorexit%=2 THEN abort%=TRUE 12630IF abort%=FALSE PROCreturnmemory 12640ENDIF 12650IF abort% THEN PROCclosewindow(newtrack%):ENDPROC 12660PROCstoptune 12670PROCmakeselected(newtrack%,2) 12680memneeded%=368+36*92 12690memneeded%+=v%*64*4 12700freemem%=0 12710IF FNgrabmem(memneeded%) THEN 12720o%=0 12730t%=trackertune% 12740t%!o%=FNword("MUSX") : o%+=4 12750t%!o%=memneeded%-8 : o%+=4 12760t%!o%=FNword("TINF") : o%+=4 12770t%!o%=4 : o%+=4 12780t%!o%=0 : o%+=4 12790t%!o%=FNword("MVOX") : o%+=4 12800t%!o%=4 : o%+=4 12810t%!o%=v% : o%+=4 12820t%!o%=FNword("STER") : o%+=4 12830t%!o%=8 : o%+=4 12840t%!o%=&03050503 : o%+=4 12850t%!o%=&03050503 : o%+=4 12860t%!o%=FNword("MNAM") : o%+=4 12870t%!o%=32 : o%+=4 12880PROCwritewithzeros("<Untitled>",t%+o%,32) 12890o%+=32 12900t%!o%=FNword("ANAM") : o%+=4 12910t%!o%=32 : o%+=4 12920PROCwritewithzeros("<You>",t%+o%,32) 12930o%+=32 12940t%!o%=FNword("MLEN") : o%+=4 12950t%!o%=4 : o%+=4 12960t%!o%=1 : o%+=4 12970t%!o%=FNword("PNUM") : o%+=4 12980t%!o%=4 : o%+=4 12990t%!o%=1 : o%+=4 13000t%!o%=FNword("PLEN") : o%+=4 13010t%!o%=64 : o%+=4 13020FOR i%=1 TO 64 13030t%?o%=64 13040o%+=1 13050NEXT 13060t%!o%=FNword("SEQU") : o%+=4 13070t%!o%=128 : o%+=4 13080FOR i%=1 TO 128 13090t%?o%=0 13100o%+=1 13110NEXT 13120t%!o%=FNword("PATT") : o%+=4 13130t%!o%=v%*64*4 : o%+=4 13140FOR i%=1 TO v%*64*4 13150t%?o%=0 13160o%+=1 13170NEXT 13180FOR sample%=1 TO 36 13190t%!o%=FNword("SAMP") : o%+=4 13200t%!o%=84 : o%+=4 13210t%!o%=FNword("SNAM") : o%+=4 13220t%!o%=20 : o%+=4 13230PROCwritewithzeros("",t%+o%,20) 13240o%+=20 13250t%!o%=FNword("SVOL") : o%+=4 13260t%!o%=4 : o%+=4 13270t%!o%=255 : o%+=4 13280t%!o%=FNword("SLEN") : o%+=4 13290t%!o%=4 : o%+=4 13300t%!o%=0 : o%+=4 13310t%!o%=FNword("ROFS") : o%+=4 13320t%!o%=4 : o%+=4 13330t%!o%=0 : o%+=4 13340t%!o%=FNword("RLEN") : o%+=4 13350t%!o%=4 : o%+=4 13360t%!o%=2 : o%+=4 13370t%!o%=FNword("SDAT") : o%+=4 13380t%!o%=0 : o%+=4 13390NEXT 13400tuneloaded%=TRUE 13410playing%=FALSE 13420PROCseticontext(savetune%,3,"Tracker") 13430PROCgetmusicinfo 13440PROCtuneinfo 13450PROCupdatestereo 13460PROCwritesamplenames 13470PROCinitialisevoices 13480PROCclosewindow(newtrack%) 13490PROCminimise 13500ELSE 13510tuneloaded%=FALSE 13520PROCcloseall 13530ENDIF 13540PROCmakeunselected(newtrack%,2) 13550justloaded%=TRUE 13560delvoice%=1 13570delpat%=1 13580savepat%=1 13590copypat%=1 13600PROCseticontext(copypattern%,5,STR$(copypat%)) 13610PROCseticontext(amendtrack%,2,STR$(delpat%)) 13620PROCseticontext(amendtrack%,10,STR$(delvoice%)) 13630PROCredocaret 13640ENDPROC 13650: 13660DEFFNerrorbox(err%,err$) 13670q%!0=err%+(task%<<8) 13680$(q%+4)=err$+CHR$(0) 13690SYS "Wimp_ReportError",q%,%1011,"AP Tracker" TO ,exit% 13700=exit% 13710: 13720DEFFNleafname(fullpath$) 13730IF fullpath$="" THEN ="" 13740LOCAL output$,chpos%,ch$ 13750output$="" 13760chpos%=LEN(fullpath$) 13770REPEAT 13780ch$=MID$(fullpath$,chpos%,1) 13790IF INSTR(".: ",ch$)=0 THEN output$=ch$+output$ 13800chpos%-=1 13810UNTIL chpos%=0 OR INSTR(".: ",ch$)>0 13820=output$ 13830: 13840DEFPROCstereo 13850PROCopenwindow(stereo%,0) 13860ENDPROC 13870: 13880DEFPROCsetstereoESGs 13890FOR voice%=1 TO 8 13900baseicon%=voice%*8-7 13910esg%=voice% 13920FOR eachicon%=0 TO 6 13930PROCsetESG(stereo%,baseicon%+eachicon%,esg%) 13940NEXT 13950NEXT 13960ENDPROC 13970: 13980DEFPROCupdatestereo 13990FOR voice%=1 TO 8 14000s%=steraddr%+voice%-1 14010IF ?s%=0 OR ?s%>7 THEN ?s%=4 14020baseicon%=voice%*8-7 14030FOR eachicon%=0 TO 6 14040PROCmakeunselected(stereo%,baseicon%+eachicon%) 14050NEXT 14060PROCmakeselected(stereo%,baseicon%+(steraddr%?(voice%-1)-1)) 14070NEXT 14080ENDPROC 14090: 14100DEFPROCsetESG(window%,icon%,set%) 14110q%!0=window% 14120q%!4=icon% 14130q%!8=set%<<16 14140q%!12=%1111<<16 14150SYS "Wimp_SetIconState",,q% 14160ENDPROC 14170: 14180DEFPROCrewritestereo 14190FOR voice%=1 TO 8 14200w%=steraddr%+voice%-1 14210baseicon%=voice%*8-7 14220s%=1 14230FOR eachicon%=0 TO 6 14240IF FNisitselected(stereo%,baseicon%+eachicon%) THEN s%=eachicon%+1 14250NEXT 14260?w%=s% 14270NEXT 14280ENDPROC 14290: 14300DEFPROCincsavepat 14310IF savepat%<patterns% THEN savepat%+=1 14320PROCseticontext(savepattern%,6,STR$(savepat%)) 14330ENDPROC 14340: 14350DEFPROCdecsavepat 14360IF savepat%>1 THEN savepat%-=1 14370PROCseticontext(savepattern%,6,STR$(savepat%)) 14380ENDPROC 14390: 14400DEFFNpatternaddr(patno%) 14410=pattaddr%(patno%) 14420: 14430DEFPROCsavepattern(whichpat%) 14440startpat%=FNpatternaddr(whichpat%)-8 14450length%=!(startpat%+4)+8 14460pathname$=LEFT$(pathname$,LEN(pathname$)-1) 14470PROCsavewithpathstring(leafname$,pathname$,startpat%,length%) 14480PROCsetfiletype(pathname$+"."+leafname$,&FFD) 14490SYS "Wimp_CreateMenu",,-1 14500ENDPROC 14510: 14520DEFPROCsavepatterns(root$) 14530pathname$=LEFT$(pathname$,LEN(pathname$)-1) 14540SYS "Hourglass_On" 14550FOR patsave%=1 TO patterns% 14560leafname$=root$+RIGHT$("00"+STR$(patsave%),2) 14570startpat%=FNpatternaddr(patsave%)-8 14580length%=!(startpat%+4)+8 14590PROCsavewithpathstring(leafname$,pathname$,startpat%,length%) 14600PROCsetfiletype(pathname$+"."+leafname$,&FFD) 14610NEXT 14620SYS "Hourglass_Off" 14630SYS "Wimp_CreateMenu",,-1 14640ENDPROC 14650: 14660DEFPROCloadpatdata(filename$) 14670IF q%!20=samples% THEN PROCloadsample(filename$,FNwhichsampletype):ENDPROC 14680C%=OPENIN(filename$) 14690read$="" 14700FOR byte%=1 TO 4 14710read$+=CHR$(BGET#C%) 14720NEXT 14730CLOSE #C% 14740abort%=FALSE 14750IF read$<>"PATT" THEN abort%=TRUE 14760IF filelen%<(4+8) THEN abort%=TRUE 14770IF filelen%>(8*64*4+8) THEN abort%=TRUE 14780IF (filelen% AND 3)>0 THEN abort%=TRUE 14790IF abort% THEN ERROR 17,"Not a pattern file" 14800OSCLI("LOAD "+filename$+" "+STR$~copied%) 14810copiedlen%=filelen% 14820PROCopenwindow(copypattern%,0) 14830ENDPROC 14840: 14850DEFPROCinccopypat 14860IF copypat%<patterns% THEN copypat%+=1 14870PROCseticontext(copypattern%,5,STR$(copypat%)) 14880ENDPROC 14890: 14900DEFPROCdeccopypat 14910IF copypat%>1 THEN copypat%-=1 14920PROCseticontext(copypattern%,5,STR$(copypat%)) 14930ENDPROC 14940: 14950DEFPROCcopypattern 14960IF copiedlen%=0 THEN ERROR 17,"No pattern loaded" 14970copyto%=FNpatternaddr(copypat%)-8 14980copytolen%=!(copyto%+4)+8 14990IF copytolen%<>copiedlen% THEN ERROR 17,"Pattern sizes don't match" 15000PROCmakeselected(copypattern%,2) 15010FOR byte%=0 TO copiedlen%-1 15020copyto%?byte%=copied%?byte% 15030NEXT 15040PROCmakeunselected(copypattern%,2) 15050IF NOT(mredo%) THEN PROCclosewindow(copypattern%) 15060ENDPROC 15070: 15080DEFPROCstorepattern 15090PROCmakeselected(savepattern%,7) 15100startpat%=FNpatternaddr(savepat%)-8 15110length%=!(startpat%+4)+8 15120FOR byte%=0 TO length%-1 15130copied%?byte%=startpat%?byte% 15140NEXT 15150copiedlen%=length% 15160PROCmakeunselected(savepattern%,7) 15170IF NOT(mredo%) THEN SYS "Wimp_CreateMenu",,-1 15180PROCopenwindow(copypattern%,0) 15190ENDPROC 15200: 15210DEFPROCsavehelp(savehelp$) 15220A%=0 15230blkaddr%=USR(trackercode%) 15240helpaddr%=blkaddr%!0 15250helplines%=blkaddr%!4 15260C%=OPENOUT(savehelp$) 15270SYS "Hourglass_On" 15280FOR line%=1 TO helplines% 15290SYS "Hourglass_Percentage",100*(line%/helplines%) 15300FOR char%=0 TO 75 15310BPUT#C%,helpaddr%?char% 15320NEXT 15330helpaddr%+=76 15340BPUT#C%,10 15350NEXT 15360SYS "Hourglass_Off" 15370CLOSE #C% 15380PROCsetfiletype(savehelp$,&FFF) 15390SYS "Wimp_CreateMenu",,-1 15400ENDPROC 15410: 15420DEFPROCincvolume(whichvol%) 15430vol%=!svoladdr%(whichvol%) 15440vol%+=FNbuttonval(b%) 15450IF vol%>255 THEN vol%=255 15460!svoladdr%(whichvol%)=vol% 15470PROCseticontext(setvolume%,1,STR$(vol%)) 15480ENDPROC 15490: 15500DEFPROCdecvolume(whichvol%) 15510vol%=!svoladdr%(whichvol%) 15520vol%-=FNbuttonval(b%) 15530IF vol%<0 THEN vol%=0 15540!svoladdr%(whichvol%)=vol% 15550PROCseticontext(setvolume%,1,STR$(vol%)) 15560ENDPROC 15570: 15580DEFFNbuttonval(test%) 15590IF test%=1 THEN =10 15600IF test%=2 THEN =5 15610=1 15620: 15630DEFPROCloadcocotrack(cocotrack$) 15640abort%=FALSE 15650IF tuneloaded% THEN 15660errorexit%=FNerrorbox(17,"Existing tune will be lost - are you sure?") 15670IF errorexit%=1 THEN PROCreturnmemory ELSE abort%=TRUE 15680ENDIF 15690IF abort% THEN ENDPROC 15700: 15710PROCstoptune 15720aborted%=FALSE 15730freemem%=0 15740gotit%=FNgrabmem(filelen%*2+10*1024) 15750IF gotit%=FALSE THEN PROCnotenoughtoload 15760tempload%=trackertune%+filelen%+10*1024 15770tempload%=(tempload%-4) AND &FFFFFFFC 15780OSCLI("LOAD "+cocotrack$+" "+STR$~tempload%) 15790A%=2 15800B%=tempload% 15810C%=trackertune% 15820SYS "Hourglass_On" 15830CALL trackercode% 15840SYS "Hourglass_Off" 15850newsize%=trackertune%!4+8 15860newsize%=(newsize%+32*1024-1) AND &FFFF8000 15870SYS "XWimp_SlotSize",newsize%+appsize%,-1 15880freemem%=newsize%-(trackertune%!4+8) 15890PROCjustloaded 15900ENDPROC 15910: 15920DEFPROCloadprotracker(protrack$) 15930abort%=FALSE 15940IF tuneloaded% THEN 15950errorexit%=FNerrorbox(17,"Existing tune will be lost - are you sure?") 15960IF errorexit%=1 THEN PROCreturnmemory ELSE abort%=TRUE 15970ENDIF 15980IF abort% THEN ENDPROC 15990: 16000PROCstoptune 16010freemem%=0 16020gotit%=FNgrabmem(filelen%*2+10*1024) 16030IF gotit%=FALSE THEN PROCnotenoughtoload 16040tempload%=trackertune%+filelen%+10*1024 16050tempload%=(tempload%-4) AND &FFFFFFFC 16060OSCLI("LOAD "+protrack$+" "+STR$~tempload%) 16070A%=1 16080B%=tempload% 16090C%=trackertune% 16100D%=filelen% 16110SYS "Hourglass_On" 16120CALL trackercode% 16130OSCLI("LOAD "+protrack$+" "+STR$~tempload%) 16140A%=3 16150B%=tempload% 16160C%=trackertune% 16170CALL trackercode% 16180SYS "Hourglass_Off" 16190newsize%=trackertune%!4+8 16200newsize%=(newsize%+32*1024-1) AND &FFFF8000 16210SYS "XWimp_SlotSize",newsize%+appsize%,-1 16220freemem%=newsize%-(trackertune%!4+8) 16230PROCjustloaded 16240ENDPROC 16250: 16260DEFPROCplaytune 16270IF NOT(tuneloaded%) THEN ENDPROC 16280IF playing% THEN ENDPROC 16290bytes%=trackertune%!4+8 16300A%=bytes% 16310REM rmaspace%=USR(claimRma) 16320SYS "OS_Module",6,0,0,bytes% TO ,,rmaspace% 16330IF rmaspace%=0 THEN ERROR 17,"Insufficient Memory Available" 16340PROCsetupvoices 16350PROCrewritestereo 16360rmaclaimed%=bytes% 16370A%=trackertune% 16380B%=rmaspace% 16390C%=bytes% 16400CALL copybytes 16410SYS "Tracker_MemoryLoad",rmaspace%,trackertune%!4+8 16420SYS "Tracker_Play" 16430playing%=TRUE 16440PROCpanelstatus 16450ENDPROC 16460: 16470DEFPROCstoptune 16480IF NOT(playing%) THEN ENDPROC 16490SYS "Tracker_Stop" 16500SYS "XOS_Module",7,0,rmaspace% 16510SYS "XOS_ChangeDynamicArea",1,-rmaclaimed% 16520playing%=FALSE 16530oldpos%=-1:oldevent%=-1 16540PROCpanelstatus 16550ENDPROC 16560: 16570DEFPROCshade(window%,icon%) 16580q2%!0=window% 16590q2%!4=icon% 16600q2%!8=2^22 16610q2%!12=2^22 16620SYS "Wimp_SetIconState",,q2% 16630ENDPROC 16640: 16650DEFPROCunshade(window%,icon%) 16660q2%!0=window% 16670q2%!4=icon% 16680q2%!8=0 16690q2%!12=2^22 16700SYS "Wimp_SetIconState",,q2% 16710ENDPROC 16720: 16730DEFPROCpanelstatus 16740IF playing% THEN 16750PROCshade(player%,16) 16760PROCunshade(player%,17) 16770ELSE 16780PROCshade(player%,17) 16790PROCunshade(player%,16) 16800PROCseticontext(player%,10,"-") 16810PROCseticontext(player%,18,"") 16820ENDIF 16830ENDPROC 16840: 16850DEFPROCshowmusicpos 16860IF NOT(playing%) THEN ENDPROC 16870muscounter%=(muscounter%+1) MOD update% 16880IF muscounter%=0 THEN 16890SYS "Tracker_ReadPos" TO pos%,event%,max% 16900IF pos%<>oldpos% THEN 16910PROCseticontext(player%,10,STR$(pos%+1)+":"+STR$(max%+1)) 16920ENDIF 16930IF event%<>oldevent% THEN PROCseticontext(player%,18,STR$(event%)) 16940oldpos%=pos%:oldevent%=event% 16950ENDIF 16960ENDPROC 16970: 16980DEFPROCrewind 16990IF NOT(playing%) THEN ENDPROC 17000SYS "Tracker_ReadPos" TO pos%,event% 17010IF pos%>0 THEN SYS "Tracker_SetPos",pos%-1,0 17020ENDPROC 17030: 17040DEFPROCfastforward 17050IF NOT(playing%) THEN ENDPROC 17060SYS "Tracker_ReadPos" TO pos%,event%,max% 17070IF pos%<max% THEN SYS "Tracker_SetPos",pos%+1,0 17080ENDPROC 17090: 17100DEFPROCinitialisevoices 17110FOR v%=1 TO voices% 17120PROCmakeselected(player%,v%) 17130PROCunshade(player%,v%) 17140SYS "Tracker_RestoreChannel",v% 17150NEXT 17160IF voices%<8 THEN 17170FOR v%=voices%+1 TO 8 17180PROCmakeunselected(player%,v%) 17190PROCshade(player%,v%) 17200NEXT 17210ENDIF 17220ENDPROC 17230: 17240DEFPROCsetupvoices 17250FOR v%=1 TO voices% 17260IF FNisitselected(player%,v%) THEN 17270SYS "Tracker_RestoreChannel",v% 17280ELSE 17290SYS "Tracker_MuteChannel",v% 17300ENDIF 17310NEXT 17320ENDPROC 17330: 17340DEFPROCtogglevoice(v%) 17350IF NOT(tuneloaded%) THEN ENDPROC 17360IF FNisitselected(player%,v%) THEN 17370PROCmakeunselected(player%,v%) 17380SYS "Tracker_MuteChannel",v% 17390ELSE 17400PROCmakeselected(player%,v%) 17410SYS "Tracker_RestoreChannel",v% 17420ENDIF 17430ENDPROC 17440: 17450DEFPROCalterstereo(icon%) 17460IF icon%<0 OR icon%>=8*8 THEN ENDPROC 17470IF (icon% MOD 8)=0 THEN ENDPROC 17480IF b%=1 THEN PROCmakeselected(stereo%,icon%) 17490IF icon%>=voices%*8 THEN ENDPROC 17500v%=(icon% DIV 8)+1 17510steraddr%?(v%-1)=(icon% MOD 8) 17520IF playing% THEN SYS "Sound_Stereo",v%,stereovals%(icon% MOD 8) 17530ENDPROC 17540: 17550DEFPROCincpatlength 17560IF patlen%<64 THEN patlen%+=1 17570PROCseticontext(settings%,5,STR$(patlen%)) 17580ENDPROC 17590: 17600DEFPROCdecpatlength 17610IF patlen%>1 THEN patlen%-=1 17620PROCseticontext(settings%,5,STR$(patlen%)) 17630ENDPROC 17640: 17650DEFFNwhichsampletype 17660IF FNisitselected(settings%,6) THEN =3 17670IF FNisitselected(settings%,7) THEN =4 17680=5 17690: 17700DEFFNpad(str$,len%) 17710=LEFT$(str$+STRING$(len%," "),len%) 17720: 17730DEFFNpadright(str$,len%) 17740=RIGHT$(STRING$(len%," ")+str$,len%) 17750: 17760DEFFNbase36(num%) 17770IF num%=0 THEN ="-" 17780IF num%<11 THEN =STR$(num%-1) 17790=CHR$(num%+54) 17800: 17810DEFPROCsavedump(dumpname$) 17820PROCgetnames 17830SYS "Hourglass_On" 17840A%=OPENIN(dumpname$) 17850IF A%>0 THEN CLOSE #A% 17860IF A%>0 THEN 17870C%=OPENUP(dumpname$) 17880PTR#C%=EXT#C% 17890ELSE 17900C%=OPENOUT(dumpname$) 17910ENDIF 17920PROCsetfiletype(dumpname$,&FFF) 17930: 17940IF FNisitselected(savedump%,4) THEN 17950BPUT#C%,"Tune Name :"+mname$ 17960BPUT#C%,"Author :"+aname$ 17970BPUT#C%,"Voices :"+STR$(voices%) 17980BPUT#C%,"Patterns :"+STR$(patterns%) 17990BPUT#C%,"Length :"+STR$(seqlen%) 18000BPUT#C%,"Size :"+STR$(INT((trackertune%!4+8+512) DIV 1024))+"K ("+STR$(trackertune%!4+8)+" bytes)" 18010BPUT#C%,"" 18020ENDIF 18030: 18040IF FNisitselected(savedump%,5) THEN 18050BPUT #C%,"Sequence:" 18060seqpos%=0 18070FOR row%=1 TO (seqlen%+15) DIV 16 18080row$="" 18090FOR col%=1 TO 16 18100IF seqpos%>=seqlen% THEN add$=" " ELSE add$=RIGHT$(" "+STR$(seqaddr%?seqpos%+1),4) 18110row$+=add$ 18120seqpos%+=1 18130NEXT 18140BPUT#C%,row$ 18150NEXT 18160BPUT#C%,"" 18170ENDIF 18180: 18190IF FNisitselected(savedump%,6) THEN 18200BPUT #C%,"Instruments:" 18210FOR sample%=1 TO 36 18220IF slen%(sample%)>0 THEN 18230sample$="Sample "+FNbase36(sample%)+" "+FNpad(sample$(sample%),20) 18240sample$+=" Length:"+FNpad(STR$(slen%(sample%)),5) 18250BPUT#C%,sample$ 18260ENDIF 18270NEXT 18280BPUT#C%,"" 18290ENDIF 18300: 18310IF FNisitselected(savedump%,10) THEN 18320squashed%=FALSE 18330BPUT#C%,"Patterns:" 18340BPUT#C%,"" 18350FOR pattern%=1 TO patterns% 18360SYS "Hourglass_Percentage",100*(pattern%/patterns%) 18370addr%=pattaddr%(pattern%) 18380BPUT#C%,"Pattern:"+FNpad(STR$(pattern%),2)+" (length:"+STR$(pattlen%?(pattern%-1))+")" 18390FOR row%=1 TO pattlen%?(pattern%-1) 18400row$="" 18410FOR voice%=1 TO voices% 18420event%=!addr% 18430SYS "Tracker_DecodeNote",event% TO ,note%,inst%,comm%,val% 18440event$=MID$(notes$,3*note%+1,3)+" "+FNbase36(inst%)+" "+FNbase36(comm%+1) 18450event$+=RIGHT$("00"+STR$~val%,2) 18460IF voice%>1 THEN row$+=" " 18470row$+=event$ 18480addr%+=4 18490NEXT 18500BPUT#C%,row$ 18510NEXT 18520BPUT#C%,"" 18530NEXT 18540ENDIF 18550: 18560IF FNisitselected(savedump%,12) THEN 18570BPUT#C%,"Used in tune:" 18580BPUT#C%,"" 18590A%=6 18600B%=trackertune% 18610used%=USR(trackercode%) 18620A%=7 18630comm%=USR(trackercode%) 18640FOR row%=1 TO 36 18650row$=MID$(notes$,3*row%+1,3) 18660row$+=" "+FNpadright(STR$(used%!(row%*4-4)),5)+" " 18670IF slen%(row%)>0 THEN row$+="*" ELSE row$+=" " 18680samp$=sample$(row%) 18690row$+=FNbase36(row%)+" "+FNpad(samp$,21) 18700row$+=FNpadright(STR$(used%!(row%*4-4+36*4)),5)+" " 18710row$+=FNbase36(row%)+" " 18720row$+=FNpad(FNarrows(FNstringwithlimit(comm%+row%*14-14,14)),15) 18730row$+=FNpadright(STR$(used%!(row%*4-4+72*4)),5) 18740BPUT#C%,row$ 18750NEXT 18760BPUT#C%,"" 18770ENDIF 18780: 18790SYS "Hourglass_Off" 18800CLOSE #C% 18810SYS "Wimp_CreateMenu",,-1 18820ENDPROC 18830: 18840DEFFNarrows(str$) 18850IF str$="" THEN ="" 18860LOCAL new$,b%,ch% 18870new$="" 18880FOR ch%=1 TO LEN(str$) 18890b%=ASC(MID$(str$,ch%,1)) 18900IF b%>126 THEN b%+=9 18910new$+=CHR$(b%) 18920NEXT 18930=new$ 18940: 18950DEFPROCminimise 18960tunesize%=trackertune%!4+8 18970tunesize%=(tunesize%+32*1024-1) 18980tunesize%=32*1024*(tunesize% DIV (32*1024)) 18990SYS "XWimp_SlotSize",tunesize%+appsize%,-1 19000SYS "XWimp_SlotSize",-1,-1 TO tunesize% 19010freemem%=(tunesize%-appsize%)-(trackertune%!4+8) 19020ENDPROC 19030: 19040DEFPROCdecdelpat 19050IF delpat%>1 THEN delpat%-=1 19060PROCseticontext(amendtrack%,2,STR$(delpat%)) 19070ENDPROC 19080: 19090DEFPROCincdelpat 19100IF delpat%<patterns% THEN delpat%+=1 19110PROCseticontext(amendtrack%,2,STR$(delpat%)) 19120ENDPROC 19130: 19140DEFPROCdecdelvoice 19150IF delvoice%>1 THEN delvoice%-=1 19160PROCseticontext(amendtrack%,10,STR$(delvoice%)) 19170ENDPROC 19180: 19190DEFPROCincdelvoice 19200IF delvoice%<voices% THEN delvoice%+=1 19210PROCseticontext(amendtrack%,10,STR$(delvoice%)) 19220ENDPROC 19230: 19240DEFPROCdeletepattern 19250IF patterns%=1 THEN ERROR 17,"Only one pattern!" 19260flag%=FALSE 19270FOR pos%=0 TO seqlen%-1 19280IF seqaddr%?pos%=(delpat%-1) THEN flag%=TRUE 19290NEXT 19300IF flag% THEN ERROR 17,"Pattern occurs in sequence" 19310PROCmakeselected(amendtrack%,5) 19320at%=pattaddr%(delpat%)-8 19330todelete%=at%!4+8 19340flag%=FNdeletebytes(at%,todelete%) 19350FOR pos%=0 TO seqlen%-1 19360IF seqaddr%?pos%>=delpat% THEN seqaddr%?pos%-=1 19370NEXT 19380FOR pos%=(delpat%-1) TO (patterns%-2) 19390pattlen%?(pos%)=pattlen%?(pos%+1) 19400NEXT 19410!pnumaddr%-=1 19420PROCgetmusicinfo 19430PROCminimise 19440PROCtuneinfo 19450IF delpat%>patterns% THEN delpat%=patterns% 19460PROCseticontext(amendtrack%,2,STR$(delpat%)) 19470PROCmakeunselected(amendtrack%,5) 19480ENDPROC 19490: 19500DEFPROCamendvoice 19510IF FNisitselected(amendtrack%,14) THEN PROCdeletevoice(delvoice%) ELSE PROCinsertvoice(delvoice%) 19520IF delvoice%>voices% THEN delvoice%=voices% 19530PROCseticontext(amendtrack%,10,STR$(delvoice%)) 19540ENDPROC 19550: 19560DEFFNtotalpatlength 19570total%=0 19580FOR pattern%=1 TO patterns% 19590total%+=pattlen%?(pattern%-1) 19600NEXT 19610=total% 19620: 19630DEFPROCdeletevoice(v%) 19640IF voices%=1 THEN ERROR 17,"Only one voice present!" 19650PROCmakeselected(amendtrack%,11) 19660SYS "Hourglass_On" 19670FOR pattern%=1 TO patterns% 19680SYS "Hourglass_Percentage",((pattern%-1)/patterns%)*100 19690rows%=pattlen%?(pattern%-1) 19700start%=pattaddr%(pattern%) 19710p1%=start%:p2%=p1% 19720FOR row%=1 TO rows% 19730FOR voice%=1 TO voices% 19740IF voice%<>v% THEN 19750!p1%=!p2% 19760p1%+=4 19770ENDIF 19780p2%+=4 19790NEXT 19800NEXT 19810!(start%-4)=!(start%-4)-rows%*4 19820todelete%=rows%*4 19830flag%=FNdeletebytes(p1%,todelete%) 19840PROCreadpatterns 19850NEXT 19860!mvoxaddr%-=1 19870PROCminimise 19880PROCmakeunselected(amendtrack%,11) 19890SYS "Hourglass_Off" 19900PROCgetmusicinfo 19910PROCtuneinfo 19920PROCinitialisevoices 19930justloaded%=TRUE 19940ENDPROC 19950: 19960DEFPROCinsertvoice(v%) 19970IF voices%=8 THEN ERROR 17,"Already 8 voices!" 19980grab%=FNtotalpatlength*4 19990IF NOT(FNgrabmem(grab%)) THEN ERROR 17,"Insufficient Memory Available" 20000freemem%+=grab% 20010PROCmakeselected(amendtrack%,11) 20020SYS "Hourglass_On" 20030FOR pattern%=1 TO patterns% 20040SYS "Hourglass_Percentage",((pattern%-1)/patterns%)*100 20050rows%=pattlen%?(pattern%-1) 20060start%=pattaddr%(pattern%) 20070at%=start%+rows%*voices%*4 20080toinsert%=rows%*4 20090flag%=FNinsertbytes(at%,toinsert%) 20100FOR row%=rows% TO 1 STEP -1 20110p1%=start%+(row%-1)*voices%*4 20120p2%=start%+(row%-1)*(voices%+1)*4 20130FOR voice%=1 TO voices% 20140event%(voice%)=p1%!((voice%-1)*4) 20150NEXT 20160FOR voice%=1 TO voices% 20170!p2%=event%(voice%) 20180IF voice%=v% THEN 20190p2%+=4 20200!p2%=0 20210ENDIF 20220p2%+=4 20230NEXT 20240NEXT 20250!(start%-4)=!(start%-4)+(rows%*4) 20260PROCreadpatterns 20270NEXT 20280!mvoxaddr%+=1 20290PROCminimise 20300PROCmakeunselected(amendtrack%,11) 20310SYS "Hourglass_Off" 20320PROCgetmusicinfo 20330PROCtuneinfo 20340PROCinitialisevoices 20350justloaded%=TRUE 20360ENDPROC
� >!RunImage : menuspace%=4000 (+sprsize%=�filelen("<Obey$Dir>.Sprites") 2.codesize%=�filelen("<Obey$Dir>.TrackCode") <: F� q% 256,q2% 128 P� code% 160 Z� temp% 300 d� block% 1000 n� spname% 20 x� menuaddr% menuspace% �� copied% 8*64*4+8 �� mainsprites% sprsize%+16 �� trackercode% codesize% �: �tuneloaded%=� �saveheader%=� �trackertune%=� �justloaded%=� �delvoice%=1 � delpat%=1 �savepat%=1 �copypat%=1 �copiedlen%=0 patlen%=64 update%=4 muscounter%=0 "oldpos%=-1:oldevent%=-1 ,freemem%=0 6playing%=� @: J� sampaddr%(36),sample$(36) T� slen%(36),svoladdr%(36) ^� pattaddr%(64) h� onoff%(8),event%(8) r� stereovals%(7) |,stereovals%()=0,-126,-70,-40,0,40,70,127 �|notes$="---C-1C#1D-1D#1E-1F-1F#1G-1G#1A-1A#1B-1C-2C#2D-2D#2E-2F-2F#2G-2G#2A-2A#2B-2C-3C#3D-3D#3E-3F-3F#3G-3G#3A-3A#3B-3" �sample$()=�20," ") �defvoices%=4 �: �#wbcol=0:mbcol=2:wfcol=7:tfcol=7 �: �� � �error �: �$q%="TASK" �prefix$="<APTracker$Dir>" �>ș "Wimp_Initialise",200,!q%,"AP Tracker" � version%,task% �=�loadsprites(prefix$+".Sprites",mainsprites%,sprsize%+16) �;�loadwithpathvariable(prefix$,"TrackCode",trackercode%) �loadwindows �setstereoESGs �assemble &!iconh%=�iconbar("!aptracker") 0(ș "XWimp_SlotSize",-1,-1 � appsize% : �main D �shutdown N� X: b��shutdown labort%=� v� tuneloaded% � �Aerrorexit%=�errorbox(17,"Data will be lost - are you sure ?") �� errorexit%=2 � abort%=� �� �� abort% � � � �stoptune �$q%="TASK" �!ș "Wimp_CloseDown",task%,!q% �� �: �ݤiconbar(sprite$) �$spname%=sprite$ �block%!0=-1 �block%!4=0 block%!8=0 block%!12=80 block%!16=64 block%!20=&2102 *block%!24=spname% 4block%!28=mainsprites% >block%!32=�($spname%) H(ș "Wimp_CreateIcon",,block% � icon% R =icon% \: f$��loadsprites(file$,addr%,size%) p!addr%=size% z addr%!4=0 �addr%!8=16 �addr%!12=0 �'ș "OS_SpriteOp",256+10,addr%,file$ �� �: ���loadwindows � � T% 5000 �maxws%=5000 �� indir% maxws% �ind%=indir% �spr%=mainsprites% �0ș "Wimp_OpenTemplate",,prefix$+".Templates" �!info%=�getwindow("info",spr%) )savetune%=�getwindow("savetune",spr%) )tuneinfo%=�getwindow("tuneinfo",spr%) 'samples%=�getwindow("samples",spr%) $-savesample%=�getwindow("savesample",spr%) .)newtrack%=�getwindow("newtrack",spr%) 8%stereo%=�getwindow("stereo",spr%) B/savepattern%=�getwindow("savepattern",spr%) L/savepatterns%=�getwindow("savepattns",spr%) V/copypattern%=�getwindow("copypattern",spr%) `)savehelp%=�getwindow("savehelp",spr%) j+setvolume%=�getwindow("setvolume",spr%) t%player%=�getwindow("player",spr%) ~)settings%=�getwindow("settings",spr%) �)savedump%=�getwindow("savedump",spr%) �-amendtrack%=�getwindow("amendtrack",spr%) �ș "Wimp_CloseTemplate" �5�seticontext(info%,11,�icontext(info%,11)+" #1") �� �: �ݤgetwindow(wtitle$,spr%) �Iș "Wimp_LoadTemplate",,T%,ind%,indir%+maxws%-1,-1,wtitle$,0 � ,,ind% �T%!64=spr% �(ș "Wimp_CreateWindow",,T% � handle% �=handle% �: ��main quit%=� � !ș "Wimp_Poll",0,q% � reason% (Ȏ reason% � 2� 0:�showmusicpos <� 2:�openwindow(q%!0,q%) F� 3:�closewindow(q%!0) P/� 6:�checkmouse(q%!0,q%!4,q%!8,q%!12,q%!16) Z� 7:�dragfile d"� 8:ș "Wimp_ProcessKey",q%!24 n� 9:�menuselect(q%) x� 17,18:�message �� �� quit% �� �: �)��checkmouse(mx%,my%,b%,where%,icon%) � � b%=1 � mredo%=� � mredo%=� �Ȏ where% � � � -2: �Ȏ b% � �� 1:�edittracker �� 4: �� tuneloaded% � ��panelstatus �openwindow(player%,0) � � 2: " �mainmenu ,'�openmenu(101,mainmenu%,mx%-86,376) 6� @� savetune%: J,� icon%=0 � �initiatedrag(savetune%,0,1) T� icon%=4 � �quicksave ^<� savesample%:� icon%=0 � �initiatedrag(savesample%,0,2) h8� savehelp%:� icon%=0 � �initiatedrag(savehelp%,0,4) r@� savepatterns%:� icon%=0 � �initiatedrag(savepatterns%,0,5) |� savepattern%: �Ȏ icon% � �'� 0:�initiatedrag(savepattern%,0,3) �� 1:�incsavepat �� 4:�decsavepat �� 7:�storepattern �� �'� tuneinfo%:� icon%=6 � �newpattern �� samples%: �� b%=2 � ��makesamplemenu(icon% � 36) �F� slen%((icon% � 36)+1)>0 � �openmenu(106,mainmenu%,mx%-86,my%+24) �� �� newtrack%: Ȏ icon% � � 2:�createtune(defvoices%) � 3:�incdefvoices &� 4:�decdefvoices 0� :� copypattern%: DȎ icon% � N� 3:�inccopypat X� 4:�deccopypat b� 2:�copypattern l� v� setvolume%: �Ȏ icon% � �� 2:�incvolume(sampleno%) �� 3:�decvolume(sampleno%) �� �� player%: �:� icon%>0 � icon%<(!mvoxaddr%+1) � �togglevoice(icon%) �Ȏ icon% � �� 16:�playtune �� 17:�stoptune �� 21:�rewind �� 22:�fastforward �� �� settings%: Ȏ icon% � � 3:�incpatlength � 4:�decpatlength *� 6,7,8:�makeselected(settings%,icon%) *� 48� savedump%:� icon%=0 � �initiatedrag(savedump%,0,6) >� amendtrack%: HȎ icon% � R� 3:�incdelpat \� 4:�decdelpat f� 5:�deletepattern p� 8:�incdelvoice z� 9:�decdelvoice �� 11:�amendvoice �,� 14,15:�makeselected(amendtrack%,icon%) �� �!� stereo%:�alterstereo(icon%) �� �� �: ���openwindow(handle%,pos%) �� b% �� pos%=0 � �b%=block%:block%!0=handle% � ș "Wimp_GetWindowState",,b% �� b%=pos% � block%!28=-1 $ș "Wimp_OpenWindow",,b% .� 8: B��closewindow(handle%) L� handle%=tuneinfo% � V!mname$=�icontext(tuneinfo%,7) `!aname$=�icontext(tuneinfo%,8) j� tblock%!0=handle% ~!ș "Wimp_CloseWindow",,block% �� �: �(��initiatedrag(window%,icon%,myref%) �savehandle%=window% �globalref%=myref% �!q%=window% � ș "Wimp_GetWindowState",,q% �z%=q%!16-q%!8 �x%=q%!4:y%=q%!8:q%!4=icon% �ș "Wimp_GetIconState",,q% �q%!8+=x%:q%!12+=y%+z% �q%!16+=x%:q%!20+=y%+z% q%!24=0:q%!28=0 q%!32=1279:q%!36=1023 !q%=0:q%!4=5 ș "Wimp_DragBox",,q% (� 2: < ��message Fyourref%=q%!8 PȎ q%!16 � Z� 0:quit%=� d� 2:�savefile n� 3:�loadfile x� �� �: ���dragfile � !q%=0 � ș "Wimp_GetPointerInfo",,q% �q%!32=4 � q%!28=!q% �q%!24=q%!16 �q%!20=q%!12 �q%!16=1 �q%!12=0 � q%!36=100 �q%!40=&C00 $(q%+44)=�(0) !q%=60 +ș "Wimp_SendMessage",18,q%,q%!20,q%!24 "� ,: 6ݤstringfrommemory(addr%) @� byte%,temp$,out$ Jbyte%=0 Ttemp$="" ^out$="" h� rtemp$=�(addr%?byte%) |#� �(temp$)>31 � out$=out$+temp$ �byte%+=1 �� �(temp$)=0 � =out$ �: �$ݤstringwithlimit(addr%,maxlen%) �� byte%,temp$,out$ �byte%=0 �temp$="" �out$="" �� �temp$=�(addr%?byte%) �#� �(temp$)>31 � out$=out$+temp$ �byte%+=1 !� �(temp$)=0 � byte%>=maxlen% =out$ : &ݤicontext(wh%,iconnumber%) 0!temp%=wh% :temp%!4=iconnumber% D!ș "Wimp_GetIconState",,temp% N it$="" Xbyte%=0 bȕ ?((temp%!28)+byte%)>31 l"it$=it$+�(?((temp%!28)+byte%)) vbyte%+=1 �� �=it$ �: �ݤiconval(wh%,iconnumber%) �"=�(�icontext(wh%,iconnumber%)) �: ���error �ș "Hourglass_Off" �� #0 �ș "Wimp_DragBox",,-1 �ș "Wimp_CreateMenu",,-1 � !block%=� �$(block%+4)=�$+�(0) /ș "Wimp_ReportError",block%,1,"AP Tracker" �main � : *(��seticontext(wh%,iconnumber%,text$) 4!temp%=wh% >temp%!4=iconnumber% H!ș "Wimp_GetIconState",,temp% R $temp%!28=�text$,temp%!36-1) \ temp%!8=0 ftemp%!12=0 p!ș "Wimp_SetIconState",,temp% z� �: ���makesamplemenu(samp%) �sampleno%=samp%+1 �menuptr%=menuaddr% �"menend%=menuaddr%+menuspace%-1 �� i$,m$ �inst%=samp%+1 �� slen%(inst%)=0 � � �%mtitle$=�leafname(sample$(inst%)) �#� mtitle$="" � mtitle$="Sample" �mtitle$=�mtitle$,12) �'�seticontext(savesample%,3,mtitle$) �\mainmenu%=�makemen("|winssSave,|winsvVolume,Delete,"+�tic(saveheader%)+"Header",mtitle$) 5� menuptr%>menend% � � 17,"Not enough menu space" 7�seticontext(setvolume%,1,�(!svoladdr%(sampleno%))) � $: .��mainmenu 8menuptr%=menuaddr% B"menend%=menuaddr%+menuspace%-1 L� i$,m$ V�savemenu%=�makemen("|winsa"+�lit(tuneloaded%)+"Tune,|winsp"+�lit(tuneloaded%)+"Pattern,|winap"+�lit(tuneloaded%)+"Patterns,|winsd"+�lit(tuneloaded%)+"Text Dump,|winshHelp","Save") `?tunemenu%=�makemen("Info,Samples,Stereo,Copy,Amend","Tune") j�mainmenu%=�makemen("|wininInfo,|winsmSave,Settings,Create,"+�lit(tuneloaded%)+"Clear,|wintn"+�lit(tuneloaded%)+"Tune,Quit","AP Tracker") t5� menuptr%>menend% � � 17,"Not enough menu space" ~+�seticontext(newtrack%,5,�(defvoices%)) �,�seticontext(savepattern%,6,�(savepat%)) �� �: �ݤlit(test%) �!� test% � ="|lit1" � ="|lit0" �: �ݤtic(test%) �!� test% � ="|tic1" � ="|tic0" �: ���menuitem(text$) �$� menuflags%,iconflags%,submenu% � ii%=� submenu%=-1 � text$="" � � menuflags%=0 iconflags%=&07000021 (ȕ �text$,1)="|" 2Ȏ �text$,2,3) � <� "lit": F*iconflags%+=(1<<22)*(1-�(�text$,5,1))) Ptext$=�text$,6) Z� "tic": dmenuflags%+=�(�text$,5,1)) ntext$=�text$,6) x� "win": �Ȏ �text$,5,2) � �� "in":submenu%=info% �� "tn":submenu%=tunemenu% �� "nt":submenu%=newtrack% �� "sa":submenu%=savetune% �� "sm":submenu%=savemenu% � � "sp":submenu%=savepattern% �!� "ap":submenu%=savepatterns% �� "sh":submenu%=savehelp% �� "ss":submenu%=savesample% �� "sv":submenu%=setvolume% �� "sd":submenu%=savedump% �� text$=�text$,7) � � ")� �(text$)>menumax% menumax%=�(text$) ,menuptr%!0=menuflags% 6menuptr%!4=submenu% @menuptr%!8=iconflags% J� �(text$)<12 � T$(menuptr%+12)=text$ ^� hmenend%-=(�(text$)+1) r(menuptr%!8=(menuptr%!8) � %100000000 |menuptr%!12=menend% �menuptr%!16=-1 �menuptr%!20=�(text$) �$menend%=text$ �� �menuptr%+=24 �� �: �ݤpar(sep$) �%i1%=i%+1:i%=�menu$+sep$,sep$,i1%) �=�menu$,i1%,i%-i1%) �: �ݤmakemen(menu$,menutitle$) �� menumax%,wasptr% wasptr%=menuptr% menumax%=10 i%=0 &menuptr%!20=40 0$menuptr%=menutitle$ :menuptr%?12=tfcol Dmenuptr%?13=mbcol Nmenuptr%?14=wfcol Xmenuptr%?15=wbcol bmaxaddr%=menuptr%+16 lmenuptr%!24=0 vmenuptr%+=28 �� �item$=�par(",") ��menuitem(item$) �� item$="" �%menuptr%!-24=(menuptr%!-24) � &80 �!maxaddr%=menumax%*16+32 �=wasptr% �: ���openmenu(our%,m%,x%,y%) �menuhandle%=our% � menux%=x% � menuy%=y% �"ș "Wimp_CreateMenu",,m%,x%,y% � : ��menuselect(menus%) � redo% *!ș "Wimp_GetPointerInfo",,q2% 4redo%=(((q2%!8) � 1)>0) >Ȏ menuhandle% � H � 101: RȎ !menus% � \� 2: f(�seticontext(settings%,5,�(patlen%)) p�openwindow(settings%,0) z � 3:�openwindow(newtrack%,0) �� 4: ��cleardata �� 5: �Ȏ menus%!4 � �4� 0:�getnames:�tuneinfo:�openwindow(tuneinfo%,0) �� 1:�samples �� 2:�stereo �#� 3:�openwindow(copypattern%,0) �� 4: �*�seticontext(amendtrack%,2,�(delpat%)) �-�seticontext(amendtrack%,10,�(delvoice%)) ��openwindow(amendtrack%,0) �� � 6:�shutdown:redo%=� � � redo% �mainmenu $ � 106: .Ȏ !menus% � 8� 2: B�deletesample(sampleno%) L� 3: Vsaveheader%=�(saveheader%) ` �makesamplemenu(sampleno%-1) j� t� ~<� redo% � �openmenu(menuhandle%,mainmenu%,menux%,menuy%) �� �: �&��seticontype(window%,icon%,type%) �q2%!0=window% �q2%!4=icon% �ș "Wimp_GetIconState",,q2% �iconblock%=q2%+8 �iconflags%=iconblock%!16 �eorword%=type%<<12 �clearword%=15<<12 �q2%!0=window% �q2%!4=icon% q2%!8=eorword% q2%!12=clearword% ș "Wimp_SetIconState",,q2% � (: 2��writeable(window%,icon%) <"�seticontype(window%,icon%,15) F� P: Z ��unwriteable(window%,icon%) d!�seticontype(window%,icon%,0) n� x: �!��makeselected(window%,icon%) �q2%!0=window% �q2%!4=icon% �q2%!8=2^21 �q2%!12=2^21 �ș "Wimp_SetIconState",,q2% �� �: �#��makeunselected(window%,icon%) �q2%!0=window% �q2%!4=icon% �q2%!8=0 �q2%!12=2^21 ș "Wimp_SetIconState",,q2% � : "!ݤisitselected(window%,icon%) ,q2%!0=window% 6q2%!4=icon% @ș "Wimp_GetIconState",,q2% Jiconblock%=q2%+8 Ticonflags%=iconblock%!16 ^%� (iconflags% � 2^21)=0 � =0 � =1 h: r��movecaret(window%,icon%) |*p%=(�(�icontext(window%,icon%))+1) � 2 �4ș "Wimp_SetCaretPosition",window%,icon%,,,-1,p% �� �: �ݤfilelen(file$) �C%=�(file$) � len%=�#C% � � #C% � =len% �: ���savefile �&pathname$=�stringfrommemory(q%+44) �&leafname$=�icontext(savehandle%,3) �� leafname$="" � � !fullname$=pathname$+leafname$ Ȏ globalref% � � 1:�savetune &� 2:�savesample(sampleno%) 0� 3:�savepattern(savepat%) :� 4:�savehelp(fullname$) D � 5:�savepatterns(leafname$) N� 6:�savedump(fullname$) X� b� l: v5��loadwithpathvariable(variable$,filename$,addr%) �2�("LOAD "+variable$+"."+filename$+" "+�~addr%) �� �: �6��savewithpathstring(filename$,path$,addr%,bytes%) �path2$=path$+"."+filename$ �0ș "OS_File",0,path2$,0,0,addr%,addr%+bytes% �� �: �ݤdigit(d$) �!� d$>="0" � d$<="9" � =� � =� �: ���settitle(block%,title$) �addr%=block%+72 len%=�(title$) c%=0 ȕ len%>0 addr%?c%=�(�title$,c%+1,1)) * c%+=1 4len%-=1 >� Haddr%?c%=0 R� \: fݤreadstring p� out$,byte% zabort$=�(0) �� �#handle% � =abort$ �out$="" �� �byte%=�#handle% �2� byte%>31 � �(�#handle%) � out$=out$+�(byte%) �� byte%<32 � �#handle% � =out$ �: ���writestring(write$) �� char%=1 � �(write$) �!�#handle%,�(�write$,char%,1)) �� ��#handle%,13 � : "��setfiletype(fname$,newtype%) $#ș "OS_File",18,fname$,newtype% .� 8: B!��writestringtofile(ch%,str$) L� str$="" � � V� l%=1 � �(str$) `�#ch%,�(�str$,l%,1)) j� t� ~: ���loadfile �&filename$=�stringfrommemory(q%+44) �loaded$=filename$ � filelen%=�filelen(filename$) �Ȏ q%!40 � �$� &001:�loadtracker(filename$,2) �$� &364:�loadcocotrack(filename$) �$� &365:�loadcocotrack(filename$) �%� &701:�loadprotracker(filename$) �$� &CB6:�loadtracker(filename$,0) �#� &CB5:�loadsample(filename$,0) �$� &CC5:�loadtracker(filename$,2) #� &D3C:�loadsample(filename$,2) #� &DF9:�loadsample(filename$,6) #� &ED0:�loadsample(filename$,1) !� &FFA:�loadmodule(filename$) ("� &FFD:�loadpatdata(filename$) 2� <� F: P��loadmodule(module$) ZC%=�(module$) d�#C%=&88 n a$="" x� byte%=1 � 8 �a$+=�(�#C%) �� � � #C% �E� a$="SampConv" � �loadsample(module$,8) � �loadsample(module$,7) �� �: �$��loadtracker(tracker$,modtype%) �modtype2%=modtype% �� modtype%=0 � �C%=�(tracker$) �read$="" �� char%=1 � 4 �read$+=�(�#C%) � � #C% � ": ,abort%=� 6� tuneloaded% � @Ierrorexit%=�errorbox(17,"Existing tune will be lost - are you sure?") J-� errorexit%=1 � �returnmemory � abort%=� T� ^� abort% � � h: r� modtype%=0 � |D� read$="FTMN" � � 17,"Sorry, can't load 'Face the Music' files" �<� read$="MED"+�(4) � � 17,"Sorry, can't load MED3 files" �,� read$="MUSX" � modtype%=1 � modtype%=2 �� read$="OKTA" � modtype%=3 �� � �stoptune �aborted%=� �Ȏ modtype% � �� 2: �� modtype2%=0 � �:errorexit%=�errorbox(17,"Convert from Sound Tracker?") � � errorexit%<>1 � aborted%=� �� �: � �(aborted%) � freemem%=0 'gotit%=�grabmem(filelen%*2+10*1024) &!� gotit%=� � �notenoughtoload 0+tempload%=trackertune%+filelen%+10*1024 :'tempload%=(tempload%-4) � &FFFFFFFC D'�("LOAD "+tracker$+" "+�~tempload%) NA%=1 XB%=tempload% bC%=trackertune% lD%=filelen% vș "Hourglass_On" �� trackercode% �ș "Hourglass_Off" � �minimise �� �: �� 1: �freemem%=0 �gotit%=�grabmem(filelen%) �!� gotit%=� � �notenoughtoload �*�("LOAD "+tracker$+" "+�~trackertune%) �: �� 3: �6errorexit%=�errorbox(17,"Convert from Octalyser?") � errorexit%<>1 � aborted%=� : � �(aborted%) � freemem%=0 *'gotit%=�grabmem(filelen%*2+10*1024) 4!� gotit%=� � �notenoughtoload >+tempload%=trackertune%+filelen%+10*1024 H'tempload%=(tempload%-4) � &FFFFFFFC R'�("LOAD "+tracker$+" "+�~tempload%) \A%=8 fB%=tempload% pC%=trackertune% zD%=filelen% �ș "Hourglass_On" �� trackercode% �ș "Hourglass_Off" � �minimise �� �: �� �: �� �(aborted%) � �justloaded �� aborted% � �closeall �� �: ���justloaded tuneloaded%=� playing%=� oldpos%=-1:oldevent%=-1 $%�seticontext(savetune%,3,loaded$) .�getmusicinfo 8 �tuneinfo B�updatestereo L�writesamplenames V�initialisevoices `justloaded%=� jdelvoice%=1 t delpat%=1 ~savepat%=1 �copypat%=1 �,�seticontext(copypattern%,5,�(copypat%)) �*�seticontext(amendtrack%,2,�(delpat%)) �-�seticontext(amendtrack%,10,�(delvoice%)) ��redocaret �� �: ���redocaret �"ș "Wimp_GetCaretPosition",,q% �cw%=q%!0:ci%=q%!4 �� cw%=tuneinfo% � �'� ci%=7 � ci%=8 �movecaret(cw%,ci%) � � : %��loadsample(sampfile$,samptype%) (withheader%=� 2window%=q%!20 <icon%=q%!24 F� window%<>samples% � � P� icon%<0 � � Zș "Hourglass_On" dsamppos%=(icon% � 36)+1 n$sampfilelen%=�filelen(sampfile$) x!actualsamplelen%=sampfilelen% �#� samptype%=2 � sampfilelen%-=1 �%� samptype%=6 � sampfilelen%-=712 �&� samptype%=7 � sampfilelen%-=1408 �%� samptype%=8 � sampfilelen%-=660 �-sampfilelen%=(sampfilelen%+3) � &FFFFFFFC �4� samptype%=0 � withheader%=�headered(sampfile$) �� withheader% � �%�loadheadered(sampfile$,samppos%) �� �1�loadunheadered(sampfile$,samppos%,samptype%) �� �ș "Hourglass_Off" ��updatesize �minimise � : "ݤheadered(samp$) ,C%=�(samp$) 6read$="" @� char%=1 � 4 Jread$+=�(�#C%) T� ^ � #C% h� read$="SAMP" � =� r=� |: � ��loadheadered(what$,where%) �abort%=� �'� sampfilelen%>(slen%(where%)+92) � �-toinsert%=sampfilelen%-(slen%(where%)+92) �at%=sampaddr%(where%) �/� �(�insertbytes(at%,toinsert%)) � abort%=� �� �'� sampfilelen%<(slen%(where%)+92) � �+todelete%=slen%(where%)+92-sampfilelen% �at%=sampaddr%(where%) �/� �(�deletebytes(at%,todelete%)) � abort%=� �� �� abort%=� � � 7:� ,�("LOAD "+what$+" "+�~sampaddr%(where%)) �readsamples �writesamplenames &� 0: :)��loadunheadered(what$,where%,stype%) Dabort%=� N"� sampfilelen%>slen%(where%) � X(toinsert%=sampfilelen%-slen%(where%) bat%=sampaddr%(where%)+92 l/� �(�insertbytes(at%,toinsert%)) � abort%=� v� �"� sampfilelen%<slen%(where%) � �(todelete%=slen%(where%)-sampfilelen% �at%=sampaddr%(where%)+92 �/� �(�deletebytes(at%,todelete%)) � abort%=� �� �� abort%=� � � 7:� �Ȏ stype% � �� 2: �C%=�(what$) �?ș "OS_GBPB",3,C%,sampaddr%(where%)+92,actualsamplelen%-1,1 � � #C% �� 6: �C%=�(what$) !Cș "OS_GBPB",3,C%,sampaddr%(where%)+92,actualsamplelen%-712,544 ! � #C% !� 7: ! C%=�(what$) !*Eș "OS_GBPB",3,C%,sampaddr%(where%)+92,actualsamplelen%-1408,1408 !4 � #C% !>� 8: !HC%=�(what$) !RCș "OS_GBPB",3,C%,sampaddr%(where%)+92,actualsamplelen%-660,660 !\ � #C% !f� 0,1,3,4,5: !p1�("LOAD "+what$+" "+�~(sampaddr%(where%)+92)) !z� !�sname$=�leafname(what$) !�sname$=�sname$,20) !�rlen%=2 !�rofs%=0 !�at%=sampaddr%(where%) !�at%!4=sampfilelen%+84 !�%�writewithzeros(sname$,at%+16,20) !�at%!80=rlen% !�at%!68=rofs% !�at%!56=sampfilelen% !�at%!88=sampfilelen% !�Ȏ stype% � !�� 1: "A%=5 " B%=at%+92 "C%=sampfilelen% "$D%=0 ".� trackercode% "8� 2,6,7: "BA%=5 "L B%=at%+92 "VC%=sampfilelen% "`D%=1 "j� trackercode% "t� 3,4,5: "~A%=5 "� B%=at%+92 "�C%=sampfilelen% "�D%=stype%-1 "�� trackercode% "�� "��readsamples "��writesamplenames "�� "�: "���writewithzeros(w$,a%,l%) "�� c%=1 � l% "�b%=0 # !� c%<=�(w$) � b%=�(�w$,c%,1)) # a%?(c%-1)=b% #� #� #(: #2��edittracker #<� tuneloaded%=� � � #F �stoptune #Poldmode%=� #Z�rewritestereo #d� 15 #nA%=trackertune% #xB%=0 #�� justloaded% � B%=1 #�� trackercode%+4 #�*FX 15,0 #�ș "Wimp_SetMode",oldmode% #��readmusicdata #��readsamples #��writesamplenames #� �tuneinfo #�justloaded%=� #�ș "OS_Byte",4,2,0 #�� #�: #���notenoughtoload $�returnmemory $ �closeall $(� 17,"Insufficient Memory Available" $"� $,: $6��returnmemory $@#ș "XWimp_SlotSize",appsize%,-1 $Jtuneloaded%=� $T� $^: $hݤgrabmem(amount%) $roldamount%=amount% $|-� amount%<freemem% � freemem%-=amount%:=� $�� $� grabable%=�grabmem2(32*1024) $�� grabable% � $�freemem%+=32*1024 $�amount%-=32*1024 $�� $�� amount%<0 � �(grabable%) $�&� amount%<0 � freemem%-=oldamount% $�=grabable% $�: $�ݤgrabmem2(amount%) $�%ș "XWimp_SlotSize",-1,-1 � size% $�(ș "XWimp_SlotSize",size%+amount%,-1 %&ș "XWimp_SlotSize",-1,-1 � size2% %� size2%<size%+amount% � % ș "XWimp_SlotSize",size%,-1 %&� %0$� size2%<size%+amount% � =� � =� %:: %D��getmusicinfo %N�readmusicdata %X�readsamples %b�readpatterns %l� %v: %���tuneinfo %�$�seticontext(tuneinfo%,7,mname$) %�$�seticontext(tuneinfo%,8,aname$) %�*�seticontext(tuneinfo%,9,�(patterns%)) %�)�seticontext(tuneinfo%,14,�(voices%)) %�)�seticontext(tuneinfo%,15,�(seqlen%)) %��updatesize %�� %�: %���getnames %�!mname$=�icontext(tuneinfo%,7) %�!aname$=�icontext(tuneinfo%,8) %�� &: & ��samples &�openwindow(samples%,0) & � &*: &4��writesamplenames &>� sample%=1 � 36 &Hicon%=sample%+107 &Rsname$=sample$(sample%) &\slen%=slen%(sample%) &fslen$=�(slen%) &p� slen%=0 � slen$="" &z slen$=�5-�(slen$)," ")+slen$ &�$sname$=sname$+�22-�(sname$)," ") &�1�seticontext(samples%,icon%,sname$+" "+slen$) &�� &�� &�: &�!ݤfindword(start%,end%,word%) &� A%=start% &�B%=end% &�� &� C%=!A% &�D%=A%!4 &� A%+=8 &�� C%<>word% � A%+=D% '� A%>B% � C%=word% '� C%=word% � =A% '=� '$: '.ݤword(word$) '8word%=0 'B� byte%=1 � 4 'Lasc%=�(�word$,5-byte%,1)) 'Vword%=(word%<<8)+asc% '`� 'j =word% 't: '~��readmusicdata '�absstart%=trackertune% '�+absend%=trackertune%+(trackertune%!4)+8 '�absstart%+=8 '�mlen%=�word("MLEN") '�mvox%=�word("MVOX") '�pnum%=�word("PNUM") '�mnam%=�word("MNAM") '�anam%=�word("ANAM") '�plen%=�word("PLEN") '�ster%=�word("STER") '�sequ%=�word("SEQU") '�0mlenaddr%=�findword(absstart%,absend%,mlen%) ( seqlen%=!mlenaddr% ( 0mvoxaddr%=�findword(absstart%,absend%,mvox%) (voices%=!mvoxaddr% (0steraddr%=�findword(absstart%,absend%,ster%) ((0pnumaddr%=�findword(absstart%,absend%,pnum%) (2patterns%=!pnumaddr% (<0mnamaddr%=�findword(absstart%,absend%,mnam%) (F0anamaddr%=�findword(absstart%,absend%,anam%) (P)aname$=�stringwithlimit(anamaddr%,32) (Z)mname$=�stringwithlimit(mnamaddr%,32) (d/pattlen%=�findword(absstart%,absend%,plen%) (n/seqaddr%=�findword(absstart%,absend%,sequ%) (x� (�: (���readsamples (�absstart%=trackertune% (�+absend%=trackertune%+(trackertune%!4)+8 (�absstart%+=8 (�samp%=�word("SAMP") (�snam%=�word("SNAM") (�slen%=�word("SLEN") (�svol%=�word("SVOL") (�start%=absstart% (�� inst%=1 � 36 (�/sampleaddr%=�findword(start%,absend%,samp%) (�"sampaddr%(inst%)=sampleaddr%-8 )searchaddr%=sampleaddr% )2snamaddr%=�findword(searchaddr%,absend%,snam%) )1sample$(inst%)=�stringwithlimit(snamaddr%,20) )"2slenaddr%=�findword(searchaddr%,absend%,slen%) ),'slen%(inst%)=4*((!slenaddr%+3) � 4) )6!slenaddr%=slen%(inst%) )@9svoladdr%(inst%)=�findword(searchaddr%,absend%,svol%) )J'start%=sampleaddr%+!(sampleaddr%-4) )T� )^� )h: )r��readpatterns )|� start%,pattern% )�absstart%=trackertune% )�+absend%=trackertune%+(trackertune%!4)+8 )�absstart%+=8 )�start%=absstart% )�patt%=�word("PATT") )�� pattern%=1 � patterns% )�7pattaddr%(pattern%)=�findword(start%,absend%,patt%) )�7start%=pattaddr%(pattern%)+!(pattaddr%(pattern%)-4) )�� )�� )�: )���newpattern )�� patterns%=64 � � *�makeselected(tuneinfo%,6) *eachpat%=4*patlen%*voices% *Bstart%=pattaddr%(patterns%)+(4*voices%*pattlen%?(patterns%-1)) *&'� �insertbytes(start%,eachpat%+8) � *0start%!0=�word("PATT") *:start%!4=eachpat% *D start%+=8 *N� word%=0 � (eachpat%/4)-1 *Xstart%!(word%*4)=0 *b� *lpattlen%?patterns%=patlen% *vpatterns%+=1 *�!pnumaddr%=patterns% *��getmusicinfo *�� *� �makeunselected(tuneinfo%,6) *� �tuneinfo *�� *�: *�"ݤinsertbytes(where%,howmany%) *� � �(�grabmem(howmany%)) � =� *�)from%=trackertune%+trackertune%!4+8-1 *�to%=from%+howmany% *�copy%=from%-where% *�A%=from% + B%=to% +C%=copy%+1 +� C%>0 � insertbytes + trackertune%!4+=howmany% +*=� +4: +>"ݤdeletebytes(where%,howmany%) +HA%=where%+howmany% +R B%=where% +\*endaddr%=trackertune%+trackertune%!4+8 +fC%=endaddr%-A% +p� C%>0 � deletebytes +zfreemem%+=howmany% +�trackertune%!4-=howmany% +�=� +�: +���assemble +�fromreg%=0 +�toreg%=1 +�countreg%=2 +�link=14:pc=15 +�� pass=0 � 2 � 2 +�P%=code% +� [OPT pass +�.insertbytes +�LDRB R11,[fromreg%],#-1 ,STRB R11,[toreg%],#-1 ,SUBS countreg%,countreg%,#1 ,BNE insertbytes ,$MOV pc,link ,..deletebytes ,8LDRB R11,[fromreg%],#1 ,BSTRB R11,[toreg%],#1 ,LSUBS countreg%,countreg%,#1 ,VBNE deletebytes ,`MOV pc,link ,j .claimRma ,t MOV R3,R0 ,~ MOV R0,#6 ,�SWI "XOS_Module" ,�MOVVS R2,#0 ,� MOV R0,R2 ,�MOV pc,link ,�.copybytes ,�ADD R11,R2,#3 ,�MOV R11,R11,ASR #2 ,�.copybytesloop ,�LDR R10,[R0],#4 ,�STR R10,[R1],#4 ,�SUBS R11,R11,#1 ,�BNE copybytesloop - MOV pc,link - ] -� -� -(: -2��savesample(sample%) -<"leaf$=�icontext(savesample%,3) -F"path$=�stringfrommemory(q%+44) -Ppath$=�path$,�(path$)-1) -Z� saveheader% � -dstart%=sampaddr%(sample%) -n%length%=!(sampaddr%(sample%)+4)+8 -x� -� start%=sampaddr%(sample%)+92 -�length%=slen%(sample%) -�� -�3�savewithpathstring(leaf$,path$,start%,length%) -�&�setfiletype(path$+"."+leaf$,&CB5) -�ș "Wimp_CreateMenu",,-1 -�� -�: -���savetune -�8�writewithzeros(�icontext(tuneinfo%,7),mnamaddr%,32) -�8�writewithzeros(�icontext(tuneinfo%,8),anamaddr%,32) -��rewritestereo -� leaf$=�icontext(savetune%,3) .leaf$=�leafname(leaf$) ."path$=�stringfrommemory(q%+44) .path$=�path$,�(path$)-1) ."B�savewithpathstring(leaf$,path$,trackertune%,trackertune%!4+8) .,&�setfiletype(path$+"."+leaf$,&CB6) .6-�seticontext(savetune%,3,path$+"."+leaf$) .@ș "Wimp_CreateMenu",,-1 .J� .T: .^��deletesample(samppos%) .hat%=sampaddr%(samppos%)+92 .rtodelete%=slen%(samppos%) .|&dummy%=�deletebytes(at%,todelete%) .�at%=sampaddr%(samppos%) .�!�writewithzeros("",at%+16,20) .�at%!4=84 .�at%!56=0 .�at%!68=0 .�at%!80=2 .�at%!88=0 .��readsamples .��writesamplenames .� �minimise .� �tuneinfo .�� .�: /��updatesize /size%=trackertune%!4+8 / ksize%=�((size%+512) � 1024) /&,�seticontext(tuneinfo%,19,�(ksize%)+"K") /00�seticontext(tuneinfo%,20,�(size%)+" bytes") /:� /D: /N��quicksave /X save$=�icontext(savetune%,3) /b�makeselected(savetune%,4) /l4� �save$,".")=0 � �makeunselected(savetune%,4):� /v8�writewithzeros(�icontext(tuneinfo%,7),mnamaddr%,32) /�8�writewithzeros(�icontext(tuneinfo%,8),anamaddr%,32) /��rewritestereo /�start%=trackertune% /�length%=trackertune%!4+8 /�0�("SAVE "+save$+" "+�~start%+" +"+�~length%) /��setfiletype(save$,&CB6) /� �makeunselected(savetune%,4) /�ș "Wimp_CreateMenu",,-1 /�� /�: /���incdefvoices /�"� defvoices%<8 � defvoices%+=1 /�+�seticontext(newtrack%,5,�(defvoices%)) 0� 0: 0��decdefvoices 0 "� defvoices%>1 � defvoices%-=1 0*+�seticontext(newtrack%,5,�(defvoices%)) 04� 0>: 0H��cleardata 0Rabort%=� 0\� tuneloaded% � 0fAerrorexit%=�errorbox(17,"Data will be lost - are you sure ?") 0p� errorexit%=2 � abort%=� 0z� 0�� abort% � � 0��returnmemory 0� �stoptune 0� �closeall 0�tuneloaded%=� 0�� 0�: 0���closeall 0��closewindow(tuneinfo%) 0��closewindow(samples%) 0��closewindow(stereo%) 0��closewindow(copypattern%) 0��closewindow(player%) 1�closewindow(amendtrack%) 1� 1: 1$��createtune(v%) 1.abort%=� 18� tuneloaded% � 1BIerrorexit%=�errorbox(17,"Existing tune will be lost - are you sure?") 1L� errorexit%=2 � abort%=� 1V� abort%=� �returnmemory 1`� 1j(� abort% � �closewindow(newtrack%):� 1t �stoptune 1~�makeselected(newtrack%,2) 1�memneeded%=368+36*92 1�memneeded%+=v%*64*4 1�freemem%=0 1�� �grabmem(memneeded%) � 1�o%=0 1�t%=trackertune% 1�t%!o%=�word("MUSX") : o%+=4 1� t%!o%=memneeded%-8 : o%+=4 1�t%!o%=�word("TINF") : o%+=4 1� t%!o%=4 : o%+=4 1� t%!o%=0 : o%+=4 1�t%!o%=�word("MVOX") : o%+=4 2 t%!o%=4 : o%+=4 2 t%!o%=v% : o%+=4 2t%!o%=�word("STER") : o%+=4 2 t%!o%=8 : o%+=4 2( t%!o%=&03050503 : o%+=4 22 t%!o%=&03050503 : o%+=4 2<t%!o%=�word("MNAM") : o%+=4 2F t%!o%=32 : o%+=4 2P*�writewithzeros("<Untitled>",t%+o%,32) 2Z o%+=32 2dt%!o%=�word("ANAM") : o%+=4 2n t%!o%=32 : o%+=4 2x%�writewithzeros("<You>",t%+o%,32) 2� o%+=32 2�t%!o%=�word("MLEN") : o%+=4 2� t%!o%=4 : o%+=4 2� t%!o%=1 : o%+=4 2�t%!o%=�word("PNUM") : o%+=4 2� t%!o%=4 : o%+=4 2� t%!o%=1 : o%+=4 2�t%!o%=�word("PLEN") : o%+=4 2� t%!o%=64 : o%+=4 2�� i%=1 � 64 2�t%?o%=64 2� o%+=1 2�� 3t%!o%=�word("SEQU") : o%+=4 3 t%!o%=128 : o%+=4 3� i%=1 � 128 3"t%?o%=0 3, o%+=1 36� 3@t%!o%=�word("PATT") : o%+=4 3J t%!o%=v%*64*4 : o%+=4 3T� i%=1 � v%*64*4 3^t%?o%=0 3h o%+=1 3r� 3|� sample%=1 � 36 3�t%!o%=�word("SAMP") : o%+=4 3� t%!o%=84 : o%+=4 3�t%!o%=�word("SNAM") : o%+=4 3� t%!o%=20 : o%+=4 3� �writewithzeros("",t%+o%,20) 3� o%+=20 3�t%!o%=�word("SVOL") : o%+=4 3� t%!o%=4 : o%+=4 3� t%!o%=255 : o%+=4 3�t%!o%=�word("SLEN") : o%+=4 3� t%!o%=4 : o%+=4 3� t%!o%=0 : o%+=4 3�t%!o%=�word("ROFS") : o%+=4 4 t%!o%=4 : o%+=4 4 t%!o%=0 : o%+=4 4t%!o%=�word("RLEN") : o%+=4 4& t%!o%=4 : o%+=4 40 t%!o%=2 : o%+=4 4:t%!o%=�word("SDAT") : o%+=4 4D t%!o%=0 : o%+=4 4N� 4Xtuneloaded%=� 4bplaying%=� 4l'�seticontext(savetune%,3,"Tracker") 4v�getmusicinfo 4� �tuneinfo 4��updatestereo 4��writesamplenames 4��initialisevoices 4��closewindow(newtrack%) 4� �minimise 4�� 4�tuneloaded%=� 4� �closeall 4�� 4� �makeunselected(newtrack%,2) 4�justloaded%=� 4�delvoice%=1 5 delpat%=1 5savepat%=1 5copypat%=1 5 ,�seticontext(copypattern%,5,�(copypat%)) 5**�seticontext(amendtrack%,2,�(delpat%)) 54-�seticontext(amendtrack%,10,�(delvoice%)) 5>�redocaret 5H� 5R: 5\ݤerrorbox(err%,err$) 5fq%!0=err%+(task%<<8) 5p$(q%+4)=err$+�(0) 5z8ș "Wimp_ReportError",q%,%1011,"AP Tracker" � ,exit% 5� =exit% 5�: 5�ݤleafname(fullpath$) 5�� fullpath$="" � ="" 5�� output$,chpos%,ch$ 5�output$="" 5�chpos%=�(fullpath$) 5�� 5�ch$=�fullpath$,chpos%,1) 5�)� �".: ",ch$)=0 � output$=ch$+output$ 5� chpos%-=1 5�� chpos%=0 � �".: ",ch$)>0 5�=output$ 6: 6��stereo 6�openwindow(stereo%,0) 6$� 6.: 68��setstereoESGs 6B� voice%=1 � 8 6Lbaseicon%=voice%*8-7 6Vesg%=voice% 6`� eachicon%=0 � 6 6j-�setESG(stereo%,baseicon%+eachicon%,esg%) 6t� 6~� 6�� 6�: 6���updatestereo 6�� voice%=1 � 8 6�s%=steraddr%+voice%-1 6�� ?s%=0 � ?s%>7 � ?s%=4 6�baseicon%=voice%*8-7 6�� eachicon%=0 � 6 6�0�makeunselected(stereo%,baseicon%+eachicon%) 6�� 6�=�makeselected(stereo%,baseicon%+(steraddr%?(voice%-1)-1)) 6�� 7 � 7 : 7 ��setESG(window%,icon%,set%) 7q%!0=window% 7(q%!4=icon% 72q%!8=set%<<16 7<q%!12=%1111<<16 7Fș "Wimp_SetIconState",,q% 7P� 7Z: 7d��rewritestereo 7n� voice%=1 � 8 7xw%=steraddr%+voice%-1 7�baseicon%=voice%*8-7 7�s%=1 7�� eachicon%=0 � 6 7�A� �isitselected(stereo%,baseicon%+eachicon%) � s%=eachicon%+1 7�� 7� ?w%=s% 7�� 7�� 7�: 7���incsavepat 7�&� savepat%<patterns% � savepat%+=1 7�,�seticontext(savepattern%,6,�(savepat%)) 7�� 8: 8��decsavepat 8� savepat%>1 � savepat%-=1 8",�seticontext(savepattern%,6,�(savepat%)) 8,� 86: 8@ݤpatternaddr(patno%) 8J=pattaddr%(patno%) 8T: 8^��savepattern(whichpat%) 8h'startpat%=�patternaddr(whichpat%)-8 8rlength%=!(startpat%+4)+8 8|(pathname$=�pathname$,�(pathname$)-1) 8�>�savewithpathstring(leafname$,pathname$,startpat%,length%) 8�.�setfiletype(pathname$+"."+leafname$,&FFD) 8�ș "Wimp_CreateMenu",,-1 8�� 8�: 8���savepatterns(root$) 8�(pathname$=�pathname$,�(pathname$)-1) 8�ș "Hourglass_On" 8�� patsave%=1 � patterns% 8�(leafname$=root$+�"00"+�(patsave%),2) 8�&startpat%=�patternaddr(patsave%)-8 8�length%=!(startpat%+4)+8 8�>�savewithpathstring(leafname$,pathname$,startpat%,length%) 9.�setfiletype(pathname$+"."+leafname$,&FFD) 9� 9ș "Hourglass_Off" 9&ș "Wimp_CreateMenu",,-1 90� 9:: 9D��loadpatdata(filename$) 9N@� q%!20=samples% � �loadsample(filename$,�whichsampletype):� 9XC%=�(filename$) 9bread$="" 9l� byte%=1 � 4 9vread$+=�(�#C%) 9�� 9� � #C% 9�abort%=� 9�� read$<>"PATT" � abort%=� 9�� filelen%<(4+8) � abort%=� 9�$� filelen%>(8*64*4+8) � abort%=� 9�!� (filelen% � 3)>0 � abort%=� 9�(� abort% � � 17,"Not a pattern file" 9�&�("LOAD "+filename$+" "+�~copied%) 9�copiedlen%=filelen% 9��openwindow(copypattern%,0) 9�� 9�: :��inccopypat :&� copypat%<patterns% � copypat%+=1 :,�seticontext(copypattern%,5,�(copypat%)) : � :*: :4��deccopypat :>� copypat%>1 � copypat%-=1 :H,�seticontext(copypattern%,5,�(copypat%)) :R� :\: :f��copypattern :p-� copiedlen%=0 � � 17,"No pattern loaded" :z$copyto%=�patternaddr(copypat%)-8 :�copytolen%=!(copyto%+4)+8 :�?� copytolen%<>copiedlen% � � 17,"Pattern sizes don't match" :�!�makeselected(copypattern%,2) :�� byte%=0 � copiedlen%-1 :�copyto%?byte%=copied%?byte% :�� :�#�makeunselected(copypattern%,2) :�,� �(mredo%) � �closewindow(copypattern%) :�� :�: :���storepattern :�!�makeselected(savepattern%,7) :�&startpat%=�patternaddr(savepat%)-8 ;length%=!(startpat%+4)+8 ;� byte%=0 � length%-1 ;!copied%?byte%=startpat%?byte% ;$� ;.copiedlen%=length% ;8#�makeunselected(savepattern%,7) ;B*� �(mredo%) � ș "Wimp_CreateMenu",,-1 ;L�openwindow(copypattern%,0) ;V� ;`: ;j��savehelp(savehelp$) ;tA%=0 ;~blkaddr%=�(trackercode%) ;�helpaddr%=blkaddr%!0 ;�helplines%=blkaddr%!4 ;�C%=�(savehelp$) ;�ș "Hourglass_On" ;�� line%=1 � helplines% ;�4ș "Hourglass_Percentage",100*(line%/helplines%) ;�� char%=0 � 75 ;��#C%,helpaddr%?char% ;�� ;�helpaddr%+=76 ;��#C%,10 ;�� <