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