<- C I ->
Toot Contents

Toot 6: Gens

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 17 GENS will you employ.   
  p5 -> p?  -  meaning determined by the particular GEN subroutine.
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
<- C I ->
Toot Contents
Prepared from the MIT Media Lab Csound Manual, PJN, Nov 1994.