Capítulo 9
Controle Gráfico
Além da maneira tradicional de se controlar os instrumentos através do score,
podemos controlá-los graficamente e em tempo real através de uma interface gráfica,
usando o FLTK (Fast Light Tool Kit) implementado por Gabriel Maldonado.
Existem três classes de componentes gráficos no Csound:
* os containers, como painéis e grupos
* os valuators, como sliders, knobs e outros controles gráficos
* e os componentes que não se enquadram nos dois anteriores, como
botões e caixas de texto para monitoração. 
Os containers são caixas visuais onde se pode organizar componentes dentro
dele, e os valuators são os controles em si, assim podemos construir uma interface com
controles organizados por painéis.
O container FLpanel
Veremos apenas os componentes gráficos mais usados, já que os outros são
definidos de maneira semelhante. Como container usaremos o principal deles, o
FLpanel, que define um painel e é o único capaz de criar uma janela a partir de sua
declaração. Podemos encadear painéis dentro de painéis de uma maneira hierarquizada,
através de sua sintaxe:
FLpanel "label", iwidth, iheight [, ix] [, iy] [, iborder]
Em label diremos o título que o painel terá. Essa informação só é útil se este
Flpanel fôr o criador da janela do programa, e neste caso label será o título da janela.
Em iwidth, iheight, ix e iy diremos o valor em pixels da largura, altura e
coordenadas x,y do painel.
Em iborder teremos o tipo de borda, variando entre 0 e 7. No próximo exemplo
mostraremos todos os tipos de borda vendo-as na janela e com o valor de iborder
comentado. 
Abaixo da declaração de Flpanel virão as declarações dos outros componentes
que estarão dentro do painel, e para terminar a seção desse painel o faremos através de
FlpanelEnd. A forma que essas declarações assumirá será então a seguinte:
FLpanel "label", iwidth, iheight, ix, iy, iborder
<declarações dos componentes que ficarão dentro do painel>
FlpanelEnd
Os valuators Flknob, Flslider e Flroller
Os controles que usaremos dentro do painel serão Flknob, Flslider e Flroller.
A sintaxe deles é praticamente idêntica, respectivamente:
kout, ihandle FLknob "label", imin, imax, iexp, itype, idisp, iwidth,\ 
ix, iy
kout, ihandle FLslider "label",imin,imax, iexp, itype, idisp, iwidth,\ 
iheight, ix, iy
kout, ihandle FLroller "label",imin,imax, istep, iexp, itype, idisp, \ 
iwidth, iheight, ix, iy
Primeiro, os parâmetros comuns a todos eles. 
Em imin e imax determinamos os valores mínimo e máximo que o controle
assumirá. 
Em iexp podemos definir essa variação como linear, para iexp = 0, ou
exponencial, para iexp = -1. 
Em itype definimos o tipo de visual que o controle assumirá, e veremos todos
eles comentados e visualizados no segundo exemplo adiante. 
Em idisp dizemos qual o controle do tipo Flvalue que estará encarregado de
mostrar quais valores, entre imin e imax, estão sendo assumidos pelo controle. 
E em iwidth, iheight, ix e iy dizemos as dimensões do controle e suas
coordenadas x e y. 
Os valores de x e y do controle não são absolutos, mas referentes as
coordenadas dentro do container em que eles estão. Assim coordenadas x e y sendo (0,0)
dirá apenas que eles estão no canto esquerdo superior do painel, mesmo que este painel
esteja no fim da janela do programa.
Os valores de saída dos controles são kout, que contém o valor do controle em
cada momento, e ihandle, que é uma referência fixa ao controle, de modo que ele pode
ser acessado e modificado por outros comandos mais tarde.
As únicas diferenças entre Flknob, Flslider e Flroller é que Flknob precisa de
um parâmetro a menos, não precisando do parâmetro iheight, já que suas dimensões são
determinadas unicamente pelo quadrado com iwidth pixels de altura e largura, e Flroller
precisa de um parâmetro a mais, istep, que diz em quanto o valor do controle é
modificado a cada clique do mouse.
Os valores dos controles em cada momento são armazenados em kout, e podem
ser exibidos visualmente através de controles do tipo Flvalue, cuja sintaxe é:
idisp FLvalue "label", idwidth, idheight, idx, idy 
Os controles são ligados ao componente Flvalue através de seu parâmetro
idisp. Note que o mesmo parâmetro de saída idisp em Flvalue é o mesmo parâmetro de
entrada idisp em Flknob, por exemplo. 
Podemos definir um valor inicial para cada controle através de FlsetVal_i, que
deve ser chamada de dentro de um instrumento e cuja sintaxe é:
FLsetVal_i kvalue, ihandle
Onde definimos aqui o valor kvalue para o controle referenciado por ihandle.
Um código simples contendo Flpanel, Flknob, Flvalue e FlsetVal_i seria:
<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; FLpanel
;
;;;;;;;;;;;;;;;;;;;;;;;;;;
iwidth = 110
iheight = 110
ix = 0
iy = 0
iborder = 1
FLpanel "", iwidth, iheight, ix, iy, iborder
;;;;;;;;;;;;;;;;;;;;;;;;;;
; FLvalue
;;;;;;;;;;;;;;;;;;;;;;;;;;
  iwidth = 90
  iheight = 30
  ix = 10
  iy = 70
  idisp FLvalue "", iwidth, iheight, ix, iy
