pool_push

Abstract

Push an item into a pool

Description

A pool is actually a stack of numbers, based on an array.

The pool_ opcodes implement a stack of numbers. This is useful when assigning ids to resources, like assigning fractional numbers to instrument instances to access them individually. To get a value, call pool_pop and when finished using it the value is returned to the pool with pool_push.

Syntax

pool_push ipool, ivalue, iwhen=0
pool_push ipool, kvalue

Arguments

  • ipool: the pool to push the value to
  • ivalue / kvalue: the value to push
  • iwhen: if 0, the value is pushed at init time, if 1 the value is pushed at release time. This argument can only be used when calling the opcode at init time

Output

Execution Time

  • Init
  • Performance

Examples

<CsoundSynthesizer>
<CsOptions>
--nosound
-m0
</CsOptions>

<CsInstruments>
sr     = 44100
ksmps  = 64
nchnls = 2
0dbfs  = 1

; create a global pool for all instances
gipool pool_gen 1, 1000

; create audio buses
ginumbuses = 200
zakinit ginumbuses, 1

; a pool of buses
gibuses pool_gen ginumbuses

; release item back to instance pool, print a message
; when that happens
opcode pool_release_instance, 0, ii
  ipool, ip1 xin
  ival = frac2int(ip1, pool_capacity(ipool))
  defer "prints", "releasing back to pool %d \n", ival
  pool_push ipool, ival, 1
endop

instr exit
  exitnow
endin

; schedule and control audio generator
instr controlsaw
  ; get an unused bus
  ibus = pool_pop(gibuses)
  prints "Using bus %d\n", ibus
  ifreq = p5
  icap pool_capacity gipool

  ; get a unique instance number for "saw" instrument
  isaw = nstrnum("saw") + pool_pop(gipool) / icap
  schedule isaw, 0, p3, ibus, ifreq

  ; modulate the frequency
  pwrite isaw, 5, linseg(ifreq, p3, ifreq*0.1)

  ; get a unique instance number for filter instrument
  ifilter = nstrnum("filter") + pool_pop(gipool) / icap
  schedule ifilter, 0, p3, ibus, 100

  ; modulate its cutoff freq.
  pwrite ifilter, 5, linseg(100, p3, 4000)

  ; release bus back to pool when finished (notice the 1 at the end)
  ; we could have done
  ;  defer "pool_push", gibuses, ibus
  pool_push gibuses, ibus, 1
endin


instr saw
  ibus = p4
  kfreq = p5
  iamp  = 0.02
  ifade = 0.05
  a0  = vco2(iamp, kfreq)
  a0 += vco2(iamp, kfreq * 0.5)
  a0 += vco2(iamp, kfreq * 0.25)
  a0 *= cosseg(0, p3*0.5, 1, p3*0.5, 0)

  ; write audio to bus
  zawm a0, ibus

  ; release instance back to the pool
  pool_release_instance gipool, p1
endin

; filter audio in bus, output to the outside world
instr filter
  ibus = p4
  kfreq = p5
  a0 zar ibus
  a0 zdf_ladder a0, kfreq, 18
  outch 1, a0
endin

instr +example1
  idur = 10                          ; dur of each note
  ioffset = 0.6                      ; offset between notes
  iFreqs[] genarray 1000, 8000, 100  ; begin freq. of gliss. for each note

  printarray iFreqs

  ; create a note for each frequency
  i0 = 0
  while i0 < lenarray(iFreqs) do
    schedule "controlsaw", ioffset*i0, idur, 0, iFreqs[i0]
    i0 += 1
  od

  ; clear zak 
  zacl 0, ginumbuses

  ; schedule exit
  schedule "exit", ioffset*i0 + idur + 1, -1
endin

schedule "example1", 0, -1

</CsInstruments>

<CsScore>
</CsScore>

</CsoundSynthesizer>

See also

Credits

Eduardo Moguillansky, 2019