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
|