Home » Archimedes archive » Acorn Computing » 1994 02 subscription disc.adf » 9402s » PD/PlayTrack/!PlayTrack/!RunImage
PD/PlayTrack/!PlayTrack/!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 02 subscription disc.adf » 9402s |
| Filename: | PD/PlayTrack/!PlayTrack/!RunImage |
| Read OK: | ✔ |
| File size: | D4A2 bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM >$.!PlayTrack.!RunImage
20REM PD
30REM 1992
40
50ON ERROR PROCtellemoff("Fatal error: (type="+STR$ERL+") "+REPORT$+" Re-run & try again."):SYS "Wimp_CloseDown":END
60REM errors in this bit of code cannot be dealt with - quit immediately
70REM If you try, templates might not be loaded, menus not defined etc.
80DIM q% 800,useful% 700,ind% &200,ind2% &300,menu% 300,pointer% 400
90DIM icontext% 36,iconvalid% 36,ind3% &200,ind4% &300,open% 650
100DIM indtext% 256:indptr%=0
110DIM ind5% &200,channel(8),ind6% &150,ind7% &100,ind8% &200,ind9% &200
120DIM ind10% &100,ind11% &20,code% 700,ind12% &100,ind13% &20,ind14% &20
130DIM samps% 32*31,volume% 4*31,samplen% 6*31,valid% 3,text% 30:$valid%="z4"
140$text%="No:":$(text%+8)="Name:":$(text%+16)="Vol:":$(text%+24)="Len:"
150edited%=FALSE:playing%=FALSE:speaker=FALSE:buffersize%=0:lenbytes%=0
160copen%=FALSE:topen%=FALSE:sopen%=FALSE:vopen%=FALSE:type=0:newicn%=FALSE
170sicn%=0:nscn%=FALSE:cmos%=42:cmos2%=43:oopen%=FALSE:lap%=TRUE:scr%=FALSE
180dos%=TRUE:afs%=FALSE:vuopen%=FALSE:mute%=FALSE:mak%=FALSE:wopen%=FALSE
190show%=FALSE:cropen%=FALSE:track%=1:com%=TRUE:ap%=TRUE:clock$="48":buff%=0
200workspc%=0
210$q%="TASK"
220SYS "Wimp_Initialise",200,!q%,"PlayTrack" TO ,taskh%
230SYS "Interface_Initialise",,taskh%:REM claim Interface pointers
240lock%=RND(2000):SYS "Tracker_Lock",lock%
250SYS "Wimp_OpenTemplate",,"<PlayTrack$Dir>.Templates"
260SYS "Wimp_LoadTemplate",,q%,ind%,ind%+&200,-1,"info",0
270SYS "Wimp_CreateWindow",,q% TO infowind%
280SYS "Wimp_LoadTemplate",,q%,ind2%,ind2%+&300,-1,"saveas",0
290SYS "Wimp_CreateWindow",,q% TO saveas%
300SYS "Wimp_LoadTemplate",,q%,ind3%,ind3%+&200,-1,"control",0
310SYS "Wimp_CreateWindow",,q% TO control%
320SYS "Wimp_LoadTemplate",,q%,ind4%,ind4%+&300,-1,"tuneinfo",0
330SYS "Wimp_CreateWindow",,q% TO tuneinfo%
340SYS "Wimp_LoadTemplate",,q%,ind5%,ind5%+&200,-1,"stereo",0
350SYS "Wimp_CreateWindow",,q% TO stereo%
360SYS "Wimp_LoadTemplate",,q%,ind6%,ind6%+&150,-1,"buffer",0
370SYS "Wimp_CreateWindow",,q% TO buffer%
380SYS "Wimp_LoadTemplate",,q%,ind7%,ind7%+&100,-1,"oddformat",0
390SYS "Wimp_CreateWindow",,q% TO odd%
400SYS "Wimp_LoadTemplate",,q%,ind8%,ind8%+&200,-1,"helptext",0
410SYS "Wimp_CreateWindow",,q% TO help%
420SYS "Wimp_LoadTemplate",,q%,ind9%,ind9%+&200,-1,"register",0
430SYS "Wimp_CreateWindow",,q% TO register%
440SYS "Wimp_LoadTemplate",,q%,ind10%,ind10%+&100,-1,"options",0
450SYS "Wimp_CreateWindow",,q% TO options%
460SYS "Wimp_LoadTemplate",,q%,ind11%,ind11%+&20,-1,"vumeter",0
470SYS "Wimp_CreateWindow",,q% TO vumeter%
480SYS "Wimp_LoadTemplate",,q%,ind12%,ind12%+&100,-1,"waveform",0
490SYS "Wimp_CreateWindow",,q% TO waveform%
500SYS "Wimp_LoadTemplate",,q%,ind13%,ind13%+&20,-1,"wavepane",0
510SYS "Wimp_CreateWindow",,q% TO wavepane%
520SYS "Wimp_LoadTemplate",,q%,ind14%,ind14%+&20,-1,"cro",0
530SYS "Wimp_CreateWindow",,q% TO cro%
540SYS "Wimp_CloseTemplate"
550PROCsamps_wind
560PROCget_register
570PROCload_opts
580IF scr% SYS "Sound_Configure",,,VALclock$
590PROCbuffer(VALbuffer$)
600PROCmenu
610PROCassemble:!vu_block%=pointer%
620SYS "Sound_Speaker",0 TO oldspeak%:SYS "Sound_Enable",0 TO oldmute%
630volunit=0.442708333:REM 1 discrete volume unit
640cvol%=255:REM Volume at 100%
650SYS "XOS_Module",18,"TrackerModule" TO ,,,start%;flags%
660IF (flags% AND 1)=1 THEN
670 PROCtellemoff("Cannot initialise TrackerModule address offsets! I must exit immediately (check that TrackerModule is loaded).")
680 PROCtidy
690 SYS "Wimp_CloseDown":SYS "Interface_CloseDown",taskh%
700 SYS "Tracker_Unlock",lock%
710 END
720ENDIF
730sccb%=start%+&1850:REM Start of SCCB in TrackerModule
740h%=OPENUP("<PlayTrack$Dir>.Font"):len%=EXT#h%:CLOSE#h%:fontlen%=len%-1
750DIM font% len%:SYS "OS_File",&FF,"<PlayTrack$Dir>.Font",font%
760icon%=FNiconbar("!PlayTrack","",-1):REM icon on iconbar
770 REM -1 = Utility (RHS)
780 REM -2 = Service (LHS)
790
800quit%=FALSE:REM Nothing happened yet!
810SYS "Tracker_Stereo",4,,,,lock%:FOR I=1 TO 8:PROCstereo(I,4):channel(I)=4:NEXT
820IF registered%=FALSE AND pirate%=FALSE THEN
830 PROCsetup_mess1:PROChold_it(help%)
840 SYS "Wimp_CreateMenu",,register%,640,900
850ENDIF
860
870ONERROR IFFNerror("Error: "+REPORT$+" (code "+STR$ERL+") Quit ? (Buffer="+STR$~workspc%+")",3)=1:SYS "Interface_CloseDown",,taskh%:SYS "Tracker_Stop",,,,,lock%:SYS "Sound_Speaker",oldspeak%:SYS "Sound_Enable",oldmute%:SYS "Tracker_Unlock",lock%:PROCtidy:SYS "Wimp_CloseDown":END
880REM Error handler drops through to wimp_poll loop, AFTER wimp_initialise
890REPEAT
900PROCvolfill
910SYS "Wimp_Poll",,q% TO reason%:REM and poll the wimp.
920SYS "Interface_PreProcessKey",reason%,q%,taskh%
930SYS "Interface_Poll",reason%,,taskh%:REM Ensure pointer up to date
940CASE reason% OF
950WHEN 0 : IF newicn% THEN
960 TIME=0:REPEAT UNTIL TIME>=20
970 CASE type OF
980 WHEN TRUE : PROCputiconsprite(win%,icn%,"selon")
990 WHEN FALSE: PROCputiconsprite(win%,icn%,"seloff")
1000 ENDCASE
1010 newicn%=FALSE
1020 ENDIF
1030 MOUSE x%,y%,b%:IF nscn% AND b%=0 THEN
1040 TIME=0:REPEAT UNTIL TIME>=15
1050 CASE sicn% OF
1060 WHEN 0 : PROCputiconsprite(control%,0,"rev")
1070 WHEN 4 : PROCputiconsprite(control%,4,"fwd")
1080 ENDCASE
1090 nscn%=FALSE
1100 ENDIF
1110 pointer%!0=vumeter%:SYS "Wimp_GetWindowState",,pointer%
1120 IF (pointer%!32 AND 1<<16)<>0 THEN
1130 SYS "Wimp_ForceRedraw",vumeter%,0,-280,310,0
1140 ENDIF
1150 IF cropen% THEN
1160 SYS "Wimp_ForceRedraw",cro%,0,-200,150,0
1170 ENDIF
1180WHEN 1 : PROCredraw
1190WHEN 2 : SYS "Wimp_OpenWindow",,q%
1200 IF !q%=waveform% THEN
1210 !q%=wavepane%:q%!4+=20:q%!8+=20:q%!12-=20:q%!16-=80
1220 !pointer%=wavepane%:SYS "Wimp_GetWindowState",,pointer%
1230 q%!20=pointer%!20:q%!24=pointer%!24
1240 SYS "Wimp_OpenWindow",,q%
1250 ENDIF
1260WHEN 3 : SYS "Wimp_CloseWindow",,q%
1270 IF !q%=control% THEN
1280 copen%=FALSE
1290 PROCtickmenu(open%,0)
1300 PROCshut(control%)
1310 ENDIF
1320 IF !q%=tuneinfo% THEN
1330 topen%=FALSE
1340 PROCtickmenu(open%,1)
1350 PROCshut(tuneinfo%)
1360 ENDIF
1370 IF !q%=stereo% THEN
1380 sopen%=FALSE
1390 PROCtickmenu(open%,2)
1400 PROCshut(stereo%)
1410 ENDIF
1420 IF !q%=samples% THEN
1430 vopen%=FALSE
1440 PROCtickmenu(open%,3)
1450 PROCshut(samples%)
1460 ENDIF
1470 IF !q%=buffer% THEN
1480 bopen%=FALSE
1490 PROCtickmenu(open%,4)
1500 PROCshut(buffer%)
1510 ENDIF
1520 IF !q%=options% THEN
1530 oopen%=FALSE
1540 PROCtickmenu(open%,5)
1550 PROCshut(options%)
1560 ENDIF
1570 IF !q%=vumeter% THEN
1580 vuopen%=FALSE
1590 PROCtickmenu(open%,6)
1600 PROCshut(vumeter%)
1610 ENDIF
1620 IF !q%=waveform% THEN
1630 wopen%=FALSE
1640 PROCtickmenu(open%,7)
1650 PROCshut(waveform%)
1660 PROCshut(wavepane%)
1670 ENDIF
1680 IF !q%=cro% THEN
1690 cropen%=FALSE
1700 PROCtickmenu(open%,8)
1710 PROCshut(cro%)
1720 ENDIF
1730WHEN 4 : SYS "Wimp_SetCaretPosition",-1
1740WHEN 5 : SYS "Wimp_SetCaretPosition",q%!0,-1
1750WHEN 6 : PROCcheckmouse
1760WHEN 7 : f$=FNlastbit(f$):PROCdragend
1770WHEN 8 : PROCkp
1780WHEN 9 : PROCprocess_menu
1790WHEN 17,18 : PROCmessage
1800ENDCASE
1810IF playing% THEN
1820 SYS "Tracker_ReadPos",,,,,lock% TO c
1830 c1=VAL(FNgeticondata(control%,9))
1840 IF c<>c1 PROCputicondata(control%,9,STR$c)
1850 SYS "Tracker_TuneInfo",,,,,lock% TO ,,s
1860 s1=VAL(FNgeticondata(tuneinfo%,7))
1870 IF s<>s1 PROCputicondata(tuneinfo%,7,STR$s)
1880 PROCvolfill
1890ENDIF
1900UNTIL quit%
1910SYS "Interface_CloseDown",,taskh%
1920SYS "Sound_Speaker",oldspeak%:SYS "Sound_Enable",oldmute%
1930SYS "Tracker_Stop",,,,,lock%:VDU7
1940SYS "Tracker_Unlock",lock%
1950PROCtidy
1960SYS "Wimp_CloseDown":END:REM leave gracefully
1970
1980DEF FNiconbar(v$,t$,handle%)
1990LOCAL i%
2000IF handle%=-2 THEN :REM Service or Utility?
2010$iconvalid%="S"+v$:$icontext%=t$
2020ENDIF
2030q%!0=handle%
2040q%!4=0
2050IF handle%=-1 q%!8=0 ELSE q%!8=-16 :REM Set up proper co-ords
2060IF handle%=-1 q%!12=68 ELSE q%!12=78
2070IF handle%=-1 q%!16=96 ELSE q%!16=90
2080IF handle%=-1 THEN :REM And proper icon flags
2090q%!20=&2002
2100ELSE
2110q%!20=%00010111000000000011000100101011
2120ENDIF
2130IF handle%=-1 THEN :REM Indirected?
2140$(q%+24)=v$
2150ELSE
2160q%!24=icontext%
2170q%!28=iconvalid%
2180q%!32=LEN($icontext%)+1
2190ENDIF
2200SYS "Wimp_CreateIcon",,q% TO i% :REM And draw the icon
2210=i%
2220
2230DEF PROCmessage
2240yr%=q%!8
2250CASE (q%!16) OF
2260WHEN 0 : quit%=TRUE:REM Message_Quit ?
2270WHEN 2 : PROCds:REM Message_DataSave ?
2280WHEN 3 : PROCdl:REM Message_DataLoad ?
2290WHEN 5 : PROCdo:REM Message_DataOpen ?
2300WHEN 8 : PROCpq:REM Message_PreQuit ?
2310WHEN &502 : PROCsendhelp:REM Message_Help ?
2320ENDCASE
2330ENDPROC
2340
2350DEF PROCcheckmouse
2360handle=(q%!12)
2370icon=(q%!16)
2380CASE (q%!12) OF
2390WHEN -2:REM iconbar ?
2400CASE (q%!8) OF
2410WHEN 4 : IF registered%=FALSE AND pirate%=FALSE SYS "Wimp_CreateMenu",,register%,640,900
2420WHEN 2 : SYS "Wimp_CreateMenu",,menu%,!q%-64,319
2430WHEN 1 : REM Adjust ?
2440ENDCASE
2450WHEN saveas%
2460CASE q%!8 OF
2470WHEN 4 : CASE q%!16 OF
2480WHEN 1 : PROCslabicon:f$=FNgeticondata(saveas%,0):PROCquicksave
2490WHEN 3 : f$=FNgeticondata(saveas%,0):PROCdragbox(saveas%,2)
2500WHEN 4 : com%=NOTcom%:PROCtoggleopts(com%,saveas%,4)
2510WHEN 6 : ap%=NOTap%:PROCtoggleopts(ap%,saveas%,6)
2520ENDCASE
2530ENDCASE
2540WHEN control%
2550CASE q%!8 OF
2560WHEN 4 : CASE q%!16 OF
2570WHEN 0 : PROCputiconsprite(control%,0,"rev1"):sicn%=0:nscn%=TRUE
2580 IF playing%SYS "Tracker_ReadPos",,,,,lock% TO c,,m:c-=1:IF c=-1 c=m
2590 IF playing% SYS "Tracker_SetPos",c,,,,lock%
2600WHEN 1 : SYS "Tracker_Pause",,,,,lock%
2610 PROCputiconsprite(control%,1,"pause1")
2620 PROCputiconsprite(control%,2,"stop")
2630 PROCputiconsprite(control%,3,"play")
2640WHEN 2 : IF dos% THEN
2650 SYS "Tracker_Stop",,,,,lock%
2660 PROCputiconsprite(control%,1,"pause")
2670 PROCputiconsprite(control%,2,"stop1")
2680 PROCputiconsprite(control%,3,"play")
2690 PROCputicondata(control%,9,"0")
2700 PROCputicondata(control%,10,"0")
2710 PROCclear:playing%=FALSE
2720 ELSE
2730 SYS "Tracker_Pause",,,,,lock%
2740 SYS "Tracker_SetPos",0,,,,lock%
2750 PROCputiconsprite(control%,1,"pause")
2760 PROCputiconsprite(control%,2,"stop1")
2770 PROCputiconsprite(control%,3,"play")
2780 PROCputicondata(control%,9,"0")
2790 ENDIF
2800WHEN 3 : SYS "Tracker_Play",,,,,lock%
2810 PROCputiconsprite(control%,1,"pause")
2820 PROCputiconsprite(control%,2,"stop")
2830 PROCputiconsprite(control%,3,"play1")
2840WHEN 4 : PROCputiconsprite(control%,4,"fwd1"):sicn%=4:nscn%=TRUE
2850 IF playing%SYS "Tracker_ReadPos",,,,,lock% TO c,,m:c+=1:IF c>m c=0
2860 IF playing% SYS "Tracker_SetPos",c,,,,lock%
2870WHEN 12: speaker=NOT speaker
2880 PROCtoggleopts(speaker,control%,12)
2890 IF speaker SYS "Sound_Speaker",2 ELSE SYS "Sound_Speaker",1
2900WHEN 15: mute%=NOT mute%
2910 PROCtoggleopts(mute%,control%,15)
2920 IF mute% SYS "Sound_Enable",1 ELSE SYS "Sound_Enable",2
2930WHEN 19: PROCvolume
2940ENDCASE
2950WHEN 1 : CASE q%!16 OF
2960WHEN 0 : PROCputiconsprite(control%,0,"fwd1"):sicn%=0:nscn%=TRUE
2970 IF playing% SYS "Tracker_ReadPos",,,,,lock% TO c,,m:c+=1:IF c>m c=0
2980 IF playing% SYS "Tracker_SetPos",c,,,,lock%
2990WHEN 4 : PROCputiconsprite(control%,4,"rev1"):sicn%=4:nscn%=TRUE
3000 IF playing% SYS "Tracker_ReadPos",,,,,lock% TO c,,m:c-=1:IF c=-1 c=m
3010 IF playing% SYS "Tracker_SetPos",c,,,,lock%
3020ENDCASE
3030ENDCASE
3040WHEN stereo%
3050CASE q%!8 OF
3060WHEN 4 : CASE q%!16 OF
3070WHEN 0 : channel(1)-=1:IF channel(1)<1 channel(1)=1
3080 PROCstereo(1,channel(1))
3090 PROCputiconsprite(stereo%,1,"stereo"+STR$channel(1)):PROCslabicon
3100WHEN 2 : channel(1)+=1:IF channel(1)>7 channel(1)=7
3110 PROCstereo(1,channel(1))
3120 PROCputiconsprite(stereo%,1,"stereo"+STR$channel(1)):PROCslabicon
3130WHEN 3 : channel(2)-=1:IF channel(2)<1 channel(2)=1
3140 PROCstereo(2,channel(2))
3150 PROCputiconsprite(stereo%,4,"stereo"+STR$channel(2)):PROCslabicon
3160WHEN 5 : channel(2)+=1:IF channel(2)>7 channel(2)=7
3170 PROCstereo(2,channel(2))
3180 PROCputiconsprite(stereo%,4,"stereo"+STR$channel(2)):PROCslabicon
3190WHEN 6 : channel(3)-=1:IF channel(3)<1 channel(3)=1
3200 PROCstereo(3,channel(3))
3210 PROCputiconsprite(stereo%,7,"stereo"+STR$channel(3)):PROCslabicon
3220WHEN 8 : channel(3)+=1:IF channel(3)>7 channel(3)=7
3230 PROCstereo(3,channel(3))
3240 PROCputiconsprite(stereo%,7,"stereo"+STR$channel(3)):PROCslabicon
3250WHEN 9 : channel(4)-=1:IF channel(4)<1 channel(4)=1
3260 PROCstereo(4,channel(4))
3270 PROCputiconsprite(stereo%,10,"stereo"+STR$channel(4)):PROCslabicon
3280WHEN 11: channel(4)+=1:IF channel(4)>7 channel(4)=7
3290 PROCstereo(4,channel(4))
3300 PROCputiconsprite(stereo%,10,"stereo"+STR$channel(4)):PROCslabicon
3310WHEN 20: channel(5)-=1:IF channel(5)<1 channel(5)=1
3320 PROCstereo(5,channel(5))
3330 PROCputiconsprite(stereo%,21,"stereo"+STR$channel(5)):PROCslabicon
3340WHEN 22: channel(5)+=1:IF channel(5)>7 channel(5)=7
3350 PROCstereo(5,channel(5))
3360 PROCputiconsprite(stereo%,21,"stereo"+STR$channel(5)):PROCslabicon
3370WHEN 23: channel(6)-=1:IF channel(6)<1 channel(6)=1
3380 PROCstereo(6,channel(6))
3390 PROCputiconsprite(stereo%,24,"stereo"+STR$channel(6)):PROCslabicon
3400WHEN 25: channel(6)+=1:IF channel(6)>7 channel(6)=7
3410 PROCstereo(6,channel(6))
3420 PROCputiconsprite(stereo%,24,"stereo"+STR$channel(6)):PROCslabicon
3430WHEN 26: channel(7)-=1:IF channel(7)<1 channel(7)=1
3440 PROCstereo(7,channel(7))
3450 PROCputiconsprite(stereo%,27,"stereo"+STR$channel(7)):PROCslabicon
3460WHEN 28: channel(7)+=1:IF channel(7)>7 channel(7)=7
3470 PROCstereo(7,channel(7))
3480 PROCputiconsprite(stereo%,27,"stereo"+STR$channel(7)):PROCslabicon
3490WHEN 29: channel(8)-=1:IF channel(8)<1 channel(8)=1
3500 PROCstereo(8,channel(8))
3510 PROCputiconsprite(stereo%,30,"stereo"+STR$channel(8)):PROCslabicon
3520WHEN 31: channel(8)+=1:IF channel(8)>7 channel(8)=7
3530 PROCstereo(8,channel(8))
3540 PROCputiconsprite(stereo%,30,"stereo"+STR$channel(8)):PROCslabicon
3550ENDCASE
3560ENDCASE
3570WHEN buffer%
3580CASE q%!8 OF
3590WHEN 4 : CASE q%!16 OF
3600WHEN 5 : PROCslabicon:PROCbuffer(VAL(FNgeticondata(buffer%,3)))
3610ENDCASE
3620ENDCASE
3630WHEN register%
3640CASE q%!8 OF
3650WHEN 4 : CASE q%!16 OF
3660WHEN 9 : PROCslabicon:PROCregister_copy
3670ENDCASE
3680ENDCASE
3690WHEN options%
3700CASE q%!8 OF
3710WHEN 4 : CASE q%!16 OF
3720WHEN 2 : lap%=NOTlap%:PROCtoggleopts(lap%,options%,2)
3730WHEN 4 : scr%=NOTscr%:PROCtoggleopts(scr%,options%,4)
3740WHEN 6 : dos%=NOTdos%:PROCtoggleopts(dos%,options%,6)
3750WHEN 8 : afs%=NOTafs%:PROCtoggleopts(afs%,options%,8)
3760WHEN 11: mak%=NOTmak%:PROCtoggleopts(mak%,options%,11)
3770WHEN 10: PROCslabicon:PROCsave_opts
3780ENDCASE
3790ENDCASE
3800WHEN waveform%
3810CASE q%!8 OF
3820WHEN 4 : CASE q%!16 OF
3830WHEN 2 : PROCslabicon:PROCplaynote
3840ENDCASE
3850ENDCASE
3860WHEN cro%:
3870CASE q%!8 OF
3880WHEN 4 : track%+=1:IF track%=9 track%=1
3890 pointer%!0=cro%:SYS "Wimp_GetWindowInfo",,pointer%
3900 $(pointer%!76)=STR$track%
3910 SYS "Wimp_GetWindowState",,pointer%
3920 SYS "Wimp_CloseWindow",,pointer%
3930 SYS "Wimp_OpenWindow",,pointer%
3940WHEN 1 : track%-=1:IF track%=0 track%=8
3950 pointer%!0=cro%:SYS "Wimp_GetWindowInfo",,pointer%
3960 $(pointer%!76)=STR$track%
3970 SYS "Wimp_GetWindowState",,pointer%
3980 SYS "Wimp_CloseWindow",,pointer%
3990 SYS "Wimp_OpenWindow",,pointer%
4000ENDCASE
4010ENDCASE
4020ENDPROC
4030
4040DEF PROCmenu
4050REM Setup menus and menu block
4060P%=menu%
4070flags=&7000021
4080PROCmenu_header("PlayTrack",9)
4090PROCmenu_item(&00,infowind%,flags,"Info")
4100IF registered% PROCmenu_item(&00,open%,flags,"Open") ELSE PROCmenu_item(&00,open%,&2000021,"Open")
4110IF registered% PROCmenu_item(&00,saveas%,flags,"Save F3") ELSE PROCmenu_item(&00,saveas%,&2000021,"Save F3")
4120PROCmenu_item(&00,-1,flags,"Stop F6")
4130PROCmenu_item(&80,-1,flags,"Quit")
4140P%=open%
4150PROCmenu_header("Open",14)
4160PROCmenu_item(&00,-1,flags,"Control �F1")
4170PROCmenu_item(&00,-1,flags,"Info �F2")
4180PROCmenu_item(&00,-1,flags,"Stereo �F3")
4190PROCmenu_item(&00,-1,flags,"Samples �F4")
4200PROCmenu_item(&00,-1,flags,"Buffer �F5")
4210PROCmenu_item(&00,-1,flags,"Options �F6")
4220PROCmenu_item(&00,-1,flags,"Vu-Meter �F7")
4230PROCmenu_item(&00,-1,flags,"Waveform �F8")
4240PROCmenu_item(&00,-1,flags,"CRO �F9")
4250PROCmenu_item(&80,-1,flags,"Monitor �F10")
4260IF registered%=FALSE THEN
4270 FOR I%=0 TO 9:PROCgreymenu(open%,I%):NEXT
4280 PROCdisable(saveas%,1):PROCdisable(saveas%,3)
4290ENDIF
4300ENDPROC
4310
4320DEF PROCmenu_header(T$,w)
4330$P%=T$
4340P%!12=&70207
4350P%!16=w*16
4360P%!20=40
4370P%!24=0
4380P%+=28
4390ENDPROC
4400
4410DEF PROCmenu_item(A%,B%,C%,T$)
4420P%!0=A%
4430P%!4=B%
4440P%!8=C%
4450IF LEN(T$)<13 THEN
4460 $(P%+12)=T$
4470ELSE
4480 $(indtext%+indptr%)=T$
4490 P%!12=indtext%+indptr%
4500 P%!16=-1
4510 P%!20=LEN(T$)+1
4520 P%!8=P%!8 OR 1<<8
4530 indptr%+=LEN(T$)+1
4540ENDIF
4550P%+=24
4560ENDPROC
4570
4580DEF FNerror(e$,b%):!q%=0:$(q%+4)=e$+CHR$0
4590SYS "Wimp_ReportError",q%,b%,"PlayTrack" TO ,b%
4600=b%
4610
4620DEF PROCdl
4630LOCAL f$,T%
4640f$=STRING$(250," "):f$="":T%=q%+44
4650WHILE ?T%<>0:f$+=CHR$?T%:T%+=1:ENDWHILE
4660CASE q%!40 OF
4670WHEN &CB6,&001,&CC5,&701 : IF q%!20=-2 PROCtracker_loadit(f$)
4680OTHERWISE : PROChold_it(odd%)
4690ENDCASE
4700q%!12=q%!8:q%!16=4:SYS "Wimp_SendMessage",17,q%
4710ENDPROC
4720
4730DEF PROCdo
4740LOCAL f$,T%
4750f$=STRING$(250," "):f$="":f$=FNrtoz(q%+44)
4760CASE q%!40 OF
4770WHEN &CB6,&001,&CC5,&701 : PROCtracker_loadit(f$)
4780OTHERWISE : ENDPROC
4790ENDCASE
4800q%!12=q%!8:q%!16=4:SYS "Wimp_SendMessage",17,q%
4810ENDPROC
4820
4830DEF PROCredraw
4840SYS "Wimp_RedrawWindow",,q% TO flag
4850x%=q%!4-q%!20:y%=q%!16-q%!24
4860WHILE flag<>0
4870IF !q%=vumeter% AND playing% THEN
4880 SYS "Tracker_SoundInfo",pointer%,,,,lock%
4890 !vu_x%=x%:!vu_y%=y%-280
4900 CALL code%
4910ENDIF
4920IF !q%=wavepane% AND show% AND FNgeticondata(waveform%,1)<>"" AND playing% THEN
4930 SYS "Hourglass_On"
4940 samp%=VAL(FNgeticondata(waveform%,1)):IF samp%=0 SYS "Hourglass_Smash":ENDPROC
4950 SYS "Tracker_ReadSampleTable",samp%,,,,lock% TO ,,len1%,len%,rpt%,rptlen%,addr%
4960 SYS "Wimp_SetColour",7
4970 IF len1%>0 AND addr%>0 THEN
4980 scale%=len%/len1%:rpt%=rpt%/scale%:rptlen%=rptlen%/scale%
4990 sx=0:sy%=0:dist=2112/len1%:mid%=0
5000 MOVE x%,y%-256
5010 FOR I%=0 TO len1%
5020 sx+=dist:sy%=addr%?I%:mid%+=sy%
5030 DRAW x%+sx,(y%-256)+sy%
5040 NEXT I%
5050 mid%=mid%/len1%
5060 SYS "Wimp_SetColour",11
5070 MOVE x%,(y%-256)+mid%:DRAW x%+2112,(y%-256)+mid%
5080 SYS "Wimp_SetColour",10
5090 MOVE x%+rpt%*dist,(y%-256):DRAW x%+rpt%*dist,y%
5100 SYS "Wimp_SetColour",13
5110 MOVE x%+(rpt%+rptlen%)*dist,(y%-256):DRAW x%+(rpt%+rptlen%)*dist,y%
5120 ENDIF
5130 SYS "Hourglass_Off"
5140ENDIF
5150IF !q%=cro% THEN
5160 SYS "Wimp_SetColour",14
5170 FOR I%=0 TO 150 STEP 50:MOVE x%+I%,(y%-200):DRAW x%+I%,y%:NEXT I%
5180 FOR I%=0 TO 200 STEP 50:MOVE x%,(y%-I%):DRAW x%+150,(y%-I%):NEXT I%
5190 IF playing% THEN
5200 SYS "Wimp_SetColour",0
5210 SYS "Tracker_SoundInfo",pointer%,,,,lock%:boff%=(pointer%!((track%-1)*32)>>>16)
5220 samp%=(pointer%!(((track%-1)*32)+16))
5230 IF samp%>0 THEN
5240 SYS "Tracker_ReadSampleTable",samp%,,,,lock% TO ,,,len%,,,addr%:IF boff%>len%-15 boff%=len%-15
5250 IF boff%<len%+15 bof%=len%+15
5260 MOVE x%,(y%-200)+addr%?(boff%-1):sx%=0:sy=0:FOR I%=boff%-15 TO boff%+15:sy=(addr%?I%)/1.28:DRAW x%+sx%,(y%-200)+sy:sx%+=(150/30):NEXT
5270 ELSE
5280 MOVE x%,(y%-100):DRAW x%+150,(y%-100)
5290 ENDIF
5300 ENDIF
5310ENDIF
5320IF !q%<>vumeter% SYS "Interface_Render3dWindow",,q%
5330SYS "Wimp_GetRectangle",,q% TO flag
5340ENDWHILE
5350ENDPROC
5360
5370DEF PROCassemble:REM redraw code in assembler for speed:
5380FOR pass%=8 TO 11 STEP 2
5390P%=code%:L%=code%+700
5400[OPT pass%
5410LDR R0,vu_block%
5420LDR R1,[R0,#24]:STR R1,chan1%
5430LDR R1,[R0,#32+24]:STR R1,chan2%
5440LDR R1,[R0,#64+24]:STR R1,chan3%
5450LDR R1,[R0,#96+24]:STR R1,chan4%
5460LDR R1,[R0,#128+24]:STR R1,chan5%
5470LDR R1,[R0,#160+24]:STR R1,chan6%
5480LDR R1,[R0,#192+24]:STR R1,chan7%
5490LDR R1,[R0,#224+24]:STR R1,chan8%
5500MOV R0,#11
5510SWI "Wimp_SetColour"
5520LDR R2,vu_y%
5530LDR R1,vu_x%:MOV R0,#4
5540SWI "OS_Plot"
5550MOV R1,#30:LDR R3,chan1%:MOV R2,R3,LSL #3:SUB R2,R2,R3
5560MOV R0,#97:SWI "OS_Plot"
5570LDR R2,vu_y%
5580LDR R1,vu_x%:ADD R1,R1,#40:MOV R0,#4
5590SWI "OS_Plot"
5600MOV R1,#30:LDR R3,chan2%:MOV R2,R3,LSL #3:SUB R2,R2,R3
5610MOV R0,#97:SWI "OS_Plot"
5620LDR R2,vu_y%
5630LDR R1,vu_x%:ADD R1,R1,#80:MOV R0,#4
5640SWI "OS_Plot"
5650MOV R1,#30:LDR R3,chan3%:MOV R2,R3,LSL #3:SUB R2,R2,R3
5660MOV R0,#97:SWI "OS_Plot"
5670LDR R2,vu_y%
5680LDR R1,vu_x%:ADD R1,R1,#120:MOV R0,#4
5690SWI "OS_Plot"
5700MOV R1,#30:LDR R3,chan4%:MOV R2,R3,LSL #3:SUB R2,R2,R3
5710MOV R0,#97:SWI "OS_Plot"
5720LDR R2,vu_y%
5730LDR R1,vu_x%:ADD R1,R1,#160:MOV R0,#4
5740SWI "OS_Plot"
5750MOV R1,#30:LDR R3,chan5%:MOV R2,R3,LSL #3:SUB R2,R2,R3
5760MOV R0,#97:SWI "OS_Plot"
5770LDR R2,vu_y%
5780LDR R1,vu_x%:ADD R1,R1,#200:MOV R0,#4
5790SWI "OS_Plot"
5800MOV R1,#30:LDR R3,chan6%:MOV R2,R3,LSL #3:SUB R2,R2,R3
5810MOV R0,#97:SWI "OS_Plot"
5820LDR R2,vu_y%
5830LDR R1,vu_x%:ADD R1,R1,#240:MOV R0,#4
5840SWI "OS_Plot"
5850MOV R1,#30:LDR R3,chan7%:MOV R2,R3,LSL #3:SUB R2,R2,R3
5860MOV R0,#97:SWI "OS_Plot"
5870LDR R2,vu_y%
5880LDR R1,vu_x%:ADD R1,R1,#280:MOV R0,#4
5890SWI "OS_Plot"
5900MOV R1,#30:LDR R3,chan8%:MOV R2,R3,LSL #3:SUB R2,R2,R3
5910MOV R0,#97:SWI "OS_Plot"
5920MOV PC,R14
5930.vu_block% EQUD 0:.chan1% EQUD 0:.chan2% EQUD 0:.chan3% EQUD 0
5940.chan4% EQUD 0:.chan5% EQUD 0:.chan6% EQUD 0:.chan7% EQUD 0
5950.chan8% EQUD 0:.vu_x% EQUD 0:.vu_y% EQUD 0
5960]
5970NEXT pass%
5980ENDPROC
5990
6000DEF PROCprocess_menu
6010SYS "Wimp_GetPointerInfo",,pointer%:j%=(pointer%!8=1)
6020CASE handle OF
6030WHEN -2
6040CASE q%!0 OF
6050WHEN 1 : CASE q%!4 OF
6060 WHEN 0 : copen%=NOTcopen%:PROCtickmenu(open%,0)
6070 IF copen% PROCopenup(control%,0,1024,625,325)
6080 IF NOT copen% PROCshut(control%)
6090 WHEN 1 : topen%=NOTtopen%:PROCtickmenu(open%,1)
6100 IF topen% PROCopenup(tuneinfo%,580,530,700,430)
6110 IF NOT topen% PROCshut(tuneinfo%)
6120 WHEN 2 : sopen%=NOTsopen%:PROCtickmenu(open%,2)
6130 IF sopen% PROCwindow_centre(stereo%,1110,250)
6140 IF NOT sopen% PROCshut(stereo%)
6150 WHEN 3 : vopen%=NOTvopen%:PROCtickmenu(open%,3)
6160 IF vopen% PROCopenback(samples%,0,1000,700,850)
6170 IF NOT vopen% PROCshut(samples%)
6180 WHEN 4 : bopen%=NOTbopen%:PROCtickmenu(open%,4)
6190 IF bopen% PROCwindow_centre(buffer%,700,475)
6200 IF NOT bopen% PROCshut(buffer%)
6210 WHEN 5 : oopen%=NOToopen%:PROCtickmenu(open%,5)
6220 IF oopen% PROCwindow_centre(options%,768,367)
6230 IF NOT oopen% PROCshut(options%)
6240 WHEN 6 : vuopen%=NOTvuopen%:PROCtickmenu(open%,6)
6250 IF vuopen% PROCopenup(vumeter%,970,900,310,280)
6260 IF NOT vuopen% PROCshut(vumeter%)
6270 WHEN 7 : wopen%=NOTwopen%:PROCtickmenu(open%,7)
6280 IF wopen% PROCopenlinked(waveform%,wavepane%,1280,390,2112,256)
6290 IF NOT wopen% PROCshut(waveform%):PROCshut(wavepane%)
6300 WHEN 8 : cropen%=NOT cropen%:PROCtickmenu(open%,8)
6310 IF cropen% PROCopenup(cro%,700,500,150,200)
6320 IF NOT cropen% PROCshut(cro%)
6330 WHEN 9 : PROCmonitor
6340 ENDCASE
6350WHEN 3 : IF dos% THEN
6360 SYS "Tracker_Stop",,,,,lock%
6370 PROCputiconsprite(control%,1,"pause")
6380 PROCputiconsprite(control%,2,"stop1")
6390 PROCputiconsprite(control%,3,"play")
6400 PROCputicondata(control%,9,"0")
6410 PROCputicondata(control%,10,"0")
6420 PROCclear:playing%=FALSE
6430 ELSE
6440 SYS "Tracker_Pause",,,,,lock%
6450 SYS "Tracker_SetPos",0,,,,lock%
6460 PROCputiconsprite(control%,1,"pause")
6470 PROCputiconsprite(control%,2,"stop1")
6480 PROCputiconsprite(control%,3,"play")
6490 PROCputicondata(control%,9,"0")
6500 ENDIF
6510WHEN 4 : IF edited%=TRUE THEN
6520 IF FNok("File(s) edited but not saved. Really quit ?") THEN
6530 quit%=TRUE
6540 ELSE
6550 quit%=FALSE
6560 ENDIF
6570 ELSE
6580 IF edited%=FALSE THEN
6590 quit%=TRUE
6600 ENDIF
6610 ENDIF
6620ENDCASE
6630IF j% SYS "Wimp_CreateMenu",,menu%,pointer%!0,pointer%!4
6640ENDCASE
6650ENDPROC
6660
6670DEF PROCopenup(handle,x,y,w,h)
6680pointer%!0=handle
6690pointer%!4=x:pointer%!8=y-h
6700pointer%!12=x+w:pointer%!16=y
6710pointer%!20=0:pointer%!24=0
6720pointer%!28=-1
6730SYS "Wimp_OpenWindow",,pointer%
6740ENDPROC
6750
6760DEF PROCopenback(handle,x,y,w,h)
6770pointer%!0=handle
6780pointer%!4=x:pointer%!8=y-h
6790pointer%!12=x+w:pointer%!16=y
6800pointer%!20=0:pointer%!24=0
6810pointer%!28=-2
6820SYS "Wimp_OpenWindow",,pointer%
6830ENDPROC
6840
6850DEF PROCslabicon
6860SYS "Interface_SlabButton",,q%:REM Slab in...
6870q%!8=0
6880SYS "Interface_SlabButton",,q%:REM ...and out
6890ENDPROC
6900
6910DEF PROCshut(h%)
6920pointer%!0=h%:SYS "Wimp_CloseWindow",,pointer%
6930ENDPROC
6940
6950DEF PROCsendhelp
6960q%!12=q%!8:q%!16=&503:help%=q%+20
6970help%=FNhelp(q%!32,q%!36,q%!20,q%!24,help%):IF help%=0 ENDPROC
6980?help%=0:REM No, so send application help
6990!q%=(help%+4-q%)ANDNOT3:REM Setup help block
7000SYS "Wimp_SendMessage",17,q%,q%!4:REM and send it
7010ENDPROC
7020
7030DEF FNhelp(window%,icon%,x%,y%,to%)
7040$to%=""
7050CASE window% OF
7060 WHEN -2 : REM iconbar ?
7070 CASE icon% OF
7080 WHEN icon% : REM my icon ?
7090 $to%="This is the PlayTrack icon.|MDrag Tracker tunes to it to play them."
7100 ENDCASE
7110 WHEN infowind% : REM info window ?
7120 CASE icon% OF
7130 WHEN -1,0,1,2,3,4,5,6,7,8 : REM not over 'Click here...' icon ?
7140 $to%="This is the Info window.|MIt provides information on PlayTrack."
7150 OTHERWISE : SYS "Interface_SendHelp",,q%:=0:REM Send Interface help
7160 ENDCASE
7170 WHEN saveas% : REM 'Save as:' window ?
7180 CASE icon% OF
7190 WHEN -1 : REM over work area ?
7200 $to%="This is the 'Save' window.|MIt is used to save a file."
7210 OTHERWISE : SYS "Interface_SendHelp",,q%:=0:REM Send Interface help
7220 ENDCASE
7230ENDCASE
7240=to%+LEN($to%)
7250
7260DEF FNgeticondata(window%,icon%)
7270pointer%!0=window%
7280pointer%!4=icon%
7290SYS "Wimp_GetIconState",,pointer%
7300=$(pointer%!28)
7310
7320DEF PROCputicondata(window%,icon%,t$)
7330pointer%!0=window%:pointer%!4=icon%
7340SYS "Wimp_GetIconState",,pointer%
7350$(pointer%!28)=t$
7360pointer%!12=0:pointer%!8=0
7370SYS "Wimp_SetIconState",,pointer%
7380ENDPROC
7390
7400DEF PROCputiconsprite(window%,icon%,t$)
7410pointer%!0=window%:pointer%!4=icon%
7420SYS "Wimp_GetIconState",,pointer%
7430SYS "Wimp_DeleteIcon",,pointer%
7440pointer%!4=window%:$(pointer%+28)=t$
7450pointer%+=4:SYS "Wimp_CreateIcon",,pointer%
7460SYS "Wimp_ForceRedraw",pointer%!0,pointer%!4,pointer%!8,pointer%!12,pointer%!16
7470pointer%-=4
7480ENDPROC
7490
7500DEF PROCtellemoff(e$)
7510er%=pointer%
7520!er%=0
7530$(er%+4)=e$+CHR$0
7540SYS "Wimp_ReportError",er%,1,"PlayTrack"
7550ENDPROC
7560
7570DEF FNrtoz(T%):LOCAL q$:WHILE ?T%<>0:q$+=CHR$?T%:T%+=1:ENDWHILE:=q$
7580
7590DEF PROCpq
7600IF edited% THEN
7610IF NOT FNok("File(s) edited but not saved. Really quit ?"):PROCno_quit
7620ENDIF
7630ENDPROC
7640
7650DEF FNok(e$)
7660er%=pointer%
7670!er%=0
7680$(er%+4)=e$+CHR$0
7690SYS "Wimp_ReportError",er%,&17,"Message from !PlayTrack" TO ,b%
7700=(b%=1)
7710
7720DEF PROCno_quit
7730q%!12=q%!8:q%!16=8:SYS "Wimp_SendMessage",17,q%,q%!4:ENDPROC
7740
7750DEF PROCdragend
7760d%=pointer%
7770SYS "Wimp_GetPointerInfo",,d%
7780d%!32=d%!4 :tt%=d%!32
7790d%!28=!d% :te%=d%!28
7800d%!24=d%!16 :tf%=d%!24
7810d%!20=d%!12 :tw%=d%!20
7820d%!16=1 :d%!12=0 :d%!36=0
7830d%!40=0 :!d%=64 :$(d%+44)=f$
7840SYS "Wimp_SendMessage",17,d%,d%!20,d%!24
7850mr%=d%!8
7860ENDPROC
7870
7880DEF FNlastbit(s$)
7890WHILE INSTR(s$,":")>0
7900s$=MID$(s$,INSTR(s$,":")+1)
7910ENDWHILE
7920WHILE INSTR(s$,".")>0
7930s$=MID$(s$,INSTR(s$,".")+1)
7940ENDWHILE
7950=s$
7960
7970DEF PROCds
7980PROCputicondata(saveas%,0,FNrtoz(q%+44))
7990f$=FNrtoz(q%+44)
8000PROCsd(&FFA)
8010ENDPROC
8020
8030DEF PROCdragbox(w%,i%)
8040d%=pointer%
8050!d%=w%
8060SYS "Wimp_GetWindowState",,d%
8070ys%=d%!16-d%!8:x%=d%!4:y%=d%!8
8080d%!4=i%
8090SYS "Wimp_GetIconState",,d%
8100f$=FNlastbit(f$)
8110d%!8+=x%
8120d%!12+=y%+ys%
8130d%!16+=x%
8140d%!20+=y%+ys%
8150d%!24=0
8160d%!28=0
8170SYS "OS_ReadModeVariable",MODE,4 TO ,,h%:h%=FNextracth(h%)
8180SYS "OS_ReadModeVariable",MODE,5 TO ,,v%:v%=FNextractv(v%)
8190d%!32=(h%*2)
8200d%!36=(v%*4)
8210!d%=0
8220d%!4=5
8230SYS "Wimp_DragBox",,d%
8240ENDPROC
8250
8260DEF PROCquicksave
8270IF INSTR(f$,":")<1 AND INSTR(f$,".")<1 THEN
8280PROCtellemoff("To save, drag icon to a directory viewer")
8290ELSE
8300PROCsd(&FFA)
8310ENDIF
8320ENDPROC
8330
8340DEF PROCsd(t%)
8350PROCsave_rm(f$)
8360d%=pointer%
8370!d%=64
8380d%!20=tw%
8390d%!24=tf%
8400d%!28=te%
8410d%!32=tt%
8420d%!12=yr%
8430d%!16=3
8440d%!36=0
8450d%!40=t%
8460$(d%+44)=f$
8470SYS "Wimp_SendMessage",17,d%,d%!20
8480SYS "OS_File",18,f$,t%
8490SYS "Wimp_CreateMenu",,-1
8500ENDPROC
8510
8520DEF FNextracth(a%)
8530CASE a% OF
8540 WHEN 0 : =1280
8550 WHEN 1 : =640
8560 WHEN 2 : =320
8570 WHEN 3 : =160
8580ENDCASE
8590
8600DEF FNextractv(a%)
8610CASE a% OF
8620 WHEN 1 : =512
8630 WHEN 2 : =256
8640ENDCASE
8650
8660DEF PROCtoggleopts(flag,w%,i%):win%=w%:icn%=i%
8670PROCputiconsprite(w%,i%,"selclick")
8680CASE flag OF
8690 WHEN TRUE : newicn%=TRUE:type=flag
8700 WHEN FALSE : newicn%=TRUE:type=flag
8710ENDCASE
8720ENDPROC
8730
8740DEF PROCtoggleradio(flag,w%,i%,i2%)
8750CASE flag OF
8760 WHEN TRUE : PROCputiconsprite(w%,i%,"radon")
8770 PROCputiconsprite(w%,i2%,"radoff")
8780 WHEN FALSE : PROCputiconsprite(w%,i%,"radoff")
8790 PROCputiconsprite(w%,i2%,"radon")
8800ENDCASE
8810ENDPROC
8820
8830DEF PROChackflags(w%,i%,eor%,or%)
8840pointer%!0=w%:pointer%!4=i%
8850pointer%!8=eor%:pointer%!12=or%
8860SYS "Wimp_SetIconState",,pointer%
8870ENDPROC
8880
8890DEF PROCenable(w%,i%)
8900PROChackflags(w%,i%,0,&400000)
8910ENDPROC
8920
8930DEF PROCdisable(w%,i%)
8940PROChackflags(w%,i%,&400000,&400000)
8950ENDPROC
8960
8970DEF PROCselect(w%,i%)
8980PROChackflags(w%,i%,&200000,&200000)
8990ENDPROC
9000
9010DEF PROCdeselect(w%,i%)
9020PROChackflags(w%,i%,0,&200000)
9030ENDPROC
9040
9050DEF PROCtoedit(file$)
9060!pointer%=(48+LENfile$)ANDNOT3
9070pointer%!12=0
9080pointer%!16=5
9090pointer%!36=-2
9100pointer%!40=&FFF
9110$(pointer%+44)=file$+CHR$0
9120SYS "Wimp_SendMessage",18,pointer%,0
9130ENDPROC
9140
9150DEF PROCtocursor(text$)
9160FOR key%=1 TO LEN(text$)
9170SYS "Wimp_ProcessKey",ASC(MID$(text$,key%,1))
9180SYS "Wimp_Poll",,q% TO reason%
9190SYS "Interface_PreProcessKey",reason%,q%,taskh%
9200SYS "Interface_Poll",reason%,,taskh%
9210CASE reason% OF
9220 WHEN 1 : PROCredraw
9230 WHEN 2 : SYS "Wimp_OpenWindow",,q%
9240 WHEN 3 : SYS "Wimp_CloseWindow",,q%
9250 WHEN 6 : PROCcheckmouse
9260 WHEN 7 : f$=FNlastbit(f$):PROCdragend
9270 WHEN 9 : PROCprocess_menu
9280 WHEN 17,18 : PROCmessage
9290ENDCASE
9300NEXT
9310ENDPROC
9320
9330DEF PROCtickmenu(b%,n%)
9340b%!(28+24*n%)=b%!(28+24*n%) EOR &01
9350ENDPROC
9360
9370DEF PROCgreymenu(b%,n%)
9380b%!((28+24*n%)+8)=b%!((28+24*n%)+8) EOR &400000
9390ENDPROC
9400
9410DEF PROCwindow_centre(handle%,w%,h%)
9420x%=((1280-w%)/2)
9430y%=(((1024-h%)/2)+h%)
9440PROCopenup(handle%,x%,y%,w%,h%)
9450ENDPROC
9460
9470DEF PROCforce_redraw
9480SYS "Wimp_ForceRedraw",fontselect%,0,0-400,700,0
9490ENDPROC
9500
9510DEF PROCtracker_loadit(f$):tune$=f$
9520SYS "Tracker_Stop",,,,,lock%:REM Release so next call won't corrupt
9530IF workspc%>0 SYS "OS_Heap",3,buff%,workspc%
9540h%=OPENUP(f$):len%=EXT#h%:CLOSE#h%
9550SYS "OS_Heap",2,buff%,,len% TO ,,workspc%;flags%
9560IF (flags% AND 1)=1 PROCtellemoff("Buffer size is inadequate: Please extend"):ENDPROC
9570SYS "OS_File",&FF,f$,workspc%
9580SYS "Tracker_MemoryLoad",workspc%,len%,,,lock%
9590SYS "Sound_Speaker",1:speaker=FALSE
9600IF lap% SYS "Tracker_Play",,,,,lock%
9610IF registered% PROCopenup(control%,0,1024,625,325)
9620PROCputiconsprite(control%,0,"rev")
9630PROCputiconsprite(control%,1,"pause")
9640IF lap% PROCputiconsprite(control%,2,"stop") ELSE PROCputiconsprite(control%,2,"stop1")
9650IF lap% PROCputiconsprite(control%,3,"play1") ELSE PROCputiconsprite(control%,3,"play")
9660PROCputiconsprite(control%,4,"fwd")
9670SYS "Tracker_ReadPos",,,,,lock% TO current,,max
9680PROCputicondata(control%,10,STR$max)
9690IF registered% PROCopenup(tuneinfo%,580,530,700,430)
9700PROCputicondata(tuneinfo%,1,f$)
9710h%=OPENUP(f$):len%=EXT#h%:CLOSE#h%
9720PROCputicondata(tuneinfo%,3,STR$len%+" bytes -- "+STR$(FNint((len%/1024)+0.4))+"K"):lenbytes%=len%
9730SYS "Tracker_TuneInfo",,,,,lock% TO len1%,voices%,speed%,name$,a%
9740IF a%>0 author$=FNrtoz(a%) ELSE author$=""
9750name$=FNstrip(name$)
9760PROCputicondata(tuneinfo%,5,STR$voices%)
9770PROCputicondata(tuneinfo%,7,STR$speed%)
9780PROCputicondata(tuneinfo%,9,STR$len1%)
9790PROCputicondata(tuneinfo%,11,name$)
9800PROCputicondata(tuneinfo%,13,author$)
9810PROCputicondata(tuneinfo%,15,FNfmat(f$))
9820PROCputicondata(control%,14,name$)
9830SYS "OS_File",5,f$ TO ,,load%:type%=(load%>>>8)AND&FFF:CASE type% OF
9840WHEN &001 : PROCputicondata(tuneinfo%,17,"STracker")
9850WHEN &CB6 : PROCputicondata(tuneinfo%,17,"STModule")
9860WHEN &CC5 : PROCputicondata(tuneinfo%,17,"TeqMusic")
9870WHEN &701 : PROCputicondata(tuneinfo%,17,"ProTrack")
9880ENDCASE
9890IF afs% SYS "OS_File",18,f$,&CB6
9900PROCsamples_draw
9910PROCredo_buff(lenbytes%)
9920IF copen%=FALSE copen%=TRUE:PROCtickmenu(open%,0)
9930IF topen%=FALSE topen%=TRUE:PROCtickmenu(open%,1)
9940playing%=TRUE
9950ENDPROC
9960
9970DEF PROCredo_buff(len%)
9980IF buffersize%>0 THEN
9990 PROCputicondata(buffer%,10,STR$len%+" bytes -- "+STR$(FNint(len%/1024))+"K")
10000 SYS "OS_Heap",1,buff% TO ,,,free%
10010 PROCputicondata(buffer%,11,STR$(free%)+" bytes -- "+STR$(FNint(free%/1024))+"K")
10020ELSE
10030 PROCputicondata(buffer%,10,"No buffer defined")
10040 PROCputicondata(buffer%,11,"No buffer defined")
10050ENDIF
10060ENDPROC
10070
10080DEF PROCclear
10090PROCputicondata(tuneinfo%,1,"No Tune Loaded")
10100PROCputicondata(tuneinfo%,3,"No Tune Loaded")
10110PROCputicondata(tuneinfo%,5,"0")
10120PROCputicondata(tuneinfo%,7,"0")
10130PROCputicondata(tuneinfo%,9,"0")
10140PROCputicondata(tuneinfo%,11,"No Tune Loaded")
10150PROCputicondata(tuneinfo%,13,"No Tune Loaded")
10160PROCputicondata(tuneinfo%,15,"0")
10170PROCputicondata(tuneinfo%,17,"No Tune Loaded")
10180PROCputicondata(control%,14,"")
10190ENDPROC
10200
10210DEF FNstrip(text$)
10220WHILE ASC(RIGHT$(text$,1))<33:text$=LEFT$(text$,(LENtext$)-1):ENDWHILE
10230WHILE ASC(LEFT$(text$,1))<33:text$=RIGHT$(text$,(LENtext$)-1):ENDWHILE
10240=text$
10250
10260DEF FNfmat(f$)
10270CASE mak% OF
10280WHEN TRUE : =FNmandk(f$)
10290WHEN FALSE: =FNxbyte(f$)
10300ENDCASE
10310
10320DEF FNxbyte(f$)
10330h%=OPENUP(f$)
10340PTR#h%=471
10350a=BGET#h%
10360CLOSE#h%
10370IF a=&78 ="15" ELSE ="31"
10380
10390DEF FNmandk(f$)
10400h%=OPENUP(f$)
10410PTR#h%=1080
10420q$="":FOR I%=1 TO 4:q$+=CHR$(BGET#h%):NEXT
10430CLOSE#h%
10440IF q$="M.K." OR q$="FLT4" OR q$="FLT8" ="31" ELSE ="15"
10450REM Check for Startrekker as well as ProTracker ID
10460
10470DEF PROCstereo(ch,pos)
10480SYS "Sound_Stereo",ch,FNpos(pos)
10490ENDPROC
10500
10510DEF FNpos(pos)
10520CASE pos OF
10530 WHEN 1 : =-127
10540 WHEN 2 : =-79
10550 WHEN 3 : =-47
10560 WHEN 4 : =0
10570 WHEN 5 : =47
10580 WHEN 6 : =79
10590 WHEN 7 : =127
10600ENDCASE
10610
10620DEF FNcreate(ww,wh,tf,tb,sc,T$,wf,wb,flags)
10630pointer%!24=-1:pointer%!28=flags
10640pointer%?32=tf:pointer%?33=tb
10650pointer%?34=wf:pointer%?35=wb
10660pointer%?36=3:pointer%?37=1
10670pointer%?38=sc:pointer%?39=0
10680pointer%!40=0:pointer%!44=wh
10690pointer%!48=ww:pointer%!52=0
10700pointer%!56=&3D:pointer%!60=0
10710pointer%!64=0:pointer%!68=0
10720$(pointer%+72)=T$
10730pointer%!84=0
10740SYS "Wimp_CreateWindow",,pointer% TO h%
10750=h%
10760
10770DEF PROCcreate_icon(handle,addr,minx,maxx,miny,ht,t$,flags,len)
10780pointer%!0=handle:pointer%!4=minx
10790pointer%!8=miny:pointer%!12=maxx
10800pointer%!16=miny+ht:pointer%!20=flags
10810IF addr=0 THEN
10820$(pointer%+24)=t$
10830ELSE
10840pointer%!24=addr
10850IF t$="�" pointer%!28=valid% ELSE pointer%!28=-1
10860pointer%!32=len
10870ENDIF
10880SYS "Wimp_CreateIcon",,pointer%
10890ENDPROC
10900
10910DEF PROCsamps_wind
10920start%=samps%
10930volstart%=volume%
10940sampstart%=samplen%
10950samples%=FNcreate(700,-1200,7,2,12,"Samples",7,1,%111)
10960miny=-60
10970PROCcreate_icon(samples%,text%,10,80,miny,52,"�",&17000121,0)
10980PROCcreate_icon(samples%,text%+8,90,200,miny,52,"�",&17000121,0)
10990PROCcreate_icon(samples%,text%+16,500,590,miny,52,"�",&17000121,0)
11000PROCcreate_icon(samples%,text%+24,600,690,miny,52,"�",&17000121,0)
11010miny-=60
11020count%=1
11030FOR I=1 TO 31
11040$samps%=""
11050$volume%=""
11060$samplen%=""
11070PROCcreate_icon(samples%,0,10,80,miny,36,STR$I,&7000021,0)
11080PROCcreate_icon(samples%,samps%,90,490,miny,36,"",&7016121,32)
11090PROCcreate_icon(samples%,volume%,500,590,miny,36,"",&7000121,32)
11100PROCcreate_icon(samples%,samplen%,600,690,miny,36,"",&7000121,32)
11110miny-=36:samps%+=32:volume%+=4:samplen%+=6:count%+=1
11120NEXT
11130samps%=start%
11140volume%=volstart%
11150samplen%=sampstart%
11160ENDPROC
11170:
11180DEF PROCsamples_draw
11190sampsnum=0
11200start%=samps%
11210volstart%=volume%
11220sampstart%=samplen%
11230FOR I=1 TO 31
11240SYS "Tracker_ReadSampleTable",I,,,,lock% TO no%,a$,vol%,len%
11250PROCputicontext(samples%,(2*I)+3,samps%,a$)
11260IF vol%<>0 PROCputicontext(samples%,(2*I)+4,volume%,STR$vol%) ELSE PROCputicontext(samples%,(2*I)+4,volume%,"")
11270IF len%<>0 PROCputicontext(samples%,(2*I)+5,samplen%,STR$len%) ELSE PROCputicontext(samples%,(2*I)+5,samplen%,""):sampsnum+=1
11280samps%+=32:volume%+=4:samplen%+=6
11290NEXT
11300samps%=start%
11310volume%=volstart%
11320samplen%=sampstart%
11330ENDPROC
11340
11350DEF PROCputicontext(window%,icon%,buffer%,text$)
11360$buffer%=text$
11370pointer%!0=window%:pointer%!4=icon%
11380pointer%!8=0:pointer%!12=0
11390SYS "Wimp_SetIconState",,pointer%
11400ENDPROC
11410
11420DEF PROCkp
11430SYS "Wimp_ProcessKey",q%!24
11440CASE q%!0 OF
11450 WHEN buffer%
11460 CASE q%!4 OF
11470 WHEN 3
11480 CASE q%!24 OF
11490 WHEN 13 : q%!8=4:q%!12=buffer%:q%!16=5:PROCslabicon
11500 PROCbuffer(VAL(FNgeticondata(buffer%,3)))
11510 ENDCASE
11520 ENDCASE
11530 WHEN waveform%
11540 CASE q%!4 OF
11550 WHEN 1
11560 CASE q%!24 OF
11570 WHEN 13 : show%=TRUE:SYS "Wimp_ForceRedraw",wavepane%,0,-256,2112,0
11580 ENDCASE
11590 ENDCASE
11600ENDCASE
11610CASE q%!24 OF
11620 WHEN 385 : speaker=NOTspeaker:PROCtoggleopts(speaker,control%,12)
11630 IF speaker SYS "Sound_Speaker",2 ELSE SYS "Sound_Speaker",1
11640 WHEN 386 : mute%=NOTmute%:PROCtoggleopts(mute%,control%,15)
11650 IF mute% SYS "Sound_Enable",1 ELSE SYS "Sound_Enable",2
11660 WHEN 387 : IF register% THEN
11670 SYS "Wimp_GetPointerInfo",,pointer%
11680 SYS "Wimp_CreateMenu",,saveas%,pointer%!0-64,pointer%!4+64
11690 ENDIF
11700 WHEN 388 : PROCputiconsprite(control%,0,"rev1"):sicn%=0:nscn%=TRUE
11710 SYS "Tracker_ReadPos",,,,,lock% TO c,,m:c-=1:IF c<0 c=m
11720 SYS "Tracker_SetPos",c,,,,lock%
11730 WHEN 389 : SYS "Tracker_Pause",,,,,lock%
11740 PROCputiconsprite(control%,1,"pause1")
11750 PROCputiconsprite(control%,2,"stop")
11760 PROCputiconsprite(control%,3,"play")
11770 WHEN 390 : IF dos% THEN
11780 SYS "Tracker_Stop",,,,,lock%
11790 PROCputiconsprite(control%,1,"pause")
11800 PROCputiconsprite(control%,2,"stop1")
11810 PROCputiconsprite(control%,3,"play")
11820 PROCputicondata(control%,9,"0")
11830 PROCputicondata(control%,10,"0")
11840 PROCclear:playing%=FALSE
11850 ELSE
11860 SYS "Tracker_Pause",,,,,lock%
11870 SYS "Tracker_SetPos",0,,,,lock%
11880 PROCputiconsprite(control%,1,"pause")
11890 PROCputiconsprite(control%,2,"stop1")
11900 PROCputiconsprite(control%,3,"play")
11910 ENDIF
11920 WHEN 391 : SYS "Tracker_Play",,,,,lock%
11930 PROCputiconsprite(control%,1,"pause")
11940 PROCputiconsprite(control%,2,"stop")
11950 PROCputiconsprite(control%,3,"play1")
11960 WHEN 392 : PROCputiconsprite(control%,4,"fwd1"):sicn%=4:nscn%=TRUE
11970 SYS "Tracker_ReadPos",,,,,lock% TO c,,m:c+=1:IF c>m c=0
11980 SYS "Tracker_SetPos",c,,,,lock%
11990 WHEN 401 : IF registered% THEN
12000 copen%=NOTcopen%:PROCtickmenu(open%,0)
12010 IF copen% PROCopenup(control%,0,1024,625,325)
12020 IF NOT copen% PROCshut(control%)
12030 ENDIF
12040 WHEN 402 : IF registered% THEN
12050 topen%=NOTtopen%:PROCtickmenu(open%,1)
12060 IF topen% PROCopenup(tuneinfo%,580,530,700,430)
12070 IF NOT topen% PROCshut(tuneinfo%)
12080 ENDIF
12090 WHEN 403 : IF registered% THEN
12100 sopen%=NOTsopen%:PROCtickmenu(open%,2)
12110 IF sopen% PROCwindow_centre(stereo%,1110,250)
12120 IF NOT sopen% PROCshut(stereo%)
12130 ENDIF
12140 WHEN 404 : IF registered% THEN
12150 vopen%=NOTvopen%:PROCtickmenu(open%,3)
12160 IF vopen% PROCopenback(samples%,0,1000,700,850)
12170 IF NOT vopen% PROCshut(samples%)
12180 ENDIF
12190 WHEN 405 : IF registered% THEN
12200 bopen%=NOTbopen%:PROCtickmenu(open%,4)
12210 IF bopen% PROCwindow_centre(buffer%,700,475)
12220 IF NOT bopen% PROCshut(buffer%)
12230 ENDIF
12240 WHEN 406 : IF registered% THEN
12250 oopen%=NOToopen%:PROCtickmenu(open%,5)
12260 IF oopen% PROCwindow_centre(options%,768,367)
12270 IF NOT oopen% PROCshut(options%)
12280 ENDIF
12290 WHEN 407 : IF registered% THEN
12300 vuopen%=NOTvuopen%:PROCtickmenu(open%,6)
12310 IF vuopen% PROCopenup(vumeter%,970,900,310,280)
12320 IF NOT vuopen% PROCshut(vumeter%)
12330 ENDIF
12340 WHEN 408 : IF registered% THEN
12350 wopen%=NOTwopen%:PROCtickmenu(open%,7)
12360 IF wopen% PROCopenlinked(waveform%,wavepane%,1280,390,2112,256)
12370 IF NOT wopen% PROCshut(waveform%):PROCshut(wavepane%)
12380 ENDIF
12390 WHEN 409 : IF registered% THEN
12400 cropen%=NOTcropen%:PROCtickmenu(open%,8)
12410 IF cropen% PROCopenup(cro%,700,500,150,200)
12420 IF NOT cropen% PROCshut(cro%)
12430 ENDIF
12440 WHEN 474 : IF registered% THEN
12450 PROCmonitor
12460 ENDIF
12470 WHEN 393 : cvol%-=5:IF cvol%<0 cvol%=0
12480 x%=FNint(cvol%/volunit)
12490 pointer%!0=control%:pointer%!4=18
12500 SYS "Wimp_GetIconState",,pointer%
12510 SYS "Wimp_DeleteIcon",,pointer%
12520 pointer%!16=pointer%!8+x%
12530 pointer%!4=control%:SYS "Wimp_CreateIcon",,pointer%+4
12540 pointer%!4=19:SYS "Wimp_GetIconState",,pointer%
12550 SYS "Wimp_ForceRedraw",pointer%!0,pointer%!8,pointer%!12,pointer%!16,pointer%!20
12560 WHEN 458 : cvol%+=5:IF cvol%>255 cvol%=255
12570 x%=FNint(cvol%/volunit)
12580 pointer%!0=control%:pointer%!4=18
12590 SYS "Wimp_GetIconState",,pointer%
12600 SYS "Wimp_DeleteIcon",,pointer%
12610 pointer%!16=pointer%!8+x%
12620 pointer%!4=control%:SYS "Wimp_CreateIcon",,pointer%+4
12630 pointer%!4=19:SYS "Wimp_GetIconState",,pointer%
12640 SYS "Wimp_ForceRedraw",pointer%!0,pointer%!8,pointer%!12,pointer%!16,pointer%!20
12650 WHEN 459 : cvol%=255
12660 x%=FNint(cvol%/volunit)
12670 pointer%!0=control%:pointer%!4=18
12680 SYS "Wimp_GetIconState",,pointer%
12690 SYS "Wimp_DeleteIcon",,pointer%
12700 pointer%!16=pointer%!8+x%
12710 pointer%!4=control%:SYS "Wimp_CreateIcon",,pointer%+4
12720 pointer%!4=19:SYS "Wimp_GetIconState",,pointer%
12730 SYS "Wimp_ForceRedraw",pointer%!0,pointer%!8,pointer%!12,pointer%!16,pointer%!20
12740 SYS "Tracker_SetPos",0,,,,lock%
12750 SYS "Tracker_Play",,,,,lock%
12760 PROCputiconsprite(control%,1,"pause")
12770 PROCputiconsprite(control%,2,"stop")
12780 PROCputiconsprite(control%,3,"play1")
12790 SYS "Sound_Speaker",1:SYS "Sound_Enable",2
12800 speaker=FALSE:mute%=FALSE
12810 PROCputiconsprite(control%,12,"seloff")
12820 PROCputiconsprite(control%,15,"seloff")
12830 WHEN 474 : IF registered% THEN
12840 pointer%!0=1:pointer%!4=9
12850 SYS "Wimp_SendMessage",9,pointer%,taskh%
12860 ENDIF
12870ENDCASE
12880ENDPROC
12890
12900DEF PROCbuffer(size%)
12910IF playing% PROCtellemoff("Can't alter buffer while playing"):ENDPROC
12920IF buff%>0 THEN PROCrelease_rma(buff%)
12930OSCLI("RMAFree "+STR$(size%)+" Error 0 Insufficent RMA")
12940buffersize%=(size%*1024) AND NOT 3
12950buff%=FNclaim_rma(buffersize%)
12960SYS "OS_Heap",0,buff%,,buffersize%
12970PROCredo_buff(lenbytes%)
12980ENDPROC
12990
13000DEF PROChold_it(window%)
13010LOCAL finish%
13020CASE window% OF
13030WHEN odd% : PROCwindow_centre(odd%,750,300)
13040WHEN help%: PROCwindow_centre(help%,800,400)
13050ENDCASE
13060pointer%!0=window%:SYS "Wimp_GetWindowOutline",,pointer%
13070xmin%=pointer%!4:ymin%=pointer%!8:xsize%=pointer%!12-pointer%!4
13080ysize%=pointer%!16-pointer%!8:MOUSE RECTANGLE xmin%,ymin%,xsize%,ysize%
13090finish%=FALSE
13100REPEAT
13110SYS "Wimp_Poll",,pointer% TO r%
13120CASE r% OF
13130WHEN 1 : PROCredraw2
13140WHEN 2 : SYS "Wimp_OpenWindow",,pointer%
13150WHEN 3 : SYS "Wimp_CloseWindow",,pointer%
13160WHEN 6 : PROCcheckmouse2
13170WHEN 17,18 : IF pointer%!16=0 SYS "Interface_CloseDown",taskh%:SYS "Sound_Speaker",oldspeak%:SYS "Sound_Enable",oldmute%:SYS "Tracker_Unlock",lock%:PROCtidy:SYS "Wimp_CloseDown":END
13180 IF pointer%!16=&400C1 MOUSE RECTANGLE xmin%,ymin%,xsize%,ysize%
13190ENDCASE
13200UNTIL finish%
13210PROCshut(window%)
13220SYS "OS_ReadModeVariable",-1,4 TO ,,Eig%
13230SYS "OS_ReadModeVariable",-1,11 TO ,,Extent%
13240xsize%=(Extent%+1)<<Eig%
13250SYS "OS_ReadModeVariable",-1,5 TO ,,Eig%
13260SYS "OS_ReadModeVariable",-1,12 TO ,,Extent%
13270ysize%=(Extent%+1)<<Eig%
13280MOUSE RECTANGLE 0,0,xsize%,ysize%
13290ENDPROC
13300
13310DEF PROCcheckmouse2
13320CASE pointer%!12 OF
13330WHEN odd%
13340CASE pointer%!8 OF
13350WHEN 4 : CASE pointer%!16 OF
13360WHEN 6 : PROCslabicon2:PROCtracker_loadit(f$):finish%=TRUE
13370WHEN 7 : PROCslabicon2:finish%=TRUE
13380WHEN 8 : PROCslabicon2:PROCsetup_help:PROChold_it(help%):finish%=TRUE
13390ENDCASE
13400ENDCASE
13410WHEN help%
13420CASE pointer%!8 OF
13430WHEN 4 : CASE pointer%!16 OF
13440WHEN 9 : PROCslabicon2:finish%=TRUE
13450ENDCASE
13460ENDCASE
13470ENDCASE
13480ENDPROC
13490
13500DEF PROCsetup_help
13510PROCclear_help
13520PROCputicondata(help%,3,"PlayTrack can only handle")
13530PROCputicondata(help%,4,"certain types of file.")
13540PROCputicondata(help%,5,"However, it may be able to")
13550PROCputicondata(help%,6,"load music files in formats")
13560PROCputicondata(help%,7,"it doesn't 'know' about,")
13570PROCputicondata(help%,8,"so you can still hear them.")
13580ENDPROC
13590
13600DEF PROCsetup_mess1
13610PROCclear_help
13620PROCputicondata(help%,3,"This is an unregistered")
13630PROCputicondata(help%,4,"copy of !PlayTrack, that is")
13640PROCputicondata(help%,5,"restricted in what it can do.")
13650PROCputicondata(help%,6,"If you want to use the more")
13660PROCputicondata(help%,7,"advanced facilities, then")
13670PROCputicondata(help%,8,"you can register.")
13680ENDPROC
13690
13700DEF PROCsetup_mess2
13710PROCclear_help
13720PROCputicondata(help%,3,"This copy of !PlayTrack is")
13730PROCputicondata(help%,4,"now registered to this")
13740PROCputicondata(help%,5,"machine. Please quit")
13750PROCputicondata(help%,6,"!PlayTrack and reload to")
13760PROCputicondata(help%,7,"use the more advanced")
13770PROCputicondata(help%,8,"facilities.")
13780ENDPROC
13790
13800DEF PROCsetup_mess3
13810PROCclear_help
13820PROCputicondata(help%,3,"Only PIN numbers up to")
13830PROCputicondata(help%,4,"#65280 are allowed.")
13840PROCputicondata(help%,6,"Please re-enter your")
13850PROCputicondata(help%,7,"PIN number.")
13860ENDPROC
13870
13880DEF PROCsetup_mess4
13890PROCclear_help
13900PROCputicondata(help%,3,"This copy of !PlayTrack is")
13910PROCputicondata(help%,4,"not registered to this")
13920PROCputicondata(help%,5,"machine.")
13930PROCputicondata(help%,7,"!PlayTrack will now run, but")
13940PROCputicondata(help%,8,"will not work fully.")
13950ENDPROC
13960
13970DEF PROCclear_help:FOR I%=3 TO 8:PROCputicondata(help%,I%,""):NEXT:ENDPROC
13980
13990DEF PROCredraw2
14000SYS "Wimp_RedrawWindow",,pointer% TO more%
14010WHILE more%<>0
14020SYS "Interface_Render3dWindow",,pointer%
14030SYS "Wimp_GetRectangle",,pointer% TO more%
14040ENDPROC
14050
14060DEF PROCslabicon2
14070SYS "Interface_SlabButton",,pointer%
14080pointer%!8=0
14090SYS "Interface_SlabButton",,pointer%
14100ENDPROC
14110
14120DEF PROCregister(string$)
14130PROCputicondata(infowind%,15,"Registered to: "+string$)
14140ENDPROC
14150
14160DEF PROCget_register
14170h%=OPENUP("<PlayTrack$Dir>.Register")
14180l%=EXT#h%:CLOSE#h%
14190block%=FNclaim_rma(l%)
14200SYS "OS_File",255,"<PlayTrack$Dir>.Register",block%
14210FOR I%=0 TO l%:block%?I%=block%?I% EOR ASC(LEFT$(STR$(I%),1)):NEXT
14220pirate%=FALSE:pin%=!block%:name$=FNrtoz(block%+4)
14230IF pin%=65281 OR pin%=65282 THEN
14240 IF pin%=65281 THEN
14250 PROCregister(name$):registered%=FALSE:PROCbeep
14260 ELSE
14270 PROCregister(name$):registered%=TRUE
14280 ENDIF
14290ELSE
14300 SYS "OS_Byte",161,cmos% TO ,,reg%:SYS "OS_Byte",161,cmos2% TO ,,reg2%
14310 reg%=(256*reg%)+reg2%
14320 IF reg%<>pin% THEN PROCsetup_mess4:PROChold_it(help%):registered%=FALSE:pirate%=TRUE:PROCregister("PIRATE COPY"):PROCrelease_rma(block%):ENDPROC
14330 PROCregister(name$):registered%=TRUE
14340ENDIF
14350PROCrelease_rma(block%)
14360ENDPROC
14370
14380DEF PROCbeep
14390FOR I=1 TO 7:VDU7:TIME=0:REPEAT UNTIL TIME=50:NEXT:ENDPROC
14400
14410DEF FNclaim_rma(size%)
14420SYS "XOS_Module",6,,,size% TO ,,addr%;flags%
14430IF (flags% AND 1)=1 THEN
14440 PROCtellemoff("Error during RMA claim")
14450 =0
14460ENDIF
14470=addr%
14480
14490DEF PROCrelease_rma(addr%)
14500SYS "OS_Module",7,,addr%
14510ENDPROC
14520
14530DEF PROCregister_copy
14540name$=FNgeticondata(register%,4)
14550pin%=VAL(FNgeticondata(register%,10))
14560IF pin%>65280 THEN PROCsetup_mess3:PROChold_it(help%):PROCputicondata(register%,10,""):ENDPROC
14570len%=4+LENname$+1
14580addr%=FNclaim_rma(len%)
14590!addr%=pin%:block%=addr%+4:name$+=CHR$0:FOR I%=1 TO LENname$:?block%=ASC(MID$(name$,I%,1)):block%+=1:NEXT
14600FOR I%=0 TO len%:addr%?I%=addr%?I% EOR ASC(LEFT$(STR$I%,1)):NEXT
14610SYS "OS_File",10,"<PlayTrack$Dir>.Register",&FFD,,addr%,addr%+len%
14620SYS "OS_Byte",162,cmos%,pin% DIV 256
14630SYS "OS_Byte",162,cmos2%,pin% MOD 256
14640PROCsetup_mess2:PROChold_it(help%)
14650ENDPROC
14660
14670DEF PROCsave_opts
14680h%=OPENOUT("<PlayTrack$Dir>.Options")
14690clock$=FNgeticondata(options%,13)
14700buffer$=FNgeticondata(buffer%,3)
14710PRINT#h%,lap%,scr%,dos%,afs%,mak%,clock$,buffer$
14720CLOSE#h%
14730ENDPROC
14740
14750DEF PROCload_opts
14760h%=OPENUP("<PlayTrack$Dir>.Options")
14770INPUT#h%,lap%,scr%,dos%,afs%,mak%,clock$,buffer$
14780CLOSE#h%
14790lap$="":IF lap% lap$="selon" ELSE lap$="seloff"
14800scr$="":IF scr% scr$="selon" ELSE scr$="seloff"
14810dos$="":IF dos% dos$="selon" ELSE dos$="seloff"
14820afs$="":IF afs% afs$="selon" ELSE afs$="seloff"
14830mak$="":IF mak% mak$="selon" ELSE mak$="seloff"
14840PROCputiconsprite(options%,2,lap$)
14850PROCputiconsprite(options%,4,scr$)
14860PROCputiconsprite(options%,6,dos$)
14870PROCputiconsprite(options%,8,afs$)
14880PROCputiconsprite(options%,11,mak$)
14890PROCputicondata(options%,13,clock$)
14900PROCputicondata(buffer%,3,buffer$)
14910ENDPROC
14920
14930DEF PROCopenlinked(wh1%,wh2%,w1%,h1%,w2%,h2%)
14940x%=(1280-w1%)/2
14950y%=((1024-h1%)/2)+h1%
14960PROCopenup(wh1%,x%,y%,w1%,h1%)
14970PROCopenup(wh2%,x%+20,y%-80,w1%-40,h2%)
14980ENDPROC
14990
15000DEF PROCvolume
15010SYS "Wimp_GetPointerInfo",,pointer%:x%=pointer%!0
15020pointer%!0=control%:SYS "Wimp_GetWindowState",,pointer%
15030x%-=pointer%!4:pointer%!4=19:SYS "Wimp_GetIconState",,pointer%
15040x%-=pointer%!8:REM x% now is distance along icon #19
15050pointer%!0=control%:pointer%!4=18
15060SYS "Wimp_GetIconState",,pointer%
15070SYS "Wimp_DeleteIcon",,pointer%
15080pointer%!4=control%:pointer%!16=pointer%!8+x%
15090SYS "Wimp_CreateIcon",,pointer%+4
15100pointer%!0=control%:pointer%!4=19:SYS "Wimp_GetIconState",,pointer%
15110SYS "Wimp_ForceRedraw",pointer%!0,pointer%!8,pointer%!12,pointer%!16,pointer%!20
15120cvol%=FNint(x%*volunit):IF cvol%>255 cvol%=255
15130ENDPROC
15140
15150DEF FNint(int)
15160int+=0.5
15170=INT(int)
15180
15190DEF PROCvolfill
15200IF cvol%>10 THEN
15210 sc=cvol%/255
15220 sccb%!20=FNvol(sccb%!20,sc):sccb%!(32+20)=FNvol(sccb%!(32+20),sc)
15230 sccb%!(64+20)=FNvol(sccb%!(64+20),sc)
15240 sccb%!(96+20)=FNvol(sccb%!(96+20),sc)
15250 sccb%!(128+20)=FNvol(sccb%!(128+20),sc)
15260 sccb%!(160+20)=FNvol(sccb%!(160+20),sc)
15270 sccb%!(192+20)=FNvol(sccb%!(192+20),sc)
15280 sccb%!(224+20)=FNvol(sccb%!(224+20),sc)
15290ELSE
15300 FOR I%=0 TO 224 STEP 32:sccb%!(I%+20)=255:NEXT
15310ENDIF
15320ENDPROC
15330
15340DEF FNvol(vol%,scl)
15350vol1=255-vol%:vol1=vol1*scl:=FNint(255-vol1)
15360
15370DEF PROCplaynote
15380samp%=VAL(FNgeticondata(waveform%,1)):IF samp%=0 ENDPROC
15390SYS "Tracker_ReadSampleTable",samp%,,,,lock% TO ,,len%:IF len%=0 ENDPROC
15400SYS "Tracker_PlayNote",1,15,samp%,200,lock%
15410ENDPROC
15420
15430DEF PROCsave_rm(f$)
15440IF workspc%=0 PROCtellemoff("You have to have a Tracker tune loaded first!"):ENDPROC
15450base%=FNclaim_rma(lenbytes%+1000)
15460IF base%=0 PROCtellemoff("Cannot save Tracker tune as Relocatable Module"):ENDPROC
15470FOR pass%=12 TO 15 STEP 2
15480P%=0:O%=base%:L%=base%+lenbytes%+1500
15490[OPT pass%
15500EQUD 0
15510EQUD mod_initialise%
15520EQUD mod_finalise%
15530EQUD 0
15540EQUD mod_title%
15550EQUD mod_help%
15560]
15570IF com% THEN
15580 [OPT pass%
15590 EQUD mod_command%
15600 ]
15610ELSE
15620 [OPT pass%
15630 EQUD 0
15640 ]
15650ENDIF
15660[OPT pass%
15670EQUD 0
15680
15690.mod_initialise%
15700STMFD R13!,{R0-R8,R14}
15710SWI "OS_ReadMonotonicTime"
15720AND R0,R0,#256
15730STR R0,mod_lock%
15740SWI "Tracker_Lock"
15750ADR R0,mod_tunestart%
15760LDR R1,mod_tunelength%
15770LDR R4,mod_lock%
15780SWI "Tracker_MemoryLoad"
15790LDR R0,mod_autoplay%
15800CMP R0,#1
15810SWIEQ "Tracker_Play"
15820LDMFD R13!,{R0-R8,PC}
15830
15840.mod_finalise%
15850STMFD R13!,{R0-R8,R14}
15860LDR R4,mod_lock%
15870SWI "Tracker_Stop"
15880MOV R0,R4
15890SWI "Tracker_Unlock"
15900LDMFD R13!,{R0-R8,PC}
15910
15920.mod_title%
15930EQUS "MusicModule"
15940EQUB 0
15950ALIGN
15960
15970.mod_help%
15980EQUS "MusicModule"+CHR$9+"0.10 ("+MID$(TIME$,5,11)+")"
15990EQUB 0:ALIGN
16000
16010.mod_command%
16020EQUS "MusicOn"
16030EQUB 0
16040ALIGN
16050EQUD mod_musicon%
16060EQUD 0
16070EQUD mod_musicon_syntax%
16080EQUD mod_musicon_help%
16090EQUS "MusicOff"
16100EQUB 0
16110ALIGN
16120EQUD mod_musicoff%
16130EQUD 0
16140EQUD mod_musicoff_syntax%
16150EQUD mod_musicoff_help%
16160EQUS "MusicPause"
16170EQUB 0
16180ALIGN
16190EQUD mod_musicpause%
16200EQUD 0
16210EQUD mod_musicpause_syntax%
16220EQUD mod_musicpause_help%
16230EQUD 0
16240
16250.mod_musicon%
16260STMFD R13!,{R0-R8,R14}
16270LDR R4,mod_lock%
16280SWI "Tracker_Play"
16290LDMFD R13!,{R0-R8,PC}
16300
16310.mod_musicon_syntax%
16320EQUS "Syntax: *MusicOn"
16330EQUB 0
16340ALIGN
16350
16360.mod_musicon_help%
16370EQUS "*MusicOn switches the background Tracker music on."
16380EQUB 0
16390ALIGN
16400
16410.mod_musicoff%
16420STMFD R13!,{R0-R8,R14}
16430LDR R4,mod_lock%
16440SWI "Tracker_Pause"
16450MOV R0,#0
16460SWI "Tracker_SetPos"
16470LDMFD R13!,{R0-R8,PC}
16480
16490.mod_musicoff_syntax%
16500EQUS "Syntax: *MusicOff"
16510EQUB 0
16520ALIGN
16530
16540.mod_musicoff_help%
16550EQUS "*MusicOff switches the background Tracker music off."
16560EQUB 0
16570ALIGN
16580
16590.mod_musicpause%
16600STMFD R13!,{R0-R8,R14}
16610LDR R4,mod_lock%
16620SWI "Tracker_Pause"
16630LDMFD R13!,{R0-R8,PC}
16640
16650.mod_musicpause_syntax%
16660EQUS "Syntax: *MusicPause"
16670EQUB 0
16680ALIGN
16690
16700.mod_musicpause_help%
16710EQUS "*MusicPause pauses the background Tracker music."
16720EQUB 0
16730ALIGN
16740
16750.mod_autoplay%
16760EQUD 1
16770
16780.mod_lock%
16790EQUD 0
16800
16810.mod_tunelength%
16820EQUD 0
16830
16840.mod_tunestart%
16850]
16860SYS "OS_File",&FF,tune$,mod_tunestart%+base%
16870P%+=lenbytes%:O%+=lenbytes%
16880NEXT pass%
16890!(mod_tunelength%+base%)=lenbytes%
16900IF ap% THEN !(mod_autoplay%+base%)=1 ELSE !(mod_autoplay%+base%)=0
16910SYS "OS_File",&A,f$,&FFA,,base%,base%+P%
16920PROCrelease_rma(base%)
16930ENDPROC
16940
16950DEF PROCmonitor:oldmode%=MODE
16960LOCAL track%
16970MODE12:OFF:MOUSE OFF
16980FOR I%=0 TO fontlen%-1:VDU font%?I%:NEXT
16990SYS "Tracker_TuneInfo",,,,,lock% TO len%,voices%,speed%,name$,a%
17000PRINTTAB(0,0);"Track: "+name$
17010PRINTTAB(48,1);"Voices: "+STR$voices%+" Speed: "+STR$speed%
17020PRINTTAB(48,2);"Patterns: "+STR$len%+STRING$(3-LEN(STR$len%)," ")+" Volume: "+STR$~cvol%
17030PRINTTAB(48,3);"Position: 0 of: "+STR$(len%-1)+STRING$(3-LEN(STR$(len%-1))," ")+" Event: 0"
17040PRINTTAB(12,5);"Pitch Acc Pitch Inc Byte Off Samp Len Samp No Volume Period"
17050SYS "OS_Heap",1,buff% TO ,,,size%
17060PRINTTAB(0,20);"Buffer size currently &"+STR$~size%+" bytes."
17070PRINTTAB(0,21);"Module loaded at &"+STR$~workspc%+", length &"+STR$~lenbytes%
17080PRINTTAB(0,29);"System PlayTrack by David J. Seery"
17090PRINTTAB(0,31);FNgeticondata(infowind%,15);
17100REPEAT:SYS "Tracker_ReadPos" TO cp%,ev%
17110PRINTTAB(48,3);"Position: "+STR$cp%+STRING$(3-LEN(STR$cp%)," ")+" of: "+STR$(len%-1)+STRING$(3-LEN(STR$(len%-1))," ")+" Event: "+STR$ev%
17120SYS "Tracker_SoundInfo",pointer%
17130FOR I%=0 TO 224 STEP 32:track%=I%/32
17140PRINTTAB(0,6+track%);"Channel "+STR$track%
17150acc%=pointer%!I%:inc%=pointer%!(I%+4):slen%=pointer%!(I%+12):sno%=pointer%!(I%+16):vol%=pointer%!(I%+20):note%=pointer%!(I%+24):per%=pointer%!(I%+28)
17160SYS"OS_ConvertHex8",acc%,pointer%+300,100:acc$=FNrtoz(pointer%+300)
17170SYS"OS_ConvertHex8",inc%,pointer%+300,100:inc$=FNrtoz(pointer%+300)
17180SYS"OS_ConvertHex8",acc%>>>16,pointer%+300,100:loop$=FNrtoz(pointer%+300)
17190SYS"OS_ConvertHex8",slen%,pointer%+300,100:slen$=FNrtoz(pointer%+300)
17200SYS"OS_ConvertHex8",sno%,pointer%+300,100:sno$=FNrtoz(pointer%+300)
17210SYS"OS_ConvertHex8",255-vol%,pointer%+300,100:vol$=FNrtoz(pointer%+300)
17220SYS"OS_ConvertHex8",per%,pointer%+300,100:per$=FNrtoz(pointer%+300)
17230PRINTTAB(12,6+track%);acc$+" "+inc$+" "+loop$+" "+slen$+" "+sno$+" "+vol$+" "+per$
17240PRINTTAB((10*track%)+3,15);FNnote(note%)
17250NEXT
17260MOUSE x%,y%,z%:UNTIL z%<>0
17270OSCLI("Alphabet Latin1")
17280SYS "Wimp_SetMode",oldmode%
17290ENDPROC
17300
17310DEF FNnote(val%)
17320CASE val% OF
17330 WHEN 1 : ="C-1"
17340 WHEN 2 : ="C#1"
17350 WHEN 3 : ="D-1"
17360 WHEN 4 : ="D#1"
17370 WHEN 5 : ="E-1"
17380 WHEN 6 : ="F-1"
17390 WHEN 7 : ="F#1"
17400 WHEN 8 : ="G-1"
17410 WHEN 9 : ="G#1"
17420 WHEN 10: ="A-1"
17430 WHEN 11: ="A#1"
17440 WHEN 12: ="B-1"
17450 WHEN 13: ="B#1"
17460 WHEN 14: ="C-2"
17470 WHEN 15: ="C#2"
17480 WHEN 16: ="D-2"
17490 WHEN 17: ="D#2"
17500 WHEN 18: ="E-2"
17510 WHEN 19: ="F-2"
17520 WHEN 20: ="F#2"
17530 WHEN 21: ="G-2"
17540 WHEN 22: ="G#2"
17550 WHEN 23: ="A-2"
17560 WHEN 24: ="A#2"
17570 WHEN 25: ="B-2"
17580 WHEN 26: ="B#2"
17590 WHEN 27: ="C-3"
17600 WHEN 28: ="C#3"
17610 WHEN 29: ="D-3"
17620 WHEN 30: ="D#3"
17630 WHEN 31: ="E-3"
17640 WHEN 32: ="F-3"
17650 WHEN 33: ="F#3"
17660 WHEN 34: ="G-3"
17670 WHEN 35: ="G#3"
17680 WHEN 36: ="A-3"
17690ENDCASE
17700="0-0"
17710
17720DEF PROCtidy
17730IF buff%>0 PROCrelease_rma(buff%)
17740ENDPROC
� >$.!PlayTrack.!RunImage
� PD
� 1992
(
2a� � �tellemoff("Fatal error: (type="+Þ+") "+�$+" Re-run & try again."):ș "Wimp_CloseDown":�
<H� errors in this bit of code cannot be dealt with - quit immediately
FG� If you try, templates might not be loaded, menus not defined etc.
PD� q% 800,useful% 700,ind% &200,ind2% &300,menu% 300,pointer% 400
Z@� icontext% 36,iconvalid% 36,ind3% &200,ind4% &300,open% 650
d� indtext% 256:indptr%=0
nG� ind5% &200,channel(8),ind6% &150,ind7% &100,ind8% &200,ind9% &200
xH� ind10% &100,ind11% &20,code% 700,ind12% &100,ind13% &20,ind14% &20
�L� samps% 32*31,volume% 4*31,samplen% 6*31,valid% 3,text% 30:$valid%="z4"
�I$text%="No:":$(text%+8)="Name:":$(text%+16)="Vol:":$(text%+24)="Len:"
�<edited%=�:playing%=�:speaker=�:buffersize%=0:lenbytes%=0
�8copen%=�:topen%=�:sopen%=�:vopen%=�:type=0:newicn%=�
�=sicn%=0:nscn%=�:cmos%=42:cmos2%=43:oopen%=�:lap%=�:scr%=�
�3dos%=�:afs%=�:vuopen%=�:mute%=�:mak%=�:wopen%=�
�?show%=�:cropen%=�:track%=1:com%=�:ap%=�:clock$="48":buff%=0
�workspc%=0
�$q%="TASK"
�6ș "Wimp_Initialise",200,!q%,"PlayTrack" � ,taskh%
�@ș "Interface_Initialise",,taskh%:� claim Interface pointers
�)lock%=�(2000):ș "Tracker_Lock",lock%
�7ș "Wimp_OpenTemplate",,"<PlayTrack$Dir>.Templates"
9ș "Wimp_LoadTemplate",,q%,ind%,ind%+&200,-1,"info",0
*ș "Wimp_CreateWindow",,q% � infowind%
=ș "Wimp_LoadTemplate",,q%,ind2%,ind2%+&300,-1,"saveas",0
"(ș "Wimp_CreateWindow",,q% � saveas%
,>ș "Wimp_LoadTemplate",,q%,ind3%,ind3%+&200,-1,"control",0
6)ș "Wimp_CreateWindow",,q% � control%
@?ș "Wimp_LoadTemplate",,q%,ind4%,ind4%+&300,-1,"tuneinfo",0
J*ș "Wimp_CreateWindow",,q% � tuneinfo%
T=ș "Wimp_LoadTemplate",,q%,ind5%,ind5%+&200,-1,"stereo",0
^(ș "Wimp_CreateWindow",,q% � stereo%
h=ș "Wimp_LoadTemplate",,q%,ind6%,ind6%+&150,-1,"buffer",0
r(ș "Wimp_CreateWindow",,q% � buffer%
|@ș "Wimp_LoadTemplate",,q%,ind7%,ind7%+&100,-1,"oddformat",0
�%ș "Wimp_CreateWindow",,q% � odd%
�?ș "Wimp_LoadTemplate",,q%,ind8%,ind8%+&200,-1,"helptext",0
�&ș "Wimp_CreateWindow",,q% � help%
�?ș "Wimp_LoadTemplate",,q%,ind9%,ind9%+&200,-1,"register",0
�*ș "Wimp_CreateWindow",,q% � register%
�@ș "Wimp_LoadTemplate",,q%,ind10%,ind10%+&100,-1,"options",0
�)ș "Wimp_CreateWindow",,q% � options%
�?ș "Wimp_LoadTemplate",,q%,ind11%,ind11%+&20,-1,"vumeter",0
�)ș "Wimp_CreateWindow",,q% � vumeter%
�Aș "Wimp_LoadTemplate",,q%,ind12%,ind12%+&100,-1,"waveform",0
�*ș "Wimp_CreateWindow",,q% � waveform%
�@ș "Wimp_LoadTemplate",,q%,ind13%,ind13%+&20,-1,"wavepane",0
�*ș "Wimp_CreateWindow",,q% � wavepane%
;ș "Wimp_LoadTemplate",,q%,ind14%,ind14%+&20,-1,"cro",0
%ș "Wimp_CreateWindow",,q% � cro%
ș "Wimp_CloseTemplate"
&�samps_wind
0�get_register
:�load_opts
D)� scr% ș "Sound_Configure",,,�clock$
N�buffer(�buffer$)
X �menu
b!�assemble:!vu_block%=pointer%
lCș "Sound_Speaker",0 � oldspeak%:ș "Sound_Enable",0 � oldmute%
v0volunit=0.442708333:� 1 discrete volume unit
�cvol%=255:� Volume at 100%
�9ș "XOS_Module",18,"TrackerModule" � ,,,start%;flags%
�� (flags% � 1)=1 �
�� �tellemoff("Cannot initialise TrackerModule address offsets! I must exit immediately (check that TrackerModule is loaded).")
� �tidy
�9 ș "Wimp_CloseDown":ș "Interface_CloseDown",taskh%
� ș "Tracker_Unlock",lock%
� �
��
�7sccb%=start%+&1850:� Start of SCCB in TrackerModule
�?h%=�("<PlayTrack$Dir>.Font"):len%=�#h%:�#h%:fontlen%=len%-1
�>� font% len%:ș "OS_File",&FF,"<PlayTrack$Dir>.Font",font%
�8icon%=�iconbar("!PlayTrack","",-1):� icon on iconbar
< � -1 = Utility (RHS)
< � -2 = Service (LHS)
#quit%=�:� Nothing happened yet!
*Hș "Tracker_Stereo",4,,,,lock%:� I=1 � 8:�stereo(I,4):channel(I)=4:�
4!� registered%=� � pirate%=� �
>" �setup_mess1:�hold_it(help%)
H- ș "Wimp_CreateMenu",,register%,640,900
R�
\
f�� �error("Error: "+�$+" (code "+Þ+") Quit ? (Buffer="+�~workspc%+")",3)=1:ș "Interface_CloseDown",,taskh%:ș "Tracker_Stop",,,,,lock%:ș "Sound_Speaker",oldspeak%:ș "Sound_Enable",oldmute%:ș "Tracker_Unlock",lock%:�tidy:ș "Wimp_CloseDown":�
pJ� Error handler drops through to wimp_poll loop, AFTER wimp_initialise
z�
��volfill
�5ș "Wimp_Poll",,q% � reason%:� and poll the wimp.
�2ș "Interface_PreProcessKey",reason%,q%,taskh%
�Cș "Interface_Poll",reason%,,taskh%:� Ensure pointer up to date
�Ȏ reason% �
�� 0 : � newicn% �
� �=0:� � �>=20
� Ȏ type �
�< � � : �puticonsprite(win%,icn%,"selon")
�< � �: �puticonsprite(win%,icn%,"seloff")
� �
� newicn%=�
� �
- ȗ x%,y%,b%:� nscn% � b%=0 �
�=0:� � �>=15
Ȏ sicn% �
$; � 0 : �puticonsprite(control%,0,"rev")
.; � 4 : �puticonsprite(control%,4,"fwd")
8 �
B nscn%=�
L �
VG pointer%!0=vumeter%:ș "Wimp_GetWindowState",,pointer%
`- � (pointer%!32 � 1<<16)<>0 �
j> ș "Wimp_ForceRedraw",vumeter%,0,-280,310,0
t �
~ � cropen% �
�: ș "Wimp_ForceRedraw",cro%,0,-200,150,0
� �
�� 1 : �redraw
�&� 2 : ș "Wimp_OpenWindow",,q%
�" � !q%=waveform% �
�F !q%=wavepane%:q%!4+=20:q%!8+=20:q%!12-=20:q%!16-=80
�I !pointer%=wavepane%:ș "Wimp_GetWindowState",,pointer%
�6 q%!20=pointer%!20:q%!24=pointer%!24
�+ ș "Wimp_OpenWindow",,q%
� �
�'� 3 : ș "Wimp_CloseWindow",,q%
�! � !q%=control% �
copen%=�
$ �tickmenu(open%,0)
! �shut(control%)
�
(" � !q%=tuneinfo% �
2 topen%=�
<$ �tickmenu(open%,1)
F" �shut(tuneinfo%)
P �
Z � !q%=stereo% �
d sopen%=�
n$ �tickmenu(open%,2)
x �shut(stereo%)
� �
�! � !q%=samples% �
� vopen%=�
�$ �tickmenu(open%,3)
�! �shut(samples%)
� �
� � !q%=buffer% �
� bopen%=�
�$ �tickmenu(open%,4)
� �shut(buffer%)
� �
�! � !q%=options% �
� oopen%=�
% �tickmenu(open%,5)
" �shut(options%)
�
"! � !q%=vumeter% �
, vuopen%=�
6% �tickmenu(open%,6)
@" �shut(vumeter%)
J �
T" � !q%=waveform% �
^ wopen%=�
h% �tickmenu(open%,7)
r# �shut(waveform%)
|# �shut(wavepane%)
� �
� � !q%=cro% �
� cropen%=�
�% �tickmenu(open%,8)
� �shut(cro%)
� �
�+� 4 : ș "Wimp_SetCaretPosition",-1
�0� 5 : ș "Wimp_SetCaretPosition",q%!0,-1
�� 6 : �checkmouse
�&� 7 : f$=�lastbit(f$):�dragend
�� 8 : �kp
�� 9 : �process_menu
�� 17,18 : �message
�
� playing% �
' ș "Tracker_ReadPos",,,,,lock% � c
&# c1=�(�geticondata(control%,9))
0( � c<>c1 �puticondata(control%,9,�c)
:* ș "Tracker_TuneInfo",,,,,lock% � ,,s
D$ s1=�(�geticondata(tuneinfo%,7))
N) � s<>s1 �puticondata(tuneinfo%,7,�s)
X
�volfill
b�
l� quit%
v$ș "Interface_CloseDown",,taskh%
�;ș "Sound_Speaker",oldspeak%:ș "Sound_Enable",oldmute%
�"ș "Tracker_Stop",,,,,lock%:�7
�ș "Tracker_Unlock",lock%
� �tidy
�,ș "Wimp_CloseDown":�:� leave gracefully
�
�� �iconbar(v$,t$,handle%)
�� i%
�=� handle%=-2 � :� Service or Utility?
�$$iconvalid%="S"+v$:$icontext%=t$
��
�q%!0=handle%
�
q%!4=0
?� handle%=-1 q%!8=0 � q%!8=-16 :� Set up proper co-ords
$� handle%=-1 q%!12=68 � q%!12=78
$� handle%=-1 q%!16=96 � q%!16=90
?� handle%=-1 � :� And proper icon flags
*q%!20=&2002
4�
>+q%!20=%00010111000000000011000100101011
H�
R5� handle%=-1 � :� Indirected?
\$(q%+24)=v$
f�
pq%!24=icontext%
zq%!28=iconvalid%
�q%!32=�($icontext%)+1
��
�=ș "Wimp_CreateIcon",,q% � i% :� And draw the icon
�=i%
�
�� �message
�yr%=q%!8
�Ȏ (q%!16) �
�%� 0 : quit%=�:� Message_Quit ?
�%� 2 : �ds:� Message_DataSave ?
�%� 3 : �dl:� Message_DataLoad ?
�%� 5 : �do:� Message_DataOpen ?
�$� 8 : �pq:� Message_PreQuit ?
'� &502 : �sendhelp:� Message_Help ?
�
�
$
.� �checkmouse
8handle=(q%!12)
Bicon=(q%!16)
LȎ (q%!12) �
V� -2:� iconbar ?
`Ȏ (q%!8) �
jM� 4 : � registered%=� � pirate%=� ș "Wimp_CreateMenu",,register%,640,900
t0� 2 : ș "Wimp_CreateMenu",,menu%,!q%-64,319
~� 1 : � Adjust ?
��
�
� saveas%
�
Ȏ q%!8 �
�� 4 : Ȏ q%!16 �
�9� 1 : �slabicon:f$=�geticondata(saveas%,0):�quicksave
�8� 3 : f$=�geticondata(saveas%,0):�dragbox(saveas%,2)
�0� 4 : com%=�com%:�toggleopts(com%,saveas%,4)
�-� 6 : ap%=�ap%:�toggleopts(ap%,saveas%,6)
��
��
�� control%
�
Ȏ q%!8 �
� 4 : Ȏ q%!16 �
;� 0 : �puticonsprite(control%,0,"rev1"):sicn%=0:nscn%=�
L � playing%ș "Tracker_ReadPos",,,,,lock% � c,,m:c-=1:� c=-1 c=m
6 � playing% ș "Tracker_SetPos",c,,,,lock%
(&� 1 : ș "Tracker_Pause",,,,,lock%
20 �puticonsprite(control%,1,"pause1")
<. �puticonsprite(control%,2,"stop")
F. �puticonsprite(control%,3,"play")
P� 2 : � dos% �
Z* ș "Tracker_Stop",,,,,lock%
d1 �puticonsprite(control%,1,"pause")
n1 �puticonsprite(control%,2,"stop1")
x0 �puticonsprite(control%,3,"play")
�+ �puticondata(control%,9,"0")
�, �puticondata(control%,10,"0")
� �clear:playing%=�
� �
�+ ș "Tracker_Pause",,,,,lock%
�- ș "Tracker_SetPos",0,,,,lock%
�1 �puticonsprite(control%,1,"pause")
�1 �puticonsprite(control%,2,"stop1")
�0 �puticonsprite(control%,3,"play")
�+ �puticondata(control%,9,"0")
� �
�%� 3 : ș "Tracker_Play",,,,,lock%
�/ �puticonsprite(control%,1,"pause")
. �puticonsprite(control%,2,"stop")
/ �puticonsprite(control%,3,"play1")
;� 4 : �puticonsprite(control%,4,"fwd1"):sicn%=4:nscn%=�
"K � playing%ș "Tracker_ReadPos",,,,,lock% � c,,m:c+=1:� c>m c=0
,6 � playing% ș "Tracker_SetPos",c,,,,lock%
6� 12: speaker=� speaker
@- �toggleopts(speaker,control%,12)
JB � speaker ș "Sound_Speaker",2 � ș "Sound_Speaker",1
T� 15: mute%=� mute%
^+ �toggleopts(mute%,control%,15)
h> � mute% ș "Sound_Enable",1 � ș "Sound_Enable",2
r� 19: �volume
|�
�� 1 : Ȏ q%!16 �
�;� 0 : �puticonsprite(control%,0,"fwd1"):sicn%=0:nscn%=�
�L � playing% ș "Tracker_ReadPos",,,,,lock% � c,,m:c+=1:� c>m c=0
�6 � playing% ș "Tracker_SetPos",c,,,,lock%
�;� 4 : �puticonsprite(control%,4,"rev1"):sicn%=4:nscn%=�
�M � playing% ș "Tracker_ReadPos",,,,,lock% � c,,m:c-=1:� c=-1 c=m
�6 � playing% ș "Tracker_SetPos",c,,,,lock%
��
��
�
� stereo%
�
Ȏ q%!8 �
�� 4 : Ȏ q%!16 �
�3� 0 : channel(1)-=1:� channel(1)<1 channel(1)=1
" �stereo(1,channel(1))
E �puticonsprite(stereo%,1,"stereo"+�channel(1)):�slabicon
3� 2 : channel(1)+=1:� channel(1)>7 channel(1)=7
&" �stereo(1,channel(1))
0E �puticonsprite(stereo%,1,"stereo"+�channel(1)):�slabicon
:3� 3 : channel(2)-=1:� channel(2)<1 channel(2)=1
D" �stereo(2,channel(2))
NE �puticonsprite(stereo%,4,"stereo"+�channel(2)):�slabicon
X3� 5 : channel(2)+=1:� channel(2)>7 channel(2)=7
b" �stereo(2,channel(2))
lE �puticonsprite(stereo%,4,"stereo"+�channel(2)):�slabicon
v3� 6 : channel(3)-=1:� channel(3)<1 channel(3)=1
�" �stereo(3,channel(3))
�E �puticonsprite(stereo%,7,"stereo"+�channel(3)):�slabicon
�3� 8 : channel(3)+=1:� channel(3)>7 channel(3)=7
�" �stereo(3,channel(3))
�E �puticonsprite(stereo%,7,"stereo"+�channel(3)):�slabicon
�3� 9 : channel(4)-=1:� channel(4)<1 channel(4)=1
�" �stereo(4,channel(4))
�F �puticonsprite(stereo%,10,"stereo"+�channel(4)):�slabicon
�3� 11: channel(4)+=1:� channel(4)>7 channel(4)=7
�" �stereo(4,channel(4))
�F �puticonsprite(stereo%,10,"stereo"+�channel(4)):�slabicon
�3� 20: channel(5)-=1:� channel(5)<1 channel(5)=1
�" �stereo(5,channel(5))
F �puticonsprite(stereo%,21,"stereo"+�channel(5)):�slabicon
3� 22: channel(5)+=1:� channel(5)>7 channel(5)=7
" �stereo(5,channel(5))
F �puticonsprite(stereo%,21,"stereo"+�channel(5)):�slabicon
*3� 23: channel(6)-=1:� channel(6)<1 channel(6)=1
4" �stereo(6,channel(6))
>F �puticonsprite(stereo%,24,"stereo"+�channel(6)):�slabicon
H3� 25: channel(6)+=1:� channel(6)>7 channel(6)=7
R" �stereo(6,channel(6))
\F �puticonsprite(stereo%,24,"stereo"+�channel(6)):�slabicon
f3� 26: channel(7)-=1:� channel(7)<1 channel(7)=1
p" �stereo(7,channel(7))
zF �puticonsprite(stereo%,27,"stereo"+�channel(7)):�slabicon
�3� 28: channel(7)+=1:� channel(7)>7 channel(7)=7
�" �stereo(7,channel(7))
�F �puticonsprite(stereo%,27,"stereo"+�channel(7)):�slabicon
�3� 29: channel(8)-=1:� channel(8)<1 channel(8)=1
�" �stereo(8,channel(8))
�F �puticonsprite(stereo%,30,"stereo"+�channel(8)):�slabicon
�3� 31: channel(8)+=1:� channel(8)>7 channel(8)=7
�" �stereo(8,channel(8))
�F �puticonsprite(stereo%,30,"stereo"+�channel(8)):�slabicon
��
��
�
� buffer%
�
Ȏ q%!8 �
� 4 : Ȏ q%!16 �
7� 5 : �slabicon:�buffer(�(�geticondata(buffer%,3)))
�
$�
.� register%
8
Ȏ q%!8 �
B� 4 : Ȏ q%!16 �
L"� 9 : �slabicon:�register_copy
V�
`�
j� options%
t
Ȏ q%!8 �
~� 4 : Ȏ q%!16 �
�1� 2 : lap%=�lap%:�toggleopts(lap%,options%,2)
�1� 4 : scr%=�scr%:�toggleopts(scr%,options%,4)
�1� 6 : dos%=�dos%:�toggleopts(dos%,options%,6)
�1� 8 : afs%=�afs%:�toggleopts(afs%,options%,8)
�2� 11: mak%=�mak%:�toggleopts(mak%,options%,11)
�� 10: �slabicon:�save_opts
��
��
�� waveform%
�
Ȏ q%!8 �
�� 4 : Ȏ q%!16 �
�� 2 : �slabicon:�playnote
�
�
� cro%:
Ȏ q%!8 �
('� 4 : track%+=1:� track%=9 track%=1
2> pointer%!0=cro%:ș "Wimp_GetWindowInfo",,pointer%
<# $(pointer%!76)=�track%
F/ ș "Wimp_GetWindowState",,pointer%
P, ș "Wimp_CloseWindow",,pointer%
Z+ ș "Wimp_OpenWindow",,pointer%
d'� 1 : track%-=1:� track%=0 track%=8
n> pointer%!0=cro%:ș "Wimp_GetWindowInfo",,pointer%
x# $(pointer%!76)=�track%
�/ ș "Wimp_GetWindowState",,pointer%
�, ș "Wimp_CloseWindow",,pointer%
�+ ș "Wimp_OpenWindow",,pointer%
��
��
��
�
�� �menu
� � Setup menus and menu block
�P%=menu%
�flags=&7000021
��menu_header("PlayTrack",9)
�*�menu_item(&00,infowind%,flags,"Info")
\� registered% �menu_item(&00,open%,flags,"Open") � �menu_item(&00,open%,&2000021,"Open")
h� registered% �menu_item(&00,saveas%,flags,"Save F3") � �menu_item(&00,saveas%,&2000021,"Save F3")
'�menu_item(&00,-1,flags,"Stop F6")
"#�menu_item(&80,-1,flags,"Quit")
,P%=open%
6�menu_header("Open",14)
@+�menu_item(&00,-1,flags,"Control �F1")
J+�menu_item(&00,-1,flags,"Info �F2")
T+�menu_item(&00,-1,flags,"Stereo �F3")
^+�menu_item(&00,-1,flags,"Samples �F4")
h+�menu_item(&00,-1,flags,"Buffer �F5")
r+�menu_item(&00,-1,flags,"Options �F6")
|+�menu_item(&00,-1,flags,"Vu-Meter �F7")
�+�menu_item(&00,-1,flags,"Waveform �F8")
�+�menu_item(&00,-1,flags,"CRO �F9")
�,�menu_item(&80,-1,flags,"Monitor �F10")
�� registered%=� �
�& � I%=0 � 9:�greymenu(open%,I%):�
�- �disable(saveas%,1):�disable(saveas%,3)
��
��
�
�� �menu_header(T$,w)
�
$P%=T$
�P%!12=&70207
�P%!16=w*16
P%!20=40
P%!24=0
P%+=28
&�
0
:� �menu_item(A%,B%,C%,T$)
DP%!0=A%
NP%!4=B%
XP%!8=C%
b� �(T$)<13 �
l $(P%+12)=T$
v�
� $(indtext%+indptr%)=T$
� P%!12=indtext%+indptr%
� P%!16=-1
� P%!20=�(T$)+1
� P%!8=P%!8 � 1<<8
� indptr%+=�(T$)+1
��
�
P%+=24
��
�
�'� �error(e$,b%):!q%=0:$(q%+4)=e$+�0
�1ș "Wimp_ReportError",q%,b%,"PlayTrack" � ,b%
�=b%
� �dl
� f$,T%
f$=�250," "):f$="":T%=q%+44
*ȕ ?T%<>0:f$+=�?T%:T%+=1:�
4Ȏ q%!40 �
>:� &CB6,&001,&CC5,&701 : � q%!20=-2 �tracker_loadit(f$)
H% : �hold_it(odd%)
R�
\2q%!12=q%!8:q%!16=4:ș "Wimp_SendMessage",17,q%
f�
p
z � �do
�� f$,T%
�&f$=�250," "):f$="":f$=�rtoz(q%+44)
�Ȏ q%!40 �
�/� &CB6,&001,&CC5,&701 : �tracker_loadit(f$)
� : �
��
�2q%!12=q%!8:q%!16=4:ș "Wimp_SendMessage",17,q%
��
�
�
� �redraw
�%ș "Wimp_RedrawWindow",,q% � flag
� x%=q%!4-q%!20:y%=q%!16-q%!24
�ȕ flag<>0
� !q%=vumeter% � playing% �
. ș "Tracker_SoundInfo",pointer%,,,,lock%
!vu_x%=x%:!vu_y%=y%-280
$
� code%
.�
8H� !q%=wavepane% � show% � �geticondata(waveform%,1)<>"" � playing% �
B ș "Hourglass_On"
LI samp%=�(�geticondata(waveform%,1)):� samp%=0 ș "Hourglass_Smash":�
VS ș "Tracker_ReadSampleTable",samp%,,,,lock% � ,,len1%,len%,rpt%,rptlen%,addr%
` ș "Wimp_SetColour",7
j � len1%>0 � addr%>0 �
tA scale%=len%/len1%:rpt%=rpt%/scale%:rptlen%=rptlen%/scale%
~) sx=0:sy%=0:dist=2112/len1%:mid%=0
� � x%,y%-256
� � I%=0 � len1%
�' sx+=dist:sy%=addr%?I%:mid%+=sy%
� � x%+sx,(y%-256)+sy%
� � I%
� mid%=mid%/len1%
� ș "Wimp_SetColour",11
�2 � x%,(y%-256)+mid%:� x%+2112,(y%-256)+mid%
� ș "Wimp_SetColour",10
�1 � x%+rpt%*dist,(y%-256):� x%+rpt%*dist,y%
� ș "Wimp_SetColour",13
�E � x%+(rpt%+rptlen%)*dist,(y%-256):� x%+(rpt%+rptlen%)*dist,y%
�
ș "Hourglass_Off"
�
� !q%=cro% �
( ș "Wimp_SetColour",14
28 � I%=0 � 150 � 50:� x%+I%,(y%-200):� x%+I%,y%:� I%
<: � I%=0 � 200 � 50:� x%,(y%-I%):� x%+150,(y%-I%):� I%
F � playing% �
P ș "Wimp_SetColour",0
ZV ș "Tracker_SoundInfo",pointer%,,,,lock%:boff%=(pointer%!((track%-1)*32)>>>16)
d- samp%=(pointer%!(((track%-1)*32)+16))
n � samp%>0 �
xe ș "Tracker_ReadSampleTable",samp%,,,,lock% � ,,,len%,,,addr%:� boff%>len%-15 boff%=len%-15
�& � boff%<len%+15 bof%=len%+15
�� � x%,(y%-200)+addr%?(boff%-1):sx%=0:sy=0:� I%=boff%-15 � boff%+15:sy=(addr%?I%)/1.28:� x%+sx%,(y%-200)+sy:sx%+=(150/30):�
� �
�) � x%,(y%-100):� x%+150,(y%-100)
� �
� �
��
�5� !q%<>vumeter% ș "Interface_Render3dWindow",,q%
�%ș "Wimp_GetRectangle",,q% � flag
��
��
�
�5� �assemble:� redraw code in assembler for speed:
� pass%=8 � 11 � 2
P%=code%:L%=code%+700
[OPT pass%
"LDR R0,vu_block%
,!LDR R1,[R0,#24]:STR R1,chan1%
6$LDR R1,[R0,#32+24]:STR R1,chan2%
@$LDR R1,[R0,#64+24]:STR R1,chan3%
J$LDR R1,[R0,#96+24]:STR R1,chan4%
T%LDR R1,[R0,#128+24]:STR R1,chan5%
^%LDR R1,[R0,#160+24]:STR R1,chan6%
h%LDR R1,[R0,#192+24]:STR R1,chan7%
r%LDR R1,[R0,#224+24]:STR R1,chan8%
|MOV R0,#11
�SWI "Wimp_SetColour"
�LDR R2,vu_y%
�LDR R1,vu_x%:MOV R0,#4
�SWI "OS_Plot"
�:MOV R1,#30:LDR R3,chan1%:MOV R2,R3,LSL #3:SUB R2,R2,R3
�MOV R0,#97:SWI "OS_Plot"
�LDR R2,vu_y%
�(LDR R1,vu_x%:ADD R1,R1,#40:MOV R0,#4
�SWI "OS_Plot"
�:MOV R1,#30:LDR R3,chan2%:MOV R2,R3,LSL #3:SUB R2,R2,R3
�MOV R0,#97:SWI "OS_Plot"
�LDR R2,vu_y%
�(LDR R1,vu_x%:ADD R1,R1,#80:MOV R0,#4
SWI "OS_Plot"
:MOV R1,#30:LDR R3,chan3%:MOV R2,R3,LSL #3:SUB R2,R2,R3
MOV R0,#97:SWI "OS_Plot"
&LDR R2,vu_y%
0)LDR R1,vu_x%:ADD R1,R1,#120:MOV R0,#4
:SWI "OS_Plot"
D:MOV R1,#30:LDR R3,chan4%:MOV R2,R3,LSL #3:SUB R2,R2,R3
NMOV R0,#97:SWI "OS_Plot"
XLDR R2,vu_y%
b)LDR R1,vu_x%:ADD R1,R1,#160:MOV R0,#4
lSWI "OS_Plot"
v:MOV R1,#30:LDR R3,chan5%:MOV R2,R3,LSL #3:SUB R2,R2,R3
�MOV R0,#97:SWI "OS_Plot"
�LDR R2,vu_y%
�)LDR R1,vu_x%:ADD R1,R1,#200:MOV R0,#4
�SWI "OS_Plot"
�:MOV R1,#30:LDR R3,chan6%:MOV R2,R3,LSL #3:SUB R2,R2,R3
�MOV R0,#97:SWI "OS_Plot"
�LDR R2,vu_y%
�)LDR R1,vu_x%:ADD R1,R1,#240:MOV R0,#4
�SWI "OS_Plot"
�:MOV R1,#30:LDR R3,chan7%:MOV R2,R3,LSL #3:SUB R2,R2,R3
�MOV R0,#97:SWI "OS_Plot"
�LDR R2,vu_y%
�)LDR R1,vu_x%:ADD R1,R1,#280:MOV R0,#4
SWI "OS_Plot"
:MOV R1,#30:LDR R3,chan8%:MOV R2,R3,LSL #3:SUB R2,R2,R3
MOV R0,#97:SWI "OS_Plot"
MOV PC,R14
*B.vu_block% EQUD 0:.chan1% EQUD 0:.chan2% EQUD 0:.chan3% EQUD 0
4?.chan4% EQUD 0:.chan5% EQUD 0:.chan6% EQUD 0:.chan7% EQUD 0
>..chan8% EQUD 0:.vu_x% EQUD 0:.vu_y% EQUD 0
H]
R� pass%
\�
f
p� �process_menu
z8ș "Wimp_GetPointerInfo",,pointer%:j%=(pointer%!8=1)
�Ȏ handle �
�� -2
�
Ȏ q%!0 �
�� 1 : Ȏ q%!4 �
�5 � 0 : copen%=�copen%:�tickmenu(open%,0)
�@ � copen% �openup(control%,0,1024,625,325)
�1 � � copen% �shut(control%)
�5 � 1 : topen%=�topen%:�tickmenu(open%,1)
�B � topen% �openup(tuneinfo%,580,530,700,430)
�2 � � topen% �shut(tuneinfo%)
�5 � 2 : sopen%=�sopen%:�tickmenu(open%,2)
�@ � sopen% �window_centre(stereo%,1110,250)
�0 � � sopen% �shut(stereo%)
5 � 3 : vopen%=�vopen%:�tickmenu(open%,3)
B � vopen% �openback(samples%,0,1000,700,850)
1 � � vopen% �shut(samples%)
$5 � 4 : bopen%=�bopen%:�tickmenu(open%,4)
.? � bopen% �window_centre(buffer%,700,475)
80 � � bopen% �shut(buffer%)
B5 � 5 : oopen%=�oopen%:�tickmenu(open%,5)
L@ � oopen% �window_centre(options%,768,367)
V1 � � oopen% �shut(options%)
`7 � 6 : vuopen%=�vuopen%:�tickmenu(open%,6)
jB � vuopen% �openup(vumeter%,970,900,310,280)
t2 � � vuopen% �shut(vumeter%)
~5 � 7 : wopen%=�wopen%:�tickmenu(open%,7)
�R � wopen% �openlinked(waveform%,wavepane%,1280,390,2112,256)
�C � � wopen% �shut(waveform%):�shut(wavepane%)
�8 � 8 : cropen%=� cropen%:�tickmenu(open%,8)
�> � cropen% �openup(cro%,700,500,150,200)
�. � � cropen% �shut(cro%)
� � 9 : �monitor
� �
�� 3 : � dos% �
�* ș "Tracker_Stop",,,,,lock%
�1 �puticonsprite(control%,1,"pause")
�1 �puticonsprite(control%,2,"stop1")
�0 �puticonsprite(control%,3,"play")
+ �puticondata(control%,9,"0")
, �puticondata(control%,10,"0")
�clear:playing%=�
�
(+ ș "Tracker_Pause",,,,,lock%
2- ș "Tracker_SetPos",0,,,,lock%
<1 �puticonsprite(control%,1,"pause")
F1 �puticonsprite(control%,2,"stop1")
P0 �puticonsprite(control%,3,"play")
Z+ �puticondata(control%,9,"0")
d �
n� 4 : � edited%=� �
xD � �ok("File(s) edited but not saved. Really quit ?") �
� quit%=�
� �
� quit%=�
� �
� �
� � edited%=� �
� quit%=�
� �
� �
��
�:� j% ș "Wimp_CreateMenu",,menu%,pointer%!0,pointer%!4
��
��
� �openup(handle,x,y,w,h)
pointer%!0=handle
"pointer%!4=x:pointer%!8=y-h
,!pointer%!12=x+w:pointer%!16=y
6pointer%!20=0:pointer%!24=0
@pointer%!28=-1
J"ș "Wimp_OpenWindow",,pointer%
T�
^
h� �openback(handle,x,y,w,h)
rpointer%!0=handle
|pointer%!4=x:pointer%!8=y-h
�!pointer%!12=x+w:pointer%!16=y
�pointer%!20=0:pointer%!24=0
�pointer%!28=-2
�"ș "Wimp_OpenWindow",,pointer%
��
�
�� �slabicon
�.ș "Interface_SlabButton",,q%:� Slab in...
�
q%!8=0
�.ș "Interface_SlabButton",,q%:� ...and out
��
�
�� �shut(h%)
1pointer%!0=h%:ș "Wimp_CloseWindow",,pointer%
�
&� �sendhelp
0%q%!12=q%!8:q%!16=&503:help%=q%+20
::help%=�help(q%!32,q%!36,q%!20,q%!24,help%):� help%=0 �
D+?help%=0:� No, so send application help
N*!q%=(help%+4-q%)��3:� Setup help block
X2ș "Wimp_SendMessage",17,q%,q%!4:� and send it
b�
l
v$� �help(window%,icon%,x%,y%,to%)
�$to%=""
�Ȏ window% �
� � -2 : � iconbar ?
� Ȏ icon% �
� � icon% : � my icon ?
�P $to%="This is the PlayTrack icon.|MDrag Tracker tunes to it to play them."
� �
�" � infowind% : � info window ?
� Ȏ icon% �
�@ � -1,0,1,2,3,4,5,6,7,8 : � not over 'Click here...' icon ?
�L $to%="This is the Info window.|MIt provides information on PlayTrack."
�> : ș "Interface_SendHelp",,q%:=0:� Send Interface help
� �
& � saveas% : � 'Save as:' window ?
Ȏ icon% �
� -1 : � over work area ?
C $to%="This is the 'Save' window.|MIt is used to save a file."
*> : ș "Interface_SendHelp",,q%:=0:� Send Interface help
4 �
>�
H=to%+�($to%)
R
\!� �geticondata(window%,icon%)
fpointer%!0=window%
ppointer%!4=icon%
z$ș "Wimp_GetIconState",,pointer%
�=$(pointer%!28)
�
�$� �puticondata(window%,icon%,t$)
�'pointer%!0=window%:pointer%!4=icon%
�$ș "Wimp_GetIconState",,pointer%
�$(pointer%!28)=t$
�pointer%!12=0:pointer%!8=0
�$ș "Wimp_SetIconState",,pointer%
��
�
�&� �puticonsprite(window%,icon%,t$)
�'pointer%!0=window%:pointer%!4=icon%
�$ș "Wimp_GetIconState",,pointer%
"ș "Wimp_DeleteIcon",,pointer%
(pointer%!4=window%:$(pointer%+28)=t$
.pointer%+=4:ș "Wimp_CreateIcon",,pointer%
$Rș "Wimp_ForceRedraw",pointer%!0,pointer%!4,pointer%!8,pointer%!12,pointer%!16
.pointer%-=4
8�
B
L� �tellemoff(e$)
Ver%=pointer%
`
!er%=0
j$(er%+4)=e$+�0
t+ș "Wimp_ReportError",er%,1,"PlayTrack"
~�
�
�3� �rtoz(T%):� q$:ȕ ?T%<>0:q$+=�?T%:T%+=1:�:=q$
�
� � �pq
�� edited% �
�C� � �ok("File(s) edited but not saved. Really quit ?"):�no_quit
��
��
�
�
� �ok(e$)
�er%=pointer%
�
!er%=0
$(er%+4)=e$+�0
Aș "Wimp_ReportError",er%,&17,"Message from !PlayTrack" � ,b%
=(b%=1)
(� �no_quit
29q%!12=q%!8:q%!16=8:ș "Wimp_SendMessage",17,q%,q%!4:�
<
F� �dragend
Pd%=pointer%
Z ș "Wimp_GetPointerInfo",,d%
d+d%!32=d%!4 :tt%=d%!32
n+d%!28=!d% :te%=d%!28
x+d%!24=d%!16 :tf%=d%!24
�+d%!20=d%!12 :tw%=d%!20
�%d%!16=1 :d%!12=0 :d%!36=0
�)d%!40=0 :!d%=64 :$(d%+44)=f$
�+ș "Wimp_SendMessage",17,d%,d%!20,d%!24
�mr%=d%!8
��
�
�� �lastbit(s$)
�ȕ �s$,":")>0
�s$=�s$,�s$,":")+1)
��
�ȕ �s$,".")>0
�s$=�s$,�s$,".")+1)
�
=s$
" � �ds
,(�puticondata(saveas%,0,�rtoz(q%+44))
6f$=�rtoz(q%+44)
@
�sd(&FFA)
J�
T
^� �dragbox(w%,i%)
hd%=pointer%
r
!d%=w%
| ș "Wimp_GetWindowState",,d%
�"ys%=d%!16-d%!8:x%=d%!4:y%=d%!8
�d%!4=i%
�ș "Wimp_GetIconState",,d%
�f$=�lastbit(f$)
�d%!8+=x%
�d%!12+=y%+ys%
�
d%!16+=x%
�d%!20+=y%+ys%
�d%!24=0
�d%!28=0
�8ș "OS_ReadModeVariable",�,4 � ,,h%:h%=�extracth(h%)
�8ș "OS_ReadModeVariable",�,5 � ,,v%:v%=�extractv(v%)
�d%!32=(h%*2)
d%!36=(v%*4)
!d%=0
d%!4=5
&ș "Wimp_DragBox",,d%
0�
:
D� �quicksave
N� �f$,":")<1 � �f$,".")<1 �
X:�tellemoff("To save, drag icon to a directory viewer")
b�
l
�sd(&FFA)
v�
��
�
�
� �sd(t%)
��save_rm(f$)
�d%=pointer%
�
!d%=64
�
d%!20=tw%
�
d%!24=tf%
�
d%!28=te%
�
d%!32=tt%
�
d%!12=yr%
�d%!16=3
�d%!36=0
!d%!40=t%
!$(d%+44)=f$
!%ș "Wimp_SendMessage",17,d%,d%!20
! ș "OS_File",18,f$,t%
!*ș "Wimp_CreateMenu",,-1
!4�
!>
!H� �extracth(a%)
!RȎ a% �
!\ � 0 : =1280
!f � 1 : =640
!p � 2 : =320
!z � 3 : =160
!��
!�
!�� �extractv(a%)
!�Ȏ a% �
!� � 1 : =512
!� � 2 : =256
!��
!�
!�-� �toggleopts(flag,w%,i%):win%=w%:icn%=i%
!�$�puticonsprite(w%,i%,"selclick")
!�
Ȏ flag �
!� � � : newicn%=�:type=flag
!� � � : newicn%=�:type=flag
"�
"�
"
"$"� �toggleradio(flag,w%,i%,i2%)
".
Ȏ flag �
"8) � � : �puticonsprite(w%,i%,"radon")
"B1 �puticonsprite(w%,i2%,"radoff")
"L) � � : �puticonsprite(w%,i%,"radoff")
"V0 �puticonsprite(w%,i2%,"radon")
"`�
"j�
"t
"~ � �hackflags(w%,i%,eor%,or%)
"�pointer%!0=w%:pointer%!4=i%
"�#pointer%!8=eor%:pointer%!12=or%
"�$ș "Wimp_SetIconState",,pointer%
"��
"�
"�� �enable(w%,i%)
"��hackflags(w%,i%,0,&400000)
"��
"�
"�� �disable(w%,i%)
"�%�hackflags(w%,i%,&400000,&400000)
"��
#
#
� �select(w%,i%)
#%�hackflags(w%,i%,&200000,&200000)
#�
#(
#2� �deselect(w%,i%)
#<�hackflags(w%,i%,0,&200000)
#F�
#P
#Z� �toedit(file$)
#d!pointer%=(48+�file$)��3
#npointer%!12=0
#xpointer%!16=5
#�pointer%!36=-2
#�pointer%!40=&FFF
#�$(pointer%+44)=file$+�0
#�'ș "Wimp_SendMessage",18,pointer%,0
#��
#�
#�� �tocursor(text$)
#�� key%=1 � �(text$)
#�*ș "Wimp_ProcessKey",�(�text$,key%,1))
#� ș "Wimp_Poll",,q% � reason%
#�2ș "Interface_PreProcessKey",reason%,q%,taskh%
#�'ș "Interface_Poll",reason%,,taskh%
#�Ȏ reason% �
$ � 1 : �redraw
$# � 2 : ș "Wimp_OpenWindow",,q%
$$ � 3 : ș "Wimp_CloseWindow",,q%
$" � 6 : �checkmouse
$,# � 7 : f$=�lastbit(f$):�dragend
$6 � 9 : �process_menu
$@ � 17,18 : �message
$J�
$T�
$^�
$h
$r� �tickmenu(b%,n%)
$|%b%!(28+24*n%)=b%!(28+24*n%) � &01
$��
$�
$�� �greymenu(b%,n%)
$�1b%!((28+24*n%)+8)=b%!((28+24*n%)+8) � &400000
$��
$�
$�#� �window_centre(handle%,w%,h%)
$�x%=((1280-w%)/2)
$�y%=(((1024-h%)/2)+h%)
$� �openup(handle%,x%,y%,w%,h%)
$��
$�
$�� �force_redraw
%3ș "Wimp_ForceRedraw",fontselect%,0,0-400,700,0
%�
%
%&"� �tracker_loadit(f$):tune$=f$
%0Dș "Tracker_Stop",,,,,lock%:� Release so next call won't corrupt
%:.� workspc%>0 ș "OS_Heap",3,buff%,workspc%
%Dh%=�(f$):len%=�#h%:�#h%
%N2ș "OS_Heap",2,buff%,,len% � ,,workspc%;flags%
%XM� (flags% � 1)=1 �tellemoff("Buffer size is inadequate: Please extend"):�
%b ș "OS_File",&FF,f$,workspc%
%l1ș "Tracker_MemoryLoad",workspc%,len%,,,lock%
%v"ș "Sound_Speaker",1:speaker=�
%�&� lap% ș "Tracker_Play",,,,,lock%
%�2� registered% �openup(control%,0,1024,625,325)
%�$�puticonsprite(control%,0,"rev")
%�&�puticonsprite(control%,1,"pause")
%�Q� lap% �puticonsprite(control%,2,"stop") � �puticonsprite(control%,2,"stop1")
%�Q� lap% �puticonsprite(control%,3,"play1") � �puticonsprite(control%,3,"play")
%�$�puticonsprite(control%,4,"fwd")
%�1ș "Tracker_ReadPos",,,,,lock% � current,,max
%�"�puticondata(control%,10,�max)
%�4� registered% �openup(tuneinfo%,580,530,700,430)
%� �puticondata(tuneinfo%,1,f$)
%�h%=�(f$):len%=�#h%:�#h%
%�\�puticondata(tuneinfo%,3,�len%+" bytes -- "+�(�int((len%/1024)+0.4))+"K"):lenbytes%=len%
&Cș "Tracker_TuneInfo",,,,,lock% � len1%,voices%,speed%,name$,a%
&)� a%>0 author$=�rtoz(a%) � author$=""
&name$=�strip(name$)
& &�puticondata(tuneinfo%,5,�voices%)
&*%�puticondata(tuneinfo%,7,�speed%)
&4$�puticondata(tuneinfo%,9,�len1%)
&>$�puticondata(tuneinfo%,11,name$)
&H&�puticondata(tuneinfo%,13,author$)
&R(�puticondata(tuneinfo%,15,�fmat(f$))
&\#�puticondata(control%,14,name$)
&fAș "OS_File",5,f$ � ,,load%:type%=(load%>>>8)�&FFF:Ȏ type% �
&p2� &001 : �puticondata(tuneinfo%,17,"STracker")
&z2� &CB6 : �puticondata(tuneinfo%,17,"STModule")
&�2� &CC5 : �puticondata(tuneinfo%,17,"TeqMusic")
&�2� &701 : �puticondata(tuneinfo%,17,"ProTrack")
&��
&�"� afs% ș "OS_File",18,f$,&CB6
&��samples_draw
&��redo_buff(lenbytes%)
&�*� copen%=� copen%=�:�tickmenu(open%,0)
&�*� topen%=� topen%=�:�tickmenu(open%,1)
&�playing%=�
&��
&�
&�� �redo_buff(len%)
&�� buffersize%>0 �
'G �puticondata(buffer%,10,�len%+" bytes -- "+�(�int(len%/1024))+"K")
'$ ș "OS_Heap",1,buff% � ,,,free%
'K �puticondata(buffer%,11,�(free%)+" bytes -- "+�(�int(free%/1024))+"K")
'$�
'.1 �puticondata(buffer%,10,"No buffer defined")
'81 �puticondata(buffer%,11,"No buffer defined")
'B�
'L�
'V
'`� �clear
'j.�puticondata(tuneinfo%,1,"No Tune Loaded")
't.�puticondata(tuneinfo%,3,"No Tune Loaded")
'~!�puticondata(tuneinfo%,5,"0")
'�!�puticondata(tuneinfo%,7,"0")
'�!�puticondata(tuneinfo%,9,"0")
'�/�puticondata(tuneinfo%,11,"No Tune Loaded")
'�/�puticondata(tuneinfo%,13,"No Tune Loaded")
'�"�puticondata(tuneinfo%,15,"0")
'�/�puticondata(tuneinfo%,17,"No Tune Loaded")
'� �puticondata(control%,14,"")
'��
'�
'�� �strip(text$)
'�1ȕ �(�text$,1))<33:text$=�text$,(�text$)-1):�
'�1ȕ �(�text$,1))<33:text$=�text$,(�text$)-1):�
(
=text$
(
(� �fmat(f$)
(
Ȏ mak% �
((� � : =�mandk(f$)
(2� �: =�xbyte(f$)
(<�
(F
(P� �xbyte(f$)
(Zh%=�(f$)
(d�#h%=471
(n
a=�#h%
(x�#h%
(�� a=&78 ="15" � ="31"
(�
(�� �mandk(f$)
(�h%=�(f$)
(�
�#h%=1080
(�"q$="":� I%=1 � 4:q$+=�(�#h%):�
(��#h%
(�5� q$="M.K." � q$="FLT4" � q$="FLT8" ="31" � ="15"
(�4� Check for Startrekker as well as ProTracker ID
(�
(�� �stereo(ch,pos)
(�"ș "Sound_Stereo",ch,�pos(pos)
(��
)
)� �pos(pos)
)Ȏ pos �
)" � 1 : =-127
), � 2 : =-79
)6 � 3 : =-47
)@
� 4 : =0
)J � 5 : =47
)T � 6 : =79
)^ � 7 : =127
)h�
)r
)|,� �create(ww,wh,tf,tb,sc,T$,wf,wb,flags)
)�$pointer%!24=-1:pointer%!28=flags
)�!pointer%?32=tf:pointer%?33=tb
)�!pointer%?34=wf:pointer%?35=wb
)�pointer%?36=3:pointer%?37=1
)� pointer%?38=sc:pointer%?39=0
)� pointer%!40=0:pointer%!44=wh
)� pointer%!48=ww:pointer%!52=0
)�!pointer%!56=&3D:pointer%!60=0
)�pointer%!64=0:pointer%!68=0
)�$(pointer%+72)=T$
)�pointer%!84=0
)�)ș "Wimp_CreateWindow",,pointer% � h%
)�=h%
*
*>� �create_icon(handle,addr,minx,maxx,miny,ht,t$,flags,len)
*%pointer%!0=handle:pointer%!4=minx
*&$pointer%!8=miny:pointer%!12=maxx
*0)pointer%!16=miny+ht:pointer%!20=flags
*:� addr=0 �
*D$(pointer%+24)=t$
*N�
*Xpointer%!24=addr
*b0� t$="�" pointer%!28=valid% � pointer%!28=-1
*lpointer%!32=len
*v�
*�"ș "Wimp_CreateIcon",,pointer%
*��
*�
*�� �samps_wind
*�start%=samps%
*�volstart%=volume%
*�sampstart%=samplen%
*�9samples%=�create(700,-1200,7,2,12,"Samples",7,1,%111)
*�miny=-60
*�>�create_icon(samples%,text%,10,80,miny,52,"�",&17000121,0)
*�A�create_icon(samples%,text%+8,90,200,miny,52,"�",&17000121,0)
*�C�create_icon(samples%,text%+16,500,590,miny,52,"�",&17000121,0)
*�C�create_icon(samples%,text%+24,600,690,miny,52,"�",&17000121,0)
+miny-=60
+count%=1
+� I=1 � 31
+ $samps%=""
+*$volume%=""
+4$samplen%=""
+>8�create_icon(samples%,0,10,80,miny,36,�I,&7000021,0)
+H?�create_icon(samples%,samps%,90,490,miny,36,"",&7016121,32)
+RA�create_icon(samples%,volume%,500,590,miny,36,"",&7000121,32)
+\B�create_icon(samples%,samplen%,600,690,miny,36,"",&7000121,32)
+f8miny-=36:samps%+=32:volume%+=4:samplen%+=6:count%+=1
+p�
+zsamps%=start%
+�volume%=volstart%
+�samplen%=sampstart%
+��
+�:
+�� �samples_draw
+�sampsnum=0
+�start%=samps%
+�volstart%=volume%
+�sampstart%=samplen%
+�� I=1 � 31
+�>ș "Tracker_ReadSampleTable",I,,,,lock% � no%,a$,vol%,len%
+�,�puticontext(samples%,(2*I)+3,samps%,a$)
+�f� vol%<>0 �puticontext(samples%,(2*I)+4,volume%,�vol%) � �puticontext(samples%,(2*I)+4,volume%,"")
,t� len%<>0 �puticontext(samples%,(2*I)+5,samplen%,�len%) � �puticontext(samples%,(2*I)+5,samplen%,""):sampsnum+=1
,%samps%+=32:volume%+=4:samplen%+=6
,�
,$samps%=start%
,.volume%=volstart%
,8samplen%=sampstart%
,B�
,L
,V/� �puticontext(window%,icon%,buffer%,text$)
,`$buffer%=text$
,j'pointer%!0=window%:pointer%!4=icon%
,tpointer%!8=0:pointer%!12=0
,~$ș "Wimp_SetIconState",,pointer%
,��
,�
,� � �kp
,�ș "Wimp_ProcessKey",q%!24
,�
Ȏ q%!0 �
,� � buffer%
,� Ȏ q%!4 �
,� � 3
,� Ȏ q%!24 �
,�4 � 13 : q%!8=4:q%!12=buffer%:q%!16=5:�slabicon
,�4 �buffer(�(�geticondata(buffer%,3)))
,� �
- �
-
� waveform%
- Ȏ q%!4 �
- � 1
-( Ȏ q%!24 �
-2C � 13 : show%=�:ș "Wimp_ForceRedraw",wavepane%,0,-256,2112,0
-< �
-F �
-P�
-ZȎ q%!24 �
-d> � 385 : speaker=�speaker:�toggleopts(speaker,control%,12)
-nE � speaker ș "Sound_Speaker",2 � ș "Sound_Speaker",1
-x8 � 386 : mute%=�mute%:�toggleopts(mute%,control%,15)
-�A � mute% ș "Sound_Enable",1 � ș "Sound_Enable",2
-� � 387 : � register% �
-�4 ș "Wimp_GetPointerInfo",,pointer%
-�K ș "Wimp_CreateMenu",,saveas%,pointer%!0-64,pointer%!4+64
-� �
-�> � 388 : �puticonsprite(control%,0,"rev1"):sicn%=0:nscn%=�
-�D ș "Tracker_ReadPos",,,,,lock% � c,,m:c-=1:� c<0 c=m
-�. ș "Tracker_SetPos",c,,,,lock%
-�) � 389 : ș "Tracker_Pause",,,,,lock%
-�3 �puticonsprite(control%,1,"pause1")
-�1 �puticonsprite(control%,2,"stop")
-�1 �puticonsprite(control%,3,"play")
-� � 390 : � dos% �
.- ș "Tracker_Stop",,,,,lock%
.4 �puticonsprite(control%,1,"pause")
.4 �puticonsprite(control%,2,"stop1")
."3 �puticonsprite(control%,3,"play")
.,. �puticondata(control%,9,"0")
.6/ �puticondata(control%,10,"0")
.@# �clear:playing%=�
.J �
.T. ș "Tracker_Pause",,,,,lock%
.^0 ș "Tracker_SetPos",0,,,,lock%
.h4 �puticonsprite(control%,1,"pause")
.r4 �puticonsprite(control%,2,"stop1")
.|3 �puticonsprite(control%,3,"play")
.� �
.�( � 391 : ș "Tracker_Play",,,,,lock%
.�2 �puticonsprite(control%,1,"pause")
.�1 �puticonsprite(control%,2,"stop")
.�2 �puticonsprite(control%,3,"play1")
.�> � 392 : �puticonsprite(control%,4,"fwd1"):sicn%=4:nscn%=�
.�D ș "Tracker_ReadPos",,,,,lock% � c,,m:c+=1:� c>m c=0
.�. ș "Tracker_SetPos",c,,,,lock%
.� � 401 : � registered% �
.�3 copen%=�copen%:�tickmenu(open%,0)
.�; � copen% �openup(control%,0,1024,625,325)
.�, � � copen% �shut(control%)
.� �
/ � 402 : � registered% �
/3 topen%=�topen%:�tickmenu(open%,1)
/= � topen% �openup(tuneinfo%,580,530,700,430)
/&- � � topen% �shut(tuneinfo%)
/0 �
/: � 403 : � registered% �
/D3 sopen%=�sopen%:�tickmenu(open%,2)
/N; � sopen% �window_centre(stereo%,1110,250)
/X+ � � sopen% �shut(stereo%)
/b �
/l � 404 : � registered% �
/v3 vopen%=�vopen%:�tickmenu(open%,3)
/�= � vopen% �openback(samples%,0,1000,700,850)
/�, � � vopen% �shut(samples%)
/� �
/� � 405 : � registered% �
/�3 bopen%=�bopen%:�tickmenu(open%,4)
/�: � bopen% �window_centre(buffer%,700,475)
/�+ � � bopen% �shut(buffer%)
/� �
/� � 406 : � registered% �
/�3 oopen%=�oopen%:�tickmenu(open%,5)
/�; � oopen% �window_centre(options%,768,367)
/�, � � oopen% �shut(options%)
/� �
0 � 407 : � registered% �
05 vuopen%=�vuopen%:�tickmenu(open%,6)
0= � vuopen% �openup(vumeter%,970,900,310,280)
0 - � � vuopen% �shut(vumeter%)
0* �
04 � 408 : � registered% �
0>3 wopen%=�wopen%:�tickmenu(open%,7)
0HM � wopen% �openlinked(waveform%,wavepane%,1280,390,2112,256)
0R> � � wopen% �shut(waveform%):�shut(wavepane%)
0\ �
0f � 409 : � registered% �
0p5 cropen%=�cropen%:�tickmenu(open%,8)
0z9 � cropen% �openup(cro%,700,500,150,200)
0�) � � cropen% �shut(cro%)
0� �
0� � 474 : � registered% �
0� �monitor
0� �
0�' � 393 : cvol%-=5:� cvol%<0 cvol%=0
0�& x%=�int(cvol%/volunit)
0�1 pointer%!0=control%:pointer%!4=18
0�0 ș "Wimp_GetIconState",,pointer%
0�. ș "Wimp_DeleteIcon",,pointer%
0�) pointer%!16=pointer%!8+x%
0�D pointer%!4=control%:ș "Wimp_CreateIcon",,pointer%+4
0�> pointer%!4=19:ș "Wimp_GetIconState",,pointer%
1_ ș "Wimp_ForceRedraw",pointer%!0,pointer%!8,pointer%!12,pointer%!16,pointer%!20
1+ � 458 : cvol%+=5:� cvol%>255 cvol%=255
1& x%=�int(cvol%/volunit)
1$1 pointer%!0=control%:pointer%!4=18
1.0 ș "Wimp_GetIconState",,pointer%
18. ș "Wimp_DeleteIcon",,pointer%
1B) pointer%!16=pointer%!8+x%
1LD pointer%!4=control%:ș "Wimp_CreateIcon",,pointer%+4
1V> pointer%!4=19:ș "Wimp_GetIconState",,pointer%
1`_ ș "Wimp_ForceRedraw",pointer%!0,pointer%!8,pointer%!12,pointer%!16,pointer%!20
1j � 459 : cvol%=255
1t& x%=�int(cvol%/volunit)
1~1 pointer%!0=control%:pointer%!4=18
1�0 ș "Wimp_GetIconState",,pointer%
1�. ș "Wimp_DeleteIcon",,pointer%
1�) pointer%!16=pointer%!8+x%
1�D pointer%!4=control%:ș "Wimp_CreateIcon",,pointer%+4
1�> pointer%!4=19:ș "Wimp_GetIconState",,pointer%
1�_ ș "Wimp_ForceRedraw",pointer%!0,pointer%!8,pointer%!12,pointer%!16,pointer%!20
1�. ș "Tracker_SetPos",0,,,,lock%
1�+ ș "Tracker_Play",,,,,lock%
1�2 �puticonsprite(control%,1,"pause")
1�1 �puticonsprite(control%,2,"stop")
1�2 �puticonsprite(control%,3,"play1")
1�8 ș "Sound_Speaker",1:ș "Sound_Enable",2
2 ! speaker=�:mute%=�
2
4 �puticonsprite(control%,12,"seloff")
24 �puticonsprite(control%,15,"seloff")
2 � 474 : � registered% �
2(+ pointer%!0=1:pointer%!4=9
229 ș "Wimp_SendMessage",9,pointer%,taskh%
2< �
2F�
2P�
2Z
2d� �buffer(size%)
2n?� playing% �tellemoff("Can't alter buffer while playing"):�
2x#� buff%>0 � �release_rma(buff%)
2�5�("RMAFree "+�(size%)+" Error 0 Insufficent RMA")
2�"buffersize%=(size%*1024) � � 3
2�!buff%=�claim_rma(buffersize%)
2�%ș "OS_Heap",0,buff%,,buffersize%
2��redo_buff(lenbytes%)
2��
2�
2�� �hold_it(window%)
2�
� finish%
2�Ȏ window% �
2�)� odd% : �window_centre(odd%,750,300)
2�*� help%: �window_centre(help%,800,400)
2��
3;pointer%!0=window%:ș "Wimp_GetWindowOutline",,pointer%
3Cxmin%=pointer%!4:ymin%=pointer%!8:xsize%=pointer%!12-pointer%!4
3Aysize%=pointer%!16-pointer%!8:ȗ ȓ xmin%,ymin%,xsize%,ysize%
3"
finish%=�
3,�
36!ș "Wimp_Poll",,pointer% � r%
3@Ȏ r% �
3J� 1 : �redraw2
3T(� 2 : ș "Wimp_OpenWindow",,pointer%
3^)� 3 : ș "Wimp_CloseWindow",,pointer%
3h� 6 : �checkmouse2
3r�� 17,18 : � pointer%!16=0 ș "Interface_CloseDown",taskh%:ș "Sound_Speaker",oldspeak%:ș "Sound_Enable",oldmute%:ș "Tracker_Unlock",lock%:�tidy:ș "Wimp_CloseDown":�
3|E � pointer%!16=&400C1 ȗ ȓ xmin%,ymin%,xsize%,ysize%
3��
3�
� finish%
3��shut(window%)
3�*ș "OS_ReadModeVariable",-1,4 � ,,Eig%
3�.ș "OS_ReadModeVariable",-1,11 � ,,Extent%
3�xsize%=(Extent%+1)<<Eig%
3�*ș "OS_ReadModeVariable",-1,5 � ,,Eig%
3�.ș "OS_ReadModeVariable",-1,12 � ,,Extent%
3�ysize%=(Extent%+1)<<Eig%
3�ȗ ȓ 0,0,xsize%,ysize%
3��
3�
3�� �checkmouse2
4Ȏ pointer%!12 �
4
� odd%
4Ȏ pointer%!8 �
4&� 4 : Ȏ pointer%!16 �
402� 6 : �slabicon2:�tracker_loadit(f$):finish%=�
4:� 7 : �slabicon2:finish%=�
4D:� 8 : �slabicon2:�setup_help:�hold_it(help%):finish%=�
4N�
4X�
4b� help%
4lȎ pointer%!8 �
4v� 4 : Ȏ pointer%!16 �
4�� 9 : �slabicon2:finish%=�
4��
4��
4��
4��
4�
4�� �setup_help
4��clear_help
4�5�puticondata(help%,3,"PlayTrack can only handle")
4�2�puticondata(help%,4,"certain types of file.")
4�6�puticondata(help%,5,"However, it may be able to")
4�7�puticondata(help%,6,"load music files in formats")
4�4�puticondata(help%,7,"it doesn't 'know' about,")
57�puticondata(help%,8,"so you can still hear them.")
5�
5
5 � �setup_mess1
5*�clear_help
543�puticondata(help%,3,"This is an unregistered")
5>7�puticondata(help%,4,"copy of !PlayTrack, that is")
5H9�puticondata(help%,5,"restricted in what it can do.")
5R7�puticondata(help%,6,"If you want to use the more")
5\5�puticondata(help%,7,"advanced facilities, then")
5f-�puticondata(help%,8,"you can register.")
5p�
5z
5�� �setup_mess2
5��clear_help
5�6�puticondata(help%,3,"This copy of !PlayTrack is")
5�2�puticondata(help%,4,"now registered to this")
5�1�puticondata(help%,5,"machine. Please quit")
5�4�puticondata(help%,6,"!PlayTrack and reload to")
5�1�puticondata(help%,7,"use the more advanced")
5�'�puticondata(help%,8,"facilities.")
5��
5�
5�� �setup_mess3
5��clear_help
5�2�puticondata(help%,3,"Only PIN numbers up to")
6/�puticondata(help%,4,"#65280 are allowed.")
60�puticondata(help%,6,"Please re-enter your")
6'�puticondata(help%,7,"PIN number.")
6$�
6.
68� �setup_mess4
6B�clear_help
6L6�puticondata(help%,3,"This copy of !PlayTrack is")
6V2�puticondata(help%,4,"not registered to this")
6`$�puticondata(help%,5,"machine.")
6j8�puticondata(help%,7,"!PlayTrack will now run, but")
6t0�puticondata(help%,8,"will not work fully.")
6~�
6�
6�:� �clear_help:� I%=3 � 8:�puticondata(help%,I%,""):�:�
6�
6�� �redraw2
6�,ș "Wimp_RedrawWindow",,pointer% � more%
6�ȕ more%<>0
6�+ș "Interface_Render3dWindow",,pointer%
6�,ș "Wimp_GetRectangle",,pointer% � more%
6��
6�
6�� �slabicon2
6�'ș "Interface_SlabButton",,pointer%
7 pointer%!8=0
7
'ș "Interface_SlabButton",,pointer%
7�
7
7(� �register(string$)
728�puticondata(infowind%,15,"Registered to: "+string$)
7<�
7F
7P� �get_register
7Z$h%=�("<PlayTrack$Dir>.Register")
7dl%=�#h%:�#h%
7nblock%=�claim_rma(l%)
7x6ș "OS_File",255,"<PlayTrack$Dir>.Register",block%
7�4� I%=0 � l%:block%?I%=block%?I% � �(��(I%),1)):�
7�0pirate%=�:pin%=!block%:name$=�rtoz(block%+4)
7�� pin%=65281 � pin%=65282 �
7� � pin%=65281 �
7�, �register(name$):registered%=�:�beep
7� �
7�& �register(name$):registered%=�
7� �
7��
7�G ș "OS_Byte",161,cmos% � ,,reg%:ș "OS_Byte",161,cmos2% � ,,reg2%
7� reg%=(256*reg%)+reg2%
7�y � reg%<>pin% � �setup_mess4:�hold_it(help%):registered%=�:pirate%=�:�register("PIRATE COPY"):�release_rma(block%):�
7�$ �register(name$):registered%=�
8�
8�release_rma(block%)
8�
8"
8,� �beep
86!� I=1 � 7:�7:�=0:� � �=50:�:�
8@
8J� �claim_rma(size%)
8T.ș "XOS_Module",6,,,size% � ,,addr%;flags%
8^� (flags% � 1)=1 �
8h* �tellemoff("Error during RMA claim")
8r =0
8|�
8�
=addr%
8�
8�� �release_rma(addr%)
8�ș "OS_Module",7,,addr%
8��
8�
8�� �register_copy
8�#name$=�geticondata(register%,4)
8�&pin%=�(�geticondata(register%,10))
8�O� pin%>65280 � �setup_mess3:�hold_it(help%):�puticondata(register%,10,""):�
8�len%=4+�name$+1
8�addr%=�claim_rma(len%)
8�\!addr%=pin%:block%=addr%+4:name$+=�0:� I%=1 � �name$:?block%=�(�name$,I%,1)):block%+=1:�
92� I%=0 � len%:addr%?I%=addr%?I% � �(��I%,1)):�
9Eș "OS_File",10,"<PlayTrack$Dir>.Register",&FFD,,addr%,addr%+len%
9%ș "OS_Byte",162,cmos%,pin% � 256
9&&ș "OS_Byte",162,cmos2%,pin% � 256
90 �setup_mess2:�hold_it(help%)
9:�
9D
9N� �save_opts
9X#h%=�("<PlayTrack$Dir>.Options")
9b$clock$=�geticondata(options%,13)
9l#buffer$=�geticondata(buffer%,3)
9v0�#h%,lap%,scr%,dos%,afs%,mak%,clock$,buffer$
9��#h%
9��
9�
9�� �load_opts
9�#h%=�("<PlayTrack$Dir>.Options")
9�0�#h%,lap%,scr%,dos%,afs%,mak%,clock$,buffer$
9��#h%
9�/lap$="":� lap% lap$="selon" � lap$="seloff"
9�/scr$="":� scr% scr$="selon" � scr$="seloff"
9�/dos$="":� dos% dos$="selon" � dos$="seloff"
9�/afs$="":� afs% afs$="selon" � afs$="seloff"
9�/mak$="":� mak% mak$="selon" � mak$="seloff"
9�#�puticonsprite(options%,2,lap$)
:#�puticonsprite(options%,4,scr$)
:#�puticonsprite(options%,6,dos$)
:#�puticonsprite(options%,8,afs$)
: $�puticonsprite(options%,11,mak$)
:*$�puticondata(options%,13,clock$)
:4#�puticondata(buffer%,3,buffer$)
:>�
:H
:R,� �openlinked(wh1%,wh2%,w1%,h1%,w2%,h2%)
:\x%=(1280-w1%)/2
:fy%=((1024-h1%)/2)+h1%
:p�openup(wh1%,x%,y%,w1%,h1%)
:z(�openup(wh2%,x%+20,y%-80,w1%-40,h2%)
:��
:�
:�
� �volume
:�4ș "Wimp_GetPointerInfo",,pointer%:x%=pointer%!0
:�:pointer%!0=control%:ș "Wimp_GetWindowState",,pointer%
:�Ax%-=pointer%!4:pointer%!4=19:ș "Wimp_GetIconState",,pointer%
:�6x%-=pointer%!8:� x% now is distance along icon #19
:�%pointer%!0=control%:pointer%!4=18
:�$ș "Wimp_GetIconState",,pointer%
:�"ș "Wimp_DeleteIcon",,pointer%
:�1pointer%!4=control%:pointer%!16=pointer%!8+x%
:�$ș "Wimp_CreateIcon",,pointer%+4
:�Fpointer%!0=control%:pointer%!4=19:ș "Wimp_GetIconState",,pointer%
;Sș "Wimp_ForceRedraw",pointer%!0,pointer%!8,pointer%!12,pointer%!16,pointer%!20
;0cvol%=�int(x%*volunit):� cvol%>255 cvol%=255
;�
;$
;.� �int(int)
;8int+=0.5
;B=�(int)
;L
;V� �volfill
;`� cvol%>10 �
;j sc=cvol%/255
;tE sccb%!20=�vol(sccb%!20,sc):sccb%!(32+20)=�vol(sccb%!(32+20),sc)
;~* sccb%!(64+20)=�vol(sccb%!(64+20),sc)
;�* sccb%!(96+20)=�vol(sccb%!(96+20),sc)
;�, sccb%!(128+20)=�vol(sccb%!(128+20),sc)
;�, sccb%!(160+20)=�vol(sccb%!(160+20),sc)
;�, sccb%!(192+20)=�vol(sccb%!(192+20),sc)
;�, sccb%!(224+20)=�vol(sccb%!(224+20),sc)
;��
;�+ � I%=0 � 224 � 32:sccb%!(I%+20)=255:�
;��
;��
;�
;�� �vol(vol%,scl)
;�/vol1=255-vol%:vol1=vol1*scl:=�int(255-vol1)
<