;;;;;;;;;;;;;;;;;;;;;;;;;;
; FLknob
;;;;;;;;;;;;;;;;;;;;;;;;;;
  imin = 0
  imax = 1
  iexp = 0
  itype = 1 
  iwidth = 40
  ix = 10
  iy = 10
  gkout, gihandle FLknob "Knob1", imin, imax, iexp, itype, idisp, \
iwidth, ix, iy
FLpanelEnd 
FLrun
;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; FLsetVal_i
;
;;;;;;;;;;;;;;;;;;;;;;;;;;
instr 1
  FLsetVal_i 0.5, gihandle
endin
</CsInstruments>
<CsScore>
f0 100
i1 0 1
</CsScore>
</CsoundSynthesizer>
Fig. 1: fltk.csd
Fig.2: tela do programa fltk.csd
Depois das declarações dos componentes gráficos, chamamos Flrun, que
executa todos os componentes e mostra a interface gráfica.
Diferenças visuais em itype e iborder
Em nosso próximo exemplo poderemos ver as diferenças visuais para cada
valor de itype declarado em Flknob, Flslider e Flroller.
Em Flknob, o valor do parâmetro itype pode ser:
* itype = 1, para  ter uma aparência 3-D
* itype = 2, para se ter um knob estilo fatia ou pie-like
* itype=3 para se ter um knob estilo relógio
* itype=4 nos dá um knob plano.
Fig.3: os valores de itype em Flknob
Em Flslider, o valor do parâmetro itype pode ser:
* itype = 1, para se ter um slider horizontal de preenchimento
* itype=2 para um slider vertical de preenchimento
* itype=3 nos dá um slider horizontal de rolagem
* itype=4 um slider vertical de rolagem
* itype=5 um slider horizontal estilo mesa de som
* itype=6 um slider vertical de mesa de som. 
Os tipos 7 e 8 estão documentados mas ainda não fôram
implementados.
Fig.4: os valores de itype em Flslider
Em Flroller, o valor do parâmetro itype pode ser:
* itype=1 para rolagem horizontal
* itype=2 para rolagem vertical.
Fig.5: os valores de itype em Flroller
Em Flpanel temos o parâmetro iborder que nos dá o estilo de borda do painel,
sendo:
* iborder=0 para nenhuma borda
* iborder=1 para o efeito de painel rebaixado
* iborder=2 para um painel levantado
* iborder=3 para uma borda gravada
* iborder=4 para uma borda levantada
* iborder=5 uma borda apenas de linha
* iborder=6 para o efeito de painel rebaixado com borda fina
* iborder=7 para um painel levantado de borda fina.
Fig.6: os valores de iborder em Flpanel
A seguir temos o programa completo que gerou todos os tipos de gráficos
nesses componentes. Não se assuste com a quantidade de linhas do programa, de fato a
maior parte é de especificação de coordenadas para cada componente. Com o tempo você
notará que o mais trabalhoso em interfaces gráficas no Csound é especificar essas
coordenadas de modo que os controles se alinhem bem na tela. 
No programa os parâmetros com prefixo ip são referentes a parâmetros dos
painéis, prefixos id são referentes a parâmetros dos componentes Flvalue, e os sem
prefixo são referentes aos valuators. Logo depois do programa temos a imagem gerada
por ele na tela.
<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
ipwidth = 90
ipheight = 95
idwidth = 60
idheight = 30
idx = 10
idy = 60
imin = 0
imax = 1
iexp = 0 ; saída é linear, para -1 seria exponencial
iborder = 1 ; down box border
iwidth = 40
iheight = 40
ix = 20
iy = 5
FLpanel "Controle Gráfico", 700, 400
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Knobs
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ipx = 5
ipy = 5
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp1 FLvalue "", idwidth, idheight, idx, idy  
  itype = 1 ; um knob 3-D
  gk1, gi1 FLknob "itype=1", imin, imax, iexp, itype, idisp1, iwidth, ix, iy
