Tenho algumas dúvidas sobre o Pd...
- Função de Hamming
Existe uma função de Hamming que já existe no sistema (hamming~). Dá para usar essa, ou é melhor criar essa função de novo a partir da formula?
- Frequência de maior amplitude
É fácil pegar a amplitude máxima, mas como fazer para selecionar a frequência associada à esse valor ?
- O "block"
Aparentemente o block~ não está funcionando... alguém entende por quê ?
obrigado pela ajuda !!!!!
abs
Pierre-Marie
Olás!
Sobre a função de hamming, ela não faz parte do Pd (eu por exemplo não a tenho aqui). Talvez seja de alguma biblioteca de externals. Não tenho nada contra usá-la. Há uma implementação disto também num dos exemplos que vimos em aula (I07 - phase vocoder).
Para pegar a frequência de máxima amplitude, não é difícil fazer do jeito usual, percorrendo o vetor e armazenando em algum lugar o índice que realizou o máximo. Em C seria algo como for (imax=0, i=1;i<N;i++) if (v[i]>v[imax]) imax=i; (só que com caixinhas...
O block~ funciona sempre no patch em que ele for definido, e em seus subpatches. Dê uma olhada no help. Ou então mande mais detalhes da dificuldade que você está tendo.
Sobre a função de hamming, ela não faz parte do Pd (eu por exemplo não a tenho aqui). Talvez seja de alguma biblioteca de externals. Não tenho nada contra usá-la. Há uma implementação disto também num dos exemplos que vimos em aula (I07 - phase vocoder).
Para pegar a frequência de máxima amplitude, não é difícil fazer do jeito usual, percorrendo o vetor e armazenando em algum lugar o índice que realizou o máximo. Em C seria algo como for (imax=0, i=1;i<N;i++) if (v[i]>v[imax]) imax=i; (só que com caixinhas...
O block~ funciona sempre no patch em que ele for definido, e em seus subpatches. Dê uma olhada no help. Ou então mande mais detalhes da dificuldade que você está tendo.
Obrigado!
Vou dar uma estudada...
PM
Vou dar uma estudada...
PM
Um problema que eu tive com o block foi receber o erro "'error: dac~: bad vector size" quando usava um block diferente de 64 (default). Encontrei num lista o porque, os objetos adc~ e dac~ são implementados utilizando um um bloco de tamanho 64 harcoded então a parte do código que precisa de um bloco diferente precisam estar em um subpatch diferente.
link
http://lists.puredata.info/pipermail/pd-list/2002-08/007792.html
[]'s
link
http://lists.puredata.info/pipermail/pd-list/2002-08/007792.html
[]'s
Você não pode ter block~ e adc~ ou dac~ no mesmo patch. pra resolver isso, faça no patch principal um subpatch recebendo o sinal do adc~, tipo isso:
[adc~]
|
[pd outropatch]
e nesse tal outropatch coloque um inlet~ recebendo o que vem do principal. aí, nessa tela, vc pode criar um [block 4096 1 1], em qq lugar da janela. ele não fica ligado a nada:
[inlet~]
|
[blalblabla (qq coisa que mexa no sinal que veio do adc~ da tela principal)
só pra reforçar, nessa tela vc não vai poder colocar dac~, pelo mesmo motivo de ter o block lá.
pelo menos foi isso que eu entendi.
[]s
[adc~]
|
[pd outropatch]
e nesse tal outropatch coloque um inlet~ recebendo o que vem do principal. aí, nessa tela, vc pode criar um [block 4096 1 1], em qq lugar da janela. ele não fica ligado a nada:
[inlet~]
|
[blalblabla (qq coisa que mexa no sinal que veio do adc~ da tela principal)
só pra reforçar, nessa tela vc não vai poder colocar dac~, pelo mesmo motivo de ter o block lá.
pelo menos foi isso que eu entendi.
[]s
Funcionou para mim !
Valeu !
Valeu !
Na saída dos eventos musicais é dito para fazer a comparação |(f0atual - f0anterior)/f0anterior| > 0.03.
Esse f0anterior é a freqüência da nota anterior, ou a última freqüência recebida?
Por exemplo, a última freqüência recebida foi 444Hz, e a freqüência atual é 452Hz. Devo comparar 452 com 444 ou com 440 (444Hz seria avaliado como um Lá = 440Hz)?
Fiquei com essa dúvida porque se comparo com a freqüência recebida anteriormente, e for aumentando a freqüência atual suficientemente devagar, |(f0atual - f0anterior)/f0anterior| será menor do que 0.03 e o programa vai achar que a nota nunca muda.
Não sei se ficou claro...
Obrigado!
Esse f0anterior é a freqüência da nota anterior, ou a última freqüência recebida?
Por exemplo, a última freqüência recebida foi 444Hz, e a freqüência atual é 452Hz. Devo comparar 452 com 444 ou com 440 (444Hz seria avaliado como um Lá = 440Hz)?
Fiquei com essa dúvida porque se comparo com a freqüência recebida anteriormente, e for aumentando a freqüência atual suficientemente devagar, |(f0atual - f0anterior)/f0anterior| será menor do que 0.03 e o programa vai achar que a nota nunca muda.
Não sei se ficou claro...
Obrigado!
Olá, Andrew!
Sim, sua dúvida ficou clara. Possivelmente o enunciado não esteja tão claro neste ponto. Quando você reporta um início de nota na saída de texto do Pd, você também coloca uma frequência fundamental, que é a frequência real detectada (antes do arredondamento do d), por exemplo d=0 e f=444Hz. A sugestão é que este valor f0anterior=444Hz seja comparado com as frequências fundamentais das janelas seguintes, como um critério preliminar necessário para permitir que a nota mude (só muda se |(f0atual-f0anterior)/f0anterior|>0.03).
Por exemplo, se na primeira janela você obteve d=0 com f0=444 e na janela atual você obtém d=1 com f0=453, então a condição preliminar |(453-444)/444|<=0.03 indica que você não deve reportar um novo evento. Nas janelas seguintes, se você continuar obtendo frequências entre 430.68(=444*0.97) e 457.32(=444*1.03), você não vai reportar um evento novo, pois a condição |(f0atual-444)/444|<=0.03 continuará valendo, independentemente do valor arredondado de d ficar oscilando entre 0 e 1 (qualquer valor acima de 452.89 daria a entender que a nota seria d=1). Ou seja, a memorização do f0anterior do momento em que você reporta o início de nota efetivamente "recalcula" os limites inferior e superior de tolerância para aquela nota, como [f0anterior*0.97...f0anterior*1.03]. Isso permitirá que uma pessoa entoe uma nota qualquer, mesmo fora da escala cromática (valores de d inteiros), e sua nota seja reportada uma única vez, desde que o som não se afaste demais de sua frequência inicial.
Espero ter ajudado!
Sim, sua dúvida ficou clara. Possivelmente o enunciado não esteja tão claro neste ponto. Quando você reporta um início de nota na saída de texto do Pd, você também coloca uma frequência fundamental, que é a frequência real detectada (antes do arredondamento do d), por exemplo d=0 e f=444Hz. A sugestão é que este valor f0anterior=444Hz seja comparado com as frequências fundamentais das janelas seguintes, como um critério preliminar necessário para permitir que a nota mude (só muda se |(f0atual-f0anterior)/f0anterior|>0.03).
Por exemplo, se na primeira janela você obteve d=0 com f0=444 e na janela atual você obtém d=1 com f0=453, então a condição preliminar |(453-444)/444|<=0.03 indica que você não deve reportar um novo evento. Nas janelas seguintes, se você continuar obtendo frequências entre 430.68(=444*0.97) e 457.32(=444*1.03), você não vai reportar um evento novo, pois a condição |(f0atual-444)/444|<=0.03 continuará valendo, independentemente do valor arredondado de d ficar oscilando entre 0 e 1 (qualquer valor acima de 452.89 daria a entender que a nota seria d=1). Ou seja, a memorização do f0anterior do momento em que você reporta o início de nota efetivamente "recalcula" os limites inferior e superior de tolerância para aquela nota, como [f0anterior*0.97...f0anterior*1.03]. Isso permitirá que uma pessoa entoe uma nota qualquer, mesmo fora da escala cromática (valores de d inteiros), e sua nota seja reportada uma única vez, desde que o som não se afaste demais de sua frequência inicial.
Espero ter ajudado!
Olá professor!
Obrigado! Dúvida esclarecida!
Obrigado! Dúvida esclarecida!
Mais uma dúvida! hehe
Na saída da forma de onda, caso consideremos o sinal como um evento musical, devemos mostrar 3 períodos completos da forma da onda da freqüência fundamental, ou do sinal original, ou nenhum dos dois?
Obrigado!
Na saída da forma de onda, caso consideremos o sinal como um evento musical, devemos mostrar 3 períodos completos da forma da onda da freqüência fundamental, ou do sinal original, ou nenhum dos dois?
Obrigado!
Não sei o que você está chamando de forma de onda da frequência fundamental, mas é claro que a saída não deve ser 3 períodos de uma senóide pura. O usuário deve ver 3 períodos completos do sinal que ele está produzindo, ou seja do sinal original. Saber qual é o trecho da janela da entrada que corresponde a esta visualização passa por duas etapas: estimar a frequência fundamental (para saber quantos pontos da entrada correspondem a 3 períodos) e estimar a fase do harmônico que corresponde à fundamental (para estabilizar a forma de onda).
Observe que o tabread4~ permite a leitura com índices fracionários, então é fácil definir o tamanho da janela de saída da forma de onda com N pontos (N fixo, por exemplo 1000) e ler da janela de entrada N pontos linearmente espaçados entre k0 (fracionário) e k0+3*R/f_0.
Observe que o tabread4~ permite a leitura com índices fracionários, então é fácil definir o tamanho da janela de saída da forma de onda com N pontos (N fixo, por exemplo 1000) e ler da janela de entrada N pontos linearmente espaçados entre k0 (fracionário) e k0+3*R/f_0.
Ok. Obrigado!
Impressão minha ou ainda não tem onde entregar o ep aqui no paca?
[]'s
[]'s
Não era impressão, acabei de acrescentar.