icnt -- maximum number of phasors to be used.
iphs -- initial phase, expressed as a fraction of a cycle (0 to 1). If -1 initialization is skipped. If iphas>1 each phasor will be initialized with a random value.
kndx -- index value to access individual phasors
For each independent phasor, an internal phase is successively accumulated in accordance with the kcps or xcps frequency to produce a moving phase value, normalized to lie in the range 0 <= phs < 1. Each individual phasor is accessed by index kndx.
This phasor bank can be used inside a k-rate loop to generate multiple independent voices, or together with the adsynt opcode to change parameters in the tables used by adsynt.
Here is an example of the phasorbnk opcode. It uses the files phasorbnk.orc and phasorbnk.sco.
Example 15-1. Example of the phasorbnk opcode.
/* phasorbnk.orc */
; Initialize the global variables.
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
; Generate a sinewave table.
giwave ftgen 1, 0, 1024, 10, 1
; Instrument #1
instr 1
; Generate 10 voices.
icnt = 10
; Empty the output buffer.
asum = 0
; Reset the loop index.
kindex = 0
; This loop is executed every k-cycle.
loop:
; Generate non-harmonic partials.
kcps = (kindex+1)*100+30
; Get the phase for each voice.
aphas phasorbnk kcps, kindex, icnt
; Read the wave from the table.
asig table aphas, giwave, 1
; Accumulate the audio output.
asum = asum + asig
; Increment the index.
kindex = kindex + 1
; Perform the loop until the index (kindex) reaches
; the counter value (icnt).
if (kindex < icnt) kgoto loop
out asum*3000
endin
/* phasorbnk.orc */
/* phasorbnk.sco */
; Play Instrument #1 for two seconds.
i 1 0 2
e
/* phasorbnk.sco */