FLpanelEnd
ipx = 100
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp2 FLvalue "", idwidth, idheight, idx, idy  
  itype = 2 ; um knob pie-like
  gk2, gi2 FLknob "itype=2", imin, imax, iexp, itype, idisp2, iwidth, ix, iy
FLpanelEnd
ipx = 200
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp3 FLvalue "", idwidth, idheight, idx, idy  
  itype = 3 ; um knob clock-like
  gk3, gi3 FLknob "itype=3", imin, imax, iexp, itype, idisp3, iwidth, ix, iy
FLpanelEnd
ipx = 300
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp4 FLvalue "", idwidth, idheight, idx, idy  
  itype = 4 ; um knob flat
  gk4, gi4 FLknob "itype=4", imin, imax, iexp, itype, idisp4, iwidth, ix, iy
FLpanelEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Sliders
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
iwidth = 40
iheight = 20
ipx = 5
ipy = 100
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp5 FLvalue "", idwidth, idheight, idx, idy  
  itype = 1 ; horizontal fill slider
  gk5, gi5 FLslider "itype=1", imin, imax, iexp, itype, idisp5, iwidth, \
iheight, ix, iy
FLpanelEnd
iwidth = 20
iheight = 40
ipx = 100
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp6 FLvalue "", idwidth, idheight, idx, idy  
  itype = 2 ; vertical fill slider
  gk6, gi6 FLslider "itype=2", imin, imax, iexp, itype, idisp6, iwidth, \
iheight, ix, iy
FLpanelEnd
iwidth = 40
iheight = 20
ipx = 200
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp7 FLvalue "", idwidth, idheight, idx, idy  
  itype = 3 ; horizontal engraved slider
  gk7, gi7 FLslider "itype=3", imin, imax, iexp, itype, idisp7, iwidth, \
iheight, ix, iy
FLpanelEnd
iwidth = 20
iheight = 40
ipx = 300
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp8 FLvalue "", idwidth, idheight, idx, idy  
  itype = 4 ; vertical engraved slider
  gk8, gi8 FLslider "itype=4", imin, imax, iexp, itype, idisp8, iwidth, \
iheight, ix, iy
FLpanelEnd
iwidth = 40
iheight = 20
ipx = 400
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp9 FLvalue "", idwidth, idheight, idx, idy  
  itype = 5 ; horizontal nice slider
  gk9, gi9 FLslider "itype=5", imin, imax, iexp, itype, idisp9, iwidth, \
