Compucolor.org – Virtual Media

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