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
;��
<