' Loading and playing a sequence from AS Sound Sampler ' by A.Lüning Mai 1987 ' ' Dimension sequence list for n steps n=1000 DIM sindex%(n),sspeed%(n),srepeat%(n),soffset%(n) ' Dimension pattern list for n patterns n=100 DIM mstart(n),mlen(n),mstr$(n) ' Make memory ready for the pattern(s) s_len=FRE(0)-20000 DIM smp%(s_len/4) s_start=LPEEK(ARRPTR(smp%()))+4 ' The following program is an example for the use of the ' procedures in this file GOSUB smpinit IF ferr=0 PRINT PRINT TAB(5);"AS Sound Sampler from GfA-Basic - by A.Lüning May 1987" PRINT FILESELECT "*.SEQ","",n$ GOSUB loadseq(n$) DO PRINT AT(5,10);" " GOSUB playseq(1) PRINT AT(5,10);"Press Q to quit; any other to play again" a$=INPUT$(1) EXIT IF a$="q" LOOP ENDIF END ' Procedure loadseq - Load a sequence PROCEDURE loadseq(fn$) LOCAL str$,count,fhandle,dummy,len count=0 OPEN "I",#1,fn$ str$=INPUT$(160,#1) DO str$=INPUT$(4,#1) mstart(count)=CVL(str$) EXIT IF mstart(count)=-1 mstart(count)=mstart(count)+s_start str$=INPUT$(4,#1) mlen(count)=CVL(str$) str$=INPUT$(16,#1) mstr$(count)=str$ INC count EXIT IF count>100 LOOP count=0 DO str$=INPUT$(2,#1) sindex%(count)=CVI(str$) EXIT IF sindex%(count)=65535 str$=INPUT$(2,#1) sspeed%(count)=CVI(str$) str$=INPUT$(2,#1) srepeat%(count)=CVI(str$) str$=INPUT$(2,#1) soffset%(count)=CVI(str$) INC count EXIT IF count>1000 LOOP p=LOC(#1) CLOSE #1 fhandle=GEMDOS(&H3D,L:VARPTR(fn$),0) len=GEMDOS(&H42,L:0,fhandle,2) IF (len>s_len) ALERT 3,"Not enough memory to|load the sequence.",1,"exit",dummy ferr=1 ELSE dummy=GEMDOS(&H42,L:p,fhandle,0) dummy=GEMDOS(&H3F,fhandle,L:len-p,L:s_start) dummy=GEMDOS(&H3E,fhandle) ferr=0 ENDIF RETURN ' Initialising the actual code (reading of SAMPLER.IMG) PROCEDURE smpinit LOCAL r,len,dummy,a$,b$ a$="sampler.img" b$="" r=GEMDOS(&H4B,3,L:VARPTR(a$),L:VARPTR(b$),L:VARPTR(b$)) IF r<=0 ALERT 3,"Cannot open file",1,"Exit",r ferr=1 ELSE len=LPEEK(r+&HC)+LPEEK(r+&H14)+LPEEK(r+&H1C)+&H100 dummy=GEMDOS(&H4A,0,L:r,L:len) smpin=r+&H100 conv=r+&H100+&H8E speak=r+&H100+&H14A smpon=r+&H100+&H312 smpoff=r+&H100+&H2F6 ferr=0 ENDIF RETURN ' Output of a sequence PROCEDURE playseq(port) LOCAL i,r,block,buffer,length,dummy OUT 4,&H13 IF port=1 dummy=C:smpon() ENDIF FOR i=0 TO 1000 EXIT IF sindex%(i)=65535 PRINT AT(6,5);sindex%(i);":";TAB(10);mstr$(sindex%(i));" " block=sindex%(i) buffer=mstart(block) length=mlen(block) IF soffset%(i)>9 buffer=buffer+length-1 ENDIF FOR r=0 TO srepeat%(i)-1 IF port=1 dummy=C:speak(L:buffer,L:length,99-sspeed%(i)+6,soffset%(i)) ELSE dummy=C:conv(L:buffer,L:length,99-sspeed%(i)+8,soffset%(i)) ENDIF NEXT r NEXT i IF port=1 dummy=C:smpoff() ENDIF OUT 4,&H11 RETURN ' Output of a pattern PROCEDURE playpat(index,port,speed,repeat,offset) LOCAL buffer,length,dummy OUT 4,&H13 IF port=1 dummy=C:smpon() ENDIF buffer=mstart(block) length=mlen(block) IF offset>9 OR offset<0 buffer=buffer+length-1 ENDIF FOR r=0 TO repeat-1 IF port=1 dummy=C:speak(L:buffer,L:length,99-speed+6,offset) ELSE dummy=C:conv(L:buffer,L:length,99-speed+8,offset) ENDIF NEXT r IF port=1 dummy=C:smpoff() ENDIF OUT 4,&H11 RETURN