Dance with the 21st. Century Global Revolution
In 1991 I was fascinated by the possibility of creating a harmonic sequence that, taken as a whole, could nest itself completely into each small duration between consecutive events. I sketched a graphic of this idea that enabled me to write a computer program whose output was a string quartet and a microtonal harmonic cluster smeared through time. Then in 2003, while making a backup copy of the original, a drum patch accidentally doubled the viola part and I observed that the music never missed a beat. I realized that what had started as an harmonic algorithm had finally found contemporary bedrock. This music carries a lot of inner tension, and then too, global revolution is definitely not for the faint of heart.
© Drew Lesso Major revision of 2003.
Duration 21 minutes 37 seconds
In 1991 I began this work by selecting a string length, divided it in half, in thirds and up to sixteenths. This type of harmonic division never reaches either extremity of the string and mirrors itself at one half. This division yields 80 segments with the largest segment, 1/16 of the whole, appearing at either end of the strings length. Into the leftmost 1/16 segment I introduced all 80 divisions of 16. The result looks like a bar code. I divided each successive segment by 80 divisions of 16. In the graphic below I marked all of the divisions according to their proportional harmonic data. I allow the string length to equal a total duration for the entire work. This method of assigning total duration for the work automatically gives a time for each harmonic to appear. I wrote an algorithm to accomplish this huge task of moving 80 segments transposed through 80 segments for time and tone data. The output of this program was a string quartet with a microtonal harmonic cluster drone. This is the starting point for the 2003 revision. I wrote the revision entirely from a musical intuitive point of view which is directly opposite from the 1991 algorithmic composition.
Rem Projektionen 0>1 June 24, 1991
CLEAR, 200000&
midiopen 10000,2048
DIM midibyte%(8592), timestamp&(8592), veloff%(8592)
DIM n(477)
' 1-79 Harmonic Data 1/2-15/16 (79)
' 80-158 Harmonic Data 1/16-15/16 (79)
' 159-237 MIDI Harmonics (79)
' 238-317 Segment Start Times (80)
' 318-397 Segment Durations (80)
' 398-477 Segment MIDI Harmonic Generators (80)
DIM m(79,4)
' m(x,1) = timestamp&
' m(x,2) = associated harmonic
' m(x,3) = midibyte%
' m(x,4) = Proportional duration within a segment
a=0:b=0:d=0:r=0:s=0:w=0:z=0:REM counters
handler:
TEXTFONT 4
MENU 1,0,1, "File"
MENU 1,1,1, "Harmoniclunch"
MENU 1,2,1, "Play"
MENU 1,3,1, "Bubblesort"
MENU 1,4,1, "Quit"
WHILE 1
CLS :PRINT "Ready for Menu Selection"
WHILE MENU (0) <> 1: WEND
CLS
SELECT CASE MENU (1)
CASE 1:GOSUB harmoniclunch
CASE 2:GOSUB play
CASE 3: GOSUB bubblesort
CASE 4: GOSUB quit
END SELECT
MENU
WEND
quit:
libterm
END
harmoniclunch:
REM load n(477)
FOR x = 1 TO 477
READ n(x)
NEXT x
REM Harmonic Data 1/2-15/16 (1-79)
DATA .5, .33, .66, .25, .75, .2, .4, .6, .8, .166, .833, .142, .285, .428, .571, .714
DATA .857, .125, .375, .625, .875, .111, .222, .444, .555, .777, .888, .1, .3, .7
DATA .9, .09, .181, .272, .363, .454, .545, .636, .727, .818, .909, .083, .416
DATA .583, .916, .076, .153, .23, .307, .384, .461, .538, .615, .692, .769, .846
DATA .923, .071, .214, .357, .642, .785, .928, .066, .133, .266, .466, .533
DATA .733, .866, .933, .062, .187, .312, .437, .562, .687, .812, .937
REM Harmonic Data 1/16-15/16 (80-158)
DATA .062, .066, .071, .076, .083, .09, .1, .111, .125, .133, .142, .153, .166
DATA .181, .187, .2, .214, .222, .23, .25, .266, .272, .285, .3, .307, .312, .333
DATA .357, .363, .375, .384, .4, .416, .428, .437, .444, .454, .461, .466, .5
DATA .533, .538, .545, .555, .562, .571, .583, .6, .615, .625, .636, .642, .666
DATA .687, .692, .7, .714, .727, .733, .75, .769, .777, .785, .8, .812, .818, .833
DATA .846, .857, .866, .875, .888, .9, .909, .916, .923, .928, .933, .937
REM MIDI Harmonics (159-237) Harmonic Order 1/2-15/16
DATA 12, 19, 7, 24, 5, 28, 16, 9, 4, 31, 3, 34, 22, 15, 10, 6, 3, 36, 17, 8, 2
DATA 38, 26, 14, 10, 4, 2, 40, 21, 6, 2, 42, 30, 23, 18, 14, 11, 8, 6, 4, 2, 43
DATA 15, 9, 1, 45, 33, 26, 21, 17, 14, 11, 9, 7, 5, 3, 2, 46, 27, 18, 8, 4, 1
DATA 47, 35, 23, 16, 13, 5, 2, 1, 48, 29, 20, 14, 10, 6, 3, 1
REM Segment Start Times (238-317)
DATA 0, 84.5, 90.1, 96.5, 104, 112.6, 122.9, 135.2, 150.2, 169, 180.2
DATA 193.1, 208, 225.3, 245.8, 253.5, 270.4, 289.7, 300.4, 312, 338, 360.5
DATA 368.7, 386.2, 405.6, 416, 422.5, 450.7, 482.8, 491.6, 507, 520, 540.8
DATA 563.3, 579.4, 591.5, 600.8, 614.5, 624, 630.9, 676, 721, 728, 737.4
DATA 751.1, 760.5, 772.5, 788.6, 811.2, 832, 845, 860.3, 869.1, 901.3, 929.5
DATA 936, 946.4, 965.7, 983.2, 991.4, 1014, 1040, 1051.5, 1062.2, 1081.6
DATA 1098.5, 1106.1, 1126.6, 1144, 1158.8, 1171.7, 1183, 1201.7, 1216.8
DATA 1229, 1239.3, 1248, 1255.4, 1261.8, 1267.5
REM Segment Durations (318-397)
DATA 84.5, 5.6, 6.4, 7.5, 8.6, 10.3, 12.3, 15, 18.8, 11.2, 12.9, 14.9, 17.3, 20.5
DATA 7.7, 16.9, 19.3, 10.7, 11.6, 26, 22.5, 8.2, 17.5, 19.4, 10.4, 6.5, 28.2
DATA 32.1, 8.8, 15.4, 13, 20.8, 22.5, 16.1, 12.1, 9.3, 13.7, 9.5, 6.9, 45.1, 45
DATA 7, 9.4, 13.7, 9.4, 12, 16.1, 22.6, 20.8, 13, 15.3, 8.8, 32.2, 28.2, 6.5, 10.4
DATA 19.3, 17.5, 8.2, 22.6, 26, 11.5, 10.7, 19.4, 16.9, 7.6, 20.5, 17.4, 14.8
DATA 12.9, 11.3, 18.7, 15.1, 12.2, 10.3, 8.7, 7.4, 6.4, 5.7, 84.5
REM Segment MIDI Harmonic Generators (398-477) Input from score
DATA 79, 33, 42, 37, 40, 34, 37, 40, 33, 36, 41, 34, 42, 50, 33, 45, 46, 47
DATA 48, 36, 43, 66, 52, 54, 59, 33, 39, 38, 65, 61, 55, 45, 35, 62, 53, 67
DATA 57, 49, 64, 32, 31, 20, 21, 21, 29, 22, 29, 20, 23, 22, 21, 25, 27, 26
DATA 20, 24, 21, 25, 27, 21, 24, 26, 21, 20, 28, 29, 23, 22, 28, 22, 21, 27
DATA 23, 25, 30, 28, 30, 23, 30, 25
crunch: 'load m(79,4)
LET b = 0 ' zero counters
LET z = 0
LET w = 0
LET s = s +1
LET a = 317 + s 'duration segment flag
IF a > 397 THEN LPRINT "fine":STOP:RETURN
FOR x = 1 TO 79 'harmonic order 1/2-15/16
LET d = n(a)*n(x) 'proportional duration
IF d>n(a)- 1 THEN GOTO sort 'checks for end duration
LET m(x,1) = (n(s+237)+d)*1000 'timestamp&
LET m(x,2) = n(x) 'associated harmonic
LET m(x,3) = n(s+397)+n(x+158) 'generator + midi harmonic
LET m(x,4) = d 'proportional duration
NEXT x
sort:
LET z = z+1 'harmonic order 1/16-15/16
LET w = 79 + z 'harmonic order 1/2-15/16
FOR y = 1 TO 79
IF w > 158 THEN GOTO precrunch
IF n(w) = m(y,2) THEN b=y:GOTO presave
NEXT y
presave:
IF m(b,3)=0 OR m(b,1)=0 GOTO sort
LET r = r+1 '1 to 8592
LET midibyte%(r) = m(b,3)
LET timestamp&(r) = m(b,1)
LET veloff%(r) = 67
LET r = r+1
LET midibyte%(r) = m(b,3)
LET timestamp&(r) = m(b,4)*m(b,2)*1000+timestamp&(r-1)
LET veloff%(r) = 0
IF r>3 THEN GOSUB renew
GOTO sort
precrunch:
FOR x = 1 TO 79 'reset array
LET m(x,1) = 0
LET m(x,2) = 0
LET m(x,3) = 0
LET m(x,4) = 0
NEXT x
GOTO crunch
bubblesort:
10 FOR x = 1 TO 8592-1
20 f = 0
30 FOR j = 1 TO 8592-x
40 IF timestamp&(j+1) >= timestamp&(j) THEN GOTO 90
50 SWAP timestamp&(j+1), timestamp&(j)
60 SWAP midibyte%(j+1), midibyte%(j)
70 SWAP veloff%(j+1), veloff%(j)
80 f = 1
90 NEXT j
100 IF f = 0 THEN GOTO 120
105 LPRINT x;
110 NEXT x
120 LPRINT "Sorted MIDIharmonics"
LPRINT "all's fine try to save and play"
STOP
RETURN
play:
midiport 1: midiport 3
b% = 144
upperlimit% = 8592: trackindex% = 1
ticklength% = 782
midi 0: miditime 0: miditime ticklength%: settime 0: count% = 0
WHILE trackindex% < upperlimit%
outcount count%
WHILE count% > 0: outcount count%: WEND
midiout b%,timestamp&(trackindex%)
midiout midibyte% (trackindex%),timestamp&(trackindex%)
midiout veloff%(trackindex%),timestamp&(trackindex%)
trackindex% = trackindex% + 1
WEND
RETURN
renew:
IF timestamp&(r-1)=timestamp&(r-3) THEN LET r=r-2
RETURN
Origin 1991