Capítulo 2
A série harmônica
Os exemplos anteriores foram úteis para entendermos como funciona o Csound,
mas vamos agora aplicar algumas técnicas para ir tornando nossos instrumentos mais
interessantes. 
Normalmente quando uma nota é tocada os instrumentos acústicos produzem a
chamada série harmônica, que é uma onda composta da frequência fundamental
acompanhada por várias frequências a partir desta. Se tocarmos a nota Dó em um piano,
tipicamente as frequências produzidas serão a fundamental Dó acompanhada de seus
harmônicos:
Fig. 5: A série harmônica
Essas frequências que soam juntas com a frequência fundamental Dó, não são
notadas como frequências separadas, mas é o que dá o timbre ao som quando uma única
nota é tocada. Praticamente todos os instrumentos acústicos possuem a mesma série
harmônica, entretanto o que diferencia o timbre de cada um é a intensidade com que cada
harmônico, ou frequência superior, é reproduzido. Uma flauta doce tem pouca
intensidade em seus harmônicos, gerando um som mais puro, enquanto que um saxofone
tem maior intensidade nos harmônicos superiores, produzindo um timbre mais complexo.
Existem vários opcodes em Csound que tiram proveito da série harmônica para
produzir sons mais complexos, entre eles GEN10, GEN11 e o opcode buzz. Se olharmos
para a forma como a GEN10 foi utilizada no nosso exemplo anterior veremos que ela foi
escrita com um único parâmetro depois da especificação 10:
f 1 0 16384 10 1
Na verdade dissemos com esse último parâmetro 1 que apenas a frequência
fundamental deveria ser produzida. Vejamos agora um exemplo onde teremos os
primeiros 5 harmônicos da série harmônica reproduzidos, todos com intensidade 1:
<CsoundSynthesizer>
<CsOptions>
-o gen10.wav
</CsOptions>
<CsInstruments>
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
instr 1
  kamp = 30000
  kcps = 440
  ifn = 1
  ; Toca com amplitude 30000 e frequência de 440 Hz a onda dos 5
  ; primeiros harmônicos armazenados na tabela 1.
  a1 oscil kamp, kcps, ifn
  
  out a1
endin
</CsInstruments>
<CsScore>
; Tabela #1: Primeiros 5 harmônicos com GEN10, todos com a mesma 
; intensidade.
f 1 0 16384 10 1 1 1 1 1
; Toca o instrumento #1 por 3 segundos, começando em 0 segundos
i 1 0 3
e
</CsScore>
</CsoundSynthesizer>
Fig. 6: GEN10.csd, O arquivo csd para uma série harmônica usando GEN10
Se quiséssemos apenas seis harmônicos, mas que não tivesse o segundo
harmônico, que o terceiro harmônico tivesse a metade da intensidade da fundamental, e
todos os harmônicos seguintes um quarto da intensidade, usaríamos:
f 1 0 16384 10 1 0 0.5 0.25 0.25 0.25 0.25
A principal diferença entre GEN10 e GEN11 é que em GEN10 definimos a
intensidade de cada harmônico, enquanto em GEN11 podemos definir todos os
harmônicos com a mesma intensidade dizendo apenas o número de harmônicos. Se em
GEN10 usamos a linha de comando:
f 1 0 16384 10 1 1 1 1 1
para os cinco primeiros harmônicos com a mesma intensidade, podemos criar a mesma f-
table com GEN11 através da linha:
f 1 0 16384 11 5
Uma alternativa para se produzir o som da série harmônica, é gerá-lo na seção
orchestra, a partir do opcode buzz, ao invés de gerá-lo no arquivo score através de
GEN10.
Se olharmos no Csound Reference Manual, veremos que a sintaxe de buzz é:
ares buzz xamp, xcps, knh, ifn [, iphs]
Onde os parâmetros dados são:
.
xamp é a amplitude de saída
.
xcps é a frequência
. knh é o número de harmônicos a ser reproduzido
. ifn é o índice de uma f-table que contém a onda do seno
. iphs (opcional) é a fase em que as ondas de seno começarão
Os parâmteros ifn e iphs são de tempo de inicialização, os outros parâmetros
são de tempo de performance. Aqui temos o seu uso no arquivo buzz.csd:
<CsoundSynthesizer>
<CsOptions>
-o buzz.wav
</CsOptions>
<CsInstruments>
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
instr 1
  kamp = 5000
  kcps = 440
  ifn = 1
  ; Número de harmônicos
  knh = 5
  ; Toca com amplitude 5000, a partir da frequência fundamental de 
  ; 440 Hz, a onda dos 5 primeiros harmônicos do seno
  a1 buzz kamp, kcps, knh, ifn
  
  out a1
endin
</CsInstruments>
<CsScore>
  ; Tabela #1: uma simples onda de seno usando GEN10.
  f 1 0 16384 10 1
  ; Toca o instrumento #1 por 2 segundos, começando em 0 segundos
  i 1 0 2
  e
</CsScore>
</CsoundSynthesizer>
Fig. 5: buzz.csd, um arquivo csd utilizando o opcode buzz para gerar a série harmônica
Podemos então ouvir a mesma onda gerada antes por GEN10, agora gerada por
buzz, através da linha de comando:
csound buzz.csd
A primeira vista parece que os opcodes GEN10, GEN11 e buzz são quase
idênticos, mas uma de suas diferenças fundamentais é que ondas geradas em uma f-table
como nas rotinas GEN são estáticas, enquando que a onda gerada pelo opcode buzz é
dinâmica, pode ser alterada a qualquer momento da execução. Podemos, por exemplo,
começar com 10 harmônicos no opcode buzz e a cada segundo diminuirmos em um os
harmônicos, o que é impossível de se fazer com a f-table.