Use Non-Frames Version Previous Page Next Page
Appendix: DirectCsound

parmck, parmtk, parmca, parmta, rtrnck, rtrntk, rtrnca, rtrnta

          parmck    kinarg1, kinarg2, kinarg3, ..., kinargN 
          parmtk    koutarg1, koutarg2, koutarg3, ..., koutargN
          parmca    ainarg1, ainarg2, ainarg3, ..., ainargN 
          parmta    aoutarg1, aoutarg2, aoutarg3, ..., aoutargN 
          rtrnck    koutarg1, koutarg2, koutarg3, ..., koutargN 
          rtrntk    kinarg1, kinarg2, kinarg3, ..., kinargN 
          rtrnca    aoutarg1, aoutarg2, aoutarg3, ..., aoutargN 
          rtrnta    ainarg1, ainarg2, ainarg3, ..., ainargN

Description

These opcodes deal with a-rate and k-rate arguments and signals. They return signals to be sent when using subroutine calls

Performance

kinarg1, kinarg2, kinarg3, ..., kinargN - k-rate input arguments

koutarg1, koutarg2, koutarg3, ..., koutargN - k-rate output arguments

ainarg1, ainarg2, ainarg3, ..., ainargN - a-rate input arguments

aoutarg1, aoutarg2, aoutarg3, ..., aoutargN - a-rate output arguments

This opcode family allows the user to define input and output signals to use as arguments (or parameters) and return values when calling a subroutine (together with the call opcode family).

parmck (k-rate parameters handling to be placed in the caller instrument)and parmtk (k-rate parameters handling to be placed in the target instrument) work in pairs.

Also you must put parmck (as well as parmca) immediately after the call opcode.

rtrnck (k-rate return values received by the caller instrument) and rtrntk (k-rate return values sent by the target instrument) work in pairs. The target instrument can return several k-rate signals to the caller instrument by using these two opcodes.

The caller instrument can send several k-rate signals to the target instrument by using these opcodes.

Examples

Some k-rate examples will be presented below, the corresponding a-rate oriented opcodes can be used in the same way, the only difference is that the arguments are a-rate variables.

Example 1

instr   1       ;caller instrument

   ;calculating the k-rate arguments to be sent to the target instrument
  karg1   oscil     ...
  karg2   linen     ...
  karg3   expseg     ...
  karg4   linseg     ...      
          ;****     instrno   actime    dur     init-rate arguments sent to instr 2 
          call      2,        0,        3,      iarg1,iarg2,iarg3   ;call the target instr
          parmck    karg1,karg2,karg3,karg4     ;send the four signals
         .....
endin

instr   2       ;target instrument 
  .....

   ;receive the four signals from the caller instr
          parmtk    k1,k2,k3,k4
          
   ;  using the k-rate arguments...
  a1      oscil     k1,k2,k3,1
          out       a1*k4
  .....
endin

In this case instr 1 (the caller) calls instr 2 (the target) and sends three i-rate variables (iarg1, iarg2 and iarg3 which are interpreted as p4, p5 and p6 by the target instrument) and four k-rate arguments (karg1, karg2, karg3, karg4 which are interpreted by the target instrument as k1, k2, k3 and k4 local variables) to the target instrument.

IMPORTANT: Notice that the k1, k2, k3 and k4 arguments of parmtk opcode are output arguments, even if they appear on the right of the opcode instead of on the left. This because Csound at the moment doesn't support a variable number of arguments at the left of the opcode.

Example 2

instr   1       ;caller instrument
   ;calculating the k-rate arguments....
   ;  to be sent to the target instrument
  ....
          ;****     instrno   actime    dur     init-rate arguments sent to instr 2 
          call      2,        0,        3,      iarg1,iarg2,iarg3   ;*** call the target instr
          rtrnck    karg1,karg2,karg3,karg4 ;*** receive the return signals from the target instr
          
   ;using the return signals ...
  a1      oscil     karg1,karg1,karg1,1
          out       a1*karg1
  .....
endin

instr   2       ;target instrument
  .....

   ;generating k-rate signals to be returned to the caller instr...
  k1	oscil         ....
  k2	linseg        ....
  k3	oscil1        ....
  k4  expseg        ....
  
   ;return the four signals to the caller instr
      rtrntk        k1,k2,k3,k4
	.....
endin

It is important to be sure that the number of arguments for the pair parmck/parmtk, and rtrnck/rtrntk is the same. Using a-rate opcodes (parmca/parmta and rtrnca/rtrnta) is almost identical.

;An example of parmck, parmca, parmtk, parmta, rtrnck,rtrnca, rtrntk and rtrnta opcodes

sr     = 44100
kr     = 441
ksmps  = 100
nchnls = 2

  gifn    ftgen     1,0,1024,10 ,1 ,0,0,0,0,0,0,.1,0,0,0,0,0,.05,0,0,0,0,0,0,0,.01
  gikfn   ftgen     2,0,1024,10 ,1

instr   1       ;caller instrument

  iamp    ampmidi   2000
  ifreq   cpsmidi
  a1      oscili    iamp, ifreq, gifn
  a2      oscili    iamp, ifreq*1.3, gifn
  a3      oscili    iamp, ifreq*1.5555, gifn
  k1      oscili    1, .5, gikfn
  k2      oscili    1, 1.3, gikfn
  k3      oscili    1, 2.1.5555, gikfn
          xtratim 2       ;when using a-rate arguments in subroutine call,
                          ;you must be sure that the extra time of the instrument
                          ;containing the out opcode is
                          ;greater or equal to that of the target instr

  ;first  call
          callm     2,0,4,iamp, ifreq       ;call instr 2 as subroutine
          parmck    k1,k2,k3                ;send k-rate arguments to instr 2
          parmca   a1,a2,a3                 ;send a-rate arguments to instr 2
          rtrnca   aout1,aout2              ;receive a-signals returned by the first call of instr 2

  ;second call
          callm    2,0,4,iamp, ifreq*2.2    ;call instr 2 as subroutine
          parmck   k3,k2,k1                 ;send k-rate arguments to instr 2
          parmca   a3,a1,a2                 ;send a-rate arguments to instr 2
          rtrnck   kenv                     ;receive k-signals returned by the second call of instr 2
          rtrnca   aout3,aout4              ;receive a-signals returned by the second call of instr 2
          outs    (aout1+aout3)*kenv, (aout2+aout4)*kenv
endin

instr   2       ;target instrument

          parmtk    ksig,ksig2,ksig3         ;receive k-signals sent by caller arguments
          parmta    asig,asig2,asig3         ;receive a-signals sent by caller arguments
  k1      linenr    1,p3/2,p3/2,.03
  a1      oscili    p4*ksig,p5,gifn
  a2      oscili    p4*ksig2,p5*1.5,gifn
  a3      oscili    p4*ksig3,p5*1.8,gifn
          rtrntk    k1                              ;return k-signals
          rtrnta    a1+asig2+asig3, a2+a3+asig      ;return a-signals
endin

Use Non-Frames Version Previous Page Next Page
Appendix: DirectCsound