5  REM  HP CONTRIBUTED LIBRARY, "MUSIC", 2/75
10  PRINT "TWELVE - TONE COMPOSITION PROGRAM  11/28/72 VERSION"
20  PRINT 
30  PRINT 
40  PRINT 
50  PRINT "NO. OF MEASURES (16 MAX.)";
60  INPUT C1
70  PRINT "TIME SIGNATURE=X/4, (X=9 MAX.)";
80  INPUT C2
90  PRINT "NO. OF VOICES (4 MAX.)";
100  INPUT N3
110  PRINT "CHOOSE PROBABILITIES FOR OCTAVES (1=YES,0=N0)";
120  INPUT N4
130  PRINT "CHOOSE PROBABILITIES FOR TIME VALUES (1=YES,0=NO)";
140  INPUT N5
150  PRINT "CHOOSE PROBABILITIES FROM 0 TO 1 FOR REST IN VOICE(S)"
160  FOR D=1 TO N3
170  PRINT "VOICE";D;
180  INPUT R[D]
190  IF N3=1 THEN 210
200  NEXT D
210  LET N2=1
220  LET X2=I=Z1=E1=D=0
230  FOR D=1 TO N3
240  LET F[D]=0
250  NEXT D
260  PRINT "INPUT YOUR OWN 12-TONE ROW (1=YES,0=NO)";
270  INPUT N6
280  LET K9=15
290  DIM K[13],A$[13],T[24],G[24],O$[24],N$[13],S$[24],R$[2]
300  DIM F[4],O[8,3],U[4],A[8,4],R[4]
310  MAT U=CON
320  FILES V1,V2,V3,V4
330  IF N4=0 THEN 350
340  GOSUB 2220
350  IF N5=0 THEN 370
360  GOSUB 2510
370  LET X1=C1*C2
380  LET X3=X1*N3
390  MAT G=ZER
400  REM **** RANDOM # GENERATED
410  FOR M=1 TO 12
420  LET I=I+1
430  LET X=RND(I)
440  REM **** 12 DIVISIONS ARE SET UP
450  IF G[M] <> 0 THEN 730
460  FOR N=1 TO 12
470  LET J=N/12
480  IF X<J THEN 520
490  NEXT N
500  GOTO 410
510  REM **** FILLING THE DIVISIONS
520  IF N6=0 THEN 550
530  GOSUB 2870
540  GOTO 560
550  LET G[M]=N
560  LET T[M]=N
570  REM **** SETTING TIME VALUES
580  FOR R=1 TO 8
590  LET Z=R/8
600  IF X<Z THEN 620
610  NEXT R
620  LET K[M]=R/2
630  IF Z1=1 THEN 1870
640  REM **** CHECK FOR REPEATS
650  IF N6=0 THEN 670
660  GOTO 730
670  FOR O=1 TO 12
680  IF M=O THEN 720
690  IF G[M] <> G[O] THEN 720
700  LET G[M]=0
710  GOTO 420
720  NEXT O
730  NEXT M
740  PRINT 
750  PRINT 
760  PRINT "12 TONE ROW"
770  LET Z1=1
780  REM **** STRING QUOTE
790  LET N$="CCDDEFFGGAABR"
800  LET A$=" # #  # # #  "
810  LET O$="123123123123 "
820  FOR M=1 TO 12
830  LET L1=G[M]
840  PRINT N$[L1,L1];A$[L1,L1];
850  PRINT TAB(K9);
860  LET K9=K9+15
870  IF K9>60 THEN 890
880  GOTO 910
890  PRINT 
900  LET K9=15
910  NEXT M
920  REM **** OCTAVE & MEASURE CONTROL COUNT
930  LET M1=0
940  FOR M=1 TO 12
950  LET H=T[M]
960  LET X2=X2+K[H]
970  LET M1=M
980  IF X2=X3 THEN 1070
990  IF X2<X3 THEN 1040
1000  LET X2=X2-K[H]
1010  LET K[H]=X3-X2
1020  LET X2=X2+K[H]
1030  GOTO 1070
1040  NEXT M
1050  LET K9=15
1060  REM **** GENERATE VOICES
1070  IF E1=1 THEN 1360
1080  LET E1=1
1090  LET R3=0
1100  LET D=0
1110  FOR N1=1 TO N3
1120  LET N=N1
1130  LET D=D+1
1140  LET X8=0
1150  READ #D,1
1160  LET X=RND(1)
1170  IF X<R[D] THEN 1190
1180  GOTO 1210
1190  GOSUB 2730
1200  GOTO 1270
1210  LET A=G[N1]
1220  IF N4=0 THEN 1240
1230  GOSUB 2390
1240  LET B=T[N1]
1250  IF N5=0 THEN 1270
1260  GOSUB 2650
1270  LET C=K[N1]
1280  LET F[D]=K[N1]
1290  REM **** PRINT INTO FILES
1300  PRINT #D;1000*A+10*B+C
1310  IF X8=1 THEN 1130
1320  IF N3=D THEN 1350
1340  NEXT N1
1350  LET N2=N1+1
1360  FOR N=N2 TO 12
1370  LET D1=0
1380  LET E=1
1390  FOR G=1 TO N3
1400  IF E=G THEN 1490
1410  IF F[E]<F[G] THEN 1450
1420  IF F[E]>F[G] THEN 1470
1430  LET D=E
1440  GOTO 1490
1450  LET D=E
1460  GOTO 1490
1470  LET E=G
1480  LET D=G
1490  NEXT G
1500  FOR D2=1 TO N3
1510  IF F[D2] <> X1 THEN 1540
1520  NEXT D2
1530  GOTO 1780
1540  LET X8=0
1550  LET X=RND(1)
1560  IF X<R[D] THEN 1580
1570  GOTO 1600
1580  GOSUB 2740
1590  GOTO 1660
1600  LET A=G[N]
1610  IF N4=0 THEN 1630
1620  GOSUB 2390
1630  LET B=T[N]
1640  IF N5=0 THEN 1660
1650  GOSUB 2650
1660  LET C=K[N]
1670  LET F[D]=F[D]+K[N]
1680  IF F[D] <= X1 THEN 1730
1690  LET F[D]=F[D]-K[N]
1700  LET K[N]=X1-F[D]
1710  GOTO 1660
1720  REM **** PRINT ING INTO FILES
1730  PRINT #D;1000*A+10*B+C
1740  IF X8=1 THEN 1370
1750  NEXT N
1760  GOSUB 4000
1770  REM **** OCTAVE & TIME CHANGES
1780  LET N2=1
1790  FOR D=1 TO N3
1800  IF F[D]<X1 THEN 1830
1810  NEXT D
1820  GOTO 1930
1830  FOR M=1 TO 12
1840  LET I=I+1
1850  LET X=RND(I)
1860  GOTO 580
1870  LET T[M]=T[M]+1
1880  IF T[M]<13 THEN 1900
1890  LET T[M]=1
1900  NEXT M
1910  GOTO 930
1920  REM **** MOVE TO FRONT OF FILES
1930  PRINT 
1940  PRINT " EACH NOTE PRINTOUT SHOWS NOTES, OCTAVES, NO. OF BEATS"
1950  FOR D=1 TO N3
1960  PRINT #D; END 
1970  READ #D,1
1980  NEXT D
1990  REM **** PRINT OUT FROM FILES
2000  FOR D=1 TO N3
2010  PRINT 
2020  PRINT 
2030  PRINT "VOICE";D
2040  LET K9=15
2050  READ #D;A9
2060  LET A=INT(A9/1000)
2070  LET B=INT(A9/10)-100*A
2080  LET C=A9-1000*A-10*B
2090  PRINT N$[A,A];A$[A,A];O$[B,B];C;
2100  PRINT TAB(K9);
2110  LET K9=K9+15
2120  IF K9>60 THEN 2140
2130  GOTO 2160
2140  PRINT 
2150  LET K9=15
2160  IF  END #D THEN 2180
2170  GOTO 2050
2180  PRINT 
2190  NEXT D
2200  GOTO 9999
2210  REM **** SUBROUTINE FOR PROBABILITIES OF OCTAVES
2220  FOR D=1 TO N3
2230  FOR J=1 TO 3
2240  LET S=0
2250  READ F1
2260  FOR I=1 TO 2
2270  LET S=S+F1
2280  LET O[2*(D-1)+I,J]=S
2290  READ F1
2300  NEXT I
2310  IF ABS(S+F1-1)<.01 THEN 2340
2320  PRINT "PROBABILITIES FOR OCTAVES DO NOT SUM TO 1 IN VOICE";D
2330  STOP 
2340  NEXT J
2350  IF N3=1 THEN 2370
2360  NEXT D
2370  RETURN 
2380  REM **** SELECTS OCTAVE FOR CURRENT NOTE AS 'P'
2390  LET X=RND(1)
2400  LET K1=U[D]
2410  FOR I=1 TO 2
2420  IF X<O[2*(D-1)+I,K1] THEN 2460
2430  NEXT I
2440  LET P=3
2450  GOTO 2470
2460  LET P=I
2470  LET U[D]=P
2480  LET T[N]=P
2490  RETURN 
2500  REM **** SUBROUTINE FOR PROBABILITES OF TIME VALUES
2510  FOR D=1 TO N3
2520  LET S1=0
2530  FOR I=1 TO 8
2540  READ F2
2550  LET S1=S1+F2
2560  LET A[I,D]=S1
2570  NEXT I
2580  IF ABS(S1-1)<.01 THEN 2610
2590  PRINT "PROBABILITIES FOR TIME VALUES DO NOT SUM TO 1 IN VOICE";D
2600  STOP 
2610  IF N3=1 THEN 2630
2620  NEXT D
2630  RETURN 
2640  REM **** SELECTS TIME VALUES FOR CURRENT NOTE AS 'I/2'
2650  LET X=RND(1)
2660  FOR I=1 TO 8
2670  IF X <= A[I,D] THEN 2700
2680  NEXT I
2690  PRINT "SYSTEM ERROR"
2700  LET K[N]=I/2
2710  RETURN 
2720  STOP 
2730  REM **** SUBROUTINE FOR RESTS
2740  LET A=13
2750  LET B=13
2760  LET X8=1
2770  IF N5=0 THEN 2800
2780  GOSUB 2650
2790  RETURN 
2800  FOR T1=1 TO 8
2810  LET X=RND(1)
2820  IF X<T1/8 THEN 2840
2830  NEXT T1
2840  LET K[N]=T1/2
2850  RETURN 
2860  REM **** SUBROUTINE FOR INPUT OF A 12-TONE ROW
2870  PRINT "NOTE";M;
2880  INPUT R$
2890  LET L3=0
2900  LET S$="C C#D D#E F F#G G#A A#B "
2910  FOR L2=1 TO 23 STEP 2
2920  LET L9=1
2930  IF LEN(R$)=2 THEN 2950
2940  LET L9=0
2950  IF R$=S$[L2,L2+L9] THEN 2990
2960  NEXT L2
2970  PRINT "IS NOT A NOTE!"
2980  GOTO 2870
2990  FOR L4=1 TO 23 STEP 2
3000  LET L3=L3+1
3010  IF L2=L4 THEN 3040
3020  NEXT L4
3030  PRINT "SYSTEM ERROR"
3040  LET G[M]=L3
3050  RETURN 
3060  REM **** SUBROUTINE TO PERMUTE ROW SHOULD GO HERE
4000  RETURN 
9999  END 
