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 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 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