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