Boa tarde, pessoal!
Hoje tivemos nossa primeira aula prática, e com ela alguns contratempos que prejudicaram o planejamento do trabalho de implementação que iríamos entregar. Escrevo esse e-mail para pedir um pouco de paciência a vocês: faremos todo o possível para que as próximas aulas práticas sejam muito mais produtivas. Enquanto isso, algumas observações e dicas:
1) Farei testes essa semana no laboratório para garantir que não teremos problemas técnicos com o som ou com a interface na próxima aula: as falhas intermitentes que observamos hoje não são uma característica nem do Pd nem do Linux. Por outro lado, quem quiser trazer seu próprio computador continua sendo muito bem-vindo a fazê-lo.
2) O roteiro para o primeiro trabalho prático não foi pensado como uma corrida contra o tempo, e sim como uma sessão experimental onde poderíamos testar ideias, brincar com as expressões e parâmetros, e mapear representações matemáticas em propriedades perceptuais da nossa escuta. Só que era muita coisa... (fui muito otimista em relação à duração da aula). Considero muito importante que tentemos todos fazer o roteiro até o fim, mesmo que leve bastante tempo: vou deixar a entrega no PACA aberta durante duas semanas, até a próxima aula prática. Tenham em mente que muitas expressões estão naquele roteiro apenas para provocar nossa curiosidade em relação a técnicas que serão discutidas ao longo do semestre: não seria possível nessa altura entender porque os sons modificados soam como soam, mas é possível prestar atenção neles e tentar descrever intuitivamente suas propriedades e as diferenças entre eles (esse é o único objetivo dos comentários que vocês devem incluir nas implementações).
3) A partir das próximas aulas vou trazer vários exemplos em Pd, nos quais veremos que muitas coisas que fizemos hoje podem ser feitas de várias maneiras diferentes. O uso da linguagem Lua no Pd abre muitas portas para coisas que faremos durante o semestre, razão pela qual a estamos usando desde o início, porém algumas coisas podem parecer um pouco burocráticas, especialmente os métodos de acesso a posições de vetores. Para relembrar, um vetor do Pd é acessado em Lua através de uma variável local, como
local v = ofArray("array1");
(no ofelia 2.3 use pdArray ao invés de ofArray), e os métodos para acessar e modificar o vetor são chamados v:getAt e v:setAt; especificamente, quando quisermos usar v[i] em uma expressão, usaremos v:getAt(i), e quanto quisermos fazer uma atribuição do tipo v[i] = expressão, usaremos v:setAt(i,expressão); Essa é só uma adaptação sintática que logo nos acostumamos.
Especialmente quando estivermos usando dois ou mais vetores, pode ser útil armazenar os resultados intermediários em outras variáveis para aumentar a legibilidade: assim, poderíamos escrever sequências como
local v = ofArray("array1");
local w = ofArray("array2");
for i=0,88199 do;
x = v:getAt(i);
y = math.sin(2*math.pi*550*2^(a/12)*i/44100);
w:setAt(i,x+y);
end;
Agora algumas dicas adicionais para a continuação do roteiro:
4) Lembrem-se que ao "disparar" um valor numérico para dentro de um script ofelia, o parâmetro correspondente é chamado de a (o valor a nas expressões em Lua será substituído pelo valor inteiro do seletor). No exemplo acima, esse a é o expoente associado ao "fator semitom" = 2^(1/12). Por sinal, quem escreveu essa expressão deve ter percebido que Lua usa a divisão inteira em 1/12, resultando em 2^0 = 1 (isso pode ser evitado escrevendo 2^(1.0/12)).
5) No item 8, todas as transformações produzem valores na faixa correta de representação [-1,...,+1] (não é necessário ajustar nenhuma das fórmulas).
6) No item 10 usaremos a função math.random(), que produz valores aleatórios entre [0,...,1].
7) No item 11, combinem as expressões para expressar a Amplitude (que é o fator multiplicativo que colocaremos na frente da expressão) em função do Loudness (que deveria representar nossa escala perceptual); para isso, mapeiem os valores a= 0, 1,..., 19, 20 produzidos pelo seletor horizontal em valores de Loudness iguais a 0, 0.05, 0.1,..., 0.95, 1, para então transformar esses valores em fatores multiplicativos de amplitude também entre 0 e 1. Certifiquem-se de compreender a transformação: nesse mapeamento, as Amplitudes são menores ou maiores do que os valores equivalentes de Loudness?
8) As manipulações dos itens 12, 13 e 14 envolvem duas tabelas simultaneamente, a primeira (denotada por x) inicializada com um ruído branco e outra (denotada por y) que vai sendo preenchida com valores novos dentro de um laço. Observe que y[n] pode depender tanto de mais de um valor de x como também de outros valores de y computados anteriormente. Nessas expressões, não se preocupem em verificar se os índices (n-1 ou n-2) existem ou fazem sentido: transcrevam as fórmulas da maneira mais simples e direta possível (valores diferentes nas duas ou três primeiras amostras não mudarão em nada o som resultante).
9) No item 13, vocês precisarão calcular o máximo valor absoluto produzido na segunda tabela, para em seguida (em um novo laço) dividir todas as amostras por esse valor. O cálculo do máximo valor absoluto pode ser feito no mesmo laço que computa a expressão y[n]=x[n]+y[n-1], usando uma variável max e as funções math.max() e math.abs().
10) No item 15, para atualizar as variáveis x2,...,x6 apenas nos índices correspondentes, utilize o comando if e o teste de divisibilidade por 2, 4, 8, 16 e 32; por exemplo:
if i%8==0 then x4 = 2*math.random()-1 end
só vai atualizar o x4 quando i=0,8,16,24,32,...
Fiquem à vontade para postar quaisquer dúvidas aqui nesse tópico de discussão. Para esse primeiro trabalho — excepcionalmente — vocês podem anexar o programa ou partes dele na mensagem para ajudar a formular suas dúvidas.
Bom trabalho!
Marcelo