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$)
<