Listing of file='COMP.BAS;01' on disk='vmedia/soundware_II-sector.ccvf'
10 GOSUB 60000 50 CLEAR 1000:NS= 0:S1= 0:S2= 0:C= 0:CT= 0:OUT 8,255 60 GOSUB 50000 70 DIM DE(100),NE$(100) 100 PLOT 6,2,12,29:PRINT "MUSIC COMPOSER":PRINT 105 DIM PS(100),DS(100) 500 REM DRIVER 510 INPUT "ADD, CLEAR, EDIT, LOAD, PRINT, QUIT, REPLAY OR SAVE ? ";A$ 515 PLOT 18 520 A$= LEFT$ (A$,1) 530 IF A$= "A" GOTO 4000 540 IF A$= "E" GOTO 3000 545 IF A$= "L" GOTO 7000 550 IF A$= "P" GOTO 5000 560 IF A$= "Q" THEN END 570 IF A$= "R" GOTO 2000 580 IF A$= "S" GOTO 6000 590 IF A$< > "C" GOTO 510 600 CT= 0:C= 0:GOTO 4000 2000 REM REPLAY ROUTINE 2005 NS= 0:S1= 0:S2= 0:GOSUB 2500 2010 FOR I= RL- 1 TO RH- 1 2015 IF I> CT- 1 GOTO 500 2017 IF I< 0 GOTO 2100 2020 PI= PS(I):DU= DS(I) 2030 IF PI> 0 GOTO 2090 2040 FOR J= 1 TO DU:NEXT J 2050 GOTO 2100 2090 GOSUB 63000 2100 NEXT I 2200 GOTO 500 2500 PRINT "RANGE OF NOTES> "; 2510 RL= 0 2520 GOSUB 11000:RL= X 2530 GOSUB 11000:RH= X 2540 IF RH< RL OR RH= 0 THEN RH= CT 2550 PRINT :RETURN 3000 REM EDIT THE TUNE 3010 GOSUB 2500 3020 IF RL= 0 GOTO 3100 3040 PRINT "NUMBER","DURN","NOTE" 3050 FOR I= RL TO RH 3055 IF I< 0 GOTO 3080 3060 IF I- 1> CT- 1 GOTO 3010 3070 PRINT I,DE(I- 1),NE$(I- 1) 3080 NEXT I 3100 INPUT "NUMBER OF NOTE TO CHANGE = ";C 3110 IF C= 0 GOTO 3200 3120 C= C- 1:GOSUB 10000 3130 GOTO 3100 3200 INPUT "FINISHED EDITING (Y/N) ? ";A$ 3210 IF A$= "Y" GOTO 500 3220 GOTO 3010 4000 REM ADD NOTES TO THE TUNE 4010 C= CT:GOSUB 10000 4020 IF D= 0 GOTO 500 4030 CT= CT+ 1:GOTO 4010 5000 REM PRINT OUT THE DATA 5010 GOSUB 2500 5020 IF RL= 0 GOTO 500 5030 PRINT "NUMBER","PITCH","DURN" 5040 FOR I= RL- 1 TO RH- 1 5050 IF I> CT- 1 GOTO 5010 5060 IF I< 0 GOTO 5080 5070 PRINT I+ 1,PS(I),DS(I) 5080 NEXT I 5090 GOTO 5010 6000 REM SAVE THE DATA IN A FILE 6020 INPUT "FILENAME> ";F$ 6030 FILE "N",F$,CT+ 1,8,16 6040 FILE "R",1,F$,2 6045 PUT 1;CT- 1,CT- 1 6050 FOR I= 0 TO CT- 1 6060 PUT 1;PS(I),DS(I) 6070 NEXT I 6080 FILE "C",1 6500 GOTO 500 7000 REM LOAD A SAVED TUNE 7010 INPUT "FILENAME> ";F$ 7020 FILE "R",1,F$,2 7030 GET 1;CT,CT 7040 FOR I= 0 TO CT 7050 GET 1;PS(I),DS(I) 7060 NEXT I 7070 CT= CT+ 1 7080 FILE "C",1 7500 GOTO 500 10000 PRINT "DURATION,OCTAVE,NOTE> "; 10010 PRINT "";:GOSUB 11000:D= X 10020 IF D= 0 THEN PRINT :RETURN 10030 IF D< 1 OR D> 32 GOTO 10057 10050 PRINT "";:O = CALL (2)- 48 10055 IF O< > - 22 GOTO 10060 10057 GOSUB 10900:IF D> 9 THEN PRINT " ";:GOSUB 10900 10058 GOTO 10010 10060 IF O< 1 OR O> 5 GOTO 10050 10070 PRINT CHR$ (O+ 48);" "; 10080 PRINT "";:N$ = CHR$ (CALL (2)) 10085 IF N$= CHR$ (26) THEN GOSUB 10900:GOTO 10050 10090 IF N$= "R" THEN PRINT N$;:GOTO 10200 10100 IF N$< "A" OR N$> "G" GOTO 10080 10110 PRINT N$;" "; 10120 NC = CALL (2) 10125 IF NC< > 26 GOTO 10130 10127 GOSUB 10900:GOTO 10080 10130 IF NC= 13 GOTO 10200 10140 IF NC< > 35 AND NC< > 98 GOTO 10120 10150 IF NC= 35 AND N$= "E" GOTO 10127 10160 IF NC= 35 AND N$= "B" GOTO 10127 10170 IF NC= 98 AND N$= "C" GOTO 10127 10180 IF NC= 98 AND N$= "F" GOTO 10127 10182 PRINT CHR$ (NC);" "; 10185 A= CALL (2):IF A= 13 GOTO 10190 10187 IF A= 26 THEN GOSUB 10900:GOTO 10120 10190 N$ = N$+ CHR$ (NC) 10200 PRINT "":L = LEN (N$) 10210 K$ = LEFT$ (N$,1):K = ASC (K$)- ASC ("A") 10220 IF K= 17 GOTO 10550 10240 IF L= 1 GOTO 10310 10250 AC$ = MID$ (N$,2,1) 10270 IF AC$= "#" THEN K= K+ 0.5 10280 IF AC$= "b" THEN K= K- 0.5 10300 IF K= - 0.5 THEN K= 6.5 10310 REM CONVERT TO PITCH 10320 NT= - 1 10330 IF K= 2.0 THEN NT= 0:REM C 10340 IF K= 2.5 THEN NT= 1:REM C# 10350 IF K= 3.0 THEN NT= 2:REM D 10360 IF K= 3.5 THEN NT= 3:REM D# 10370 IF K= 4.0 THEN NT= 4:REM E 10380 IF K= 5.0 THEN NT= 5:REM F 10390 IF K= 5.5 THEN NT= 6:REM F# 10400 IF K= 6.0 THEN NT= 7:REM G 10410 IF K= 6.5 THEN NT= 8:REM G# 10420 IF K= 0.0 THEN NT= 9:REM A 10430 IF K= 0.5 THEN NT= 10:REM A# 10440 IF K= 1.0 THEN NT= 11:REM B 10450 REM SET UP PARAMETERS 10460 LN = D* 4000 10470 IF NT< 0 GOTO 10550 10480 PI= PM(O- 1,NT) 10490 DU= INT (LN/ PI) 10500 GOSUB 63000 10510 PS(C)= PI:DS(C)= DU:DE(C)= D:NE$(C)= CHR$ (O+ 48)+ N$:RETURN 10550 PS(C)= 0:DS(C)= D* 10:DE(C)= D:NE$(C)= "REST":RETURN 10900 PRINT CHR$ (26);CHR$ (26);" ";CHR$ (26);CHR$ (26);:RETURN 11000 X= 0:QC= 0 11010 QQ = CALL (2) 11020 IF QQ= 13 OR QQ= 32 OR QQ= 44 THEN PRINT " ";:RETURN 11030 IF QQ< > 26 GOTO 11060 11040 IF QC> 0 THEN PRINT CHR$ (26);" ";CHR$ (26);:QC= QC- 1:X= INT (X/ 10) 11050 GOTO 11010 11060 IF QQ< 48 OR QQ> 57 GOTO 11010 11070 QC= QC+ 1:X= X* 10+ QQ- 48:PRINT CHR$ (QQ); 11080 GOTO 11010 50000 REM SET UP THE MUSICAL NOTES 50010 DIM PM(4,11) 50020 RESTORE 51000 50030 FOR O= 0 TO 4 50040 FOR NT= 0 TO 11 50050 READ PM(O,NT) 50060 NEXT NT 50070 NEXT O 50080 RETURN 51000 DATA 626,591,557,526,497,469,442,418,394,372,351,332 51010 DATA 313,296,280,263,249,236,223,211,199,187,176,165 51020 DATA 154,146,138,130,122,115,109,103, 97, 91, 86, 81 51030 DATA 77, 72, 68, 64, 60, 57, 54, 51, 48, 45, 42, 39 51040 DATA 37, 35, 33, 31, 29, 27, 25, 24, 22, 21, 20, 18 51050 DATA 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6 60000 REM SOUND PATCH 60005 PLOT 6,7,15,12,14,3,29,15 60006 REM USER NOTE: CHANGE DA IN STATEMENT 60010 TO: 60007 REM 40770 FOR 8K MACHINES 60008 REM 48962 FOR 16K MACHINES 60009 REM OR 65346 FOR 32K MACHINES 60010 DA= 65346 60015 AD= 32940:GOSUB 60100:CLEAR 100 60019 REM 60020 FINDS TOP OF BASIC MEMORY 60020 GOSUB 62000 60021 POKE TM+ 1,50:POKE TM+ 2,0:POKE TM+ 3,15:POKE TM+ 4,0 60024 REM 60025 SETS THE CALL VECTOR 60025 AD= 33283:DA= TM+ 8:GOSUB 60100 60035 PRINT "WORKING" 60040 RESTORE 60200 60049 REM 60050 LOADS MACHINE LANGUAGE 60050 FOR N= 1TO 200:READ A:IF A> 255THEN N= 220:GOTO 60080 60060 IF A< 0THEN DA= TM- A:AD= TM+ N:GOSUB 60100:N= N+ 1:GOTO 60080 60070 POKE TM+ N,A 60080 NEXT 60090 GOTO 50 60100 Z1= INT (DA/ 256):Z2= DA- Z1* 256 60110 POKE AD,Z2:POKE AD+ 1,Z1:RETURN 60199 REM MACHINE LANGUAGE DATA 60200 DATA 50,0,15,0,0,0,0,123,254,0,194,-121,30,8,243 60210 DATA 58,-6,87,58,-7,254,0,194,-33,122,50,-7,42,-1 60220 DATA 34,-49,42,-3,34,-46,33,-22,1,50,0,11,120,177 60230 DATA 194,-51,123,238,2,211,4,95,43,124,181,194 60240 DATA -48,58,-5,254,0,202,-100,61,50,-5,58,-49,130 60250 DATA 50,-49,58,-7,103,122,50,-7,84,195,-45,50,-7 60260 DATA 50,-4,50,-2,62,15,50,-3,62,50,50,-1,251,201 60270 DATA 254,1,194,-158,33,0,0,6,4,14,17,17,128,0,25 60280 DATA 126,17,128,255,25,119,35,0,13,194,-133,17,8 60290 DATA 0,25,5,194,-131,201 60300 DATA 254,2,194,-182,245,229,197,205,36,0,194,-166 60310 DATA 95,175,87,50,255,129,193,225,241,201,201 60320 DATA 300 61000 REM RETURN LINKAGE 61050 REM RETURN TO CALLING PROGRAM:RETURN 62000 TM= PEEK (32940)+ PEEK (32941)* 256:RETURN 63000 REM SOUND EXECUTER 63010 GOSUB 62000 63020 AD= TM+ 1:DA= PI:GOSUB 60100 63030 AD= TM+ 3:DA= DU:GOSUB 60100 63040 POKE TM+ 5,NS:POKE TM+ 6,S1:POKE TM+ 7,S2 63050 QQ = CALL (0) 63060 RETURN