Pues no sé cómo funciona PD, así que no sé si podréis usarlo igual; en Reaktor es bastante fácil por que dispones de los valores de la onda a cada sample, de esa forma en cada sample miras a ver si la onda ha cambiado de positiva a negativa(o viceversa), y si ha cambiado es que ha cruzado el eje, cuentas el número de samples que ha tardado en cruzarlo, formulita y obtienes la frecuencia. El algoritmo en pseudo código sería algo así:
1. Creas dos variables, por ejemplo "Positivo" y "Cambio", y dos contadores que cada vez que reciban una señal sumen uno.
2. A cada sample:
2.3. Sumas 1 al primer contador
2.2. If (valor de onda) > 0 entonces Positivo = 1 ; else Positivo = 0
2.3. If Positivo = Cambio entonces no hace nada; else suma uno al segundo contador y haces Exor Cambio (Exor es como un flipFlop, si la variable era 1 la convierte en 0, y si era 0 la convierte en 1)
Por otro lado, sabes que si divides la sample rate entre un número de samples, obtienes la frecuencia correspondiente (la sample rate es el número de samples por segundo, y la frecuencia es el número de ciclos por segundo), así que queda un tercer paso.
3. A cada sample haces la siguiente fórmula: SampleRate / número de samples transcurridos a cada cruce(samples del primer contador)
Y esa fórmula te da la frecuencia que pasas a pitch.
Faltarían un par de pasos para resetear los contadores, quizás algún detalles más y, como decía antes, no sale bien en todos los sonidos si solo tienes en cuenta un cruce, así que tienes que cambiar el número de cruces en el cual cuentas los samples para usar la fórmula. Pero bueno, en general así es cómo funciona.
Lo bueno es que es prácticamente instantaneo, sin latencia audible. Lo malo es que no tengo la más mínima idea de cómo determinar el número de cruces de forma automática
, así que hay que ir probando a mano con cada sonido
. También es verdad que si lo usas tal cual, tiende a bascular entre 1, 2 o 3 tonos alrededor del tono verdadero; yo resolví esto haciendo una media. Al final, descubriendo el número de cruces a mano y en mi caso usando ARIMA para la media, el resultado es muy bueno y estable... pero lo de los cruces es un coñazo tremendo, a veces no aciertas ni de coña
Lo de los filtros está bien pensado, pero necesitarías demasiados para llegar solo a un tono ¿No?... son 127 notas... si el fiddle este tiene una buena latencia, yo ni me lo pensaría, por que se supone que si la ventana es lo suficientemente grande, el FFT te da siempre el resultado más cercano a la onda real.
El problema del ataque es un buen problema, se me ocurren dos posibilidades: que establezcas un threshold en tonos y en milisegundos, y si el cambio de tono en esos milisegundos es mayor que ese threshold el patch no envía la nota midi; que directamente el patch no tome en cuenta los primeros milisegundos de cada nota, usando un envelope follower por ejemplo. Las dos cosas seguro que te darán más latencia, pero no se me ocurre nada más.
Para la intensidad de la nota yo directamente usé el envelope follower que viene en Reaktor "de fábrica", así que ni idea.
Saludos... y perdón por el tocho de post