iheight, ix, iy
FLpanelEnd
iwidth = 20
iheight = 40
ipx = 500
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp10 FLvalue "", idwidth, idheight, idx, idy  
  itype = 6 ; vertical nice slider
  gk10, gi10 FLslider "itype=6", imin, imax, iexp, itype, idisp10, iwidth, \
iheight, ix, iy
FLpanelEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Rollers
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
istep = 0.1
iwidth = 40
iheight = 20
ipx = 5
ipy = 200
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp11 FLvalue "", idwidth, idheight, idx, idy  
  itype = 1 ; horizontal fill slider
  gk11, gi11 FLroller "itype=1", imin, imax, istep, iexp, itype, idisp11, \
iwidth, iheight, ix, iy
FLpanelEnd
iwidth = 20
iheight = 40
ipx = 100
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
  idisp12 FLvalue "", idwidth, idheight, idx, idy  
  itype = 2 ; vertical fill slider
  gk12, gi12 FLroller "itype=2", imin, imax, istep, iexp, itype, idisp12, \
iwidth, iheight, ix, iy
FLpanelEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Panels
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ipy = 300
ipx = 5
iborder = 1 ; down box border
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
FLpanelEnd
ipx = 100
iborder = 2 ; up box border
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
FLpanelEnd
ipx = 200
iborder = 3 ; engraved border
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
FLpanelEnd
ipx = 300
iborder = 4 ; embossed border
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
FLpanelEnd
ipx = 400
iborder = 5 ; black line border
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
FLpanelEnd
ipx = 500
iborder = 6 ; thin down border
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
FLpanelEnd
ipx = 600
iborder = 7 ; thin up border
FLpanel "", ipwidth, ipheight, ipx, ipy, iborder
FLpanelEnd
FLpanelEnd
FLrun
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Inicialização dos controles
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
instr 1
  igain init 0.5
  FLsetVal_i igain, gi1
  FLsetVal_i igain, gi2
  FLsetVal_i igain, gi3
  FLsetVal_i igain, gi4
  FLsetVal_i igain, gi5
  FLsetVal_i igain, gi6
  FLsetVal_i igain, gi7
  FLsetVal_i igain, gi8
  FLsetVal_i igain, gi9
  FLsetVal_i igain, gi10
  FLsetVal_i igain, gi11
  FLsetVal_i igain, gi12
endin
</CsInstruments>
<CsScore>
i1  0 100
</CsScore>
</CsoundSynthesizer>
Fig.7: fltk2.csd
  
Fig.8: a tela do programa fltk2.csd
 
No arquivo zak2.csd do capítulo 6 implementamos uma cadeia de efeitos com
parâmetros do score. Queremos agora controlá-los graficamente por controles Flslider.
Basicamente teremos que acrescentar no início da seção orchestra os vários
controles FLTK e em cada instrumento definir o valor inicial do controle e associar o
controle a um parâmetro do instrumento. Para o intrumento de distorção, por exemplo,
teremos no cabeçalho os componentes que o controlarão, associando duas variáveis
gkpregain e gkpostgain aos valores de dois controles Flslider.
FLpanel "Distorção", iwidth, iheight, ix, iy, iborder
  iwidth = 30
  iheight = 30
  ix = 20
  iy = 240
  idisp1 FLvalue "", iwidth, iheight, ix, iy
  
  imin = 1
  imax = 2
  iexp = 0 ; saída é linear, para -1 seria exponencial
  itype = 6
  iwidth = 30
  iheight = 200
  ix = 20
  iy = 20
  gkpregain, gipregain FLslider "Pre Gain", imin, imax, iexp, itype,\ 
idisp1, iwidth, iheight, ix, iy
  iwidth = 30
  iheight = 30
  ix = 100
  iy = 240
  idisp2 FLvalue "", iwidth, iheight, ix, iy
  
  imin = 1
  imax = 2
  iexp = 0 ; saída é linear, para -1 seria exponencial
  itype = 6
  iwidth = 30
  iheight = 200
  ix = 100
  iy = 20
  gkpostgain, gipostgain FLslider "Post Gain", imin, imax, iexp,\
