Capítulo 6
Combinando efeitos
Normalmente queremos usar mais de um efeito ao mesmo tempo, e desejamos
estabelecer em qual ordem eles serão aplicados ao sinal, assim como escolheríamos a
ordem em que ligaríamos vários pedais em uma guitarra. A maneira mais eficiente e
organizada de se fazer isso em Csound é utilizando os opcodes da família Zak, criados
por Robin Whittle, que simula um patch panel com entradas e saídas de sinal, onde
podemos ligar cabos da saída de um efeito e conectá-lo com a entrada de outro efeito, em
qualquer ordem.
Os opcodes Zak estabelecem canais onde podem ser escritos sinais que depois
serão lidos por outro instrumento. Os três opcodes essenciais são zakinit, zaw e zar.
Zakinit é usado para a inicialização, e diz quantos sinais de a-rate e k-rate serão
usados entre os instrumentos. A sintaxe de zakinit é:
zakinit isizea, isizek
Em isizea dizemos quantos sinais a-rate serão armazenados para depois serem
lidos, e em isizek dizemos quantos sinais k-rate serão armazenados. Com essas
informações é alocada a memória que será usada para escrita e leitura entre os
instrumentos.
Para executar zakinit apenas uma vez, você deve colocá-lo antes dos
instrumentos, após o cabeçalho da orchestra.
O par de opcodes zar e zaw escrevem e lêem de um determinado canal,
tipicamente em instrumentos diferentes. A sintaxe de zaw é:
zaw asig, kndx
Onde asig é o sinal de entrada e kndx é número do canal em que ele será escrito.
A sintaxe de zar é:
ares zar kndx
Em ares é lido o sinal que foi escrito anteriormente no canal kndx por zaw.
Vamos agora colocar em uma mesma orchestra vários efeitos vistos no capítulo
anterior, e vamos controlar quais serão utilizados e em que ordem, apenas alterando os
canais de entrada e saída em cada instrumento, como se estivéssemos ligando cabos entre
pedais de efeito.
Iremos alterar os instrumentos que utilizamos no capítulo anterior de modo que
haja apenas um gerador de sinal (em nossa analogia, a guitarra), e os instrumentos
subsequentes apenas lerão e modificarão o sinal anterior. 
Para o efeito de flanger por exemplo, tiraremos dele o opcode pluck que gerava o
sinal inicial,  e substituiremos por um opcode zar que lerá o sinal que foi direcionado
para seu canal de entrada, e no final do instrumento teremos um opcode zaw para
escrever o sinal modificado para um próximo instrumento na linha de efeitos.
O instrumento gerador instr 1 usa o opcode soundin, criado por Barry Vercoe, na
linha:
asig soundin "female.aif"
que simplesmente armazena o arquivo “female.aif” na variável asig
Abaixo temos o código completo. A partir de agora omitiremos o arquivo de saída
em CsOptions, e o áudio irá direto para os alto-falantes.
<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
zakinit 4, 1
instr 1
  iinch = p4
  ioutch = p5
 
  asig soundin "female.aif"
  zaw asig, ioutch
endin
instr 2 
  iinch = p4
  ioutch = p5
  krvt = p6 ;1
  asig zar iinch 
  arev reverb asig, krvt
  zaw arev, ioutch
endin
instr 3
  iinch = p4
  ioutch = p5
  
  asig zar iinch 
  zacl 1,4
  out asig
endin
</CsInstruments>
<CsScore>
i1 0 10 1 1
i2 0 10 1 2 1
i3 0 10 2 3
 
</CsScore>
</CsoundSynthesizer>
Fig. 1: zak.csd
Note que controlamos os canais de entrada e saída através do score, assim instr 2
lê do canal 1 e escreve no canal 2, instr 2 lê do canal 2 e escreve no 3, que finalmente lê
do 3 e escreve na saída. Alterando o quarto e o quinto parâmetro do score, que aqui
especificam o canal de entrada e saída, podemos colocar quaisquer efeitos em qualquer
ordem. 
Em cada instrumento temos as variáveis iinch e ioutch, que são atribuídas com p4
e p5 para os canais de entrada e saída. Subsequentemente é lido o sinal de entrada usando
o opcode zar, processado o som, e escrito no canal de saída usando o opcode zaw.
Agora que já aprendemos como funciona os opcodes Zak nesse exemplo mais
simples, vamos incrementar nossa linha de efeitos num exemplo um pouco mais
elaborado, assim instr 1 será o gerador do sinal lendo o arquivo “female.aif”, instr 95
será o efeito de distorção, o instr 96 será o flanger, instr 97 será o reverb, e o instr 98
será o delay. Finalmente instr 99 será apenas o instrumento que escreve o som
processado na saída.
Além dos parâmetros iinch e ioutch definidos usando p4 e p5, todos os
instrumentos terão o parâmetro igain, que será definido com o parâmetro p6 do score.
Isso é necessário porque quando encadeamos muitos efeitos, é natural que o sinal final
esteja fora de escala, e precisamos por isso atenuá-lo à medida que ele passa pelos
efeitos.
<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
zakinit 5, 1
instr 1
  iinch = p4
  ioutch = p5
  igain = p6
 
  asig soundin "female.aif"
  zaw asig*igain, ioutch
endin
instr 95
  iinch = p4
  ioutch = p5
  igain = p6
  ipregain = p7
  ipostgain = p8
  ishape1 = 0
  ishape2 = 0
  asign init 0
  asig zar iinch
  adist distort1 asig, ipregain, ipostgain, ishape1, ishape2
  aold = asign         ; Salva o último sinal
  asign = asig/30000   ; Normaliza o novo sinal
  atemp delayr  .1                  ; Faz um atraso baseado na declividade
  aout deltapi (2-asign)/1500 + (asign-aold)/300
  delayw  adist
  zaw aout*igain, ioutch
endin
instr 96
  iinch = p4
  ioutch = p5
  igain = p6
  initdel = p7 ;0.01
  ienddel = p8 ;0.07 
  kfeedback = p9 ;0.7
  asig zar iinch
  adel line initdel, p3, ienddel
  aflang flanger asig, adel, kfeedback
  zaw aflang*igain, ioutch
endin
instr 97 
  iinch = p4
  ioutch = p5
  igain = p6
  krvt = p7 ;1
  asig zar iinch 
  arev reverb asig, krvt
  zaw arev*igain, ioutch
endin
instr 98 
  iinch = p4
  ioutch = p5
  igain = p6
  krvt = p7
  ilpt = p8
  asig zar iinch 
  aout comb asig, krvt, ilpt
  zaw (asig+aout)*igain, ioutch 
endin
instr 99
  iinch = p4
  ioutch = p5
  igain = p6
  
  asig zar iinch 
  zacl 1, 4
  out asig*igain
endin
</CsInstruments>
<CsScore>
;entrada:
iinch
ioutch igain
i1  0 10
1
1
0.5  
;distorção:
iinch
ioutch igain
pregain
postgain
i95 0 10
1
2
0.5
2
1
;flanger:
iinch
ioutch igain
initdel
ienddel
ifeedback
i96 0 10 
3
0.5
0.01
0.07
0.8
;reverb:
iinch
ioutch igain
krvt
i97 0 10 
3
4
0.5
5
;delay:
iinch
ioutch igain
krvt
ilpt
i98 0 20
4
5
0.5
90
5
;saída:
iinch
ioutch igain
i99 0 20
5
1
0.5
</CsScore>
</CsoundSynthesizer>
Fig.2: zak2.csd