This is by far our most complex instrument. In it we have designed the ability to store pitches in a table, and then index them in three different ways: 1) directly, 2) via an lfo, and 3) randomly. As a means of switching between these three methods, we will use Csound's program control statements and logical and conditional operations.
instr 12
;toot12.orc
iseed
=
p8
iamp
=
ampdb(p4)
kdirect
=
p5
imeth
=
p6
ilforate
=
p7
; lfo and random index rate
itab
=
2
itablesize
=
8
if (imeth == 1) igoto direct
if (imeth == 2) kgoto lfo
if (imeth == 3) kgoto random
direct:
kpitch
table
kdirect, itab
; index "f2" via p5
kgoto
contin
lfo:
kindex
phasor
ilforate
kpitch
table
kindex * itablesize, itab
kgoto
contin
random:
kindex
randh
int(7), ilforate, iseed
kpitch
table
abs(kindex), itab
contin:
kamp
linseg
0, p3 * .1, iamp, p3 * .9, 0
; amp envelope
asig
oscil
kamp, cpspch(kpitch), 1
; audio osc
out
asig
endin
;toot12.sco
f1
0
2048
10
1
; sine
f2
0
8
-2
8.00
8.02
8.04
8.05
8.07
8.09
8.11
9.00
; cpspch C major scale
; method 1 - direct index of table values
; ins
start
dur
amp
index
method
lforate
rndseed
i12
0
.5
86
7
1
0
0
i12
.5
.5
86
6
1
0
i12
1
.5
86
5
1
0
i12
1.5
.5
86
4
1
0
i12
2
.5
86
3
1
0
i12
2.5
.5
86
2
1
0
i12
3
.5
86
1
1
0
i12
3.5
.5
86
0
1
0
i12
4
.5
86
0
1
0
i12
4.5
.5
86
2
1
0
i12
5
.5
86
4
1
0
i12
5.5
2.5
86
7
1
0
s
; method 2 - lfo index of table values
; ins
start
dur
amp
index
method
lforate
rndseed
i12
0
2
86
0
2
1
0
i12
3
2
86
0
2
2
i12
6
2
86
0
2
4
i12
9
2
86
0
2
8
i12
12
2
86
0
2
16
s
; method 3 - random index of table values
; ins
start
dur
amp
index
method
rndrate
rndseed
i12
0
2
86
0
3
2
.1
i12
3
2
86
0
3
3
.2
i12
6
2
86
0
3
4
.3
i12
9
2
86
0
3
7
.4
i12
12
2
86
0
3
11
.5
i12
15
2
86
0
3
18
.6
i12
18
2
86
0
3
29
.7
i12
21
2
86
0
3
47
.8
i12
24
2
86
0
3
76
.9
i12
27
2
86
0
3
123
.9
i12
30
5
86
0
3
199
.1
e
Toot 12: Tables and Labels