The first character in a score statement is an **opcode**,
determining an action request; the remaining data consists of numeric parameter
fields (p-fields) to be used by that action. So far we have been dealing
with two different opcodes in our score: **f** and **i**. **I-statements**,
or note statements, invoke the p1 instrument at time p2 and turn it off
after p3 seconds; all remaining p-fields are passed to the instrument.

**F-statements**, or
lines with an opcode of **f**, invoke function-drawing subroutines called
**GENS**. In Csound there are
currently seventeen gen routines which fill wavetables in a variety of
ways. For example, **GEN01** transfers
data from a soundfile; **GEN07** allows
you to construct functions from segments of straight lines; and **GEN10**,
which we've been using in our scores so far, generates composite waveforms
made up of a weighted sum of simple sinusoids. We have named the function
"f1," invoked it at time 0, defined it to contain 512 points,
and instructed **GEN10** to fill that
wavetable with a single sinusoid whose amplitude is 1. **GEN10**
can in fact be used to *approximate* a variety of other waveforms,
as illustrated by the following:

f1 0 2048 10 1 ; Sine f2 0 2048 10 1 .5 .3 .25 .2 .167 .14 .125 .111 ; Sawtooth f3 0 2048 10 1 0 .3 0 .2 0 .14 0 .111 ; Square f4 0 2048 10 1 1 1 1 .7 .5 .3 .1 ; Pulse

For the opcode **f**, the first four p-fields are interpreted as
follows:

p1 - table number - In the orchestra, you reference this table by its number. p2 - creation time - The time at which the function is generated. p3 - table size - Number of points in table - must be a power of 2, or that plus 1. p4 - generating subroutine - Which of the 17GENSwill you employ. p5 -> p? - meaning determined by the particularGENsubroutine.

In the instrument and score below, we have added three additional functions to the score, and modified the orchestra so that theinstrument can call them via p11.

instr 6 ; toot6.orc ifunc = p11 ; select basic waveform irel = .01 ; set vibrato release idel1 = p3 - (p10 * p3) ; calculate initial delay isus = p3 - (idel1- irel) ; calculate remaining dur iamp = ampdb(p4) iscale = iamp * .333 ; p4=amp inote = cpspch(p5) ; p5=freq k3 linseg 0, idel1, p9, isus, p9, irel, 0 ; p6=attack time k2 oscil k3, p8, 1 ; p7=release time k1 linen iscale, p6, p3, p7 ; p8=vib rate a3 oscil k1, inote*.999+k2, ifunc ; p9=vib depth a2 oscil k1, inote*1.001+k2, ifunc; p10=vib delay (0-1) a1 oscil k1, inote+k2, ifunc out a1 + a2 + a3 endin f1 0 2048 10 1 ; Sine f2 0 2048 10 1 .5 .3 .25 .2 .167 .14 .125 .111 ; Sawtooth f3 0 2048 10 1 0 .3 0 .2 0 .14 0 .111 ; Square f4 0 2048 10 1 1 1 1 .7 .5 .3 .1 ; Pulse ;ins strt dur amp frq atk rel vibrt vibdpth vibdel waveform(f) i6 0 2 86 8.00 .03 .7 6 9 .8 1 i6 3 2 86 8.02 .03 .7 6 9 .8 2 i6 6 2 86 8.04 .03 .7 6 9 .8 3 i6 9 3 86 8.05 .03 .7 6 9 .8 4 e