MAC 337/5900 - Computação Musical
Aula 11 - 18/9/7
Tabelas de Ondas (Wavetables) e Samplers
- B07.sampler:
- note o filtro passa alta no final para eliminar tudo o que
abaixo de 5Hz; isso corte o fluxo contínuo quando não
há som (amostras repetindo sempre no mesmo valor).
- ver documentação do hip~.
- B08.sampler.loop:
- loucuras mil
- note que podemos gravar uma amostra e depois refina-la manualmente com o mouse para eliminar picos e descontinuidades.
- B09.sampler.loop.smooth:
- acrescenta uma envoltória de cosseno para suavizar o fim da seqüência de amostras
- colocar freqüência em 2Hz e desenhar gráfico da envoltória.
- assim como o anterior possui a possibilidade de gravar do microfone.
- podemos suavizar a amostra do microfone manualmente.
- experimentar retro-alimentação do áudio.
- gravar uma nota aguda de falsete e tocar uma escala diatônica mudando a transposição.
- B10.sampler.scratch:
- podemos aqui mudar também qual ponto da seqüência de amostras usamos (deslocamento do início).
- notar effeito doppler quando mudamos o ponto enquanto estamos tocando.
- B11.sampler.nodoppler:
- elimina o efeito doppler usando 2 objetos samphold~ que faz com
que o deslocamento só mude quando chegamos ao fim da amostra.
- ver ajuda do samphold~
- há um grande salto na mudança da fase mas como a
envoltória do cosseno está no zero, não há
um clique.
- B12.sampler.transpose:
- calcula a freqüência de repetição do
sampler baseado na transposição desejada (em
décimos de semitom).
- colocando, por exemplo, o chunk size
em 100 e mudando o índice de transposição, obtemos
a frase inteira em várias alturas (e freqüência de
repetição calculada apropriadamente).
- usa a nova classe expr que ser para calcular uma expressão matemática arbitrária.
- ver ajuda e exemplos de expr e expr~.
- B13.sampler.overlap:
- Usa a técnica que vimos na aula passada de usar dois
samplers sobrepostos em fases diferentes da seqüência de
amostras para evitar cliques no local da descontinuidade.
- Neste exemplo, um phasor é usado para gerar duas fases defasadas em 1800.
- Desta forma, sempre há algo soando.
- Exemplo: gravar uma nota aguda de falsete e tocar uma escala diatônica mudando a transposição.
- Isso é particularmente importante quando o tamanho da seq. de amostras é pequeno (p.ex., < 0,1s).
- wrap~: joga o valor de entrada para um valor entre 0 e 1:
- 1.3 vira 0.3
- 0.75 continua 0.75
- -0.6 vira 0.4
- -0.1 vira 0.9
- send~, s~, receive~, r~: versões das classes de envio e
recebimento de mensagens em suas versões de sinal
contínuo.
- Não é permitido ter mais de um objeto com send~ para o mesmo nome. (com send isso é permitido).
Compressão e expansão temporal de amostras de áudio
- Através de uma técnica muito simples que consiste
em dividir o som em pequenos medaços microtemporais, podemos
esticar ou comprimir a duração sem mudar a
freqüência ou então mudar a freqüência sem
esticar ou comprimir a duração.
- B14.sampler.rockafella
- Neste exemplo, o ponto de leitura da seq. de amostras é
calculado automaticamente em função da
freqüência desejada.
- Isso permite aumentar e diminuir a velocidade da
execução das amostras independentemente da
transposição.
- O chunk size no canto superior esquerdo (25ms) determina o tamanho dos pedaços usados no processamento.
- Como o padrão para este tamanho é 25ms, temos 40 pedaços por segundo.
- A variável precession
controla a velocidade do movimento do cursor ao longo da
seqüência de amostras. 100% significa tempo real, 200%
significa o dobro do tempo real (a freq. do phasor é
multiplicada por dois); 50% significa metade do tempo real (a freq. do
phasor é dividida por 2).
- O que ocorre na verdade é que o phasor final pode pular
algumas amostras ou tocar 2 ou mais vezes a mesma amostra dependendo do
valor da precessão.
- A freqüência final do phasor (f) é
calculada em função da precessão (p), da
transposição (t) e do tamanho da seq. de amostras (c).
- t = p + cf, ou seja,
- f = (t-p) / c, convertendo t para semitons (h é a transposição em semitons) temos:
- f = (2h/12 - p) / c, que é calculado pelo objeto expr.
Comandos novos que vimos no Pd
- pack (empacota um conjunto de valores em uma mensagem)
- hip~
- cos~
- samphold~
- expr
- wrap~
Capítulo 3: Computações em áudio e controle
- Um sinal de áudio digital da forma como temos visto,
claramente não consegue representar qualquer
função.
- O Teorema da Amostragem de Nyquist diz que se a taxa de
amostragem é R, só conseguiremos representar
freqüências até R/2.
- Ou seja, o período resultante da maior freqüência seria 2 amostras de áudio.
- Freqüências acima disso, no momento em que são
discretizadas para R amostras por segundo, geram uma imagem equivalente
a outra freqüência abaixo de R/2.
- Ouvimos esta outra freqüência que não estava no áudio original e o efeito é chamado de aliasing.
- O efeito também é chamado de foldover porque as freqüências no intervalo de zero a ∞ são "dobradas" continuamente no intervalo 0 a π.
- A onda dente de serra possui infinitos harmônicos e o 100o harmônico é apenas 40dB mais fraco que o 1o.
- Portanto, o phasor funciona bem como gerador de fase mas não tão bem como gerador da onda de áudio em si.
- O compositor digital deve treinar o ouvido para detectar o foldover caso contrário perderá controle do som gerado.
- Para evitar o foldover devemos sempre usar a maior taxa de amostragem que o hardware permitir.
- Exemplos:
- C01.nyquist
- A tabela começa com uma senóide correspondente à 46a parcial de um som.
- É feito um glissando de 500 a 1423Hz, que corresponderia a 23000 a 65458Hz mas o glissando para cima com o foldover gera artefatos de glissando nas duas direções.
- Nas ondas complex e rectangule, em 1423 Hz, o segundo harmônico é 2846 Hz e o 33o é 1423*33-44100 = 2859 Hz, o que causa batimento.
- C01.sawtooth-foldover
Controle
- Assim como no CSound, temos a taxa de áudio e a taxa de controle.
- Note que há umas sutilezas quando falamos de tempo em computação musical:
- tempo real é o tempo no qual o som é tocado
- tempo lógico é o tempo no qual o som é calculado
- o computador calcula o som em blocos de tamanho variável (normalmente 256 a 1024 amostras)
- e joga para a placa de som 1 ou mais blocos de uma vez.
- A Fig. 3.2 mostra a relação entre tempo
lógico e tempo real e os instantes nos quais controle é
computado e áudio é computado.
- a) bloco de 1 amostra
- b) bloco de 4 amostras
- (no mundo real, os blocos contém muito mais amostras)
- O custo de chamar um objeto em Pd é aprox. 20 vezes maior do que o custo de gerar uma amostra.
- Se o Pd chamasse o objeto a cada amostra, a sobrecarga das chamadas seria 2.000%.
- O Pd usa então blocos de 64 amostras, o que leva a sobrecarga a 30% aproximadamente apenas.
Fluxos de Controle
- Dados de controle podem vir de fontes
- internas: por exemplo,
seqüenciamento de comandos ou detecções de
características do áudio (por exemplo, acompanhando os
cruzamentos do 0 num sinal de áudio).
- externas: controladores MIDI, mouse, teclado, sensores, conexão de rede, etc.
- Em ambos os casos, as mensagens de controle em geral vem em
intervalos irregulares, ao contrário do áudio que vem a
taxas e períodos constantes.
- Fluxos de controle podem ser representados por uma
seqüência de pares <t, v> onde t é o instante
onde a mensagem de controle ocorre e v o valor da mensagem.
- Por exemplo, considere a seguinte onda quadrada de controle: (2, 1), (4.75, 0), (7.5, 1), (10.25, 0), (13, 1),...
- A Fig 3.4 mostra 3 formas de implementar este fluxo de controle:
- mais simples: usa no áudio, a última informação de controle disponível.
- intermediária: aplica na amostra mais próxima.
- melhor: usa interpolação linear (com dois pontos).
- Muitas vezes, informação de controle são
convertidas para sua aplicação no áudio
através de funções rampa para eliminar
discontinuidades. Como foi usado nos exemplos de controle de amplitude
que vimos na aula retrasada (para eliminar cliques).
- C03.zipper.noise mostra como rampas podem ser criadas com line e line~.
- com line, ele gera uma escada com salto a cada 20ms, o que gera
um ruído de ziper. A conversão de controle para sinal
é feita de forma implícita e o Pd neste caso usa o
algoritmo mais simples da Fig. 3.4.
- com line~, a escalada é feita na taxa do áudio e o ruído de zíper desaparece.
- Em alguns casos mais raros, o line~ também pode gerar problemas como no C04.control.to.signal onde o line~ é usado como gerador de onda triangular. Vai para 1 em 2 ms e vai para 0 em 2 ms.
- Neste caso o line~ não dá conta do recado (pois ele alinha as linhas aos limites dos blocos de 64 amostras do Pd).
- O vline~, no entanto, que possui uma precisão maior (no nível da amostra) dá conta do recado.
- O problema é que vline~ é muito pesado
computacionalmente e só deve ser usado caso haja realmente
necessidade.
- O C05.sampler.oneshot mostra como construir um non-looping sampler usando o vline~ ao invés do phasor que usávamos no looping sampler.
- Este tipo de sampler é bem usado para inserir/disparar
amostras de áudio pré-gravadas dentro de nossas
peças eletroacústicas.
- Note as rampas no início e no fim.
Conversão de sinais de áudio para fluxos de controle
- Em alguns casos, precisamos extrair informações do
sinal de áudio e convertê-las em comandos de controle.
- Por exemplo, suponha que queremos cortar um som o mais rápido possível mas prevenindo contra cliques.
- Precisamos usar uma função rampa para diminuir a
amplitude. Mas quanto menor a amplitude inicial, mais rápida
pode ser a rampa de descida.
- A Fig. 3.6 mostra diagramas da conversão de áudio para controle e vice-versa.
- C06.signal.to.control mostra como snapshot~ pode ser usado para converter dados de áudio para controle.
Detecção de eventos
- É comum precisarmos detectar que certas coisas aconteceram
no sinal de áudio e gerar mensagens de controle dependendo desta
detecção.
- Por exemplo, poderíamos querer detectar o início e
o fim de atividades no sinal de áudio. Isso poderia ser usado
para identificar as frases melódicas tocadas por um instrumento
ou identificar quando a voz está sendo captada em uma
aplicação VoIP.
- Fig. 3.7
- a) ilustra o algoritmo
mais simples possível com 1 limite (ele gera muitos erros quando
há variações próximas do limite).
- b) ilustra um algoritmo melhor com dois limites.
- c) mostra outro
algoritmo que considera um período morto depois de cada
detecção e só volta a detectar após o
término do período morto.
- Os algoritmos b) e c) podem ainda ser utilizados em conjunto, em um algoritmo híbrido.
- C07.envelope.follower mostra como o env~ mostra como obter o RMS de um sinal de áudio em tempo real.
Sinais de Áudio como Controle
- A tradição de síntese analógica dos
anos 1950 a 1980 nos dá uma alternativa elegante para gerar
fluxos de controle:
- usar sinais de áudio para controlar outros sinais de áudio.
- Na síntese analógica, duas técnicas eram muito usadas:
- sequenciamento analógico
- pode ser simulado com uma tabela contendo valores
pré-determinados e o uso de uma onda dente de serra com a
freqüência e amplitude corretas para percorrer os elementos
da tabela.
- os elementos da tabela podem conter as alturas das notas de
uma melodia, uma seqüência de dados de controle quaisquer,
etc.
- A Fig. 2.8 mostra como ondas dente de serra podem ser manipuladas para gerar freqüências e amplitudes diversas.
- C08.analog.sequencer
- amostre e segure (sample-and-hold)
- Consiste em extrair amostras do sinal de áudio e segurar o valor daquela amostra ao longo de um certo tempo.
- A Fig. 2.9 mostra um exemplo que segura o valor do cosseno por um período fixo.
- Isso é similar ao uso que fizemos do trigger no B08.sampler.nodoppler
- C09.sample.hold
Referência
Próxima Aula
Página de MAC
337/5900
Página do Fabio
Página do
DCC