Home » Archimedes archive » Acorn Computing » 1994 05 subscription disc.adf » 9405s » Miscellany/Eff/!Effex/!RunImage
Miscellany/Eff/!Effex/!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 05 subscription disc.adf » 9405s |
| Filename: | Miscellany/Eff/!Effex/!RunImage |
| Read OK: | ✔ |
| File size: | C9BB bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM > !RunImage
20REM Effex sample editor
30REM LEN Paul Mason, 1992
40
50SYS &10 TO env%
60env$=FNz(env%)
70a%=INSTR(env$,"Effex.!RunImage")
80a%+=LEN"Effex.!RunImage "
90env$=MID$(env$,a%+1)
100env$=MID$(env$,INSTR(env$,"-")+1)
110ON ERROR PROCerr(1)
120PROCinit
130PROCcre_menus(menus%,menus%+menu_size%)
140ON ERROR PROCerr(0)
150WHILE NOT quit%
160SYS &400C7,0,q% TO reason%
170PROChandle_reason(reason%,q%)
180IF env$<>"" PROCload(env$):env$=""
190ENDWHILE
200ON ERROR PROCerr(1)
210PROCquit_voice
220PROCXmem_quit
230END
240
250DEFPROChandle_reason(reason%,q%)
260CASE reason% OF
270WHEN 0 : IF sample_type%>=0 AND !Vcounter>0 AND tracking% PROCtrack
280WHEN 1 : PROCredraw
290WHEN 2 : PROCopen(q%)
300WHEN 3 : PROCclose(q%)
310WHEN 4
320WHEN 5
330WHEN 6 : PROCmclick
340WHEN 7 : PROCdragbox
350WHEN 8 : PROCkpress(q%!0,q%!4,q%!24)
360WHEN 9 : PROCmenusel
370WHEN 17,18 : PROCmess
380ENDCASE
390ENDPROC
400
410DEFPROCdragbox
420LOCAL a%
430SYS &400CF,,q%
440q%!24=q%!16
450q%!16=1:q%!20=q%!12:q%!28=q%!0:q%!32=q%!4
460q%!36=save_size%:q%!40=file_type%
470PROCextract_leaf:$(q%+44)=save_name$
480q%!0=(44+LENsave_name$+5)AND(NOT3)
490q%!12=0:SYS &400E7,17,q%,q%!20
500saveref%=q%!8
510SYS &400D4,,-1
520ENDPROC
530
540DEFPROCdatasave_ack
550IF q%!12<>saveref% ENDPROC
560save_name$=FNz(q%+44)
570IF q%!36<>-1 PROCinsert_name:modified%=0
580CASE file_type% OF
590WHEN &631,&632,&633
600 SYS 8,10,save_name$,file_type%,,save_sample%,save_sample%+save_samp_size%
610WHEN &634 : PROCsave_eff(save_name$)
620WHEN &D3C : PROCsave_arm(save_name$)
630ENDCASE
640q%!12=q%!8:q%!16=3
650SYS &400E7,17,q%,q%!20
660ENDPROC
670
680DEFPROCsave_eff(name$)
690LOCAL file%,size%,rate%
700file%=OPENOUT(name$)
710BPUT#file%,sample_type%
720BPUT#file%,0:BPUT#file%,0:BPUT#file%,0
730PROCwput(save_samp_size%)
740PROCwput(28)
750PROCwput(save_caret%)
760PROCwput(save_sel_start%)
770PROCwput(save_sel_end%)
780rate%=VALFNXicon_getstr(win_main%,5)*(1<<24)
790PROCwput(rate%)
800SYS &C,2,file%,save_sample%,save_samp_size%
810CLOSE#file%
820OSCLI"SetType "+name$+" 634"
830ENDPROC
840
850DEFPROCsave_arm(name$)
860LOCAL file%,size%,rate%
870file%=OPENOUT(name$)
880BPUT#file%,VALFNXicon_getstr(win_main%,4)
890SYS &C,2,file%,save_sample%,save_samp_size%
900CLOSE#file%
910OSCLI"SetType "+name$+" D3C"
920ENDPROC
930
940DEFFNleaf(s$)
950LOCAL s2$:s2$=""
960IF INSTR(s$,".")=0 THEN =s$
970WHILE RIGHT$(s$)<>"." AND RIGHT$(s$)<>":"
980s2$=RIGHT$(s$)+s2$
990s$=LEFT$(s$)
1000ENDWHILE
1010=s2$
1020
1030DEFFNpath(s$)
1040WHILE RIGHT$(s$)<>"." AND RIGHT$(s$)<>":"
1050s$=LEFT$(s$)
1060ENDWHILE
1070=s$
1080
1090DEFPROCextract_leaf
1100save_name$=FNleaf(FNXicon_getstr(win_save%,1))
1110ENDPROC
1120
1130DEFPROCinsert_name
1140CASE file_type% OF
1150WHEN &631 : sname_log$=save_name$
1160WHEN &632 : sname_sgn$=save_name$
1170WHEN &633 : sname_uns$=save_name$
1180WHEN &634 : sname_eff$=save_name$
1190WHEN &D3C : sname_arm$=save_name$
1200WHEN &635 : sname_sel$=save_name$
1210WHEN &636 : sname_lib$=save_name$
1220ENDCASE
1230ENDPROC
1240
1250DEFPROCkpress(win%,icon%,key%)
1260CASE key% OF
1270WHEN 13 : IF win%=win_main%:PROCnext_caret(icon%)
1280 IF win%=win_save% PROCsave
1290WHEN &18F : PROCmove_caret(icon%,1)
1300WHEN &18E : PROCmove_caret(icon%,0)
1310OTHERWISE : IF NOT FNkey_ok(key%) SYS &400DC,key%
1320ENDCASE
1330ENDPROC
1340
1350DEFPROCsave
1360save_name$=FNXicon_getstr(win_save%,1)
1370PROCinsert_name
1380CASE file_type% OF
1390WHEN &631,&632,&633
1400 SYS 8,10,save_name$,file_type%,,save_sample%,save_sample%+save_samp_size%
1410WHEN &634 : PROCsave_eff(save_name$)
1420WHEN &D3C : PROCsave_arm(save_name$)
1430ENDCASE
1440SYS &400D4,,-1
1450ENDPROC
1460
1470DEFPROCnext_caret(ic%)
1480LOCAL a%,win%:win%=win_main%
1490CASE ic% OF
1500WHEN 5 : PROCset_rate(VAL(FNXicon_getstr(win%,5)))
1510 PROCset_caret(win%,4)
1520WHEN 4 : a%=VAL(FNXicon_getstr(win%,4)):IF a%=0 a%=50
1530 PROCset_rate(1000/a%)
1540 PROCset_caret(win%,5)
1550WHEN 18 : PROCset_caret(win%,18):PROCsc
1560WHEN 22 : PROCset_caret(win%,23)
1570WHEN 23 : PROCset_caret(win%,22):PROCss
1580WHEN 10 : PROCset_caret(win%,11)
1590WHEN 11 : PROCzoom(0,0)
1600 PROCset_caret(win%,10)
1610WHEN 25 : a%=VALFNXicon_getstr(win%,25)
1620 IF a%<0 a%=0
1630 IF a%>127 a%=127
1640 PROCXicon_setstr(win%,25,STR$a%)
1650 ?Vvol=a%
1660ENDCASE
1670ENDPROC
1680
1690DEFPROCmove_caret(ic%,up%)
1700LOCAL u%,d%
1710CASE ic% OF
1720WHEN 5 : u%=11:d%=4
1730WHEN 4 : u%=5:d%=18
1740WHEN 18 : u%=4:d%=22
1750WHEN 22 : u%=18:d%=23
1760WHEN 23 : u%=22:d%=25
1770WHEN 25 : u%=23:d%=10
1780WHEN 10 : u%=25:d%=11
1790WHEN 11 : u%=10:d%=5
1800ENDCASE
1810IF up% PROCset_caret(win_main%,u%) ELSE PROCset_caret(win_main%,d%)
1820ENDPROC
1830
1840DEFPROCset_rate(khz)
1850IF khz=0 khz=20
1860PROCXicon_setstr(win_main%,5,STR$khz)
1870PROCXicon_setstr(win_main%,4,STR$(1000/khz))
1880ENDPROC
1890
1900DEFPROCset_caret(w%,i%)
1910LOCAL len%:len%=LEN(FNXicon_getstr(w%,i%))
1920SYS &400D2,w%,i%,0,0,-1,len%
1930ENDPROC
1940
1950DEFPROCredraw
1960LOCAL more%,scl%,xp%,pos,inc,xo%,yo%,ss,se,car%,sss,sse
1970ss=sel_start%*1150*zoom/samp_size%
1980se=sel_end%*1150*zoom/samp_size%
1990car%=caret%*1150*zoom/samp_size%
2000SYS &35,-1,4 TO ,,scl%:scl%=1<<scl%
2010SYS &400C8,,q% TO more%
2020WHILE more%
2030xstart%=q%!28-q%!4+q%!20
2040xend%=q%!36-q%!4+q%!20
2050pos%=q%!28
2060pos=(xstart%-scl%)*samp_size%/zoom/1150
2070inc=scl%*samp_size%/zoom/1150
2080byte%=sample%?pos
2090xo%=q%!4-q%!20:yo%=q%!8
2100MOVE xstart%+xo%,byte%+yo%
2110SYS &400E6,4
2120FOR xp%=xstart%-scl% TO xend%+scl% STEP scl%
2130PLOTvdu%,xp%+xo%,sample%?pos+yo%
2140pos+=inc
2150NEXT
2160IF sel_start%>=0 SYS &400E6,7+(3<<4):RECTANGLEFILL ss+xo%,yo%,se-ss,256
2170IF caret%>=0 SYS &400E6,11+(3<<4):LINE car%+xo%,yo%,car%+xo%,yo%+256
2180SYS &400E6,8:LINE xo%,yo%,xo%,yo%+256
2190SYS &400E6,15:LINE xo%+1150*zoom-1,yo%,xo%+1150*zoom-1,yo%+256
2200SYS &400CA,,q% TO more%
2210ENDWHILE
2220ENDPROC
2230
2240DEFPROCfresh(win%,q%)
2250!q%=win%:SYS &400CB,,q%
2260PROCopen(q%)
2270ENDPROC
2280
2290DEFPROCzoom(da%,db%)
2300LOCAL a%,b%,scl%
2310a%=VALFNXicon_getstr(win_main%,10)
2320a%+=da%
2330IF a%>999 a%=999
2340b%=VALFNXicon_getstr(win_main%,11)
2350b%+=db%
2360IF b%>999 b%=999
2370IF a%<1 a%=1
2380IF b%<1 b%=1
2390IF b%>a% b%=a%
2400zoom=a%/b%
2410PROCXicon_setstr(win_main%,10,STR$a%)
2420PROCXicon_setstr(win_main%,11,STR$b%)
2430!q%=win_pane%:SYS &400CB,,q%
2440IF q%!20>1150*(zoom-1)-1 q%!20=1150*(zoom-1)-1:SYS &400C5,,q%
2450q%!4=0:q%!8=-256
2460q%!12=q%!4+1150*zoom
2470q%!16=0
2480SYS &35,-1,4 TO ,,scl%:scl%=1<<scl%
2490a%=q%!8MODscl%
2500q%!12=q%!12+(scl%-a%)
2510SYS &400D7,win_pane%,q%+4
2520!q%=win_pane%:SYS &400CB,,q%
2530SYS &400D1,win_pane%,q%!20,-256,q%!20+1150,0
2540ENDPROC
2550
2560DEFPROCopen(q%)
2570LOCAL a%:a%=q%+1024
2580IF !q%=win_main% THEN
2590a%!0=win_pane%:SYS &400CB,,a%
2600a%!28=q%!28:q%!28=win_pane%
2610a%!12=a%!12-a%!4:a%!16=a%!16-a%!8
2620a%!4=q%!4+panex%
2630a%!8=q%!8+paney%
2640a%!12=a%!12+a%!4:a%!16=a%!16+a%!8
2650SYS &400C5,,a%
2660ENDIF
2670SYS &400C5,,q%
2680ENDPROC
2690
2700DEFPROCclose(q%)
2710SYS &400C6,,q%
2720IF !q%<>win_main% ENDPROC
2730!q%=win_pane%
2740SYS &400C6,,q%
2750ENDPROC
2760
2770DEFPROCmclick
2780LOCAL xpos%,win%,but%,ic%
2790xpos%=!q%:but%=q%!8:win%=q%!12:ic%=q%!16
2800REM
2810IF q%!8=2 THEN
2820 IF q%!12=-2 AND q%!16=iconbar% PROCXmenu_iconbar(menu_icon%)
2830 IF q%!12=win_main% OR q%!12=win_pane% PROCXmenu_main(menu_main%)
2840ENDIF
2850REM
2860IF (q%!8=4 OR q%!8=1) AND q%!12=win_pane% THEN
2870ENDIF
2880IF q%!8=4 THEN
2890 IF q%!12=-2 AND q%!16=iconbar% AND sample_type%>-1 PROCfresh(win_main%,q%)
2900 IF q%!12=win_pane% PROCset_sel
2910 IF win%=win_main% AND ic%=28 PROCply
2920ENDIF
2930REM
2940IF q%!8=1 THEN
2950 IF q%!12=win_pane% PROCset_car
2960ENDIF
2970REM
2980IF (but%=4 OR but%=1) AND win%=win_pane% PROCscroll_pane(xpos%,q%+512)
2990IF but%<>2 AND win%=win_main% PROChandle_winmain(ic%,but%)
3000IF win%=win_save% PROChandle_saves(ic%,but%)
3010ENDPROC
3020
3030DEFPROCply
3040LOCAL vol%,rate:vol%=VALFNXicon_getstr(win_main%,25)
3050rate=VALFNXicon_getstr(win_main%,5)
3060PROCplay(sample%,sample%+samp_size%-1,vol%,rate)
3070ENDPROC
3080
3090DEFPROCply_sel
3100PROCcheck_all(0)
3110LOCAL vol%,rate:vol%=VALFNXicon_getstr(win_main%,25)
3120rate=VALFNXicon_getstr(win_main%,5)
3130PROCplay(sample%+sel_start%,sample%+sel_end%,vol%,rate)
3140ENDPROC
3150
3160DEFPROChandle_saves(ic%,but%)
3170CASE TRUE OF
3180WHEN ic%=0 AND (but%=16 OR but%=64) : PROCdrag_save
3190WHEN ic%=2 AND (but%<>2) : PROCsave
3200ENDCASE
3210ENDPROC
3220
3230DEFPROCdrag_save
3240LOCAL x0%,y0%,shft%
3250!q%=win_save%:SYS &400CB,,q%
3260x0%=q%!4:y0%=q%!16
3270q%!4=0:SYS &400CE,,q%
3280q%!4=5:q%!8+=x0%:q%!12=y0%+q%!12
3290q%!16+=x0%:q%!20=y0%+q%!20
3300SYS &35,-1,11 TO ,,x0%
3310SYS &35,-1,4 TO ,,shft%:x0%=x0%<<shft%
3320SYS &35,-1,12 TO ,,y0%
3330SYS &35,-1,5 TO ,,shft%:y0%=y0%<<shft%
3340q%!24=0:q%!28=0:q%!32=x0%:q%!36=y0%
3350SYS &400D0,,q%
3360ENDPROC
3370
3380DEFPROChandle_winmain(ic%,but%)
3390LOCAL mul%:IF INKEY(-1) mul%=16 ELSE mul%=1
3400IF but%=1 but%=-1 ELSE but%=1
3410CASE ic% OF
3420WHEN 14 : PROCzoom(but%*mul%,0)
3430WHEN 15 : PROCzoom(-but%*mul%,0)
3440WHEN 13 : PROCzoom(0,but%*mul%)
3450WHEN 16 : PROCzoom(0,-but%*mul%)
3460WHEN 27 : PROCvol(but%*mul%)
3470WHEN 26 : PROCvol(-but%*mul%)
3480WHEN 9 : PROCpitch_bend(but%*mul%)
3490WHEN 29 : PROCpitch_bend(-but%*mul%)
3500WHEN 19 : PROCcrr(but%*mul%)
3510WHEN 20 : PROCcrr(-but%*mul%)
3520ENDCASE
3530ENDPROC
3540
3550DEFPROCvol(inc%)
3560LOCAL vol%:vol%=VALFNXicon_getstr(win_main%,25)
3570vol%+=inc%:IF vol%>127 vol%=127
3580IF vol%<0 vol%=0
3590PROCXicon_setstr(win_main%,25,STR$vol%)
3600?Vvol=vol%
3610ENDPROC
3620
3630DEFPROCset_sel
3640LOCAL x%,ox%,oldss%,oldse%:x%=q%!0
3650!q%=win_pane%:SYS &400CB,,q%
3660x%=x%-q%!4+q%!20:x%=x%*samp_size%/1150/zoom
3670IF sel_start%=-1 THEN
3680sel_start%=x%:sel_end%=x%+1
3690IF sel_end%>=samp_size% sel_start%-=samp_size%-2:sel_end%=samp_size%-1
3700PROCnew_selection
3710ELSE
3720IF x%<>sel_start% AND x%<>sel_end% THEN
3730IF ABS(sel_start%-x%)<ABS(sel_end%-x%) ox%=sel_start%:sel_start%=x% ELSE ox%=sel_end%:sel_end%=x%
3740IF sel_end%<=sel_start% sel_start%=sel_end%-1
3750IF sel_start%<0 sel_start%=0
3760IF sel_end%<=sel_start% sel_end%=sel_start%+1
3770IF x%>ox% SWAP x%,ox%
3780x%=x%*1150*zoom/samp_size%
3790ox%=ox%*1150*zoom/samp_size%
3800SYS &400D1,win_pane%,x%-8,-256,ox%+8,0
3810PROCnew_selection
3820ENDIF
3830ENDIF
3840ENDPROC
3850
3860DEFPROCscroll_pane(x%,q%)
3870!q%=win_pane%:SYS &400CB,,q%
3880IF x%>q%!12-16 PROCscrollx(win_pane%,(16-q%!12+x%)*4,q%+512)
3890IF x%<q%!4+16 PROCscrollx(win_pane%,(x%-q%!4-16)*4,q%+512)
3900ENDPROC
3910
3920DEFPROCscrollx(win%,off%,q%)
3930!q%=win%:SYS &400CB,,q%
3940q%!20=q%!20+off%
3950SYS &400C5,,q%
3960ENDPROC
3970
3980DEFPROCss
3990LOCAL a%,b%,x0%,y0%
4000a%=VAL(FNXicon_getstr(win_main%,22))
4010b%=VAL(FNXicon_getstr(win_main%,23))
4020IF a%>b% THEN
4030SWAP a%,b%
4040PROCXicon_putstr(win_main%,22,STR$a%)
4050PROCXicon_putstr(win_main%,23,STR$b%)
4060ENDIF
4070x0%=sel_start%*1150*zoom/samp_size%
4080x1%=sel_end%*1150*zoom/samp_size%
4090SYS &400D1,win_pane%,x0%-8,-256,x1%+8,0
4100sel_start%=a%
4110sel_end%=b%
4120IF sel_start%>=0 THEN
4130x0%=sel_start%*1150*zoom/samp_size%
4140x1%=sel_end%*1150*zoom/samp_size%
4150SYS &400D1,win_pane%,x0%-8,-256,x1%+8,0
4160ELSE
4170sel_start%=-1
4180sel_end%=-1
4190ENDIF
4200ENDPROC
4210
4220DEFPROCset_car
4230LOCAL x%,pos%:pos%=q%!0
4240x%=caret%*1150*zoom/samp_size%
4250SYS &400D1,win_pane%,x%-8,-256,x%+8,0
4260x%=caret%
4270!q%=win_pane%:SYS &400CB,,q%
4280caret%=(pos%-q%!4+q%!20)*samp_size%/1150/zoom
4290IF caret%<0 caret%=0
4300x%=caret%*1150*zoom/samp_size%
4310SYS &400D1,win_pane%,x%-8,-256,x%+8,0
4320PROCXicon_setstr(win_main%,18,STR$caret%)
4330IF tracking% AND !Vcounter>0 AND caret%<!Vsend-sample% THEN
4340!Vcounter=caret%+sample%
4350ENDIF
4360ENDPROC
4370
4380DEFPROCtrack
4390LOCAL x%
4400x%=caret%*1150*zoom/samp_size%
4410SYS &400D1,win_pane%,x%-2,-256,x%+2,0
4420caret%=!Vcounter-sample%
4430x%=caret%*1150*zoom/samp_size%
4440SYS &400D1,win_pane%,x%-2,-256,x%+2,0
4450PROCXicon_setstr(win_main%,18,STR$caret%)
4460IF caret%>=!Vsend-sample% !Vcounter=0
4470ENDPROC
4480
4490DEFPROCcrr(dir%)
4500IF caret%<0 ENDPROC
4510LOCAL x%
4520x%=caret%*1150*zoom/samp_size%
4530SYS &400D1,win_pane%,x%-8,-256,x%+8,0
4540caret%+=dir%
4550IF caret%<0 caret%=0
4560IF caret%>=samp_size% caret%=samp_size%-1
4570x%=caret%*1150*zoom/samp_size%
4580SYS &400D1,win_pane%,x%-8,-256,x%+8,0
4590PROCXicon_setstr(win_main%,18,STR$caret%)
4600IF tracking% AND !Vcounter>0 AND caret%<!Vsend-sample% THEN
4610!Vcounter=caret%+sample%
4620ENDIF
4630ENDPROC
4640
4650DEFPROCsc
4660LOCAL a%,x%
4670a%=VAL(FNXicon_getstr(win_main%,18))
4680x%=caret%*1150*zoom/samp_size%
4690SYS &400D1,win_pane%,x%-8,-256,x%+8,0
4700caret%=a%
4710IF caret%<0 caret%=-1
4720IF caret%>=0 THEN
4730x%=caret%*1150*zoom/samp_size%
4740SYS &400D1,win_pane%,x%-8,-256,x%+8,0
4750ENDIF
4760ENDPROC
4770
4780DEFPROCmess
4790IF q%!16=0 quit%=-1:ENDPROC
4800IF q%!16=1 PROCdata_save
4810IF q%!16=&400C0 PROCmenu_warn(q%!32,q%!36,q%!40)
4820IF q%!16=3 THEN IF FNgood_load(q%!40,FNz(q%+44),q%!36,1) PROCloadack
4830IF q%!16=2 PROCdatasave_ack
4840IF q%!16=5 THEN
4850 ok%=0:IF q%!40>&630 AND q%!40<&635 ok%=-1
4860 IF q%!40=&D3C ok%=-1
4870 IF ok% THEN
4880 PROCloadack
4890 a%=FNgood_load(q%!40,FNz(q%+44),q%!36,0)
4900 ENDIF
4910ENDIF
4920ENDPROC
4930
4940DEFPROCdata_save
4950q%!36=-1:$(q%+44)="<Wimp$Scrap>"+CHR$0
4960q%!12=q%!8:q%!16=2
4970SYS &400E7,17,q%,q%!4
4980saveref%=-1
4990VDU7
5000ENDPROC
5010
5020DEFPROCloadack
5030q%!12=q%!8:q%!16=4:q%!36=-1
5040SYS &400E7,17,q%,q%!4
5050ENDPROC
5060
5070DEFPROCload(n$)
5080SYS 8,17,n$ TO ,,typ%
5090typ%=(typ%AND&FFF00)>>8
5100OSCLI"Set Effex$Type "+STR$typ%
5110typ%=FNgood_load(typ%,n$,-1,1)
5120ENDPROC
5130
5140DEFFNgood_load(type%,name$,size%,drag%)
5150LOCAL ok%:ok%=-1
5160IF sample_type%>=0 ok%=FNcheck_load
5170IF ok%=-1 THEN
5180CASE type% OF
5190WHEN &631 : ok%=FNload_raw(name$,0)
5200WHEN &632 : ok%=FNload_raw(name$,1)
5210WHEN &633 : ok%=FNload_raw(name$,2)
5220WHEN &634 : ok%=FNload_eff(name$)
5230WHEN &D3C : ok%=FNload_arm(name$)
5240OTHERWISE : IF drag% ok%=FNload_raw(name$,2)
5250ENDCASE
5260ENDIF
5270IF ok% THEN
5280 q%!512=win_pane%
5290 SYS &400C6,,q%+512
5300 PROCfresh(win_main%,q%+512)
5310 IF name$<>"<Wimp$Scrap>" THEN
5320 sname_log$=name$
5330 sname_uns$=name$
5340 sname_sgn$=name$
5350 sname_eff$=name$
5360 sname_arm$=name$
5370 ELSE
5380 OSCLI"Remove <Wimp$Scrap>"
5390 ENDIF
5400ENDIF
5410=ok%
5420
5430DEFFNcheck_load
5440LOCAL go%,act%,win%,icon%
5450PROCfresh(win_load%,q%+512)
5460REM q%!512=win_load%:SYS "Wimp_GetWindowState",,q%+512
5470REM MOUSE RECTANGLE q%!516,q%!520,q%!524-q%!516,q%!528-q%!520
5480REPEAT
5490PROCdiapoll
5500UNTIL win%=win_load% AND icon%=10
5510act%=1
5520FOR go%=2 TO 9
5530q%!512=win_load%:q%!516=go%:SYS &400CE,,q%+512
5540IF (q%!(512+24)AND(1<<21))<>0 act%=go%-2:go%=9
5550NEXT
5560go%=OPENIN(name$):size%=EXT#go%:CLOSE#go%
5570CASE act% OF
5580WHEN 0 : PROCXmem_release(sample%):sample_type%=-1:go%=-1
5590WHEN 1 : go%=0
5600WHEN 2 : PROCav(0)
5610WHEN 3 : IF caret%>=0 PROCav(caret%) ELSE go%=0
5620WHEN 4 : PROCin(0)
5630WHEN 5 : IF caret%>=0 PROCin(caret%) ELSE go%=0
5640WHEN 6 : PROCov(0)
5650WHEN 7 : IF caret%>=0 PROCov(caret%) ELSE go%=0
5660OTHERWISE : go%=1
5670ENDCASE
5680VDU7
5690q%!512=win_load%
5700SYS &400C6,,q%+512
5710REM MOUSE RECTANGLE -4000,-4000,4000,4000
5720=go%
5730
5740DEFPROCav(pos%)
5750win%=FNXmem_claim(size%)
5760SYS 8,16,name$,win%,0
5770A%=win%:B%=win%+size%-1
5780C%=sample%+pos%:D%=sample%+samp_size%-1
5790E%=samp_centre%:CALL mix
5800PROCXmem_release(win%)
5810go%=1
5820ENDPROC
5830
5840DEFPROCin(pos%)
5850PROCXmem_delta(sample%,size%)
5860PROCcopy(pos%,samp_size%-1,pos%+size%)
5870SYS 8,16,name$,sample%+pos%,0
5880ENDPROC
5890
5900DEFPROCov(pos%)
5910IF samp_size%-pos%<size% size%=samp_size%-pos%
5920win%=OPENIN(name$)
5930SYS &C,4,win%,sample%+pos%,size%
5940CLOSE#win%
5950ENDPROC
5960
5970DEFPROCdiapoll
5980LOCAL r%
5990REPEAT
6000SYS &400C7,0,q%+512 TO r%
6010CASE r% OF
6020WHEN 2 : PROCopen(q%+512)
6030WHEN 3 : PROCopen(q%+512)
6040OTHERWISE : PROChandle_reason(r%,q%+512)
6050ENDCASE
6060UNTIL r%=6 AND q%!(512+8)<>2
6070win%=q%!(512+12):icon%=q%!(512+16)
6080ENDPROC
6090
6100DEFFNload_raw(name$,stype%)
6110LOCAL file%,pos%,not%,size%
6120file%=OPENIN(name$):size%=EXT#file%:CLOSE#file%
6130pos%=FNXmem_claim(size%)
6140IF pos%=0 ERROR 1,"Not enough memory (I need "+STR$size%+" bytes)"
6150SYS 8,16,name$,pos%,0
6160sample%=pos%:samp_size%=size%
6170sample_type%=stype%
6180sel_start%=-1
6190sel_end%=-1
6200PROCnew_selection
6210PROCnew_sample_type
6220PROCclr_all
6230CASE stype% OF
6240WHEN 0 : samp_centre%=128
6250WHEN 1 : samp_centre%=128
6260WHEN 2 : samp_centre%=0
6270ENDCASE
6280=-1
6290
6300DEFFNwget(pos%)
6310LOCAL a%
6320PTR#file%=pos%
6330a%=(BGET#file%)<<0
6340a%+=(BGET#file%)<<8
6350a%+=(BGET#file%)<<16
6360a%+=(BGET#file%)<<24
6370=a%
6380
6390DEFFNbget(pos%)
6400PTR#file%=pos%
6410=BGET#file%
6420
6430DEFPROCwput(w%)
6440BPUT#file%,(w%AND&FF)>>0
6450BPUT#file%,(w%AND&FF00)>>8
6460BPUT#file%,(w%AND&FF0000)>>16
6470BPUT#file%,(w%AND&FF000000)>>24
6480ENDPROC
6490
6500DEFFNload_eff(n$)
6510LOCAL file%,pos%,not%,size%,rate
6520file%=OPENIN(name$):size%=FNwget(4)
6530pos%=FNXmem_claim(size%)
6540IF pos%=0 ERROR 1,"Not enough memory (I need "+STR$size%+" bytes)"
6550SYS &C,3,file%,pos%,size%,FNwget(8)
6560sample%=pos%:samp_size%=size%
6570sample_type%=FNbget(0)
6580caret%=FNwget(12)
6590sel_start%=FNwget(16)
6600sel_end%=FNwget(20)
6610rate=FNwget(24)/(1<<24)
6620PROCXicon_setstr(win_main%,5,STR$rate)
6630PROCXicon_setstr(win_main%,4,STR$(1000/rate))
6640CLOSE#file%
6650PROCnew_selection
6660PROCnew_sample_type
6670CASE sample_type% OF
6680WHEN 0 : samp_centre%=128
6690WHEN 1 : samp_centre%=128
6700WHEN 2 : samp_centre%=0
6710ENDCASE
6720=-1
6730
6740DEFFNload_arm(n$)
6750LOCAL file%,pos%,not%,size%,rate
6760file%=OPENIN(name$):size%=EXT#file%-1
6770pos%=FNXmem_claim(size%)
6780IF pos%=0 ERROR 1,"Not enough memory (I need "+STR$size%+" bytes)"
6790SYS &C,3,file%,pos%,size%,1
6800sample%=pos%:samp_size%=size%
6810sample_type%=2
6820sel_start%=-1
6830sel_end%=-1
6840rate=1000/FNbget(0)
6850PROCXicon_setstr(win_main%,5,STR$rate)
6860PROCXicon_setstr(win_main%,4,STR$(1000/rate))
6870CLOSE#file%
6880PROCnew_selection
6890PROCnew_sample_type
6900samp_centre%=0
6910=-1
6920
6930DEFPROCmenu_warn(a%,b%,c%)
6940IF a%=1 THEN
6950 PROCsavewinp(b%)
6960 save_sample%=sample%
6970 save_samp_size%=samp_size%
6980 save_caret%=caret%
6990 save_sel_start%=sel_start%
7000 save_sel_end%=sel_end%
7010ELSE
7020 IF a%=0 AND b%=1 : PROCopen_sinfo:SYS &400E8,,q%!20,q%!24,q%!28
7030 IF a%=2 AND b%=11 THEN
7040 PROCsavewinp(c%)
7050 save_sample%=sample%+sel_start%
7060 save_samp_size%=sel_end%-sel_start%
7070 save_caret%=caret%-sel_start%
7080 save_sel_start%=0
7090 save_sel_end%=save_samp_size%
7100 IF save_caret%<0 save_caret%=0
7110 IF save_caret%>=save_samp_size% save_caret%=0
7120 ENDIF
7130ENDIF
7140ENDPROC
7150
7160DEFPROCsavewinp(b%)
7170 CASE b% OF
7180 WHEN 0 : $save_txt%=sname_log$
7190 PROCsavewin("631")
7200 save_size%=samp_size%
7210 WHEN 1 : $save_txt%=sname_sgn$
7220 PROCsavewin("632")
7230 save_size%=samp_size%
7240 WHEN 2 : $save_txt%=sname_uns$
7250 PROCsavewin("633")
7260 save_size%=samp_size%
7270 WHEN 3 : $save_txt%=sname_eff$
7280 PROCsavewin("634")
7290 save_size%=samp_size%
7300 WHEN 4 : $save_txt%=sname_arm$
7310 PROCsavewin("D3C")
7320 save_size%=samp_size%
7330 ENDCASE
7340ENDPROC
7350
7360DEFPROCsavewin(file_type$)
7370$save_valid%="Sfile_"+file_type$
7380file_type%=EVAL("&"+file_type$)
7390SYS &400E8,,q%!20,q%!24,q%!28
7400ENDPROC
7410
7420DEFPROCinit
7430icon_size%=4:menu_size%=8
7440icon_size%=icon_size%*1024:DIM icons% icon_size%
7450menu_size%=menu_size%*1024:DIM menus% menu_size%,q% 2048+512
7460DIM save_valid% 16,save_txt% 255,code% 1024,L%-1
7470Xtemp%=q%+512:PROCXwimp_init("Effex editor")
7480RESTORE 20150:PROCXwimp_templates(icons%,icons%+icon_size%)
7490PROCXmem_init(32)
7500quit%=0
7510num_libs%=0
7520DIM lib_name$(15),lib_pos%(15),lib_size%(15)
7530PROCvars
7540PROCcreicon
7550PROCgetwininfo
7560PROCinfo_win
7570PROCassem(code%)
7580PROCinit_voice
7590samp_size%=0:sample%=0:vdu%=5
7600zoom=1:sample_type%=-1:sel_start%=-1:sel_end%=-1
7610caret%=0:play_rate%=&1800
7620use_selection%=0:tracking%=0
7630ENDPROC
7640
7650DEFPROCvars
7660sname_log$="LogSample"
7670sname_uns$="RawSample"
7680sname_sgn$="SignSample"
7690sname_eff$="Sample"
7700sname_arm$="ArmaSample"
7710sname_sel$="Selection"
7720sname_lib$="SampLib"
7730mod0$="Y EOR (X AND 255) EOR (128*(X MOD2))"
7740mod1$=""
7750mod2$=""
7760mod3$=""
7770mod4$=""
7780ENDPROC
7790
7800DEFPROCgetwininfo
7810LOCAL a%:a%=q%+1024
7820!q%=win_main%
7830!a%=win_pane%
7840SYS &400CB,,q%
7850SYS &400CB,,a%
7860panex%=a%!4-q%!4
7870paney%=a%!8-q%!8
7880ENDPROC
7890
7900DEFPROCerr(fat%)
7910err$=REPORT$:IF INKEY(-3)=0 err$+=" at line "+STR$ERL
7920IF INKEY(-1) OSCLI"Set Err$Err "+err$:END
7930!q%=ERR:$(q%+4)=err$
7940SYS &400DF,q%,3,"Effex" TO ,resp%
7950IF resp%<>1 quit%=-1
7960IF quit% AND INKEY(-1) END
7970IF fat%<>0 END
7980ENDPROC
7990
8000DEFPROCinfo_win
8010PROCXicon_setstr(win_info%,2,"� Paul Mason, 1993")
8020PROCXicon_setstr(win_info%,3,"1.02 (08-Apr-1993)")
8030ENDPROC
8040
8050DEFPROCcreicon
8060!q%=-1:q%!4=0:q%!8=0:q%!12=64:q%!16=64
8070q%!20=&1700303A:$(q%+24)="!effex"
8080SYS &400C2,,q% TO iconbar%
8090ENDPROC
8100
8110DEFPROCcre_menus(start%,end%)
8120PROCcrem_icon
8130PROCcrem_main
8140ENDPROC
8150
8160DEFPROCcrem_icon
8170PROCXmenu_start("Effex",start%,end%):menu_icon%=r0%
8180PROCXmenu_additem("Info",win_info%)
8190PROCXmenu_additem("Clear all",-1)
8200PROCXmenu_additem("Quit",-1)
8210PROCXmenu_end(start%,end%)
8220ENDPROC
8230
8240DEFPROCmenusel
8250SYS &400CF,,q%+1024
8260adjust%=(q%!(1024+8)=1)
8270CASE Xmenu_ptr% OF
8280WHEN menu_icon% : PROCdecm_icon
8290WHEN menu_main% : PROCdecm_main
8300ENDCASE
8310IF adjust% SYS &400D4,,Xmenu_ptr%,Xmenu_x%,Xmenu_y%
8320ENDPROC
8330
8340DEFPROCdecm_icon
8350CASE q%!0 OF
8360WHEN 1 : IF sample_type%>=0 PROCXmem_release(sample%):sample_type%=-1
8370 !q%=win_main%:PROCclose(q%)
8380WHEN 2 : quit%=-1
8390ENDCASE
8400ENDPROC
8410
8420DEFPROCopen_save(win%)
8430CASE win% OF
8440WHEN 0 : PROCosavewin("631",sname_log$)
8450WHEN 1 : PROCosavewin("632",sname_sgn$)
8460WHEN 2 : PROCosavewin("633",sname_uns$)
8470WHEN 3 : PROCosavewin("634",sname_eff$)
8480WHEN 4 : PROCosavewin("D3C",sname_arm$)
8490ENDCASE
8500ENDPROC
8510
8520DEFPROCosavewin(type$,a$)
8530$save_txt%=a$
8540SYS &400CF,,q%+1024
8550$save_valid%="Sfile_"+type$
8560file_type%=EVAL("&"+type$)
8570save_size%=samp_size%
8580SYS &400D4,,win_save%,q%!1024,q%!1028
8590ENDPROC
8600
8610DEFFNkey_ok(k%)
8620LOCAL ok%:ok%=-1
8630PROCvalid_sel
8640CASE k%+64 OF
8650WHEN ASC"A" : PROCadj_sel(0,samp_size%-1)
8660WHEN ASC"C" : PROCcopy_sel
8670WHEN ASC"I" : PROCfadein(Sstart%,Send%)
8680WHEN ASC"L" : PROCXicon_setstr(win_main%,25,"127"):?Vvol=127
8690WHEN ASC"O" : PROCfadeout(Sstart%,Send%)
8700WHEN ASC"P" : PROCply
8710WHEN ASC"S" : ?Vcommand=1:WAIT:?Vcommand=0:!Vcounter=0
8720WHEN ASC"T" : tracking%=NOTtracking%:PROCXmenu_tick(menu_track%,tracking%)
8730WHEN ASC"E" : PROCply_sel
8740WHEN ASC"V" : PROCmove_sel
8750WHEN ASC"X" : PROCdel_sel
8760WHEN ASC"Y" : PROCcopy2_sel
8770WHEN ASC"Z" : PROCadj_sel(-1,-1)
8780WHEN ASC"Z"+64 : PROCselzm
8790WHEN 32+64 : PROCcont
8800WHEN &183+64: PROCopen_save(3)
8810OTHERWISE : ok%=0
8820ENDCASE
8830=ok%
8840
8850DEFPROCcont
8860LOCAL s
8870IF sample_type%>=0 AND caret%>0 AND caret%<!Vsend THEN
8880s=VALFNXicon_getstr(win_main%,5)
8890PROCplay(caret%+sample%,!Vsend,0,s)
8900ENDIF
8910ENDPROC
8920
8930DEFPROCcheck_all(cc%)
8940IF caret%<0 AND cc%<>0 ERROR 1,"No caret present"
8950IF sel_start%<0 ERROR 1,"No selection"
8960ENDPROC
8970
8980DEFPROCcopy2_sel
8990PROCcheck_all(-1)
9000A%=sel_start%+sample%
9010B%=sel_end%+sample%
9020C%=caret%+sample%
9030D%=sample%+samp_size%
9040CALL copy
9050PROCred
9060ENDPROC
9070
9080DEFPROCinsert(pos%,size%)
9090PROCXmem_delta(sample%,size%)
9100PROCcopy(pos%,samp_size%-1,pos%+size%)
9110IF caret%>pos% caret%+=size%
9120samp_size%+=size%
9130IF sel_start%>pos% sel_start%+=size%
9140IF sel_end%>pos% sel_end%+=size%
9150ENDPROC
9160
9170DEFPROCdelete(start%,end%)
9180IF end%<samp_size%-1 PROCcopy(end%,samp_size%-1,start%)
9190PROCXmem_delta(sample%,start%-end%)
9200IF caret%>=start% AND caret%<=end% caret%=start%
9210IF sel_start%>=start% AND sel_start%<=end% sel_start%=start%
9220IF sel_end%>=start% AND sel_end%<=end% sel_end%=start%
9230IF caret%>start% caret%-=end%-start%
9240samp_size%-=end%-start%
9250ENDPROC
9260
9270DEFPROCdel_sel
9280PROCcheck_all(0)
9290PROCdelete(sel_start%,sel_end%)
9300sel_start%=-1
9310sel_end%=-1
9320PROCred
9330ENDPROC
9340
9350DEFPROCcopy_sel
9360PROCcheck_all(-1)
9370IF caret%>=sel_start% AND caret%<=sel_end% ERROR 1,"Cannot copy inside selection"
9380PROCinsert(caret%,sel_end%-sel_start%)
9390PROCcopy(sel_start%,sel_end%,caret%)
9400PROCred
9410ENDPROC
9420
9430DEFPROCmove_sel
9440LOCAL size%,pos%
9450PROCcheck_all(-1)
9460size%=sel_end%-sel_start%
9470pos%=FNXmem_claim(size%)
9480PROCcopy(sel_start%,sel_end%,pos%-sample%)
9490PROCdelete(sel_start%,sel_end%)
9500PROCinsert(caret%,size%)
9510PROCcopy(pos%-sample%,pos%-sample%+size%-1,caret%)
9520PROCXmem_release(pos%)
9530sel_start%=caret%
9540sel_end%=caret%+size%
9550PROCred
9560ENDPROC
9570
9580DEFPROCmodulate(s$,s%,e%)
9590LOCAL len%,Z:len%=e%-s%
9600Z=samp_centre%
9610SYS "Hourglass_On"
9620FOR X=s%-sample% TO e%-sample%:Y=sample%?X:Y=EVAL(s$):IF Y>255 Y=255
9630SYS &406C4,(X-s%+sample%)*100/len%:IF Y<0 Y=0
9640sample%?X=Y:Z=Y:NEXT
9650PROCred
9660SYS "Hourglass_Off"
9670ENDPROC
9680
9690DEFPROCselzm
9700PROCzoom(999,(sel_end%-sel_start%)*999/samp_size%)
9710!q%=win_pane%:SYS &400CC,,q%
9720q%!20=q%!52*sel_start%/samp_size%
9730SYS &400C5,,q%
9740ENDPROC
9750
9760DEFPROCdecm_main
9770CASE !q% OF
9780WHEN 0 : CASE q%!4 OF
9790 WHEN 2 : sample_type%=0:PROCnew_sample_type
9800 WHEN 3 : sample_type%=1:PROCnew_sample_type
9810 WHEN 4 : sample_type%=2:PROCnew_sample_type
9820 WHEN 5 : PROClin2log
9830 sample_type%=0:PROCnew_sample_type
9840 WHEN 6 : PROClog2lin
9850 sample_type%=1:PROCnew_sample_type
9860 WHEN 7 : PROCeor(128,sample%,samp_size%+sample%-1)
9870 sample_type%=sample_type%EOR3:PROCnew_sample_type
9880 WHEN 8 : PROCcalc_centre
9890 ENDCASE
9900WHEN 1 : CASE q%!4 OF
9910 WHEN 0,1,2,3,4 : PROCopen_save(q%!4)
9920 ENDCASE
9930WHEN 2 : CASE q%!4 OF
9940 WHEN 0 : PROCadj_sel(0,samp_size%-1)
9950 WHEN 1 : PROCadj_sel(-1,-1)
9960 WHEN 2 : PROCdel_sel
9970 WHEN 3 : PROCcopy_sel
9980 WHEN 4 : PROCcopy2_sel
9990 WHEN 5 : PROCmove_sel
10000 WHEN 6 : PROCmix
10010 WHEN 7 : PROCpremix
10020 WHEN 8 : PROCpostmix
10030 WHEN 9 : PROCselzm
10040 WHEN 10: PROCply_sel
10050 ENDCASE
10060WHEN 3 : PROCvalid_sel
10070 CASE q%!4 OF
10080 WHEN 0 : PROCtoggle_sel
10090 WHEN 1 : PROCreverse(Sstart%,Send%)
10100 WHEN 2 : PROCamp(0,Sstart%,Send%)
10110 WHEN 3 : PROCfadein(Sstart%,Send%)
10120 WHEN 4 : PROCfadeout(Sstart%,Send%)
10130 WHEN 5 : PROCamp((EVALFNz(amplify%))/100,Sstart%,Send%)
10140 WHEN 6 : PROCamp(100/EVALFNz(amplify%),Sstart%,Send%)
10150 WHEN 7 : PROCeor(EVALFNz(eor_const%),Sstart%,Send%)
10160 WHEN 8 : PROCadd(EVALFNz(add_const%),Sstart%,Send%)
10170 WHEN 9 : PROChpf(FNz(hp_filter%),Sstart%,Send%)
10180 WHEN 10: PROClpf(FNz(lp_filter%),Sstart%,Send%)
10190 WHEN 11: PROCcore(EVALFNz(core_filt%),Sstart%,Send%)
10200 WHEN 12: PROCloboost(1/EVALFNz(fboost%),Sstart%,Send%)
10210 WHEN 13: PROCloboost(EVALFNz(fboost%),Sstart%,Send%)
10220 WHEN 14: CASE q%!8 OF
10230 WHEN 0 : PROCmodulate(FNz(menu_mod0%),Sstart%,Send%)
10240 WHEN 1 : PROCmodulate(FNz(menu_mod1%),Sstart%,Send%)
10250 WHEN 2 : PROCmodulate(FNz(menu_mod2%),Sstart%,Send%)
10260 WHEN 3 : PROCmodulate(FNz(menu_mod3%),Sstart%,Send%)
10270 WHEN 4 : PROCmodulate(FNz(menu_mod4%),Sstart%,Send%)
10280 ENDCASE
10290 WHEN 15: CASE q%!8 OF
10300 WHEN 0,1:
10310 WHEN 2 : PROCecho(EVALFNz(echo_length%),VALFNz(echo_strength%))
10320 WHEN 3 : PROCflange(EVALFNz(echo_length%),VALFNz(echo_strength%))
10330 WHEN 4 : PROChallecho(EVALFNz(echo_length%),VALFNz(echo_strength%))
10340 ENDCASE
10350 ENDCASE
10360REM WHEN 4 : CASE q%!4 OF
10370 REM WHEN 0 : IF q%!8>-1 PROCadd_libentry(FNz(lib_name%))
10380 REM WHEN 1 :
10390 REM WHEN 2 :
10400 REM WHEN 3 : IF q%!8>-1 PROCdel_libentry(q%!8)
10410 REM ENDCASE
10420WHEN 4 : CASE q%!4 OF
10430 WHEN 0 : PROCply
10440 WHEN 1 : ?Vcommand=1:WAIT:?Vcommand=0:!Vcounter=0
10450 WHEN 2 : tracking%=NOTtracking%:PROCXmenu_tick(menu_track%,tracking%)
10460 WHEN 3 : PROCcont
10470 WHEN 4 : PROCpitch_bend(1)
10480 WHEN 5 : PROCpitch_bend(-1)
10490 WHEN 6 : PROCXicon_setstr(win_main%,25,"127"):?Vvol=127
10500 ENDCASE
10510ENDCASE
10520ENDPROC
10530
10540DEFPROCecho(D%,str)
10550A%=Sstart%
10560B%=Send%
10570C%=samp_centre%
10580E%=(str/100)*(1<<12)
10590CALL echo
10600ENDPROC
10610
10620DEFPROChallecho(a%,b)
10630WHILE b>=1
10640PROCflange(a%,b)
10650a%=a%*2:b=b/2
10660ENDWHILE
10670ENDPROC
10680
10690DEFPROCflange(D%,str)
10700A%=Sstart%
10710B%=Send%
10720C%=samp_centre%
10730E%=(str/100)*(1<<12)
10740CALL flange
10750ENDPROC
10760
10770DEFPROCvalid_sel
10780IF use_selection% AND sel_start%>=0 THEN
10790Sstart%=sel_start%
10800Send%=sel_end%:IF Send%>samp_size%-1 Send%=samp_size%-1
10810ELSE
10820Sstart%=0
10830Send%=samp_size%-1
10840ENDIF
10850Sstart%+=sample%
10860Send%+=sample%
10870ENDPROC
10880
10890DEFPROCcalc_centre
10900A%=sample%:B%=A%+samp_size%-1
10910C%=0:CALL calc_centre
10920samp_centre%=(!centre_val)/samp_size%+0.5
10930ENDPROC
10940
10950DEFPROClin2log
10960LOCAL vol%,a%,b%:SYS &40180,127 TO vol%
10970FOR a%=0 TO 255
10980SYS &40181,(a%-128)<<24 TO b%
10990q%?a%=b%
11000NEXT
11010A%=sample%:B%=samp_size%:C%=q%
11020CALL convert
11030SYS &40180,vol%
11040PROCred
11050ENDPROC
11060
11070DEFPROClog2lin
11080LOCAL vol%,a%,b%:SYS &40180,127 TO vol%
11090FOR a%=0 TO 255
11100SYS &40181,(a%-128)<<24 TO b%
11110q%?b%=a%
11120NEXT
11130A%=sample%:B%=samp_size%:C%=q%
11140CALL convert
11150SYS &40180,vol%
11160PROCred
11170ENDPROC
11180
11190DEFPROCloboost(val,A%,B%)
11200LOCAL a%
11210FOR a%=0 TO 255
11220q%!(a%<<2)=((255-a%)*val+a%)*(1<<12)DIV255
11230NEXT
11240D%=samp_centre%
11250C%=q%
11260CALL boost
11270PROCred
11280ENDPROC
11290
11300DEFPROChiboost(val,A%,B%)
11310LOCAL a%
11320FOR a%=0 TO 255
11330q%!(a%<<2)=(a%*val+255-a%)*(1<<12)DIV255
11340NEXT
11350D%=samp_centre%
11360C%=q%
11370CALL boost
11380PROCred
11390ENDPROC
11400
11410DEFPROCreverse(A%,B%)
11420CALL reverse
11430PROCred
11440ENDPROC
11450
11460DEFPROCamp(a,A%,B%)
11470C%=samp_centre%
11480D%=a*(1<<12)
11490CALL amp
11500PROCred
11510ENDPROC
11520
11530DEFPROCfadein(A%,B%)
11540C%=samp_centre%
11550CALL fadein
11560PROCred
11570ENDPROC
11580
11590DEFPROCfadeout(A%,B%)
11600C%=samp_centre%
11610CALL fadeout
11620PROCred
11630ENDPROC
11640
11650DEFPROCeor(C%,A%,B%)
11660CALL eor
11670PROCred
11680ENDPROC
11690
11700DEFPROCadd(C%,A%,B%)
11710CALL add
11720PROCred
11730ENDPROC
11740
11750DEFPROCred
11760!q%=win_pane%:SYS &400CB,,q%
11770SYS &400D1,win_pane%,q%!20,-256,q%!20+1150,0
11780ENDPROC
11790
11800DEFPROCinit_voice
11810LOCAL a%
11820SYS &40140,0,0,0,0,0 TO num_chan%
11830IF num_chan%>2 a%=num_chan% ELSE a%=2
11840SYS &40140,a%,0,0,0,0
11850SYS "Sound_InstallVoice",Vbase,0 TO ,voice_slot%
11860ENDPROC
11870
11880DEFPROCquit_voice
11890SYS &40140,num_chan%,0,0,0,0
11900SYS "Sound_RemoveVoice",,voice_slot%
11910ENDPROC
11920
11930DEFPROCpitch_bend(change)
11940play_rate%+=change*16
11950SOUND 2,&1FF,play_rate%,255
11960ENDPROC
11970
11980DEFPROChpf(s$,A%,B%)
11990CASE LEFT$(s$,1) OF
12000WHEN "+","-" : C%=samp_centre%+VALs$
12010OTHERWISE : C%=VALs$
12020ENDCASE
12030CALL hp_filt
12040PROCred
12050ENDPROC
12060
12070DEFPROClpf(s$,A%,B%)
12080CASE LEFT$(s$,1) OF
12090WHEN "+","-" : C%=samp_centre%+VALs$
12100OTHERWISE : C%=VALs$
12110ENDCASE
12120CALL lp_filt
12130PROCred
12140ENDPROC
12150
12160DEFPROCcore(v%,A%,B%)
12170E%=samp_centre%
12180C%=E%-v%
12190D%=E%+v%
12200CALL core_filt
12210PROCred
12220ENDPROC
12230
12240DEFPROCplay(pos%,end%,vol%,rate)
12250LOCAL a%,b%,c%
12260c%=tab_start:rate=INT(6144/12.5*rate+0.5)
12270!Vspos=pos%:!Vsend=end%
12280!Vconv_tab=tab_start
12290FOR a%=0 TO 255
12300CASE sample_type% OF
12310WHEN 0 : c%?a%=a%
12320WHEN 1 : SYS &40181,(a%-128)<<24 TO c%?a%
12330WHEN 2 : SYS &40181,((a%EOR128)-128)<<24 TO c%?a%
12340ENDCASE
12350NEXT
12360SYS &40185,2,voice_slot%
12370SYS &40142,2,0
12380SOUND 2,&17F,rate,255
12390play_rate%=rate
12400ENDPROC
12410
12420DEFPROCcopy(A%,B%,C%)
12430A%+=sample%
12440B%+=sample%
12450C%+=sample%
12460CALL copy
12470ENDPROC
12480
12490DEFPROCcheck_limits
12500LOCAL a%,b%
12510IF Sstart%<sample% Sstart%=sample%
12520IF Send%>=sample%+samp_size% Send%=sample%+samp_size%-1
12530a%=sel_start%
12540IF sel_start%<0 a%=0
12550b%=sel_end%
12560IF sel_end%>=sample%+samp_size% sel_end%=sample%+samp_size%-1
12570PROCadj_sel(a%,b%)
12580ENDPROC
12590
12600DEFPROCtoggle_sel
12610use_selection%=NOT use_selection%
12620PROCXmenu_tick(menu_selfx%,use_selection%)
12630ENDPROC
12640
12650DEFPROCclr_all
12660use_selection%=0
12670PROCXmenu_tick(menu_selfx%,0)
12680ENDPROC
12690
12700DEFPROCnew_sample_type
12710LOCAL shade%,tick%:shade%=%1111:tick%=0
12720CASE sample_type% OF
12730WHEN 0 : shade%=%0101:tick%=%1001:samp_centre%=128
12740WHEN 1 : shade%=%0010:tick%=%1010:samp_centre%=128
12750WHEN 2 : shade%=%0011:tick%=%0100:samp_centre%=0
12760ENDCASE
12770PROCXmenu_shade(menu_conv%+0,shade%AND1)
12780PROCXmenu_shade(menu_conv%+24,shade%AND2)
12790PROCXmenu_shade(menu_conv%+48,shade%AND4)
12800PROCXmenu_shade(menu_conv%+72,shade%AND8)
12810PROCXmenu_tick(menu_stype%+0,tick%AND1)
12820PROCXmenu_shade(menu_save%+0,(tick%AND7)EOR1)
12830PROCXmenu_tick(menu_stype%+24,tick%AND2)
12840PROCXmenu_shade(menu_save%+24,(tick%AND7)EOR2)
12850PROCXmenu_tick(menu_stype%+48,tick%AND4)
12860PROCXmenu_shade(menu_save%+48,(tick%AND7)EOR4)
12870PROCXmenu_shade(menu_save%+96,tick%AND8)
12880ENDPROC
12890
12900DEFPROCdo_libentries
12910LOCAL a%
12920IF num_libs%<=0 THEN
12930PROCXmenu_shade(menu_lib%+24*1,1)
12940PROCXmenu_shade(menu_lib%+24*2,1)
12950PROCXmenu_shade(menu_lib%+24*3,1)
12960$(sub_lib2%+40)=""
12970sub_lib2%!28=128
12980sub_lib2%!36=sub_lib%!36OR(1<<22)
12990ELSE
13000sub_lib2%!36=sub_lib%!36AND(NOT(1<<22))
13010PROCXmenu_shade(menu_lib%+24*1,0)
13020PROCXmenu_shade(menu_lib%+24*2,0)
13030PROCXmenu_shade(menu_lib%+24*3,0)
13040FOR a%=0 TO num_libs%-1
13050$(sub_lib2%+40+a%*24)=LEFT$(lib_name$(a%),11)
13060sub_lib2%!(28+a%*24)=sub_lib2%!(28+a%*24)AND(NOT128)
13070NEXT
13080sub_lib2%!(4+num_libs%*24)=sub_lib2%!(4+num_libs%*24)OR128
13090ENDIF
13100ENDPROC
13110
13120DEFPROCadd_libentry(s$)
13130LOCAL a%,si%
13140s$=LEFT$(s$,11)
13150IF num_libs%>=16 ERROR 1,"Too many library entries (can only have 16)"
13160lib_name$(num_libs%)=s$
13170si%=sel_end%-sel_start%+1
13180IF sel_start%<0 ERROR 1,"No selection to add!"
13190a%=FNXmem_claim(si%):IF a%=0 ERROR 1,"No room to add entry"
13200lib_pos%(num_libs%)=a%
13210lib_size%(num_libs%)=si%
13220num_libs%+=1
13230PROCdo_libentries
13240ENDPROC
13250
13260DEFPROCdel_libentry(s%)
13270LOCAL a%
13280PROCXmem_release(lib_pos%(s%))
13290num_libs%-=1
13300IF s%>=num_libs% PROCdo_libentries:ENDPROC
13310FOR a%=s% TO num_libs%-1
13320lib_name$(a%)=lib_name$(a%+1)
13330lib_pos%(a%)=lib_pos%(a%+1)
13340lib_size%(a%)=lib_size%(a%+1)
13350PROCdo_libentries
13360ENDPROC
13370
13380DEFPROCadj_sel(a%,b%)
13390sel_start%=a%:sel_end%=b%
13400PROCnew_selection
13410!q%=win_pane%:SYS &400CB,,q%
13420SYS &400D1,win_pane%,q%!20,-256,q%!20+1149,0
13430ENDPROC
13440
13450DEFPROCsamp_mix(A%,B%,C%)
13460A%+=sample%
13470B%+=sample%
13480C%+=sample%
13490D%=sample%+samp_size%-1
13500E%=samp_centre%:CALL mix
13510ENDPROC
13520
13530DEFPROCmix
13540PROCcheck_all(-1)
13550IF caret%>=sel_start% AND caret%<=sel_end% ERROR 1,"Cannot mix within selection"
13560PROCsamp_mix(sel_start%,sel_end%,caret%)
13570ENDPROC
13580
13590DEFPROCpremix
13600LOCAL size%
13610PROCcheck_all(0)
13620size%=sel_end%-sel_start%
13630C%=sel_start%-size%+sample%
13640D%=sel_start%-1+sample%
13650A%=sel_start%+sample%
13660B%=sel_end%+sample%
13670E%=samp_centre%:CALL mix
13680ENDPROC
13690
13700DEFPROCpostmix
13710PROCcheck_all(0)
13720PROCsamp_mix(sel_start%,sel_end%,sel_end%+1)
13730ENDPROC
13740
13750DEFPROCnew_selection
13760CASE TRUE OF
13770WHEN sel_start%>=0 AND sel_end%>sel_start%
13780 PROCXmenu_shade(menu_sel%+24*0,0)
13790 PROCXmenu_shade(menu_sel%+24*1,0)
13800 PROCXmenu_shade(menu_sel%+24*2,0)
13810 PROCXmenu_shade(menu_sel%+24*3,0)
13820 PROCXmenu_shade(menu_sel%+24*4,0)
13830 PROCXmenu_shade(menu_sel%+24*5,0)
13840 PROCXmenu_shade(menu_sel%+24*6,0)
13850 PROCXmenu_shade(menu_sel%+24*7,0)
13860 PROCXmenu_shade(menu_sel%+24*8,0)
13870 PROCXmenu_shade(menu_sel%+24*9,0)
13880 PROCXmenu_shade(menu_sel%+24*10,0)
13890 PROCXmenu_shade(menu_sel%+24*11,0)
13900 PROCXmenu_shade(menu_lib%,0)
13910 PROCXmenu_shade(menu_selfx%,0)
13920WHEN sel_start%=0 AND sel_end%=samp_size%-1
13930 PROCXmenu_shade(menu_sel%+24*0,1)
13940 PROCXmenu_shade(menu_sel%+24*1,0)
13950 PROCXmenu_shade(menu_sel%+24*2,0)
13960 PROCXmenu_shade(menu_sel%+24*3,0)
13970 PROCXmenu_shade(menu_sel%+24*4,0)
13980 PROCXmenu_shade(menu_sel%+24*5,0)
13990 PROCXmenu_shade(menu_sel%+24*6,0)
14000 PROCXmenu_shade(menu_sel%+24*7,0)
14010 PROCXmenu_shade(menu_sel%+24*8,0)
14020 PROCXmenu_shade(menu_sel%+24*9,0)
14030 PROCXmenu_shade(menu_sel%+24*10,0)
14040 PROCXmenu_shade(menu_sel%+24*11,0)
14050 PROCXmenu_shade(menu_lib%,0)
14060 PROCXmenu_shade(menu_selfx%,0)
14070OTHERWISE
14080 PROCXmenu_shade(menu_sel%+24*0,0)
14090 PROCXmenu_shade(menu_sel%+24*1,1)
14100 PROCXmenu_shade(menu_sel%+24*2,1)
14110 PROCXmenu_shade(menu_sel%+24*3,1)
14120 PROCXmenu_shade(menu_sel%+24*4,1)
14130 PROCXmenu_shade(menu_sel%+24*5,1)
14140 PROCXmenu_shade(menu_sel%+24*6,1)
14150 PROCXmenu_shade(menu_sel%+24*7,1)
14160 PROCXmenu_shade(menu_sel%+24*8,1)
14170 PROCXmenu_shade(menu_sel%+24*9,1)
14180 PROCXmenu_shade(menu_sel%+24*10,1)
14190 PROCXmenu_shade(menu_sel%+24*11,1)
14200 PROCXmenu_shade(menu_lib%,1)
14210 PROCXmenu_shade(menu_selfx%,1)
14220ENDCASE
14230PROCXicon_setstr(win_main%,22,STR$sel_start%)
14240PROCXicon_setstr(win_main%,23,STR$sel_end%)
14250ENDPROC
14260
14270DEFPROCopen_sinfo
14280PROCset_sinfo(0,caret%)
14290PROCset_sinfo(4,sel_start%)
14300PROCset_sinfo(8,sel_end%)
14310PROCset_sinfo(12,sel_end%-sel_start%)
14320PROCset_sinfo(16,samp_size%)
14330ENDPROC
14340
14350DEFPROCset_sinfo(ic%,data%)
14360LOCAL rate%:rate%=VALFNXicon_getstr(win_main%,5)*1000
14370IF data%>-1 THEN
14380PROCXicon_setstr(win_sampinfo%,ic%,LEFT$(STR$(data%/1024),8))
14390PROCXicon_setstr(win_sampinfo%,ic%+1,LEFT$(STR$data%,8))
14400PROCXicon_setstr(win_sampinfo%,ic%+2,LEFT$(STR$(data%/rate%),8))
14410PROCXicon_setstr(win_sampinfo%,ic%+3,LEFT$(STR$(data%/rate%*100),8))
14420ELSE
14430PROCXicon_setstr(win_sampinfo%,ic%,"None")
14440PROCXicon_setstr(win_sampinfo%,ic%+1,"None")
14450PROCXicon_setstr(win_sampinfo%,ic%+2,"None")
14460PROCXicon_setstr(win_sampinfo%,ic%+3,"None")
14470ENDIF
14480ENDPROC
14490
14500DEFPROCcrem_main
14510PROCXmenu_start("Misc",start%,end%):sub_misc%=r0%
14520PROCXmenu_additem("Program",win_info%)
14530PROCXmenu_additem("Sample",win_sampinfo%)
14540PROCXmenu_message(r0%)
14550PROCXmenu_dot
14560PROCXmenu_additem("Log sample",-1):menu_stype%=r0%
14570PROCXmenu_additem("Signed sample",-1)
14580PROCXmenu_additem("Unsigned sample",-1)
14590PROCXmenu_dot
14600PROCXmenu_additem("Lin2Log",-1):menu_conv%=r0%
14610PROCXmenu_additem("Log2Lin",-1)
14620PROCXmenu_additem("(Un)sign",-1)
14630PROCXmenu_dot
14640PROCXmenu_additem("Calc. centre",-1)
14650PROCXmenu_end(start%,end%)
14660REM
14670PROCXmenu_start("Save",start%,end%):sub_save%=r0%
14680PROCXmenu_additem("Log",win_save%):menu_save%=r0%
14690PROCXmenu_message(r0%)
14700PROCXmenu_additem("Signed",win_save%)
14710PROCXmenu_message(r0%)
14720PROCXmenu_additem("Unsigned",win_save%)
14730PROCXmenu_message(r0%)
14740PROCXmenu_dot
14750PROCXmenu_additem("Effex",win_save%)
14760PROCXmenu_message(r0%)
14770PROCXmenu_additem("Armadeus",win_save%)
14780PROCXmenu_message(r0%)
14790PROCXmenu_end(start%,end%)
14800REM
14810PROCXmenu_start("Selection",start%,end%):sub_sel%=r0%
14820PROCXmenu_additem("Select all ^A",-1):menu_sel%=r0%
14830PROCXmenu_additem("Clear selection ^Z",-1)
14840PROCXmenu_dot
14850PROCXmenu_additem("Delete ^X",-1)
14860PROCXmenu_additem("Copy ^C",-1)
14870PROCXmenu_additem("Copy over ^Y",-1)
14880PROCXmenu_additem("Move ^V",-1)
14890PROCXmenu_dot
14900PROCXmenu_additem("Mix",-1)
14910PROCXmenu_additem("Pre-mix",-1)
14920PROCXmenu_additem("Post-mix",-1)
14930PROCXmenu_dot
14940PROCXmenu_additem("Zoom Z",-1)
14950PROCXmenu_additem("Play ^E",-1)
14960PROCXmenu_additem("Save selection",sub_save%)
14970PROCXmenu_end(start%,end%)
14980REM
14990PROCXmenu_start("Echo",start%,end%):sub_echo%=r0%
15000PROCXmenu_addwrs("Length","a0-9,&,A-F,a-f","128",echo_length%)
15010PROCXmenu_addwrs("Strength","a0-9,.","60",echo_strength%)
15020PROCXmenu_dot
15030PROCXmenu_additem("Normal echo E",-1)
15040PROCXmenu_additem("Flange echo F",-1)
15050PROCXmenu_additem("Hall echo H",-1)
15060PROCXmenu_end(start%,end%)
15070REM
15080PROCXmenu_start("Modulate",start%,end%):sub_mod%=r0%
15090PROCXmenu_addinput("",64,10):menu_mod0%=Xmenu_end%:$Xmenu_end%=mod0$
15100PROCXmenu_addinput("",64,10):menu_mod1%=Xmenu_end%:$Xmenu_end%=mod1$
15110PROCXmenu_addinput("",64,10):menu_mod2%=Xmenu_end%:$Xmenu_end%=mod2$
15120PROCXmenu_addinput("",64,10):menu_mod3%=Xmenu_end%:$Xmenu_end%=mod3$
15130PROCXmenu_addinput("",64,10):menu_mod4%=Xmenu_end%:$Xmenu_end%=mod4$
15140PROCXmenu_end(start%,end%)
15150REM
15160PROCXmenu_start("Effects",start%,end%):sub_fx%=r0%
15170PROCXmenu_additem("Selection",-1):menu_selfx%=r0%
15180PROCXmenu_dot
15190PROCXmenu_additem("Reverse",-1)
15200PROCXmenu_additem("Silence",-1)
15210PROCXmenu_additem("Fade in ^I",-1)
15220PROCXmenu_additem("Fade out ^O",-1)
15230PROCXmenu_dot
15240PROCXmenu_addwrs("Amplify","a0-9","100",amplify%)
15250REM PROCXmenu_shade(r0%,1)
15260PROCXmenu_addwrs2("Quieten",amplify%)
15270PROCXmenu_addwrs("Eor const","a0-9,&,A-F,a-f","0",eor_const%)
15280PROCXmenu_addwrs("Add const","a0-9,&,A-F,a-f","0",add_const%)
15290PROCXmenu_addwrs("HA filter","a0-9,+,\-","+96",hp_filter%)
15300PROCXmenu_addwrs("LA filter","a0-9,+,\-","-96",lp_filter%)
15310PROCXmenu_addwrs("Core filter","a0-9,&,A-F,a-f","16",core_filt%)
15320PROCXmenu_addwrs("LF boost","a0-9,.","1.5",fboost%)
15330PROCXmenu_addwrs2("HF boost",fboost%)
15340PROCXmenu_additem("Modulate",sub_mod%)
15350PROCXmenu_additem("Echo",sub_echo%)
15360PROCXmenu_end(start%,end%)
15370REM
15380PROCXmenu_start("Playing",start%,end%):sub_play%=r0%
15390PROCXmenu_additem("Play ^P",-1)
15400PROCXmenu_additem("Stop ^S",-1)
15410PROCXmenu_additem("Play tracking ^T",-1):menu_track%=r0%
15420PROCXmenu_additem("Continue SPC",-1)
15430PROCXmenu_dot
15440PROCXmenu_additem("Pitch up",-1)
15450PROCXmenu_additem("Pitch down",-1)
15460PROCXmenu_dot
15470PROCXmenu_additem("Max. volume ^L",-1)
15480PROCXmenu_end(start%,end%)
15490REM
15500PROCXmenu_start("Entries",start%,end%):sub_lib2%=r0%
15510FORa%=0TO15:PROCXmenu_additem("12345678901",-1):NEXT
15520PROCXmenu_end(start%,end%)
15530REM
15540PROCXmenu_start("Library",start%,end%):sub_lib%=r0%
15550PROCXmenu_addwrs("Add ^L","aa-z,AA-Z,0-9","Entry",lib_name%)
15560menu_lib%=sub_lib%+28
15570PROCXmenu_additem("Insert",sub_lib2%):menu_lpaste%=r0%
15580PROCXmenu_additem("Overwrite",sub_lib2%)
15590PROCXmenu_additem("Delete",sub_lib2%)
15600PROCXmenu_end(start%,end%)
15610REM
15620PROCXmenu_start("Effex",start%,end%):menu_main%=r0%
15630PROCXmenu_additem("Misc",sub_misc%)
15640PROCXmenu_additem("Save",sub_save%)
15650PROCXmenu_dot
15660PROCXmenu_additem("Selection",sub_sel%)
15670PROCXmenu_additem("Effects",sub_fx%)
15680PROCXmenu_dot
15690PROCXmenu_additem("Playing",sub_play%)
15700PROCXmenu_end(start%,end%)
15710PROCnew_sample_type
15720PROCnew_selection
15730PROCdo_libentries
15740ENDPROC
15750
15760DEFPROCassem(code%)
15770claimed_code%=FNXmem_claim(4096)
15780FOR opt%=8 TO 10 STEP 2
15790P%=code%
15800[OPT opt%
15810.reverse
15820; R0 = start
15830; R1 = end
15840CMP R0,R1
15850MOVGE PC,R14
15860LDRB R2,[R0]
15870LDRB R3,[R1]
15880STRB R3,[R0],#1
15890STRB R2,[R1],#-1
15900B reverse
15910
15920.calc_centre
15930; R0 = start
15940; R1 = end
15950; R2 = tally
15960CMP R0,R1
15970STRGT R2,centre_val
15980MOVGT PC,R14
15990LDRB R3,[R0],#1
16000ADD R2,R2,R3
16010B calc_centre
16020.centre_val
16030DCD 0
16040
16050.amp
16060; R0 = start
16070; R1 = end
16080; R2 = centre
16090; R3 = factor <<12
16100CMP R0,R1
16110MOVGT PC,R14
16120LDRB R4,[R0]
16130SUB R5,R4,R2
16140MUL R5,R3,R5
16150ADDS R4,R2,R5,ASR #12
16160MOVLT R4,#0
16170CMPGT R4,#255
16180MOVGT R4,#255
16190STRB R4,[R0],#1
16200B amp
16210
16220.echo
16230; R0-R2 as for amp
16240; R3 = length
16250; R4 = strength <<12
16260SUB R5,R1,R3
16270.echolp
16280CMP R5,R0
16290MOVLT PC,R14
16300LDRB R6,[R5],#-1 ; get source
16310SUB R6,R6,R2 ; correct centre
16320MUL R6,R4,R6 ; amplify
16330LDRB R7,[R1] ; get dst
16340ADDS R7,R7,R6,ASR#12 ; add echo (>>12)
16350MOVLT R7,#0
16360CMPGT R7,#255
16370MOVGT R7,#255
16380STRB R7,[R1],#-1
16390B echolp
16400
16410.flange
16420ADD R5,R0,R3
16430.flangelp
16440CMP R5,R1
16450MOVGT PC,R14
16460LDRB R6,[R0],#1
16470SUB R6,R6,R2
16480MUL R6,R4,R6
16490LDRB R7,[R5]
16500ADDS R7,R7,R6,ASR#12
16510MOVLT R7,#0
16520CMPGT R7,#255
16530MOVGT R7,#255
16540STRB R7,[R5],#1
16550B flangelp
16560
16570.eor
16580; R0,R1 as for amp
16590; R2 = constant
16600CMP R0,R1
16610MOVGT PC,R14
16620LDRB R3,[R0]
16630EOR R3,R3,R2
16640STRB R3,[R0],#1
16650B eor
16660
16670.add
16680CMP R0,R1
16690MOVGT PC,R14
16700LDRB R3,[R0]
16710ADDS R3,R3,R2
16720MOVLT R3,#0
16730CMPGT R3,#255
16740MOVGT R3,#255
16750STRB R3,[R0],#1
16760B add
16770
16780.hp_filt
16790; R0,R1 as for amp
16800; R2 = high pass mark
16810CMP R0,R1
16820MOVGT PC,R14
16830LDRB R3,[R0]
16840CMP R3,R2
16850MOVGT R3,R2
16860STRB R3,[R0],#1
16870B hp_filt
16880
16890.lp_filt
16900CMP R0,R1
16910MOVGT PC,R14
16920LDRB R3,[R0]
16930CMP R3,R2
16940MOVLT R3,R2
16950STRB R3,[R0],#1
16960B lp_filt
16970
16980.core_filt
16990; R0,R1 as for amp
17000; R2 = high pass
17010; R3 = low pass
17020; R4 = centre
17030CMP R0,R1
17040MOVGT PC,R14
17050LDRB R5,[R0],#1
17060CMP R5,R2
17070BLT core_filt
17080CMP R5,R3
17090MOVLE R5,R4
17100STRB R5,[R0,#-1]
17110B core_filt
17120
17130.mix
17140; R0 = sample A start
17150; R1 = sample A end
17160; R2 = sample B (store) start
17170; R3 = sample B end
17180; R4 = sample centre
17190CMP R0,R1
17200CMPLE R2,R3
17210MOVGT PC,R14
17220LDRB R6,[R0],#1
17230LDRB R5,[R2]
17240ADD R6,R6,R5
17250SUB R6,R6,R4
17260STRB R6,[R2],#1
17270B mix
17280
17290.convert
17300; R0 = sample
17310; R1 = length
17320; R2 = table
17330LDRB R3,[R0]
17340LDRB R3,[R2,R3]
17350STRB R3,[R0],#1
17360SUBS R1,R1,#1
17370BGT convert
17380MOV PC,R14
17390
17400.copy
17410; R0 = start
17420; R1 = end
17430; R2 = dst
17440CMP R2,R0
17450ADDGT R2,R2,R1
17460SUBGT R2,R2,R0
17470BGT copy_back
17480.copy_lp
17490CMP R0,R1
17500MOVGT PC,R14
17510LDRB R3,[R0],#1
17520STRB R3,[R2],#1
17530B copy_lp
17540.copy_back
17550CMP R0,R1
17560MOVGT PC,R14
17570LDRB R3,[R1],#-1
17580STRB R3,[R2],#-1
17590B copy_back
17600
17610.boost
17620; R0,R1 as for amp
17630; R2 = const (<<12) table
17640; R3 = centre (old val)
17650MOV R7,R3
17660.boostlp
17670CMP R0,R1
17680MOVGT PC,R14
17690LDRB R4,[R0]
17700SUBS R6,R4,R3
17710RSBLT R5,R6,#0
17720MOVGE R5,R6
17730LDR R5,[R2,R5,LSL#2]
17740MUL R6,R5,R6
17750ADDS R6,R3,R6,ASR#12
17760MOVLT R6,#0
17770CMPGT R6,#255
17780MOVGT R6,#255
17790STRB R6,[R0],#1
17800MOV R3,R4
17810MOV R7,R6
17820B boostlp
17830
17840.fadein
17850; R0,R1,R2 as for amp
17860STMFD R13!,{R14}
17870SUBS R6,R1,R0
17880LDMLEFD R13!,{PC}
17890MOV R3,#0
17900.finlp
17910CMP R0,R1
17920LDMGTFD R13!,{PC}
17930LDRB R4,[R0]
17940SUB R5,R4,R2
17950MULS R5,R3,R5
17960MOVEQ R7,R5
17970BLNE divide
17980ADDS R4,R2,R7
17990MOVLT R4,#0
18000CMPGT R4,#255
18010MOVGT R4,#255
18020STRB R4,[R0],#1
18030ADD R3,R3,#1
18040B finlp
18050
18060.fadeout
18070STMFD R13!,{R14}
18080SUBS R6,R1,R0
18090LDMLEFD R13!,{PC}
18100MOV R3,R6
18110.foutlp
18120CMP R0,R1
18130LDMGTFD R13!,{PC}
18140LDRB R4,[R0]
18150SUB R5,R4,R2
18160MULS R5,R3,R5
18170MOVEQ R7,R5
18180BLNE divide
18190ADDS R4,R2,R7
18200MOVLT R4,#0
18210CMPGT R4,#255
18220MOVGT R4,#255
18230STRB R4,[R0],#1
18240SUB R3,R3,#1
18250B foutlp
18260
18270.divide
18280; < R5 = numerator
18290; R6 = denominator
18300; > R7 = result of division
18310STMFD R13!,{R0,R1,R2,R3,R4,R5,R14}
18320MOV R0,R5
18330MOV R1,R6
18340CMP R1,#0
18350BEQ end
18360MOV R5,#1
18370CMP R0,#0
18380MVNLT R5,R5:RSBLT R0,R0,#0
18390CMP R1,#0
18400MVNLT R5,R5:RSBLT R1,R1,#0
18410MOV R2,#0
18420MOV R3,#0
18430MOV R4,#1
18440.div_lp1
18450ADD R2,R2,#1
18460MOV R1,R1,ASL#1
18470CMP R1,R0
18480BLE div_lp1
18490.div_lp2
18500SUB R2,R2,#1
18510MOV R1,R1,ASR#1
18520CMP R0,R1
18530BLT div_lp2
18540CMP R1,#0
18550ADDGE R3,R3,R4,ASL R2
18560SUB R0,R0,R1
18570CMP R2,#0
18580BGT div_lp2
18590CMP R5,#0
18600RSBLT R3,R3,#0
18610MOV R2,R3
18620.end
18630MOV R7,R2
18640LDMFD R13!,{R0,R1,R2,R3,R4,R5,PC}
18650
18660]:P%=claimed_code%
18670[OPT opt%AND3
18680
18690.Vbase
18700B Vfill
18710B Vfill
18720B Vgon
18730B Vgoff
18740B Vinst
18750LDMFD R13!,{PC}
18760LDMFD R13!,{PC}
18770DCD Vname-Vbase
18780
18790.Vname
18800DCB "Effex"+CHR$0
18810ALIGN
18820
18830.Vinst
18840STMFD R13!,{R0-R4}
18850MOV R0,#0
18860MOV R1,#0
18870MOV R2,#0
18880MOV R3,#0
18890MOV R4,#0
18900SWI "XSound_Configure"
18910LDRVC R0,[R3,#12]
18920STRVC R0,Vla_ptr
18930STRVS R0,[R13]
18940LDMFD R13!,{R0-R4,PC}
18950
18960.Vspos
18970DCD 0
18980
18990.Vsend
19000DCD 0
19010
19020.Vla_ptr
19030DCD 0
19040
19050.Vconv_tab
19060DCD 0
19070
19080.Vvol
19090DCB 127:ALIGN
19100
19110.Vcommand
19120DCD 0
19130
19140.Vcounter
19150DCD 0
19160
19170.Vcomm_off
19180MOV R0,#0
19190STR R0,Vcommand
19200B Vfinish
19210
19220.Vgon
19230LDR R0,Vspos
19240STR R0,Vcounter
19250STR R0,[R9,#16]
19260LDR R0,Vla_ptr
19270STR R0,[R9,#20]
19280
19290.Vfill
19300LDMIB R9,{R2-R6}
19310LDR R0,Vcommand
19320CMP R0,#1
19330BEQ Vcomm_off
19340LDR R7,Vconv_tab
19350LDR R1,Vvol
19360AND R1,R1,#127
19370LDRB R1,[R6,R1,LSL#1]
19380MOV R1,R1,LSR#1
19390RSB R1,R1,#127
19400
19410.Vfill_lp
19420LDR R0,Vsend
19430LDR R5,Vcounter
19440TEQ R5,#0
19450STMEQIB R9,{R2-R5}
19460BEQ Vfinish
19470CMP R5,R0
19480STMGEIB R9,{R2-R5}
19490BGE Vfinish
19500ADD R2,R2,R2,LSL#16
19510LDRB R0,[R5,R2,LSR#24]
19520LDRB R0,[R7,R0]
19530SUBS R0,R0,R1,LSL#1
19540MOVMI R0,#0
19550STRB R0,[R12],R11
19560ADD R2,R2,R2,LSL#16
19570LDRB R0,[R5,R2,LSR#24]
19580LDRB R0,[R7,R0]
19590SUBS R0,R0,R1,LSL#1
19600MOVMI R0,#0
19610STRB R0,[R12],R11
19620ADD R2,R2,R2,LSL#16
19630LDRB R0,[R5,R2,LSR#24]
19640LDRB R0,[R7,R0]
19650SUBS R0,R0,R1,LSL#1
19660MOVMI R0,#0
19670STRB R0,[R12],R11
19680ADD R2,R2,R2,LSL#16
19690LDRB R0,[R5,R2,LSR#24]!
19700STR R5,Vcounter
19710LDRB R0,[R7,R0]
19720SUBS R0,R0,R1,LSL#1
19730MOVMI R0,#0
19740STRB R0,[R12],R11
19750BIC R2,R2,#&FF000000
19760CMP R12,R10
19770BLT Vfill_lp
19780SUBS R4,R4,#1
19790STMIB R9,{R2-R5}
19800MOVPL R0,#%1000
19810MOVMI R0,#%10
19820LDMFD R13!,{PC}
19830
19840.Vfinish
19850MOV R0,#0
19860.Vfinlp
19870STRB R0,[R12],R11
19880STRB R0,[R12],R11
19890STRB R0,[R12],R11
19900STRB R0,[R12],R11
19910MVN R4,#1
19920STMIB R9,{R2-R5}
19930MOV R0,#%10
19940LDMFD R13!,{PC}
19950
19960.Vgoff
19970MOV R0,#0
19980.Vflush
19990STRB R0,[R12],R11
20000STRB R0,[R12],R11
20010STRB R0,[R12],R11
20020STRB R0,[R12],R11
20030CMP R12,R10
20040BLT Vflush
20050MOV R0,#1
20060LDMFD R13!,{PC}
20070
20080.tab_start
20090]:NEXT
20100ENDPROC
20110
20120
20130REM ** ## ... data ... ## **
20140
20150REM ** template data **
20160
20170DATA "<Effex$Dir>.Templates"
20180DATA main,win_main%,0
20190DATA pane,win_pane%,0
20200DATA info,win_info%,0
20210DATA load_query,win_load%,0
20220DATA save,win_save%
20230DATA 88+24,save_valid%
20240DATA 88+20+32,save_txt%,0
20250DATA sample_info,win_sampinfo%,0
20260DATA 0,0
20270
20280
20290
20300REM ** ## ... tools ... ## **
20310
20320REM ** Tool = menu **
20330
20340DEFPROCXmenu_additem(item$,sub_id%)
20350LOCAL a%,wid%:a%=Xmenu_pos%
20360IF LENitem$>12 PROCXmenu_addlong(item$,0,sub_id%):ENDPROC
20370wid%=LENitem$
20380IF Xmenu_pos%+24>Xmenu_end% ERROR 1,"Menu area full"
20390!a%=0:a%!4=sub_id%
20400a%!8=&07000021
20410$(a%+12)=item$
20420r0%=Xmenu_pos%
20430Xmenu_pos%+=24
20440IF Xmenu_wid%<wid% Xmenu_wid%=wid%
20450Xmenu_height%+=44
20460ENDPROC
20470
20480DEFPROCXmenu_addwrs(title$,valid$,default$,RETURN ind%)
20490LOCAL vl%,a%,wid%,val%,b%:vl%=LENvalid$+1
20500Xmenu_end%-=vl%:val%=Xmenu_end%:$val%=valid$
20510Xmenu_end%-=16:ind%=Xmenu_end%:$ind%=default$
20520Xmenu_end%-=52
20530Xmenu_end%=Xmenu_end%AND(NOT3)
20540b%=Xmenu_end%
20550$b%=LEFT$(title$,12):b%!12=&00070207
20560b%!16=LENtitle$*16
20570IF b%!16<32 b%!16=32
20580b%!20=44:b%!24=0
20590b%!28=132:b%!32=-1
20600b%!36=&07000121
20610b%!40=ind%
20620b%!44=val%
20630b%!48=16
20640PROCXmenu_additem(title$,b%)
20650ENDPROC
20660
20670DEFPROCXmenu_addwrs2(title$,ind%)
20680LOCAL vl%,a%,wid%,val%,b%
20690vl%=ind%+16:Xmenu_end%-=52
20700Xmenu_end%=Xmenu_end%AND(NOT3)
20710b%=Xmenu_end%
20720$b%=title$:b%!12=&00070207
20730b%!16=LENtitle$*16
20740IF b%!16<32 b%!16=32
20750b%!20=44:b%!24=0
20760b%!28=132:b%!32=-1
20770b%!36=&07000121
20780b%!40=ind%
20790b%!44=val%
20800b%!48=16
20810PROCXmenu_additem(title$,b%)
20820ENDPROC
20830
20840DEFPROCXmenu_dot
20850!r0%=!r0% OR 2
20860Xmenu_height%+=24
20870ENDPROC
20880
20890DEFPROCXmenu_addlong(item$,ml%,sub_id%)
20900LOCAL a%,wid%:a%=Xmenu_pos%
20910IF ml%<=LENitem$ ml%=LENitem$+1
20920wid%=LENitem$
20930IF Xmenu_pos%+24>Xmenu_end%-ml% ERROR 1,"Menu area full"
20940!a%=0:a%!4=sub_id%
20950a%!8=&07000121
20960Xmenu_end%-=ml%
20970$Xmenu_end%=item$
20980a%!12=Xmenu_end%
20990a%!16=0
21000a%!20=ml%
21010r0%=Xmenu_pos%
21020Xmenu_pos%+=24
21030IF Xmenu_wid%<wid% Xmenu_wid%=wid%
21040Xmenu_height%+=44
21050ENDPROC
21060
21070DEFPROCXmenu_addinput(val$,ml%,wid%)
21080LOCAL a%:a%=Xmenu_pos%
21090IF Xmenu_pos%+24>Xmenu_end%-(ml%+LENval$+1) ERROR 1,"Menu area full"
21100!a%=4:a%!4=-1
21110a%!8=&07000121
21120Xmenu_end%-=ml%
21130a%!12=Xmenu_end%
21140a%!16=0
21150IF val$<>"" Xmenu_end%-=LENval$+1:$Xmenu_end%=val$:a%!16=Xmenu_end%
21160a%!20=ml%
21170r0%=Xmenu_pos%
21180Xmenu_pos%+=24
21190IF Xmenu_wid%<wid% Xmenu_wid%=wid%
21200Xmenu_height%+=44
21210ENDPROC
21220
21230DEFPROCXmenu_shade(r0%,set%)
21240IF set%<>0 set%=1<<22
21250r0%!8=(r0%!8 AND(NOT(1<<22)))OR set%
21260ENDPROC
21270
21280DEFPROCXmenu_tick(r0%,set%)
21290IF set%<>0 set%=1
21300!r0%=(!r0% AND &FFFFFFFE)OR set%
21310ENDPROC
21320
21330DEFPROCXmenu_message(r0%)
21340IF r0%!4<=1 ENDPROC
21350!r0%=!r0% OR 8
21360ENDPROC
21370
21380DEFPROCXmenu_end(RETURN p%,RETURN e%)
21390IF Xmenu_height%<1 THEN
21400PROCXmenu_additem(" ",-1)
21410PROCXmenu_shade(r0%,1)
21420Xmenu_height%=44
21430ENDIF
21440!r0%=!r0% OR 128
21450Xmenu_start%!16=(Xmenu_wid%+1)*16
21460Xmenu_start%!-4=Xmenu_height%
21470p%=Xmenu_pos%
21480e%=Xmenu_end%
21490ENDPROC
21500
21510DEFPROCXmenu_start(tit$,st%,en%)
21520st%+=4
21530Xmenu_start%=st%
21540Xmenu_pos%=Xmenu_start%
21550Xmenu_end%=en%
21560Xmenu_height%=0
21570tit$=LEFT$(tit$,12)
21580Xmenu_wid%=LENtit$
21590$st%=tit$
21600st%!12=&00070207
21610st%!16=0
21620st%!20=44
21630st%!24=0
21640r0%=Xmenu_start%
21650Xmenu_pos%+=28
21660ENDPROC
21670
21680DEFPROCXmenu_setinput(id%,st$)
21690id%+=12
21700IF LENst$>=id%!8 st$=LEFT$(st$,id%!8-1)
21710$(!id%)=st$
21720ENDPROC
21730
21740DEFFNXmenu_getinput(id%)
21750=FNz(id%!12)
21760
21770DEFPROCXmenu_iconbar(id%)
21780LOCAL height%
21790height%=id%!-4
21800SYS &400CF,,q%
21810Xmenu_x%=!q%-64
21820Xmenu_y%=96+height%
21830Xmenu_ptr%=id%
21840SYS &400D4,,Xmenu_ptr%,Xmenu_x%,Xmenu_y%
21850ENDPROC
21860
21870DEFPROCXmenu_main(id%)
21880SYS &400CF,,q%
21890Xmenu_x%=!q%-64
21900Xmenu_y%=q%!4+24
21910Xmenu_ptr%=id%
21920SYS &400D4,,Xmenu_ptr%,Xmenu_x%,Xmenu_y%
21930ENDPROC
21940
21950REM ** Tool = wimp/general **
21960
21970DEFFNz(a%):LOCALs$:s$="":WHILE?a%>31:s$+=CHR$?a%:a%+=1:ENDWHILE:=s$
21980
21990DEFFNset(RETURN var%,val%)
22000var%=val%:=0
22010
22020DEFPROCsetvar(v$,val%)
22030val%=EVAL("FNset("+v$+",val%)")
22040ENDPROC
22050
22060DEFPROCXwimp_init(s$)
22070s$=LEFT$(s$,15)
22080SYS &400C0,200,&4B534154,s$ TO wimp_vers%,task_handle%
22090ENDPROC
22100
22110DEFPROCXwimp_templates(ic%,ic_end%)
22120LOCAL file$,temp$,var$,hand%,ad$,ad%,val%
22130READ file$
22140WHILE file$<>"0"
22150 SYS &400D9,,file$
22160 READ temp$
22170 WHILE temp$<>"0"
22180 READ var$
22190 SYS &400DB,,Xtemp%,ic%,ic_end%,-1,temp$,0 TO ,,ic%
22200 READ ad$
22210 WHILE ad$<>"0"
22220 ad%=EVALad$:READ ad$:val%=EVALad$
22230 Xtemp%!ad%=val%
22240 READ ad$
22250 ENDWHILE
22260 SYS &400C1,,Xtemp% TO hand%
22270 PROCsetvar(var$,hand%)
22280 READ temp$
22290 ENDWHILE
22300 SYS &400DA
22310 READ file$
22320ENDWHILE
22330iconend%=ic%
22340ENDPROC
22350
22360REM ** Tool = memory **
22370
22380DEFPROCXmem_init(blocks%)
22390Xmem_blocks%=blocks%
22400SYS &1E,6,,,blocks%*4 TO ,,Xmem_header%
22410FOR temp_a%=0 TO blocks%-1
22420Xmem_header%!(temp_a%<<2)=0
22430NEXT
22440ENDPROC
22450
22460DEFFNXmem_claim(size%)
22470FOR temp_a%=0 TO Xmem_blocks%-1
22480IF Xmem_header%!(temp_a%<<2)=0 THEN
22490SYS &1E,6,,,size% TO ,,temp_b%
22500Xmem_header%!(temp_a%<<2)=temp_b%
22510temp_a%=Xmem_blocks%+1000
22520ENDIF
22530NEXT
22540IF temp_a%=Xmem_blocks% ERROR 1,"Maximum block allocation reached"
22550=temp_b%
22560
22570DEFPROCXmem_reduce(RETURN addr%,cs%)
22580FOR temp_a%=0 TO Xmem_blocks%-1
22590IF Xmem_header%!(temp_a%<<2)=addr% THEN
22600SYS &1D,4,&1800000,addr%,-cs% TO ,,addr%
22610Xmem_header%!(temp_a%<<2)=addr%
22620temp_a%=Xmem_blocks%+1000
22630ENDIF
22640NEXT
22650IF temp_a%=Xmem_blocks% ERROR 1,"Cannot find block for alteration"
22660ENDPROC
22670
22680DEFPROCXmem_delta(RETURN addr%,cs%)
22690LOCAL size%:IF cs%<0 PROCXmem_reduce(addr%,-cs%):ENDPROC
22700FOR temp_a%=0 TO Xmem_blocks%-1
22710IF Xmem_header%!(temp_a%<<2)=addr% THEN
22720SYS &1D,6,&1800000,addr% TO ,,,size%
22730size%+=cs%
22740SYS &1E,13,,addr%,size% TO ,,addr%
22750Xmem_header%!(temp_a%<<2)=addr%
22760temp_a%=Xmem_blocks%+1000
22770ENDIF
22780NEXT
22790IF temp_a%=Xmem_blocks% ERROR 1,"Cannot find block for alteration"
22800ENDPROC
22810
22820DEFPROCXmem_change(RETURN addr%,size%)
22830FOR temp_a%=0 TO Xmem_blocks%-1
22840IF Xmem_header%!(temp_a%<<2)=addr% THEN
22850SYS &1E,13,,addr%,size% TO ,,addr%
22860Xmem_header%!(temp_a%<<2)=addr%
22870temp_a%=Xmem_blocks%+1000
22880ENDIF
22890NEXT
22900IF temp_a%=Xmem_blocks% ERROR 1,"Cannot find block for alteration"
22910ENDPROC
22920
22930DEFPROCXmem_release(addr%)
22940FOR temp_a%=0 TO Xmem_blocks%-1
22950IF Xmem_header%!(temp_a%<<2)=addr% THEN
22960SYS &1E,7,,addr%
22970Xmem_header%!(temp_a%<<2)=0
22980temp_a%=Xmem_blocks%+1000
22990ENDIF
23000NEXT
23010IF temp_a%=Xmem_blocks% ERROR 1,"Cannot find block for release"
23020ENDPROC
23030
23040DEFPROCXmem_quit
23050temp_b%=0
23060FOR temp_a%=0 TO Xmem_blocks%-1
23070IF Xmem_header%!(temp_a%<<2)<>0 THEN
23080temp_b%+=1
23090SYS &1E,7,,Xmem_header%!(temp_a%<<2)
23100Xmem_header%!(temp_a%<<2)=0
23110ENDIF
23120NEXT
23130SYS &1E,7,,Xmem_header%
23140OSCLI"SetEval Effex%FreedBlocks "+STR$temp_b%
23150ENDPROC
23160
23170REM ** Tool = windows **
23180
23190DEFPROCXwin_open(handle%)
23200!Xtemp%=handle%
23210SYS &400CB,,Xtemp%:Xtemp%!28=-1
23220SYS &400C5,,Xtemp%
23230ENDPROC
23240
23250DEFPROCXwin_close(handle%)
23260!Xtemp%=handle%
23270SYS &400C6,,Xtemp%
23280ENDPROC
23290
23300DEFPROCXwin_settitle(handle%,tit$)
23310LOCAL a%,b%
23320!Xtemp%=handle%
23330SYS &400CC,,Xtemp%
23340IF (Xtemp%!60 AND 256)=0 ERROR 1,"Window title not indirected"
23350b%=Xtemp%!84
23360a%=Xtemp%!76
23370tit$=LEFT$(tit$,b%-1)
23380$a%=tit$
23390ENDPROC
23400
23410REM ** Tool = icons **
23420
23430DEFFNXicon_getstr(win%,ic%)
23440!Xtemp%=win%:Xtemp%!4=ic%
23450SYS &400CE,,Xtemp%
23460IF (Xtemp%!24 AND 256)=0 ERROR 1,"Icon not indirected"
23470=FNz(Xtemp%!28)
23480
23490DEFPROCXicon_setstr(win%,ic%,s$)
23500LOCAL a%,b%
23510!Xtemp%=win%:Xtemp%!4=ic%
23520SYS &400CE,,Xtemp%
23530IF (Xtemp%!24 AND 256)=0 ERROR 1,"Icon not indirected"
23540b%=Xtemp%!36
23550a%=Xtemp%!28
23560s$=LEFT$(s$,b%-1)
23570$a%=s$
23580PROCXicon_redraw(win%,ic%)
23590ENDPROC
23600
23610DEFPROCXicon_seticonvalid(win%,ic%,s$)
23620LOCAL a%,a$
23630!Xtemp%=win%:Xtemp%!4=ic%
23640SYS &400CE,,Xtemp%
23650IF (Xtemp%!24 AND 256)=0 ERROR 1,"Icon not indirected"
23660a$=$(Xtemp%!32)
23670$(Xtemp%!32)=LEFT$(s$,LENa$)
23680PROCXicon_redraw(win%,ic%)
23690ENDPROC
23700
23710DEFPROCXicon_redraw(win%,ic%)
23720!Xtemp%=win%:Xtemp%!4=ic%
23730Xtemp%!8=0:Xtemp%!12=0
23740SYS &400CD,,Xtemp%
23750ENDPROC
� > !RunImage
� Effex sample editor
� � Paul Mason, 1992
(
2ș &10 � env%
<env$=�z(env%)
Fa%=�env$,"Effex.!RunImage")
Pa%+=�"Effex.!RunImage "
Zenv$=�env$,a%+1)
denv$=�env$,�env$,"-")+1)
n� � �err(1)
x �init
�(�cre_menus(menus%,menus%+menu_size%)
�� � �err(0)
�ȕ � quit%
�ș &400C7,0,q% � reason%
��handle_reason(reason%,q%)
�"� env$<>"" �load(env$):env$=""
��
�� � �err(1)
��quit_voice
��Xmem_quit
��
�
���handle_reason(reason%,q%)
Ȏ reason% �
<� 0 : � sample_type%>=0 � !Vcounter>0 � tracking% �track
� 1 : �redraw
"� 2 : �open(q%)
,� 3 : �close(q%)
6� 4
@� 5
J� 6 : �mclick
T� 7 : �dragbox
^"� 8 : �kpress(q%!0,q%!4,q%!24)
h� 9 : �menusel
r� 17,18 : �mess
|�
��
�
�
��dragbox
�� a%
�ș &400CF,,q%
�q%!24=q%!16
�-q%!16=1:q%!20=q%!12:q%!28=q%!0:q%!32=q%!4
�%q%!36=save_size%:q%!40=file_type%
�%�extract_leaf:$(q%+44)=save_name$
� q%!0=(44+�save_name$+5)�(�3)
�!q%!12=0:ș &400E7,17,q%,q%!20
�saveref%=q%!8
�ș &400D4,,-1
�
��datasave_ack
&� q%!12<>saveref% �
0save_name$=�z(q%+44)
:(� q%!36<>-1 �insert_name:modified%=0
DȎ file_type% �
N� &631,&632,&633
XM ș 8,10,save_name$,file_type%,,save_sample%,save_sample%+save_samp_size%
b"� &634 : �save_eff(save_name$)
l"� &D3C : �save_arm(save_name$)
v�
�q%!12=q%!8:q%!16=3
�ș &400E7,17,q%,q%!20
��
�
���save_eff(name$)
�� file%,size%,rate%
�file%=�(name$)
��#file%,sample_type%
�!�#file%,0:�#file%,0:�#file%,0
��wput(save_samp_size%)
�
�wput(28)
��wput(save_caret%)
��wput(save_sel_start%)
�wput(save_sel_end%)
-rate%=��Xicon_getstr(win_main%,5)*(1<<24)
�wput(rate%)
.ș &C,2,file%,save_sample%,save_samp_size%
*�#file%
4�"SetType "+name$+" 634"
>�
H
R��save_arm(name$)
\� file%,size%,rate%
ffile%=�(name$)
p'�#file%,��Xicon_getstr(win_main%,4)
z.ș &C,2,file%,save_sample%,save_samp_size%
��#file%
��"SetType "+name$+" D3C"
��
�
�ݤleaf(s$)
�� s2$:s2$=""
�� �s$,".")=0 � =s$
�ȕ �s$)<>"." � �s$)<>":"
�s2$=�s$)+s2$
�s$=�s$)
��
�=s2$
�
ݤpath(s$)
ȕ �s$)<>"." � �s$)<>":"
s$=�s$)
$�
.=s$
8
B��extract_leaf
L0save_name$=�leaf(�Xicon_getstr(win_save%,1))
V�
`
j��insert_name
tȎ file_type% �
~"� &631 : sname_log$=save_name$
�"� &632 : sname_sgn$=save_name$
�"� &633 : sname_uns$=save_name$
�"� &634 : sname_eff$=save_name$
�"� &D3C : sname_arm$=save_name$
�"� &635 : sname_sel$=save_name$
�"� &636 : sname_lib$=save_name$
��
��
�
���kpress(win%,icon%,key%)
�
Ȏ key% �
�.� 13 : � win%=win_main%:�next_caret(icon%)
$ � win%=win_save% �save
!� &18F : �move_caret(icon%,1)
!� &18E : �move_caret(icon%,0)
( : � � �key_ok(key%) ș &400DC,key%
(�
2�
<
F
��save
P)save_name$=�Xicon_getstr(win_save%,1)
Z�insert_name
dȎ file_type% �
n� &631,&632,&633
xM ș 8,10,save_name$,file_type%,,save_sample%,save_sample%+save_samp_size%
�"� &634 : �save_eff(save_name$)
�"� &D3C : �save_arm(save_name$)
��
�ș &400D4,,-1
��
�
���next_caret(ic%)
�� a%,win%:win%=win_main%
�Ȏ ic% �
�-� 5 : �set_rate(�(�Xicon_getstr(win%,5)))
� �set_caret(win%,4)
�2� 4 : a%=�(�Xicon_getstr(win%,4)):� a%=0 a%=50
� �set_rate(1000/a%)
�set_caret(win%,5)
"� 18 : �set_caret(win%,18):�sc
� 22 : �set_caret(win%,23)
""� 23 : �set_caret(win%,22):�ss
,� 10 : �set_caret(win%,11)
6� 11 : �zoom(0,0)
@! �set_caret(win%,10)
J%� 25 : a%=��Xicon_getstr(win%,25)
T � a%<0 a%=0
^ � a%>127 a%=127
h( �Xicon_setstr(win%,25,�a%)
r ?Vvol=a%
|�
��
�
���move_caret(ic%,up%)
�� u%,d%
�Ȏ ic% �
�� 5 : u%=11:d%=4
�� 4 : u%=5:d%=18
�� 18 : u%=4:d%=22
�� 22 : u%=18:d%=23
�� 23 : u%=22:d%=25
�� 25 : u%=23:d%=10
�� 10 : u%=25:d%=11
�� 11 : u%=10:d%=5
�
=� up% �set_caret(win_main%,u%) � �set_caret(win_main%,d%)
�
&
0��set_rate(khz)
:� khz=0 khz=20
D#�Xicon_setstr(win_main%,5,�khz)
N*�Xicon_setstr(win_main%,4,�(1000/khz))
X�
b
l��set_caret(w%,i%)
v'� len%:len%=�(�Xicon_getstr(w%,i%))
�ș &400D2,w%,i%,0,0,-1,len%
��
�
���redraw
�7� more%,scl%,xp%,pos,inc,xo%,yo%,ss,se,car%,sss,sse
�&ss=sel_start%*1150*zoom/samp_size%
�$se=sel_end%*1150*zoom/samp_size%
�$car%=caret%*1150*zoom/samp_size%
�%ș &35,-1,4 � ,,scl%:scl%=1<<scl%
�ș &400C8,,q% � more%
�ȕ more%
�xstart%=q%!28-q%!4+q%!20
�xend%=q%!36-q%!4+q%!20
pos%=q%!28
+pos=(xstart%-scl%)*samp_size%/zoom/1150
!inc=scl%*samp_size%/zoom/1150
byte%=sample%?pos
*xo%=q%!4-q%!20:yo%=q%!8
4� xstart%+xo%,byte%+yo%
>ș &400E6,4
H*� xp%=xstart%-scl% � xend%+scl% � scl%
R!�vdu%,xp%+xo%,sample%?pos+yo%
\pos+=inc
f�
p@� sel_start%>=0 ș &400E6,7+(3<<4):ȓȐ ss+xo%,yo%,se-ss,256
zC� caret%>=0 ș &400E6,11+(3<<4):� car%+xo%,yo%,car%+xo%,yo%+256
�%ș &400E6,8:� xo%,yo%,xo%,yo%+256
�>ș &400E6,15:� xo%+1150*zoom-1,yo%,xo%+1150*zoom-1,yo%+256
�ș &400CA,,q% � more%
��
��
�
���fresh(win%,q%)
�!q%=win%:ș &400CB,,q%
�
�open(q%)
��
�
���zoom(da%,db%)
�� a%,b%,scl%
#a%=��Xicon_getstr(win_main%,10)
a%+=da%
� a%>999 a%=999
$#b%=��Xicon_getstr(win_main%,11)
.b%+=db%
8� b%>999 b%=999
B� a%<1 a%=1
L� b%<1 b%=1
V� b%>a% b%=a%
`zoom=a%/b%
j#�Xicon_setstr(win_main%,10,�a%)
t#�Xicon_setstr(win_main%,11,�b%)
~!q%=win_pane%:ș &400CB,,q%
�?� q%!20>1150*(zoom-1)-1 q%!20=1150*(zoom-1)-1:ș &400C5,,q%
�q%!4=0:q%!8=-256
�q%!12=q%!4+1150*zoom
�q%!16=0
�%ș &35,-1,4 � ,,scl%:scl%=1<<scl%
�a%=q%!8�scl%
�q%!12=q%!12+(scl%-a%)
�ș &400D7,win_pane%,q%+4
�!q%=win_pane%:ș &400CB,,q%
�/ș &400D1,win_pane%,q%!20,-256,q%!20+1150,0
��
�
��open(q%)
� a%:a%=q%+1024
� !q%=win_main% �
a%!0=win_pane%:ș &400CB,,a%
(a%!28=q%!28:q%!28=win_pane%
2%a%!12=a%!12-a%!4:a%!16=a%!16-a%!8
<a%!4=q%!4+panex%
Fa%!8=q%!8+paney%
P%a%!12=a%!12+a%!4:a%!16=a%!16+a%!8
Zș &400C5,,a%
d�
nș &400C5,,q%
x�
�
���close(q%)
�ș &400C6,,q%
�� !q%<>win_main% �
�!q%=win_pane%
�ș &400C6,,q%
��
�
���mclick
�� xpos%,win%,but%,ic%
�,xpos%=!q%:but%=q%!8:win%=q%!12:ic%=q%!16
��
�� q%!8=2 �
; � q%!12=-2 � q%!16=iconbar% �Xmenu_iconbar(menu_icon%)
@ � q%!12=win_main% � q%!12=win_pane% �Xmenu_main(menu_main%)
�
"�
,+� (q%!8=4 � q%!8=1) � q%!12=win_pane% �
6�
@� q%!8=4 �
JG � q%!12=-2 � q%!16=iconbar% � sample_type%>-1 �fresh(win_main%,q%)
T � q%!12=win_pane% �set_sel
^# � win%=win_main% � ic%=28 �ply
h�
r�
|� q%!8=1 �
� � q%!12=win_pane% �set_car
��
��
�C� (but%=4 � but%=1) � win%=win_pane% �scroll_pane(xpos%,q%+512)
�8� but%<>2 � win%=win_main% �handle_winmain(ic%,but%)
�,� win%=win_save% �handle_saves(ic%,but%)
��
�
� ��ply
�1� vol%,rate:vol%=��Xicon_getstr(win_main%,25)
�$rate=��Xicon_getstr(win_main%,5)
�1�play(sample%,sample%+samp_size%-1,vol%,rate)
��
��ply_sel
�check_all(0)
&1� vol%,rate:vol%=��Xicon_getstr(win_main%,25)
0$rate=��Xicon_getstr(win_main%,5)
:8�play(sample%+sel_start%,sample%+sel_end%,vol%,rate)
D�
N
X��handle_saves(ic%,but%)
b
Ȏ � �
l.� ic%=0 � (but%=16 � but%=64) : �drag_save
v� ic%=2 � (but%<>2) : �save
��
��
�
���drag_save
�� x0%,y0%,shft%
�!q%=win_save%:ș &400CB,,q%
�x0%=q%!4:y0%=q%!16
�q%!4=0:ș &400CE,,q%
�$q%!4=5:q%!8+=x0%:q%!12=y0%+q%!12
�q%!16+=x0%:q%!20=y0%+q%!20
�ș &35,-1,11 � ,,x0%
�(ș &35,-1,4 � ,,shft%:x0%=x0%<<shft%
�ș &35,-1,12 � ,,y0%
(ș &35,-1,5 � ,,shft%:y0%=y0%<<shft%
'q%!24=0:q%!28=0:q%!32=x0%:q%!36=y0%
ș &400D0,,q%
�
*
4��handle_winmain(ic%,but%)
>#� mul%:� �(-1) mul%=16 � mul%=1
H� but%=1 but%=-1 � but%=1
RȎ ic% �
\� 14 : �zoom(but%*mul%,0)
f� 15 : �zoom(-but%*mul%,0)
p� 13 : �zoom(0,but%*mul%)
z� 16 : �zoom(0,-but%*mul%)
�� 27 : �vol(but%*mul%)
�� 26 : �vol(-but%*mul%)
�!� 9 : �pitch_bend(but%*mul%)
�"� 29 : �pitch_bend(-but%*mul%)
�� 19 : �crr(but%*mul%)
�� 20 : �crr(-but%*mul%)
��
��
�
���vol(inc%)
�,� vol%:vol%=��Xicon_getstr(win_main%,25)
�"vol%+=inc%:� vol%>127 vol%=127
�� vol%<0 vol%=0
%�Xicon_setstr(win_main%,25,�vol%)
?Vvol=vol%
�
$
.
��set_sel
8"� x%,ox%,oldss%,oldse%:x%=q%!0
B!q%=win_pane%:ș &400CB,,q%
L/x%=x%-q%!4+q%!20:x%=x%*samp_size%/1150/zoom
V� sel_start%=-1 �
`sel_start%=x%:sel_end%=x%+1
jI� sel_end%>=samp_size% sel_start%-=samp_size%-2:sel_end%=samp_size%-1
t�new_selection
~�
�%� x%<>sel_start% � x%<>sel_end% �
�]� �(sel_start%-x%)<�(sel_end%-x%) ox%=sel_start%:sel_start%=x% � ox%=sel_end%:sel_end%=x%
�0� sel_end%<=sel_start% sel_start%=sel_end%-1
�� sel_start%<0 sel_start%=0
�0� sel_end%<=sel_start% sel_end%=sel_start%+1
�� x%>ox% Ȕ x%,ox%
�x%=x%*1150*zoom/samp_size%
� ox%=ox%*1150*zoom/samp_size%
�)ș &400D1,win_pane%,x%-8,-256,ox%+8,0
��new_selection
��
��
�
��scroll_pane(x%,q%)
!q%=win_pane%:ș &400CB,,q%
(<� x%>q%!12-16 �scrollx(win_pane%,(16-q%!12+x%)*4,q%+512)
2:� x%<q%!4+16 �scrollx(win_pane%,(x%-q%!4-16)*4,q%+512)
<�
F
P��scrollx(win%,off%,q%)
Z!q%=win%:ș &400CB,,q%
dq%!20=q%!20+off%
nș &400C5,,q%
x�
�
���ss
�� a%,b%,x0%,y0%
�%a%=�(�Xicon_getstr(win_main%,22))
�%b%=�(�Xicon_getstr(win_main%,23))
�
� a%>b% �
�Ȕ a%,b%
�#�Xicon_putstr(win_main%,22,�a%)
�#�Xicon_putstr(win_main%,23,�b%)
��
�'x0%=sel_start%*1150*zoom/samp_size%
�%x1%=sel_end%*1150*zoom/samp_size%
�*ș &400D1,win_pane%,x0%-8,-256,x1%+8,0
sel_start%=a%
sel_end%=b%
� sel_start%>=0 �
"'x0%=sel_start%*1150*zoom/samp_size%
,%x1%=sel_end%*1150*zoom/samp_size%
6*ș &400D1,win_pane%,x0%-8,-256,x1%+8,0
@�
Jsel_start%=-1
Tsel_end%=-1
^�
h�
r
|
��set_car
�� x%,pos%:pos%=q%!0
�"x%=caret%*1150*zoom/samp_size%
�(ș &400D1,win_pane%,x%-8,-256,x%+8,0
�
x%=caret%
�!q%=win_pane%:ș &400CB,,q%
�1caret%=(pos%-q%!4+q%!20)*samp_size%/1150/zoom
�� caret%<0 caret%=0
�"x%=caret%*1150*zoom/samp_size%
�(ș &400D1,win_pane%,x%-8,-256,x%+8,0
�'�Xicon_setstr(win_main%,18,�caret%)
�7� tracking% � !Vcounter>0 � caret%<!Vsend-sample% �
�!Vcounter=caret%+sample%
��
�
��track
&� x%
0"x%=caret%*1150*zoom/samp_size%
:(ș &400D1,win_pane%,x%-2,-256,x%+2,0
Dcaret%=!Vcounter-sample%
N"x%=caret%*1150*zoom/samp_size%
X(ș &400D1,win_pane%,x%-2,-256,x%+2,0
b'�Xicon_setstr(win_main%,18,�caret%)
l(� caret%>=!Vsend-sample% !Vcounter=0
v�
�
���crr(dir%)
�� caret%<0 �
�� x%
�"x%=caret%*1150*zoom/samp_size%
�(ș &400D1,win_pane%,x%-8,-256,x%+8,0
�caret%+=dir%
�� caret%<0 caret%=0
�,� caret%>=samp_size% caret%=samp_size%-1
�"x%=caret%*1150*zoom/samp_size%
�(ș &400D1,win_pane%,x%-8,-256,x%+8,0
�'�Xicon_setstr(win_main%,18,�caret%)
�7� tracking% � !Vcounter>0 � caret%<!Vsend-sample% �
!Vcounter=caret%+sample%
�
�
*��sc
4� a%,x%
>%a%=�(�Xicon_getstr(win_main%,18))
H"x%=caret%*1150*zoom/samp_size%
R(ș &400D1,win_pane%,x%-8,-256,x%+8,0
\
caret%=a%
f� caret%<0 caret%=-1
p� caret%>=0 �
z"x%=caret%*1150*zoom/samp_size%
�(ș &400D1,win_pane%,x%-8,-256,x%+8,0
��
��
�
�
��mess
�� q%!16=0 quit%=-1:�
�� q%!16=1 �data_save
�0� q%!16=&400C0 �menu_warn(q%!32,q%!36,q%!40)
�>� q%!16=3 � � �good_load(q%!40,�z(q%+44),q%!36,1) �loadack
�� q%!16=2 �datasave_ack
�� q%!16=5 �
�+ ok%=0:� q%!40>&630 � q%!40<&635 ok%=-1
� � q%!40=&D3C ok%=-1
� ok% �
�loadack
, a%=�good_load(q%!40,�z(q%+44),q%!36,0)
$ �
.�
8�
B
L��data_save
V'q%!36=-1:$(q%+44)="<Wimp$Scrap>"+�0
`q%!12=q%!8:q%!16=2
jș &400E7,17,q%,q%!4
tsaveref%=-1
~�7
��
�
�
��loadack
�q%!12=q%!8:q%!16=4:q%!36=-1
�ș &400E7,17,q%,q%!4
��
�
���load(n$)
�ș 8,17,n$ � ,,typ%
�typ%=(typ%�&FFF00)>>8
��"Set Effex$Type "+�typ%
�!typ%=�good_load(typ%,n$,-1,1)
�
(ݤgood_load(type%,name$,size%,drag%)
� ok%:ok%=-1
(%� sample_type%>=0 ok%=�check_load
2� ok%=-1 �
<Ȏ type% �
F#� &631 : ok%=�load_raw(name$,0)
P#� &632 : ok%=�load_raw(name$,1)
Z#� &633 : ok%=�load_raw(name$,2)
d!� &634 : ok%=�load_eff(name$)
n!� &D3C : ok%=�load_arm(name$)
x& : � drag% ok%=�load_raw(name$,2)
��
��
�� ok% �
� q%!512=win_pane%
� ș &400C6,,q%+512
� �fresh(win_main%,q%+512)
� � name$<>"<Wimp$Scrap>" �
� sname_log$=name$
� sname_uns$=name$
� sname_sgn$=name$
� sname_eff$=name$
� sname_arm$=name$
� �
�"Remove <Wimp$Scrap>"
�
�
"=ok%
,
6ݤcheck_load
@� go%,act%,win%,icon%
J�fresh(win_load%,q%+512)
T8� q%!512=win_load%:SYS "Wimp_GetWindowState",,q%+512
^?� MOUSE RECTANGLE q%!516,q%!520,q%!524-q%!516,q%!528-q%!520
h�
r�diapoll
|� win%=win_load% � icon%=10
�
act%=1
�� go%=2 � 9
�1q%!512=win_load%:q%!516=go%:ș &400CE,,q%+512
�/� (q%!(512+24)�(1<<21))<>0 act%=go%-2:go%=9
��
�"go%=�(name$):size%=�#go%:�#go%
�
Ȏ act% �
�7� 0 : �Xmem_release(sample%):sample_type%=-1:go%=-1
�� 1 : go%=0
�� 2 : �av(0)
�)� 3 : � caret%>=0 �av(caret%) � go%=0
�� 4 : �in(0)
�)� 5 : � caret%>=0 �in(caret%) � go%=0
� 6 : �ov(0)
)� 7 : � caret%>=0 �ov(caret%) � go%=0
: go%=1
&�
0�7
:q%!512=win_load%
Dș &400C6,,q%+512
N+� MOUSE RECTANGLE -4000,-4000,4000,4000
X=go%
b
l��av(pos%)
vwin%=�Xmem_claim(size%)
�ș 8,16,name$,win%,0
�A%=win%:B%=win%+size%-1
�+C%=sample%+pos%:D%=sample%+samp_size%-1
�E%=samp_centre%:� mix
��Xmem_release(win%)
� go%=1
��
�
���in(pos%)
��Xmem_delta(sample%,size%)
�'�copy(pos%,samp_size%-1,pos%+size%)
� ș 8,16,name$,sample%+pos%,0
��
��ov(pos%)
1� samp_size%-pos%<size% size%=samp_size%-pos%
win%=�(name$)
*#ș &C,4,win%,sample%+pos%,size%
4
�#win%
>�
H
R
��diapoll
\� r%
f�
pș &400C7,0,q%+512 � r%
zȎ r% �
�� 2 : �open(q%+512)
�� 3 : �open(q%+512)
�! : �handle_reason(r%,q%+512)
��
�� r%=6 � q%!(512+8)<>2
�&win%=q%!(512+12):icon%=q%!(512+16)
��
�
�ݤload_raw(name$,stype%)
�� file%,pos%,not%,size%
�(file%=�(name$):size%=�#file%:�#file%
�pos%=�Xmem_claim(size%)
�>� pos%=0 � 1,"Not enough memory (I need "+�size%+" bytes)"
ș 8,16,name$,pos%,0
!sample%=pos%:samp_size%=size%
sample_type%=stype%
$sel_start%=-1
.sel_end%=-1
8�new_selection
B�new_sample_type
L�clr_all
VȎ stype% �
`� 0 : samp_centre%=128
j� 1 : samp_centre%=128
t� 2 : samp_centre%=0
~�
�=-1
�
�ݤwget(pos%)
�� a%
��#file%=pos%
�a%=(�#file%)<<0
�a%+=(�#file%)<<8
�a%+=(�#file%)<<16
�a%+=(�#file%)<<24
�=a%
�
�ݤbget(pos%)
�#file%=pos%
=�#file%
��wput(w%)
(�#file%,(w%�&FF)>>0
2�#file%,(w%�&FF00)>>8
<�#file%,(w%�&FF0000)>>16
F�#file%,(w%�&FF000000)>>24
P�
Z
dݤload_eff(n$)
n � file%,pos%,not%,size%,rate
x!file%=�(name$):size%=�wget(4)
�pos%=�Xmem_claim(size%)
�>� pos%=0 � 1,"Not enough memory (I need "+�size%+" bytes)"
�%ș &C,3,file%,pos%,size%,�wget(8)
�!sample%=pos%:samp_size%=size%
�sample_type%=�bget(0)
�caret%=�wget(12)
�sel_start%=�wget(16)
�sel_end%=�wget(20)
�rate=�wget(24)/(1<<24)
�$�Xicon_setstr(win_main%,5,�rate)
�+�Xicon_setstr(win_main%,4,�(1000/rate))
��#file%
��new_selection
�new_sample_type
Ȏ sample_type% �
� 0 : samp_centre%=128
"� 1 : samp_centre%=128
,� 2 : samp_centre%=0
6�
@=-1
J
Tݤload_arm(n$)
^ � file%,pos%,not%,size%,rate
h"file%=�(name$):size%=�#file%-1
rpos%=�Xmem_claim(size%)
|>� pos%=0 � 1,"Not enough memory (I need "+�size%+" bytes)"
�ș &C,3,file%,pos%,size%,1
�!sample%=pos%:samp_size%=size%
�sample_type%=2
�sel_start%=-1
�sel_end%=-1
�rate=1000/�bget(0)
�$�Xicon_setstr(win_main%,5,�rate)
�+�Xicon_setstr(win_main%,4,�(1000/rate))
��#file%
��new_selection
��new_sample_type
�samp_centre%=0
�=-1
��menu_warn(a%,b%,c%)
� a%=1 �
& �savewinp(b%)
0 save_sample%=sample%
: save_samp_size%=samp_size%
D save_caret%=caret%
N save_sel_start%=sel_start%
X save_sel_end%=sel_end%
b�
l= � a%=0 � b%=1 : �open_sinfo:ș &400E8,,q%!20,q%!24,q%!28
v � a%=2 � b%=11 �
� �savewinp(c%)
�& save_sample%=sample%+sel_start%
�* save_samp_size%=sel_end%-sel_start%
�$ save_caret%=caret%-sel_start%
� save_sel_start%=0
�$ save_sel_end%=save_samp_size%
�$ � save_caret%<0 save_caret%=0
�3 � save_caret%>=save_samp_size% save_caret%=0
� �
��
��
�
���savewinp(b%)
Ȏ b% �
� 0 : $save_txt%=sname_log$
�savewin("631")
# save_size%=samp_size%
* � 1 : $save_txt%=sname_sgn$
4 �savewin("632")
># save_size%=samp_size%
H � 2 : $save_txt%=sname_uns$
R �savewin("633")
\# save_size%=samp_size%
f � 3 : $save_txt%=sname_eff$
p �savewin("634")
z# save_size%=samp_size%
� � 4 : $save_txt%=sname_arm$
� �savewin("D3C")
�# save_size%=samp_size%
� �
��
�
���savewin(file_type$)
�$$save_valid%="Sfile_"+file_type$
� file_type%=�("&"+file_type$)
� ș &400E8,,q%!20,q%!24,q%!28
��
�
�
��init
icon_size%=4:menu_size%=8
2icon_size%=icon_size%*1024:� icons% icon_size%
>menu_size%=menu_size%*1024:� menus% menu_size%,q% 2048+512
$2� save_valid% 16,save_txt% 255,code% 1024,L%-1
.-Xtemp%=q%+512:�Xwimp_init("Effex editor")
85� �pvN:�Xwimp_templates(icons%,icons%+icon_size%)
B�Xmem_init(32)
Lquit%=0
Vnum_libs%=0
`.� lib_name$(15),lib_pos%(15),lib_size%(15)
j �vars
t�creicon
~�getwininfo
�
�info_win
��assem(code%)
��init_voice
�!samp_size%=0:sample%=0:vdu%=5
�4zoom=1:sample_type%=-1:sel_start%=-1:sel_end%=-1
�caret%=0:play_rate%=&1800
� use_selection%=0:tracking%=0
��
�
�
��vars
�sname_log$="LogSample"
�sname_uns$="RawSample"
sname_sgn$="SignSample"
sname_eff$="Sample"
sname_arm$="ArmaSample"
sname_sel$="Selection"
(sname_lib$="SampLib"
20mod0$="Y EOR (X AND 255) EOR (128*(X MOD2))"
<mod1$=""
Fmod2$=""
Pmod3$=""
Zmod4$=""
d�
n
x��getwininfo
�� a%:a%=q%+1024
�!q%=win_main%
�!a%=win_pane%
�ș &400CB,,q%
�ș &400CB,,a%
�panex%=a%!4-q%!4
�paney%=a%!8-q%!8
��
�
���err(fat%)
�*err$=�$:� �(-3)=0 err$+=" at line "+Þ
�"� �(-1) �"Set Err$Err "+err$:�
�!q%=�:$(q%+4)=err$
#ș &400DF,q%,3,"Effex" � ,resp%
� resp%<>1 quit%=-1
� quit% � �(-1) �
"� fat%<>0 �
,�
6
@��info_win
J3�Xicon_setstr(win_info%,2,"� Paul Mason, 1993")
T3�Xicon_setstr(win_info%,3,"1.02 (08-Apr-1993)")
^�
h
r
��creicon
|*!q%=-1:q%!4=0:q%!8=0:q%!12=64:q%!16=64
�%q%!20=&1700303A:$(q%+24)="!effex"
�ș &400C2,,q% � iconbar%
��
�
���cre_menus(start%,end%)
��crem_icon
��crem_main
��
�
���crem_icon
�4�Xmenu_start("Effex",start%,end%):menu_icon%=r0%
�$�Xmenu_additem("Info",win_info%)
�"�Xmenu_additem("Clear all",-1)
�Xmenu_additem("Quit",-1)
�Xmenu_end(start%,end%)
�
&
0
��menusel
:ș &400CF,,q%+1024
Dadjust%=(q%!(1024+8)=1)
NȎ Xmenu_ptr% �
X� menu_icon% : �decm_icon
b� menu_main% : �decm_main
l�
v5� adjust% ș &400D4,,Xmenu_ptr%,Xmenu_x%,Xmenu_y%
��
�
���decm_icon
�
Ȏ q%!0 �
�B� 1 : � sample_type%>=0 �Xmem_release(sample%):sample_type%=-1
� !q%=win_main%:�close(q%)
�� 2 : quit%=-1
��
��
�
���open_save(win%)
�
Ȏ win% �
�%� 0 : �osavewin("631",sname_log$)
!%� 1 : �osavewin("632",sname_sgn$)
!%� 2 : �osavewin("633",sname_uns$)
!%� 3 : �osavewin("634",sname_eff$)
! %� 4 : �osavewin("D3C",sname_arm$)
!*�
!4�
!>
!H��osavewin(type$,a$)
!R$save_txt%=a$
!\ș &400CF,,q%+1024
!f$save_valid%="Sfile_"+type$
!pfile_type%=�("&"+type$)
!zsave_size%=samp_size%
!�(ș &400D4,,win_save%,q%!1024,q%!1028
!��
!�
!�ݤkey_ok(k%)
!�� ok%:ok%=-1
!��valid_sel
!�Ȏ k%+64 �
!�%� �"A" : �adj_sel(0,samp_size%-1)
!�� �"C" : �copy_sel
!�#� �"I" : �fadein(Sstart%,Send%)
!�8� �"L" : �Xicon_setstr(win_main%,25,"127"):?Vvol=127
!�$� �"O" : �fadeout(Sstart%,Send%)
!�� �"P" : �ply
"3� �"S" : ?Vcommand=1:Ȗ:?Vcommand=0:!Vcounter=0
"D� �"T" : tracking%=�tracking%:�Xmenu_tick(menu_track%,tracking%)
"� �"E" : �ply_sel
"$� �"V" : �move_sel
".� �"X" : �del_sel
"8� �"Y" : �copy2_sel
"B� �"Z" : �adj_sel(-1,-1)
"L� �"Z"+64 : �selzm
"V� 32+64 : �cont
"`� &183+64: �open_save(3)
"j
: ok%=0
"t�
"~=ok%
"�
"�
��cont
"�� s
"�2� sample_type%>=0 � caret%>0 � caret%<!Vsend �
"�!s=��Xicon_getstr(win_main%,5)
"�$�play(caret%+sample%,!Vsend,0,s)
"��
"��
"�
"���check_all(cc%)
"�.� caret%<0 � cc%<>0 � 1,"No caret present"
"�%� sel_start%<0 � 1,"No selection"
# �
#
#��copy2_sel
#�check_all(-1)
#(A%=sel_start%+sample%
#2B%=sel_end%+sample%
#<C%=caret%+sample%
#FD%=sample%+samp_size%
#P
� copy
#Z�red
#d�
#n
#x��insert(pos%,size%)
#��Xmem_delta(sample%,size%)
#�'�copy(pos%,samp_size%-1,pos%+size%)
#�� caret%>pos% caret%+=size%
#�samp_size%+=size%
#�'� sel_start%>pos% sel_start%+=size%
#�#� sel_end%>pos% sel_end%+=size%
#��
#�
#���delete(start%,end%)
#�7� end%<samp_size%-1 �copy(end%,samp_size%-1,start%)
#�$�Xmem_delta(sample%,start%-end%)
#�1� caret%>=start% � caret%<=end% caret%=start%
#�=� sel_start%>=start% � sel_start%<=end% sel_start%=start%
$7� sel_end%>=start% � sel_end%<=end% sel_end%=start%
$'� caret%>start% caret%-=end%-start%
$samp_size%-=end%-start%
$"�
$,
$6
��del_sel
$@�check_all(0)
$J �delete(sel_start%,sel_end%)
$Tsel_start%=-1
$^sel_end%=-1
$h�red
$r�
$|
$���copy_sel
$��check_all(-1)
$�N� caret%>=sel_start% � caret%<=sel_end% � 1,"Cannot copy inside selection"
$�'�insert(caret%,sel_end%-sel_start%)
$�%�copy(sel_start%,sel_end%,caret%)
$��red
$��
$�
$���move_sel
$�� size%,pos%
$��check_all(-1)
$�size%=sel_end%-sel_start%
$�pos%=�Xmem_claim(size%)
%+�copy(sel_start%,sel_end%,pos%-sample%)
% �delete(sel_start%,sel_end%)
%�insert(caret%,size%)
%&3�copy(pos%-sample%,pos%-sample%+size%-1,caret%)
%0�Xmem_release(pos%)
%:sel_start%=caret%
%Dsel_end%=caret%+size%
%N�red
%X�
%b
%l��modulate(s$,s%,e%)
%v� len%,Z:len%=e%-s%
%�Z=samp_centre%
%�ș "Hourglass_On"
%�A� X=s%-sample% � e%-sample%:Y=sample%?X:Y=�(s$):� Y>255 Y=255
%�/ș &406C4,(X-s%+sample%)*100/len%:� Y<0 Y=0
%�sample%?X=Y:Z=Y:�
%��red
%�ș "Hourglass_Off"
%��
%�
%���selzm
%�3�zoom(999,(sel_end%-sel_start%)*999/samp_size%)
%�!q%=win_pane%:ș &400CC,,q%
%�%q%!20=q%!52*sel_start%/samp_size%
&ș &400C5,,q%
&�
&
& ��decm_main
&*Ȏ !q% �
&4� 0 : Ȏ q%!4 �
&>* � 2 : sample_type%=0:�new_sample_type
&H* � 3 : sample_type%=1:�new_sample_type
&R* � 4 : sample_type%=2:�new_sample_type
&\ � 5 : �lin2log
&f% sample_type%=0:�new_sample_type
&p � 6 : �log2lin
&z% sample_type%=1:�new_sample_type
&�1 � 7 : �eor(128,sample%,samp_size%+sample%-1)
&�2 sample_type%=sample_type%�3:�new_sample_type
&� � 8 : �calc_centre
&� �
&�� 1 : Ȏ q%!4 �
&�# � 0,1,2,3,4 : �open_save(q%!4)
&� �
&�� 2 : Ȏ q%!4 �
&�# � 0 : �adj_sel(0,samp_size%-1)
&� � 1 : �adj_sel(-1,-1)
&� � 2 : �del_sel
&� � 3 : �copy_sel
&� � 4 : �copy2_sel
' � 5 : �move_sel
' � 6 : �mix
' � 7 : �premix
'$ � 8 : �postmix
'. � 9 : �selzm
'8 � 10: �ply_sel
'B �
'L� 3 : �valid_sel
'V Ȏ q%!4 �
'` � 0 : �toggle_sel
'j" � 1 : �reverse(Sstart%,Send%)
't � 2 : �amp(0,Sstart%,Send%)
'~! � 3 : �fadein(Sstart%,Send%)
'�" � 4 : �fadeout(Sstart%,Send%)
'�2 � 5 : �amp((��z(amplify%))/100,Sstart%,Send%)
'�0 � 6 : �amp(100/��z(amplify%),Sstart%,Send%)
'�. � 7 : �eor(��z(eor_const%),Sstart%,Send%)
'�. � 8 : �add(��z(add_const%),Sstart%,Send%)
'�- � 9 : �hpf(�z(hp_filter%),Sstart%,Send%)
'�- � 10: �lpf(�z(lp_filter%),Sstart%,Send%)
'�/ � 11: �core(��z(core_filt%),Sstart%,Send%)
'�1 � 12: �loboost(1/��z(fboost%),Sstart%,Send%)
'�/ � 13: �loboost(��z(fboost%),Sstart%,Send%)
'� � 14: Ȏ q%!8 �
'�3 � 0 : �modulate(�z(menu_mod0%),Sstart%,Send%)
( 3 � 1 : �modulate(�z(menu_mod1%),Sstart%,Send%)
(
3 � 2 : �modulate(�z(menu_mod2%),Sstart%,Send%)
(3 � 3 : �modulate(�z(menu_mod3%),Sstart%,Send%)
(3 � 4 : �modulate(�z(menu_mod4%),Sstart%,Send%)
(( �
(2 � 15: Ȏ q%!8 �
(< � 0,1:
(F8 � 2 : �echo(��z(echo_length%),��z(echo_strength%))
(P: � 3 : �flange(��z(echo_length%),��z(echo_strength%))
(Z< � 4 : �hallecho(��z(echo_length%),��z(echo_strength%))
(d �
(n �
(x� WHEN 4 : CASE q%!4 OF
(�; � WHEN 0 : IF q%!8>-1 PROCadd_libentry(FNz(lib_name%))
(� � WHEN 1 :
(� � WHEN 2 :
(�1 � WHEN 3 : IF q%!8>-1 PROCdel_libentry(q%!8)
(� � ENDCASE
(�� 4 : Ȏ q%!4 �
(� � 0 : �ply
(�1 � 1 : ?Vcommand=1:Ȗ:?Vcommand=0:!Vcounter=0
(�B � 2 : tracking%=�tracking%:�Xmenu_tick(menu_track%,tracking%)
(� � 3 : �cont
(� � 4 : �pitch_bend(1)
(� � 5 : �pitch_bend(-1)
(�6 � 6 : �Xicon_setstr(win_main%,25,"127"):?Vvol=127
) �
)�
)�
)"
),��echo(D%,str)
)6A%=Sstart%
)@B%=Send%
)JC%=samp_centre%
)TE%=(str/100)*(1<<12)
)^
� echo
)h�
)r
)|��hallecho(a%,b)
)�ȕ b>=1
)��flange(a%,b)
)�a%=a%*2:b=b/2
)��
)��
)�
)���flange(D%,str)
)�A%=Sstart%
)�B%=Send%
)�C%=samp_centre%
)�E%=(str/100)*(1<<12)
)�� flange
)��
*
*��valid_sel
*&� use_selection% � sel_start%>=0 �
*&Sstart%=sel_start%
*0:Send%=sel_end%:� Send%>samp_size%-1 Send%=samp_size%-1
*:�
*D
Sstart%=0
*NSend%=samp_size%-1
*X�
*bSstart%+=sample%
*lSend%+=sample%
*v�
*�
*���calc_centre
*�!A%=sample%:B%=A%+samp_size%-1
*�C%=0:� calc_centre
*�-samp_centre%=(!centre_val)/samp_size%+0.5
*��
*�
*�
��lin2log
*�%� vol%,a%,b%:ș &40180,127 � vol%
*�� a%=0 � 255
*�ș &40181,(a%-128)<<24 � b%
*�q%?a%=b%
*��
+"A%=sample%:B%=samp_size%:C%=q%
+
� convert
+ș &40180,vol%
+ �red
+*�
+4
+>
��log2lin
+H%� vol%,a%,b%:ș &40180,127 � vol%
+R� a%=0 � 255
+\ș &40181,(a%-128)<<24 � b%
+fq%?b%=a%
+p�
+z"A%=sample%:B%=samp_size%:C%=q%
+�
� convert
+�ș &40180,vol%
+��red
+��
+�
+���loboost(val,A%,B%)
+�� a%
+�� a%=0 � 255
+�,q%!(a%<<2)=((255-a%)*val+a%)*(1<<12)�255
+��
+�D%=samp_centre%
+� C%=q%
+�� boost
,�red
,�
,
,$��hiboost(val,A%,B%)
,.� a%
,8� a%=0 � 255
,B*q%!(a%<<2)=(a%*val+255-a%)*(1<<12)�255
,L�
,VD%=samp_centre%
,` C%=q%
,j� boost
,t�red
,~�
,�
,���reverse(A%,B%)
,�
� reverse
,��red
,��
,�
,���amp(a,A%,B%)
,�C%=samp_centre%
,�D%=a*(1<<12)
,� � amp
,��red
,��
-
-
��fadein(A%,B%)
-C%=samp_centre%
-� fadein
-(�red
-2�
-<
-F��fadeout(A%,B%)
-PC%=samp_centre%
-Z
� fadeout
-d�red
-n�
-x
-���eor(C%,A%,B%)
-� � eor
-��red
-��
-�
-���add(C%,A%,B%)
-� � add
-��red
-��
-�
-� ��red
-�!q%=win_pane%:ș &400CB,,q%
-�/ș &400D1,win_pane%,q%!20,-256,q%!20+1150,0
.�
.
.��init_voice
."� a%
.,#ș &40140,0,0,0,0,0 � num_chan%
.6%� num_chan%>2 a%=num_chan% � a%=2
.@ș &40140,a%,0,0,0,0
.J2ș "Sound_InstallVoice",Vbase,0 � ,voice_slot%
.T�
.^
.h��quit_voice
.rș &40140,num_chan%,0,0,0,0
.|'ș "Sound_RemoveVoice",,voice_slot%
.��
.�
.���pitch_bend(change)
.�play_rate%+=change*16
.�� 2,&1FF,play_rate%,255
.��
.�
.���hpf(s$,A%,B%)
.�Ȏ �s$,1) �
.�#� "+","-" : C%=samp_centre%+�s$
.� : C%=�s$
.��
.�
� hp_filt
/�red
/�
/
/&��lpf(s$,A%,B%)
/0Ȏ �s$,1) �
/:#� "+","-" : C%=samp_centre%+�s$
/D : C%=�s$
/N�
/X
� lp_filt
/b�red
/l�
/v
/���core(v%,A%,B%)
/�E%=samp_centre%
/�C%=E%-v%
/�D%=E%+v%
/�� core_filt
/��red
/��
/�
/���play(pos%,end%,vol%,rate)
/�� a%,b%,c%
/�+c%=tab_start:rate=�(6144/12.5*rate+0.5)
/�!Vspos=pos%:!Vsend=end%
/�!Vconv_tab=tab_start
0� a%=0 � 255
0Ȏ sample_type% �
0� 0 : c%?a%=a%
0 (� 1 : ș &40181,(a%-128)<<24 � c%?a%
0*.� 2 : ș &40181,((a%�128)-128)<<24 � c%?a%
04�
0>�
0Hș &40185,2,voice_slot%
0Rș &40142,2,0
0\� 2,&17F,rate,255
0fplay_rate%=rate
0p�
0z
0���copy(A%,B%,C%)
0�A%+=sample%
0�B%+=sample%
0�C%+=sample%
0�
� copy
0��
0�
0���check_limits
0�� a%,b%
0�%� Sstart%<sample% Sstart%=sample%
0�:� Send%>=sample%+samp_size% Send%=sample%+samp_size%-1
0�a%=sel_start%
0�� sel_start%<0 a%=0
1b%=sel_end%
1@� sel_end%>=sample%+samp_size% sel_end%=sample%+samp_size%-1
1�adj_sel(a%,b%)
1$�
1.
18��toggle_sel
1B#use_selection%=� use_selection%
1L+�Xmenu_tick(menu_selfx%,use_selection%)
1V�
1`
1j
��clr_all
1tuse_selection%=0
1~�Xmenu_tick(menu_selfx%,0)
1��
1�
1���new_sample_type
1�'� shade%,tick%:shade%=%1111:tick%=0
1�Ȏ sample_type% �
1�3� 0 : shade%=%0101:tick%=%1001:samp_centre%=128
1�3� 1 : shade%=%0010:tick%=%1010:samp_centre%=128
1�1� 2 : shade%=%0011:tick%=%0100:samp_centre%=0
1��
1�'�Xmenu_shade(menu_conv%+0,shade%�1)
1�(�Xmenu_shade(menu_conv%+24,shade%�2)
1�(�Xmenu_shade(menu_conv%+48,shade%�4)
2 (�Xmenu_shade(menu_conv%+72,shade%�8)
2
&�Xmenu_tick(menu_stype%+0,tick%�1)
2*�Xmenu_shade(menu_save%+0,(tick%�7)�1)
2'�Xmenu_tick(menu_stype%+24,tick%�2)
2(+�Xmenu_shade(menu_save%+24,(tick%�7)�2)
22'�Xmenu_tick(menu_stype%+48,tick%�4)
2<+�Xmenu_shade(menu_save%+48,(tick%�7)�4)
2F'�Xmenu_shade(menu_save%+96,tick%�8)
2P�
2Z
2d��do_libentries
2n� a%
2x� num_libs%<=0 �
2�"�Xmenu_shade(menu_lib%+24*1,1)
2�"�Xmenu_shade(menu_lib%+24*2,1)
2�"�Xmenu_shade(menu_lib%+24*3,1)
2�$(sub_lib2%+40)=""
2�sub_lib2%!28=128
2�$sub_lib2%!36=sub_lib%!36�(1<<22)
2��
2�'sub_lib2%!36=sub_lib%!36�(�(1<<22))
2�"�Xmenu_shade(menu_lib%+24*1,0)
2�"�Xmenu_shade(menu_lib%+24*2,0)
2�"�Xmenu_shade(menu_lib%+24*3,0)
2�� a%=0 � num_libs%-1
2�,$(sub_lib2%+40+a%*24)=�lib_name$(a%),11)
34sub_lib2%!(28+a%*24)=sub_lib2%!(28+a%*24)�(�128)
3�
3=sub_lib2%!(4+num_libs%*24)=sub_lib2%!(4+num_libs%*24)�128
3"�
3,�
36
3@��add_libentry(s$)
3J� a%,si%
3Ts$=�s$,11)
3^E� num_libs%>=16 � 1,"Too many library entries (can only have 16)"
3hlib_name$(num_libs%)=s$
3rsi%=sel_end%-sel_start%+1
3|-� sel_start%<0 � 1,"No selection to add!"
3�9a%=�Xmem_claim(si%):� a%=0 � 1,"No room to add entry"
3�lib_pos%(num_libs%)=a%
3�lib_size%(num_libs%)=si%
3�num_libs%+=1
3��do_libentries
3��
3�
3���del_libentry(s%)
3�� a%
3��Xmem_release(lib_pos%(s%))
3�num_libs%-=1
3�$� s%>=num_libs% �do_libentries:�
3�� a%=s% � num_libs%-1
4!lib_name$(a%)=lib_name$(a%+1)
4lib_pos%(a%)=lib_pos%(a%+1)
4!lib_size%(a%)=lib_size%(a%+1)
4&�do_libentries
40�
4:
4D��adj_sel(a%,b%)
4Nsel_start%=a%:sel_end%=b%
4X�new_selection
4b!q%=win_pane%:ș &400CB,,q%
4l/ș &400D1,win_pane%,q%!20,-256,q%!20+1149,0
4v�
4�
4���samp_mix(A%,B%,C%)
4�A%+=sample%
4�B%+=sample%
4�C%+=sample%
4�D%=sample%+samp_size%-1
4�E%=samp_centre%:� mix
4��
4�
4� ��mix
4��check_all(-1)
4�M� caret%>=sel_start% � caret%<=sel_end% � 1,"Cannot mix within selection"
4�)�samp_mix(sel_start%,sel_end%,caret%)
5�
5
5��premix
5 � size%
5*�check_all(0)
54size%=sel_end%-sel_start%
5>C%=sel_start%-size%+sample%
5HD%=sel_start%-1+sample%
5RA%=sel_start%+sample%
5\B%=sel_end%+sample%
5fE%=samp_centre%:� mix
5p�
5z
5�
��postmix
5��check_all(0)
5�-�samp_mix(sel_start%,sel_end%,sel_end%+1)
5��
5�
5���new_selection
5�
Ȏ � �
5�)� sel_start%>=0 � sel_end%>sel_start%
5�# �Xmenu_shade(menu_sel%+24*0,0)
5�# �Xmenu_shade(menu_sel%+24*1,0)
5�# �Xmenu_shade(menu_sel%+24*2,0)
5�# �Xmenu_shade(menu_sel%+24*3,0)
5�# �Xmenu_shade(menu_sel%+24*4,0)
6# �Xmenu_shade(menu_sel%+24*5,0)
6# �Xmenu_shade(menu_sel%+24*6,0)
6# �Xmenu_shade(menu_sel%+24*7,0)
6$# �Xmenu_shade(menu_sel%+24*8,0)
6.# �Xmenu_shade(menu_sel%+24*9,0)
68$ �Xmenu_shade(menu_sel%+24*10,0)
6B$ �Xmenu_shade(menu_sel%+24*11,0)
6L �Xmenu_shade(menu_lib%,0)
6V �Xmenu_shade(menu_selfx%,0)
6`*� sel_start%=0 � sel_end%=samp_size%-1
6j# �Xmenu_shade(menu_sel%+24*0,1)
6t# �Xmenu_shade(menu_sel%+24*1,0)
6~# �Xmenu_shade(menu_sel%+24*2,0)
6�# �Xmenu_shade(menu_sel%+24*3,0)
6�# �Xmenu_shade(menu_sel%+24*4,0)
6�# �Xmenu_shade(menu_sel%+24*5,0)
6�# �Xmenu_shade(menu_sel%+24*6,0)
6�# �Xmenu_shade(menu_sel%+24*7,0)
6�# �Xmenu_shade(menu_sel%+24*8,0)
6�# �Xmenu_shade(menu_sel%+24*9,0)
6�$ �Xmenu_shade(menu_sel%+24*10,0)
6�$ �Xmenu_shade(menu_sel%+24*11,0)
6� �Xmenu_shade(menu_lib%,0)
6� �Xmenu_shade(menu_selfx%,0)
6�
7 # �Xmenu_shade(menu_sel%+24*0,0)
7
# �Xmenu_shade(menu_sel%+24*1,1)
7# �Xmenu_shade(menu_sel%+24*2,1)
7# �Xmenu_shade(menu_sel%+24*3,1)
7(# �Xmenu_shade(menu_sel%+24*4,1)
72# �Xmenu_shade(menu_sel%+24*5,1)
7<# �Xmenu_shade(menu_sel%+24*6,1)
7F# �Xmenu_shade(menu_sel%+24*7,1)
7P# �Xmenu_shade(menu_sel%+24*8,1)
7Z# �Xmenu_shade(menu_sel%+24*9,1)
7d$ �Xmenu_shade(menu_sel%+24*10,1)
7n$ �Xmenu_shade(menu_sel%+24*11,1)
7x �Xmenu_shade(menu_lib%,1)
7� �Xmenu_shade(menu_selfx%,1)
7��
7�+�Xicon_setstr(win_main%,22,�sel_start%)
7�)�Xicon_setstr(win_main%,23,�sel_end%)
7��
7�
7���open_sinfo
7��set_sinfo(0,caret%)
7��set_sinfo(4,sel_start%)
7��set_sinfo(8,sel_end%)
7�&�set_sinfo(12,sel_end%-sel_start%)
7��set_sinfo(16,samp_size%)
7��
8
8��set_sinfo(ic%,data%)
82� rate%:rate%=��Xicon_getstr(win_main%,5)*1000
8"� data%>-1 �
8,6�Xicon_setstr(win_sampinfo%,ic%,��(data%/1024),8))
861�Xicon_setstr(win_sampinfo%,ic%+1,��data%,8))
8@9�Xicon_setstr(win_sampinfo%,ic%+2,��(data%/rate%),8))
8J=�Xicon_setstr(win_sampinfo%,ic%+3,��(data%/rate%*100),8))
8T�
8^+�Xicon_setstr(win_sampinfo%,ic%,"None")
8h-�Xicon_setstr(win_sampinfo%,ic%+1,"None")
8r-�Xicon_setstr(win_sampinfo%,ic%+2,"None")
8|-�Xicon_setstr(win_sampinfo%,ic%+3,"None")
8��
8��
8�
8���crem_main
8�2�Xmenu_start("Misc",start%,end%):sub_misc%=r0%
8�'�Xmenu_additem("Program",win_info%)
8�*�Xmenu_additem("Sample",win_sampinfo%)
8��Xmenu_message(r0%)
8��Xmenu_dot
8�3�Xmenu_additem("Log sample",-1):menu_stype%=r0%
8�&�Xmenu_additem("Signed sample",-1)
8�(�Xmenu_additem("Unsigned sample",-1)
8��Xmenu_dot
9/�Xmenu_additem("Lin2Log",-1):menu_conv%=r0%
9 �Xmenu_additem("Log2Lin",-1)
9!�Xmenu_additem("(Un)sign",-1)
9&�Xmenu_dot
90%�Xmenu_additem("Calc. centre",-1)
9:�Xmenu_end(start%,end%)
9D�
9N2�Xmenu_start("Save",start%,end%):sub_save%=r0%
9X2�Xmenu_additem("Log",win_save%):menu_save%=r0%
9b�Xmenu_message(r0%)
9l&�Xmenu_additem("Signed",win_save%)
9v�Xmenu_message(r0%)
9�(�Xmenu_additem("Unsigned",win_save%)
9��Xmenu_message(r0%)
9��Xmenu_dot
9�%�Xmenu_additem("Effex",win_save%)
9��Xmenu_message(r0%)
9�(�Xmenu_additem("Armadeus",win_save%)
9��Xmenu_message(r0%)
9��Xmenu_end(start%,end%)
9��
9�6�Xmenu_start("Selection",start%,end%):sub_sel%=r0%
9�9�Xmenu_additem("Select all ^A",-1):menu_sel%=r0%
9�+�Xmenu_additem("Clear selection ^Z",-1)
9��Xmenu_dot
:+�Xmenu_additem("Delete ^X",-1)
:+�Xmenu_additem("Copy ^C",-1)
:+�Xmenu_additem("Copy over ^Y",-1)
: +�Xmenu_additem("Move ^V",-1)
:*�Xmenu_dot
:4�Xmenu_additem("Mix",-1)
:> �Xmenu_additem("Pre-mix",-1)
:H!�Xmenu_additem("Post-mix",-1)
:R�Xmenu_dot
:\*�Xmenu_additem("Zoom Z",-1)
:f+�Xmenu_additem("Play ^E",-1)
:p.�Xmenu_additem("Save selection",sub_save%)
:z�Xmenu_end(start%,end%)
:��
:�2�Xmenu_start("Echo",start%,end%):sub_echo%=r0%
:�?�Xmenu_addwrs("Length","a0-9,&,A-F,a-f","128",echo_length%)
:�:�Xmenu_addwrs("Strength","a0-9,.","60",echo_strength%)
:��Xmenu_dot
:�'�Xmenu_additem("Normal echo E",-1)
:�'�Xmenu_additem("Flange echo F",-1)
:�'�Xmenu_additem("Hall echo H",-1)
:��Xmenu_end(start%,end%)
:��
:�5�Xmenu_start("Modulate",start%,end%):sub_mod%=r0%
:�E�Xmenu_addinput("",64,10):menu_mod0%=Xmenu_end%:$Xmenu_end%=mod0$
:�E�Xmenu_addinput("",64,10):menu_mod1%=Xmenu_end%:$Xmenu_end%=mod1$
;E�Xmenu_addinput("",64,10):menu_mod2%=Xmenu_end%:$Xmenu_end%=mod2$
;E�Xmenu_addinput("",64,10):menu_mod3%=Xmenu_end%:$Xmenu_end%=mod3$
;E�Xmenu_addinput("",64,10):menu_mod4%=Xmenu_end%:$Xmenu_end%=mod4$
;$�Xmenu_end(start%,end%)
;.�
;83�Xmenu_start("Effects",start%,end%):sub_fx%=r0%
;B2�Xmenu_additem("Selection",-1):menu_selfx%=r0%
;L�Xmenu_dot
;V �Xmenu_additem("Reverse",-1)
;` �Xmenu_additem("Silence",-1)
;j&�Xmenu_additem("Fade in ^I",-1)
;t&�Xmenu_additem("Fade out ^O",-1)
;~�Xmenu_dot
;�2�Xmenu_addwrs("Amplify","a0-9","100",amplify%)
;�� PROCXmenu_shade(r0%,1)
;�&�Xmenu_addwrs2("Quieten",amplify%)
;�>�Xmenu_addwrs("Eor const","a0-9,&,A-F,a-f","0",eor_const%)
;�>�Xmenu_addwrs("Add const","a0-9,&,A-F,a-f","0",add_const%)
;�;�Xmenu_addwrs("HA filter","a0-9,+,\-","+96",hp_filter%)
;�;�Xmenu_addwrs("LA filter","a0-9,+,\-","-96",lp_filter%)
;�A�Xmenu_addwrs("Core filter","a0-9,&,A-F,a-f","16",core_filt%)
;�4�Xmenu_addwrs("LF boost","a0-9,.","1.5",fboost%)
;�&�Xmenu_addwrs2("HF boost",fboost%)
;�'�Xmenu_additem("Modulate",sub_mod%)
;�$�Xmenu_additem("Echo",sub_echo%)
<