itype, idisp2, iwidth, iheight, ix, iy
FLpanelEnd
Esse trecho de código cria a interface gráfica para o efeito de distorção. Em
seguida, dentro do instrumento, definimos os valores iniciais dos dois controles Flslider e
atribuímos os valores assumidos pelos dois controles para duas variáveis locais do
instrumento, como vemos a seguir: 
instr 95
  iinch init p4
  ioutch init p5
  FLsetVal_i 2, gipregain
  kpregain = gkpregain
  FLsetVal_i 1, gipostgain
  kpostgain = gkpostgain
  ishape1 init 0
  ishape2 init 0
  asign init 0
  asig zar iinch
  adist distort1 asig, kpregain, kpostgain, ishape1, ishape2
  aold = asign         ; Salva o último sinal
  asign = asig/30000   ; Normaliza o novo sinal
; Faz um atraso baseado na declividade
  atemp delayr  .1                    
  aout deltapi (2-asign)/1500 + (asign-aold)/300
  delayw  adist
  zaw aout*gibalance, ioutch
endin
 
O código que veio no final do instrumento é exatamente o mesmo
implementado antes no capítulo 6, tendo apenas seu início adaptado tomar valores da
interface gráfica.
Criaremos a mesma cadeia de efeitos daquele capítulo, fazendo a ligação entre
eles através da família zak de opcodes, encadeando sucessivamente os efeitos de
distorção, flanger, reverb e ganho de saída, e controlando seus parâmetros de
performance através de controles Flslider
Os parâmetros de inicialização serão fixados como constantes dentro do
intrumento, e os de performance associados aos valores dos controles. Poderemos ver
essa diferença na implementação do controle flanger no trecho abaixo, onde iinitdel e
ienddel são fixados e kfeedback é associado ao valor do controle gráfico:
instr 96
  iinch init p4
  ioutch init p5
  iinitdel = 0.01
  ienddel = 0.07
  FLsetVal_i 0.7, gifeedback
  kfeedback = gkfeedback
  asig zar iinch
  adel line iinitdel, p3, ienddel
  aout flanger asig, adel, kfeedback
  zaw aout*gibalance, ioutch
endin
A seguir temos o programa completo, que na verdade é uma adaptação do
programa zak2.csd, agora com componentes gráficos para todos os parâmetros de
performance:
<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
iwidth = 500
iheight = 300
FLpanel "Controle Gráfico", iwidth, iheight
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Controle da Distorção
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
iwidth = 180
iheight = 280
ix = 10
iy = 10
iborder = 1 ; down box border
FLpanel "Distorção", iwidth, iheight, ix, iy, iborder
  iwidth = 30
  iheight = 30
  ix = 20
  iy = 240
  idisp1 FLvalue "", iwidth, iheight, ix, iy
  
  imin = 1
  imax = 2
  iexp = 0 ; saída é linear, para -1 seria exponencial
  itype = 6
  iwidth = 30
  iheight = 200
  ix = 20
  iy = 20
  gkpregain, gipregain FLslider "Pre Gain", imin, imax, iexp, itype, idisp1, \
iwidth, iheight, ix, iy
  iwidth = 30
  iheight = 30
  ix = 100
  iy = 240
  idisp2 FLvalue "", iwidth, iheight, ix, iy
  
  imin = 1
  imax = 2
  iexp = 0 ; saída é linear, para -1 seria exponencial
  itype = 6
  iwidth = 30
  iheight = 200
  ix = 100
  iy = 20
  gkpostgain, gipostgain FLslider "Post Gain", imin, imax, iexp, itype, idisp2, \
