janzen@sunfun.DEC (Thomas E. Janzen CSS GNG CWO 714 850-7849 SUNFUN::JANZEN) (08/17/84)
PROGRAM All_Interval_Row(INPUT,OUTPUT); {-----------------------------------------------------------------------} { On 16 August 1984 this program seems to work a little. It will print} { out some numbers, then seem to stop. Control-Y at this point and } { copy down the numbers. Run the program over and over until you get } { a single run that prints 10 decimal digits. then fill in the missing} { pitch (1 to 11). It may or may not be an AIR, check it manually. } { My run was OK. } { the numbers represent pitches. For example, 0 could be A, 1=A#,2=B, } { 3=C,4=C#,5=D,6=D#,7=E, etc. Note that the first pitch in each row } { is 0 (zero), so it isn't printed out. Lots of luck. } { Thomas E. Janzen 15 August 1984 } { } { OUTPUT: A twelve-tone pitch class set containing all intervals of } { the Western dodecuple scale. } { } { PROCESSING: A search and assembly of a twelve-tone pitch class set. } {_______________________________________________________________________} CONST Tritone = 6; TYPE Row = ARRAY [0..11] OF INTEGER; Truth_Table = ARRAY [0..11] OF BOOLEAN; VAR Pitch_is_Old, Interval_is_Old : BOOLEAN; Random_Number, Counter : INTEGER; Pitch_Class_Set, Interval_Set {Note that Interval_Set[n] is the interval between Pitch_Class_Set[n-1] and Pitch_Class_Set[n].} : Row; Intervals_Used, Pitches_Used : Truth_Table; PROCEDURE Write_the_Set(Number_Set : Row ); {-----------------------------------------------------------------------} { INPUT: An array of 12 integers to write out } { OUTPUT: A print-out of the array of integers, with index 0 to 11. } {_______________________________________________________________________} VAR Index : INTEGER; BEGIN FOR Index := 0 TO 11 DO WRITELN(Index, Number_Set[Index]) END; FUNCTION Interval_Size(Set_of_Integers : Row; Current_Pointer : INTEGER) : INTEGER; {-----------------------------------------------------------------------} { INPUT: A set of 12 integers and an index. } { OUTPUT: The equivalent musical interval between } { Set_of_Integers[Current_Pointer] and } { Set_of_Integers[Current_Pointer - 1]. } {_______________________________________________________________________} VAR Temp_Num : INTEGER; BEGIN Temp_Num := Set_of_Integers[Current_Pointer] - Set_of_Integers[Current_Pointer - 1]; IF (Temp_Num < 0) THEN Interval_Size := 12 + Temp_Num ELSE Interval_Size := Temp_Num END; {-----------------------------------------------------------------------} { } { M A I N P R O G R A M } { } {_______________________________________________________________________} BEGIN { Main Program } FOR Counter := 0 TO 11 DO BEGIN {Initialize arrays.} Pitches_Used[Counter] := FALSE; Intervals_Used[Counter] := FALSE; Pitch_Class_Set[Counter] := 0; Interval_Set[Counter] := 0 END; Interval_Set[0] := Tritone; Pitch_Class_Set[11] := Tritone; {The last tone in any AIR will always be a } {tritone away from the first tone.} Intervals_Used [Tritone] := TRUE; {The tritone has been used in the set.} Pitches_Used[Tritone] := TRUE; {The tritone has been used in the set.} Pitches_Used[0] := TRUE; {The first note.} FOR Counter := 1 TO 11 DO BEGIN Pitch_is_Old := TRUE; Interval_is_Old := TRUE; WHILE Pitch_is_Old OR Interval_is_Old DO BEGIN Random_Number := (CLOCK DIV 2) MOD 12; Pitch_Class_Set[Counter] := Random_Number; {Check that this pitch has not been used.} Pitch_is_Old := Pitches_Used[Pitch_Class_Set[Counter]]; {Check that this interval has not been used.} Interval_is_Old := Intervals_Used[Interval_Size(Pitch_Class_Set,Counter)] END; Pitches_Used[Pitch_Class_Set[Counter]] := TRUE; Intervals_Used[Interval_Size(Pitch_Class_Set,Counter)] := TRUE; WRITELN(Pitch_Class_Set[Counter]) END; Write_the_Set(Pitch_Class_Set) END. Thu 16-Aug-1984 12:12 PDT