10 REM ************************************************************************ 11 REM * * 12 REM * 'DRUM SYNTH 64' - AN EXPERIMENTAL DRUM SYNTHESIS PROGRAM WITH * 13 REM * RECORDING, EDITING, PLAYBACK AND STORAGE OPTIONS. * 14 REM * * 15 REM * AUTHOR OF PROGRAM : ANDREW D. LEEDER, AGE 16 * 16 REM * COMPUTER : COMMODORE 64 MICROCOMPUTER * 17 REM * LANGUAGE : CBM BASIC V2.0 AND MACHINE CODE * 18 REM * DATE OF COMPLETION : AUGUST, 1987 * 19 REM * * 20 REM ************************************************************************ 21 : 22 : 50 REM***********************************************************INITIALISATION 72 V=53248:POKEV+21,0:S=54272:TP=128:PN=0:PM=16384:PL=49156:DS=49334:HL=49411 73 DIMSN(8,8),SN$(8),VC(2),PF(3),SG(64),SD(64):FORA=0TO34:POKE53213+A,0:NEXTA 74 FORA=0TO2:POKE53213+A,1:NEXTA:GOSUB10001:GOSUB9005:GOSUB3004:SYSDS,PM+3 75 GOSUB911:GOSUB921:GOSUB1005:POKE56325,40:SYS51200 100 REM*********************************************************OPERATE WINDOWS 109 GOSUB141:IFX>208ANDY>56ANDY<145THENGOSUB150 110 IFX>32ANDX<197ANDY>56ANDY<145THENGOSUB201 121 IFY>155THENGOSUB301 130 GOTO109 140 REM***********************************************OBTAIN POINTER X,Y VALUES 141 X=PEEK(V)+(256*PEEK(V+16)):Y=PEEK(V+1):RETURN 149 REM***************************************************************MAIN MENU 150 A$=" **** OPTIONS ****":GOSUB901 151 GETA$:IFA$=""THENGOSUB170 153 IFA$=""THENAD=V+32:GOSUB180 154 IFA$=""THENAD=V+33:GOSUB180 155 IFA$=""THENAD=V+39:GOSUB180 156 IFA$=""THENGOSUB191 157 IFA$=""THENSYS65126 160 GOSUB141:IFX<208ORY>145THENGOSUB911:RETURN 161 IFPEEK(56320)<>111ORX<216ORX>330ORY<82ORY>137THENGOTO151 162 A=INT((X-216)/30)+1:B=INT((Y-82)/28):C=A+(B*4):D=A-1:LC=55480+(B*160)+(D*4) 163 FORF=0TO80STEP40:SYSHL,LC+F,3,1:NEXTF 164 ONCGOSUB401,371,431,502,351,422,701,552 165 FORF=0TO80STEP40:SYSHL,LC+F,3,12:NEXTF:FORF=1TO100:NEXTF:GOTO151 169 REM**************************************************CHANGE CURSOR VELOCITY 170 GOSUB911:PRINT""TAB(9)"CURSOR VELOCITY (0-9) ?" 171 GETA$:IFA$<"0"ORA$>"9"THENGOTO171 172 A=VAL(A$):POKE56325,16+(A*6):A$="**** MENU ****":GOSUB901:RETURN 179 REM**********************************************************CHANGE COLOURS 180 IFPEEK(AD)<255THENPOKEAD,PEEK(AD)+1:RETURN 181 POKEAD,0:RETURN 190 REM***************************************************MANUAL PATTERN CHANGE 191 GOSUB911:INPUT"NEW PATTERN NUMBER ";A$:A=VAL(A$):IFA<0ORA>255THENGOTO191 192 PN=A:PM=16384+(A*35):SYSDS,PM+3:GOSUB921:GOSUB1005:A$=" **** OPTIONS ****" 193 GOSUB901:RETURN 200 REM************************************************************SELECT DRUMS 201 A$="SOUND SELECTION...":GOSUB901 202 GOSUB141:IFX>197ORY>145THENGOSUB911:GOSUB240:RETURN 203 IFPEEK(56320)<>111THENGOTO202 204 GOSUB141:FORA=0TO2:IFX>(36+(52*A))ANDX<(86+(52*A))ANDY>81ANDY<126THENGOSUB250 205 NEXTA:GOTO202 240 FORA=0TO2:VC(A)=(PEEK(2045+A))-215:POKEPM+A,VC(A):NEXTA:GOSUB1005:RETURN 250 B=216:IFPEEK(2045+A)<223THENB=PEEK(2045+A)+1 251 POKE2045+A,B:PRINT"[152]"SPC((A*7)+3)SN$(B-215):RETURN 300 REM**********************************************************RECORD PATTERN 301 A$="RECORD/EDIT PATTERN...":GOSUB901:A=0:B=0 303 GOSUB141:IFY<155THENGOSUB911:RETURN 304 IFPEEK(56320)<>111ORX<66ORX>323ORY<173ORY>233THENGOTO303 305 GOSUB141:A=INT((X-3)/8)-8:B=(INT((Y-5)/8)-21)*40 307 IF(PEEK(1670+A+B)=219)THENGOSUB312:GOTO311 308 IF(PEEK(1670+A+B)=209)THENGOSUB314 311 FORC=1TO100:NEXTC:GOTO303 312 POKE1670+A+B,209:POKEPM+3+A,(PEEK(PM+3+A)OR(2^(B/40))):RETURN 314 POKE1670+A+B,219:POKEPM+3+A,(PEEK(PM+3+A)AND(255-(2^(B/40)))):RETURN 350 REM***************************************************CHANGE PATTERN NUMBER 351 A$="CHANGE PATTERN...":GOSUB901:SYS51213 352 A=PEEK(56320):IFA=123ANDPN>0THENPN=PN-1:PM=PM-35 353 IFA=119ANDPN<255THENPN=PN+1:PM=PM+35 354 SYSDS,PM+3:PRINT""SPC(22)" [157][157][157][157]"PN:IFA<>111THENGOTO352 360 SYS51200:GOSUB911:GOSUB1005:RETURN 370 REM************************************************************CHANGE TEMPO 371 A$="CHANGE TEMPO...":GOSUB901:SYS51213 372 A=PEEK(56320):IFA=123ANDTP>0THENTP=TP-1 373 IFA=119ANDTP<255THENTP=TP+1 374 PRINT""SPC(35)" [157][157][157][157]"TP:IFA<>111THENGOTO372 375 SYS51200:GOSUB911:RETURN 400 REM************************************************************PLAY PATTERN 401 A$="PLAYING PATTERN...":GOSUB901:FORA=0TO2:POKE253+A,2^(PEEK(PM+A)-1):NEXTA 402 SYSPL,PM+3,TP:IFPEEK(252)<>0THENGOSUB911:RETURN 403 GOTO402 420 REM***********************************************************ERASE PATTERN 422 B=14:A$="ERASE PATTERN...":GOSUB901 425 FORA=1TO200:NEXTA:SYSHL,PM+3,32,0:SYSDS,PM+3:GOSUB911:RETURN 430 REM***********************************************************COPY PATTERNS 431 GOSUB911:PRINT"[152] CUT COPY PASTE [146]"; 432 GOSUB141:IFX<136THENSYSHL,55296,14,1:SYSHL,55310,26,12:A=1 433 IFX>136ANDX<240THENSYSHL,55296,14,12:SYSHL,55310,13,1:SYSHL,55323,13,12:A=2 434 IFX>240THENSYSHL,55296,27,12:SYSHL,55323,13,1:A=3 435 IFPEEK(56320)<>111THENGOTO432 436 IFA=1ORA=2THENGOSUB470:IFA=1THENSYSHL,PM+3,32,0:SYSDS,PM+3 438 IFA=3THENGOSUB480:GOSUB1005 439 GOSUB911:RETURN 470 FORB=0TO34:POKE53213+B,PEEK(PM+B):NEXTB:RETURN 480 FORB=0TO34:POKEPM+B,PEEK(53213+B):NEXTB:SYSDS,PM+3:RETURN 500 REM*******************************************************SEQUENCE PATTERNS 502 GOSUB911:FORA=1TO64:AA=A:PRINT"ELEMENT ";A:PRINT"#" 504 INPUT"PATTERN";B$:IFLEFT$(B$,1)="X"THENA=64:GOTO508 505 B=VAL(B$):IFB<0ORB>255THENGOTO504 506 INPUT"TIMES";C$:C=VAL(C$):IFC<1ORC>256THEN506 508 SG(AA)=B:SD(AA)=C:GOSUB911:NEXTA:SE=AA-1:RETURN 550 REM***********************************************************PLAY SEQUENCE 552 FORZ=1TOSE:PN=SG(Z):GOSUB911 553 PRINT"ELEMENT "Z"[157], PATTERN"PN"[157],"SD(Z)"TIMES...":PRINT"#" 554 PM=16384+(PN*35):SYSDS,PM+3:GOSUB921:GOSUB1005:FORX=1TOSD(Z):FORY=0TO2 556 POKE253+Y,2^(PEEK(PM+Y)-1):NEXTY:SYSPL,PM+3,TP:NEXTX,Z:GOSUB911:RETURN 700 REM************************************************************DISK STORAGE 701 GOSUB911:PRINT" SAVE LOAD [146]"; 702 GOSUB141:IFX<183THENSYSHL,55296,20,1:SYSHL,55316,20,12:A=1:B$="WRITE" 703 IFX>183THENSYSHL,55296,20,12:SYSHL,55316,20,1:A=2:B$="READ" 704 IFPEEK(56320)<>111THENGOTO702 705 GOSUB911:INPUT"ENTER FILENAME";FL$:FF$="0:PAT."+LEFT$(FL$,12)+",SEQ,"+B$ 706 IFA=1THENGOSUB752 707 IFA=2THENGOSUB772 709 POKEV+21,255:SYS51200:RETURN 750 REM SAVE PATTERN 752 GOSUB911:INPUT"FIRST PATTERN";SP$:SP=VAL(SP$):IFSP<0ORSP>255THENGOTO752 754 GOSUB911:INPUT"LAST PATTERN";EP$:EP=VAL(EP$):IFEP<0OREP>255OREP0THENGOSUB911:PRINT"DISK ERROR:"AA"[157],"B$","C$","D$:CLOSE2:CLOSE15:RETURN 759 PRINT#2,CHR$(SP);:SP=16384+(SP*35):EP=16418+(EP*35) 760 FORA=SPTOEP:PRINT#2,CHR$(PEEK(A));:NEXTA:PRINT#2,CHR$(13):CLOSE2:CLOSE15:RETURN 770 REM LOAD PATTERN 772 A$="LOADING... PLEASE WAIT":GOSUB901:POKEV+21,0:SYS51213:A=0 773 OPEN15,8,15:OPEN2,8,2,FF$:INPUT#15,AA,B$,C$,D$ 774 IFAA<>0THENGOSUB911:PRINT"DISK ERROR:"AA"[157],"B$","C$","D$:CLOSE2:CLOSE15:RETURN 775 GET#2,SP$:SP=ASC(SP$+CHR$(0)):SA=16384+(SP*35) 776 GET#2,A$:IFA$<>CHR$(13)THENPOKESA+A,ASC(A$+CHR$(0)):A=A+1:GOTO776 778 CLOSE2:CLOSE15:PN=SP:PM=SA:SYSDS,PM+3:GOSUB921:GOSUB1005:RETURN 900 REM*********************************************************DISPLAY MESSAGE 901 PRINT" ";:A=((40-LEN(A$))/2) 902 PRINT""TAB(A)""A$:RETURN 910 REM***********************************************************CLEAR MESSAGE 911 SYSHL,1024,40,32:RETURN 920 REM*******************************************************DISPLAY PN AND TP 921 PRINT""SPC(22)" [157][157][157][157]"PN 922 PRINT""SPC(35)" [157][157][157][157]"TP:RETURN 1000 REM**********************************************************SET UP VOICES 1005 FORA=0TO2:VC(A)=PEEK(PM+A):POKE2045+A,VC(A)+215:NEXTA:FORA=0TO6:FORB=0TO2 1010 POKES+(B*7)+A,SN(VC(B),A+1):NEXTB,A:FORA=0TO2:POKE49152+A,SN(VC(A),5)+1 1020 NEXTA:CT=PF(1):RS=PF(2):FT=PF(3):FORA=0TO2:IFSN(VC(A),8)=1THENRS=RS+(2^A) 1060 NEXTA:POKE54294,CT:POKE54295,RS:POKE54296,15+FT 1065 PRINT"[152]"SN$(VC(0))""SN$(VC(1))""SN$(VC(2)):RETURN 3000 REM***********************************************************PRINT SCREEN 3004 POKEV+32,0:POKEV+33,0:POKEV+24,31 3005 PRINT"[158][147]":FORA=1TO8:PRINT""SN$(A):NEXTA 3006 PRINT"[151][172][152][176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174][146][172][154][176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]"; 3008 PRINT"[151][161][152][194] SOUNDS [152][221][161][154][194] OPTIONS [154][221]"; 3010 PRINT"[151][161][152][194] [221][161][154][194] [221]"; 3012 PRINT"[151][161][152][194] [221][161][154][194][152][146]@[\[154] [152][146][201][202][203][154] [152][146][213][214][215][154] [152][214][202][203][154][221]"; 3014 PRINT"[151][161][152][194] [221][161][154][194][152][146]]$%[154] [152][146][204][205][206][154] [152][146][216][218][220][154] [152][211] [213][154][221]"; 3016 PRINT"[151][161][152][194] [221][161][154][194][152][146]&_[193][154] [152][146][207][208][211][154] [152][146][255][223][166][154] [152][216][218][220][154][221]"; 3018 PRINT"[151][161][152][194] [221][161][154][194] [221]"; 3020 PRINT"[151][161][152][194] [221][161][154][194][152][\][154] [152][146][168][169][171][154] [152][166][168][169][154] [152][146]@[\[154][221]"; 3022 PRINT"[151][161][152][194] [221][161][154][194][152]$[146][221]&[154] [152][146][177][178][179][154] [152][171][177][178][154] [152][146]]$%[154][221]"; 3024 PRINT"[151][161][152][194] [221][161][154][194][152][193][201][255][154] [152][146][186][191]@[154] [152][179][186][191][154] [152][146]&_[193][154][221]"; 3026 PRINT"[151][161][152][173][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][189][161][154][173][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][189]"; 3028 PRINT"[151][146][188][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][146][190][188][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][146][190]"; 3034 PRINT"[129][146][172][158][176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]"; 3035 PRINT"[129][161][158][194]SND[158] PATTERN NUMBER: TEMPO: [158] [221]"; 3037 PRINT"[129][161][158][194] ^_<>^_<>^_<>^_<>^_<>^_<>^_<>^_<> [221]"; 3038 FORA=0TO7:PRINT"[129][161][158][194] [219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219][219] [221]";:NEXTA 3046 PRINT"[129][161][158][173][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195]";:POKE2023,253:RETURN 9000 REM*****************************************************INITIALISE SPRITES 9005 FORA=0TO2:POKEV+10+(A*2),37+(54*A):POKEV+11+(A*2),82:POKEV+44+A,0 9006 POKE2045+A,216+A:NEXTA:POKEV+23,224:POKEV+29,224:POKE2040,214 9007 POKEV+16,0:POKEV,224:POKEV+1,86:POKEV+39,1:POKEV+21,255:RETURN 10000 REM*************************************************READ SOUND PARAMETERS 10001 FORA=1TO8:READSN$(A):FORB=1TO8:READSN(A,B):NEXTB,A:READPF(1),PF(2),PF(3) 10002 RETURN 10009 REM SOUND NAME,L/FREQ,H/FREQ,L/PULSE,H/PULSE,WAVEFORM,A/D,S/R,FILT ON/OFF 10010 DATA"CYM",30,134,0,0,128,12,10,1,"BSD",12,1,0,0,128,7,5,0 10030 DATA"LTM",48,4,0,0,16,24,4,0,"HTM",97,8,0,0,16,24,4,0 10050 DATA"SND",15,67,0,0,128,8,6,0,"HIH",30,134,0,0,128,5,3,1 10060 DATA"BEL",194,102,200,7,64,42,74,0,"HCP",176,230,0,0,128,25,8,0 10070 DATA174,176,64