; sample rate can be changed as desired, control rate must match sample rate
sr = 44100
kr = 44100
nchnls = 2
; this piece is based on the defining relation S(n) = S(n - j) + S(n - k) mod m
; parameters, including the starting values, are to be entered below as instructed
gi_gr = sqrt(5)/2-.5 ; the golden ratio, do not edit
; used by orchestra, no input necessary
itmp ftgen 2, 0, 64, -2, 0
itmp ftgen 3, 0, 17, -2, 0
itmp ftgen 4, 0, 16384, 10, 1
ift vco2init -1, -1, 0, 0, 0, 4
seed 0 ; random values globally seeded from system clock, comment out if desired
; set the modulus
gi_mod = 2^32
; input starting integers for generator starting to the right of -2, or use pseudo-random initialization in table below, increase table size if needed
itmp ftgen 1, 0, 64, -2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
; comment out table above and un-comment below for pseudo-random seed (disadvantage: some possibility starting vals aren't relatively prime)
;itmp ftgen 1, 0, 64, -21, 1, gi_mod
; select wave: 0 = saw, 10 = square, 12 = triangle, 14 = sine
gi_wave = 10
; set duration of one integer in samples
gi_length_in_smps = 900
; frequency of integers, no need to edit
gi_env_freq = sr/gi_length_in_smps
; input j (see equation at top)
gi_j = 3
; input k (the number of integers entered into table 1 if manually entered)
gi_k = 5
; set pitch for 0
gi_0_cps = 440
; set temperament (x in the form of phi^x + 1)
gi_temp = 45
; calculates base interval in temperament, no need to edit
gi_temp_num = 1+gi_gr^gi_temp
; comment out above and un-comment below for descending orientation (the higher the integer the lower the pitch)
;gi_temp_num = 1/(1+gi_gr^gi_temp)
; set attack and release values
gi_att = .0021
gi_rel = .0034
; no need to edit instruments
instr 1
kndx = 0
kres timek
if (kres!=1) goto phase_2
imax = gi_k-1
katt = gi_att
krel = gi_rel
prints "starting values (note: repeated values not shown): \n"
loop_0:
ktab1 table kndx, 1
tablew int(ktab1), kndx, 1
printk2 int(ktab1)
kndx = kndx + 1
if (kndx <= imax) kgoto loop_0
phase_2:
if (kres%gi_length_in_smps!=0) goto phase_3
loop_1:
ktab1 table kndx+1, 1
tablew ktab1, kndx, 2
kndx = kndx + 1
if (kndx < imax) goto loop_1
ktab1a table kndx-gi_j+1, 1
ktab1b table 0, 1
tablew (ktab1a+ktab1b)%gi_mod, kndx, 2
kndx = 0
loop_2:
ktab2 table kndx, 2
tablew ktab2, kndx, 1
kndx = kndx + 1
if (kndx <= imax) goto loop_2
phase_3:
ktab1 table 0, 1
kdel table3 ktab1/((gi_mod-1)/16), 11
kenv loopseg gi_env_freq, 0, 0, 0, katt/(1/gi_env_freq), 1, 1-(katt+krel)/(1/gi_env_freq), 1, krel/(1/gi_env_freq), 0
kenv_d loopseg gi_env_freq, 0, 0, 0, abs(kdel)/(1/gi_env_freq), 0, katt/(1/gi_env_freq), 1, 1-(katt+krel+kdel)/(1/gi_env_freq), 1, krel/(1/gi_env_freq), 0
kamp table3 ktab1/((gi_mod-1)/16), 10
aw1 vco2 kamp, (gi_temp_num^ktab1)*gi_0_cps, gi_wave
adel vdelayxw aw1, a(abs(kdel)), .001, 1024
kpan table3 ktab1/((gi_mod-1)/16), 12
if (kdel < 0) goto left
outs adel*kenv_d*kpan, aw1*kenv*(1-kpan)
goto end
left:
outs aw1*kenv*kpan, adel*kenv_d*(1-kpan)
end:
endin
instr 2
i_att = gi_att
i_rel = gi_rel
i_extreme_cps = (gi_temp_num^(gi_mod-1))*gi_0_cps
prints "extreme pitch in Hz: \n"
print i_extreme_cps
kit1 = (gi_temp_num^(((gi_mod-1)/16)*p4))*gi_0_cps
idel table3 p4, 11
kenv linen 1, gi_att, p3, gi_rel
kenv_d linseg 0, abs(idel), 0, i_att, 1, p3-(i_att+i_rel+abs(idel)), 1, i_rel, 0
kamp table3 p4, 10
aw1 vco2 kamp, (gi_temp_num^(((gi_mod-1)/16)*p4))*gi_0_cps, gi_wave
kdel table3 p4, 11
adel vdelayxw aw1, a(abs(kdel)), .001, 1024
kpan table3 p4, 12
if (idel < 0) goto left
if (idel == 0) goto mid
outs adel*kenv_d*kpan, aw1*kenv*(1-kpan)
goto end
left:
outs aw1*kenv*kpan, adel*kenv_d*(1-kpan)
goto end
mid:
outs aw1*kenv*kpan, aw1*kenv*(1-kpan)
end:
endin
; The pan and amplitude need to be set every time the pitch is shifted (gi_0_cps), temperament changed (gi_temp), modulus changed (gi_mod)
; or when the timbre (gi_wave) is changed. In other words, when a different set of pitches (or timbre) is used, the profile needs to be adjusted.
; set amplitude
f10 0 17 -2 139.6 169.1 205.1 242.7 288.6 323.2 362.9 498.4 595.2 672.3 726.2 759.3 812.3 903.5 909.6 1081.3 1263.4
; no need to edit: delay based on a centered 8 meter straight line 4 meters in front of listener; speed of sound 345mps, head width 15cm
f11 0 17 -2 -.000307 -.000286 -.000261 -.000230 -.000194 -.000153 -.000105 -.000054 .000000 .000054 .000105 .000153 .000194 .000230 .000261 .000286 .000307
; comment out above and un-comment below for right to left orientation (so that left side represents higher integers)
;f11 0 17 -2 .000307 .000286 .000261 .000230 .000194 .000153 .000105 .000054 .000000 -.000054 -.000105 -.000153 -.000194 -.000230 -.000261 -.000286 -.000307
; set pan here to simulate line described in comment for the delay above, pan is in strength of left speaker (if left .72, right is .28)
f12 0 17 -2 .69 .656 .6205 .591 .571 .553 .5355 .518 .5 .4775 .456 .433 .41 .384 .354 .321 .28
; Use instrument 2 to set the profile; work down this list from 3 -> 5 -> 9 -> 17, these are reference pitches.
;i2 0 .5 0 ; lowest pitch (0th value of tables above)
;i2 + . 8 ; exactly in the middle - pan should always be .5 here (8th value in tables above)
;i2 + . 16 ; highest pitch (16th value in tables above)
;i2 0 .5 0
;i2 + . 4
;i2 + . 8
;i2 + . 12
;i2 + . 16
;i2 0 .5 0
;i2 + . 2
;i2 + . 4
;i2 + . 6
;i2 + . 8
;i2 + . 10
;i2 + . 12
;i2 + . 14
;i2 + . 16
;i2 0 .5 0
;i2 + . 1
;i2 + . 2
;i2 + . 3
;i2 + . 4
;i2 + . 5
;i2 + . 6
;i2 + . 7
;i2 + . 8
;i2 + . 9
;i2 + . 10
;i2 + . 11
;i2 + . 12
;i2 + . 13
;i2 + . 14
;i2 + . 15
;i2 + . 16
i1 0 52.73469 ; make sure that piece length given here is a multiple of the note length