GEN08

GEN08 — Generate a piecewise cubic spline curve.

Description

This subroutine will generate a piecewise cubic spline curve, the smoothest possible through all specified points.

Syntax

f # time size 8 a n1 b n2 c n3 d ...

Initialization

size -- number of points in the table. Must be a power of 2 or power-of-2 plus 1 (see f statement).

a, b, c, etc. -- ordinate values of the function.

n1, n2, n3 ... -- length of each segment measured in stored values. May not be zero, but may be fractional. A particular segment may or may not actually store any values; stored values will be generated at integral points from the beginning of the function. The sum n1 + n2 + ... will normally equal size for fully specified functions.

[Note] Note

  • GEN08 constructs a stored table from segments of cubic polynomial functions. Each segment runs between two specified points but depends as well on their neighbors on each side. Neighboring segments will agree in both value and slope at their common point. (The common slope is that of a parabola through that point and its two neighbors). The slope at the two ends of the function is constrained to be zero (flat).

  • Hint: to make a discontinuity in slope or value in the function as stored, arrange a series of points in the interval between two stored values; likewise for a non-zero boundary slope.

Examples

Here is an example of the GEN08 routine. It uses the files gen08.csd.

Example 1102. An example of the GEN08 routine.

<CsoundSynthesizer>
<CsOptions>
; Select audio/midi flags here according to platform
-odac  ;;;realtime audio out
;-iadc    ;;;uncomment -iadc if realtime audio input is needed too
; For Non-realtime ouput leave only the line below:
; -o gen08.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

sr = 44100
ksmps = 32
nchnls = 2
0dbfs  = 1

instr 1

ifn  = p4				;choose between tables
kcps init 1/p3				;create index over duration of note.
kndx phasor kcps
ixmode = 1
kval table kndx, 2, ixmode		;normalize index data

ibasefreq = 440
kfreq = kval * 100			;scale
asig  poscil .7, ibasefreq + kfreq, 1	;and add to frequency
      outs asig, asig
  
endin
</CsInstruments>
<CsScore>
f 1 0 16384 10 1	;sine wave.
f 2 0 65 8 0 16 1 16 1 16 0 17 0
f 3 0 65 8 -1 32 1 2 0 14 0 17 0

i 1 0 2 1
i 1 3 2 2
e
</CsScore>
</CsoundSynthesizer>


These are the diagrams of the waveforms of the GEN08 routines, as used in the example:

f 2 0 65 8 0 16 1 16 1 16 0 17 0 - a curve with a smooth hump in the middle, going briefly negative outside the hump then flat at its ends

f 2 0 65 8 0 16 1 16 1 16 0 17 0 - a curve with a smooth hump in the middle, going briefly negative outside the hump then flat at its ends

f 3 0 65 8 -1 32 1 2 0 14 0 17 0 - from a negative value,a curve with a smooth hump, going negative creating a small hump then flat at its ends

f 3 0 65 8 -1 32 1 2 0 14 0 17 0 - from a negative value,a curve with a smooth hump, going negative creating a small hump then flat at its ends

See Also

GEN05, GEN06, and GEN07