Oi, gente.
Um aluno me escreveu o seguinte:
Estou com problemas na Parte S do EP3.
Meu EP sintetiza normalmente arquivos com N = 64. Meu problema está sendo para N maiores que esse valor pois t_float *out guarda no máximo 64 valores.
Existe alguma técnica que devo aplicar para que seja possivel armazenar mais que 64 valores no vetor out? Ou algum jeito de aumentar o tamanho desse vetor?
Acho que a questão aqui é entender o processamento digital em blocos no PD.
Usando o objeto [block~], é possível determinar o tamanho do bloco e do overlap utilizado pelo PD no processamento digital. Isso significa que os objetos que emitem e recebem sinais vão ter sua entrada e saída realizada em blocos de tamanho fixo, com possível sobreposição entre os blocos. Isso causa um comportamento diferente somente para os objetos com ~.
Um bom exemplo é a diferença de funcionamento do [tabread4] para o [tabread4~]. Enquanto o primeiro, controlado por um [metro], por exemplo, possui um comportamento invariável, o segundo tem sua entrada, saída e período máximo de computação determinados pelo tamanho do bloco e da sobreposição.
Nesse sentido, a proposta na parte de Análise é, de certa forma, subverter a infraestrutura de tempo real do PD e utilizar o tamanho dos blocos e da sobreposição para controlar a leitura e processamento do arquivo de entrada, mas sem o compromisso de produzir amostras para serem tocadas em tempo real. Assim, o processamento da análise é feito em tempo real, mas não se produz nenhum sinal audível. (No exemplo I07 as duas coisas são feitas ao mesmo tempo.)
Na escrita do external, o tamanho do bloco vai influenciar também o funcionamento da função perform(). Essa função, adicionada ao escalonador do PD, é chamada a cada ciclo de DSP e recebe vetores do tamanho do bloco definido. No seu caso, o vetor de entrada e saída tem 64 amostras porque esse é o tamanho do bloco padrão do PD.
Agora, a idéia da parte de Síntese é que ela possa ser feita com sucesso independentemente do tamanho do bloco definido no PD. O número de amostras correspondentes a um intervalo sonoro de mesma frequência depende do valor de α, que pode ser alterado durante a síntese. A idéia, então, é manter o controle do número de amostras geradas independente do tamanho do vetor de amostras de saída. Em cada momento que a função perform() for chamada, é necessário continuar a síntese do ponto onde ela parou na última chamada, independente da frequência de chamada da função.
Em outras palavras, os endereços de amostras apontados por out devem ser utilizados somente para saída de amostras, não para armazenamento e controle da produção do sinal. Realize os cálculos independentemente do tamanho do bloco e vá jogando os resultados para a saída a medida em estiverem prontos.
Certo?