iwidth, iheight, ix, iy
FLpanelEnd
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Controle do Flanger
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
iwidth = 90
iheight = 280
ix = 200
iy = 10
iborder = 1 ; down box border
FLpanel "Flanger", iwidth, iheight, ix, iy, iborder
  iwidth = 30
  iheight = 30
  ix = 20
  iy = 240
  idisp3 FLvalue "", iwidth, iheight, ix, iy
  
  imin = 0.5
  imax = 0.8
  iexp = 0 ; saída é linear, para -1 seria exponencial
  itype = 6
  iwidth = 30
  iheight = 200
  ix = 20
  iy = 20
  gkfeedback, gifeedback FLslider "Feedback", imin, imax, iexp, itype, idisp3, \
iwidth, iheight, ix, iy
FLpanelEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Controle do Reverb
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
iwidth = 90
iheight = 280
ix = 300
iy = 10
iborder = 1 ; down box border
FLpanel "Reverb", iwidth, iheight, ix, iy, iborder
  iwidth = 30
  iheight = 30
  ix = 20
  iy = 240
  idisp4 FLvalue "", iwidth, iheight, ix, iy
  
  imin = 0
  imax = 6
  iexp = 0 ; saída é linear, para -1 seria exponencial
  itype = 6
  iwidth = 30
  iheight = 200
  ix = 20
  iy = 20
  gkrvt, girvt FLslider "Reverb", imin, imax, iexp, itype, idisp4, iwidth, \
iheight, ix, iy
FLpanelEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Controle do Ganho da Saída
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
iwidth = 90
iheight = 280
ix = 400
iy = 10
iborder = 1 ; down box border
FLpanel "Gain", iwidth, iheight, ix, iy, iborder
  iwidth = 30
  iheight = 30
  ix = 20
  iy = 240
  idisp5 FLvalue "", iwidth, iheight, ix, iy
  
  imin = 0
  imax = 1
  iexp = 0 ; saída é linear, para -1 seria exponencial
  itype = 6
  iwidth = 30
  iheight = 200
  ix = 20
  iy = 20
  gkgain, gigain FLslider "Gain", imin, imax, iexp, itype, idisp5, iwidth, \
iheight, ix, iy
FLpanelEnd
FLrun
zakinit 5, 1
gibalance = 0.4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Entrada
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
instr 1
  iinch init p4
  ioutch init p5
 
  asig soundin "female.aif"
  zaw asig*gibalance, ioutch
endin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Distorção
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
instr 96
  iinch init p4
  ioutch init p5
  FLsetVal_i 2, gipregain
  kpregain = gkpregain
  FLsetVal_i 1, gipostgain
  kpostgain = gkpostgain
  ishape1 init 0
  ishape2 init 0
  asign init 0
  asig zar iinch
  adist distort1 asig, kpregain, kpostgain, 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*gibalance, ioutch
endin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Flanger
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
instr 97
  iinch init p4
  ioutch init p5
  iinitdel = 0.01
  ienddel = 0.07
  FLsetVal_i 0.7, gifeedback
  kfeedback = gkfeedback
  asig zar iinch
  adel line iinitdel, p3, ienddel
  aout flanger asig, adel, kfeedback
  zaw aout*gibalance, ioutch
endin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Reverb
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
instr 98
  iinch init p4
  ioutch init p5
 
  FLsetVal_i 1, girvt
  krvt = gkrvt
  asig zar iinch 
  aout reverb asig, krvt
  zaw aout*gibalance, ioutch
endin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Saída
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
instr 99
  iinch init p4
  ioutch init p5
  FLsetVal_i 0.8, gigain
  kgain = gkgain
  
  asig zar iinch 
  zacl 1, 5
  out asig*kgain
endin
</CsInstruments>
<CsScore>
; Entrada
i1  0 6 1 1 
i1  6 6 1 1 
i1  12 6 1 1 
i1  18 6 1 1 
i1  24 6 1 1 
; Distorção
i96 0 30 1 2 
; Flanger
i97 0 30 2 3 
; Reverb
i98 0 30 3 4 
; Saída
i99 0 30 4 1 
</CsScore>
</CsoundSynthesizer>
Fig.9: fltk3.csd
Fig.10: a tela do programa fltk3.csd