Pitch, cambio de tono

aliso_prog
#1 por aliso_prog el 22/06/2019
Hola a todos, estoy intentando crear un pedal para guitarra eléctrica que baje una octava el tono original. Creo que esto se conoce como cambio de pitch.

La programación será en una FPGA, pero eso es lo de menos. Lo que me interesa realmente es saber como funciona un algoritmo de este tipo, que baje el tono. De momento todo lo que se me ocurre implica cambiar la duración de cada nota y eso no me vale jajaj
Si alguno conoce alguna solución o se le ocurre alguna idea para poder investigarla, lo agradecería mucho!

Edito para añadir un detalle:

El pedal está pensado para que reproduzca en loop ( esta parte ya le he programado y probado yo misma) pero querría añadir la opción de que el lo que se grabe en el loop se reproduzca una octava más bajo.
Apunto esto para indicar que el algoritmo no tiene por que funcionar en tiempo real necesariamente :)
Subir
vagar
#2 por vagar el 22/06/2019
Busca "pitch shifting algorithms" o algo similar, te salen cosas como esto:

http://www.guitarpitchshifter.com/algorithm.html

Hay varias librerías que realizan el trabajo, algunas de ellas de código abierto como Rubberband:

https://breakfastquay.com/rubberband/

Pero necesitarías un microprocesador para ejecutarlas, una Raspberry Pi, por ejemplo.
Subir
1
medrano
#3 por medrano el 28/07/2019
Hola

hay varios métodos. Puedes echar un vistazo a esta página, es muy interesante:

http://blogs.zynaptiq.com/bernsee/pitch-shifting-using-the-ft/

en ella habla de usar STFT (Short Fourier Transform) para aplicar un cambio de tono en tiempo real y manteniendo la duración (que entiendo es lo que pretendes).
No he probado a implementarlo, pero parece que se trata de usar el STFT para detectar el tono de pequeñas partes de sonido (chunks) y entonces subir o bajar su tono multiplicando o dividiendo su frecuencia obtenida a la vez que mantienes su duración.
Por ejemplo, si con el STFT detectas que la frecuencia principal de un chunk es 1000hz y la duración de cada chunk es de 256 samples, entonces te las apañas para hacer que su frecuencia sea de 500hz ocupando esos mismos 256 frames…básicamente, es un resumen de lo que yo entiendo que pretende mostrar.

Otro caso sería que te diese igual la duración del resultado final, entonces, en ese caso, lo que yo hago es aplicar un downsampling (o upsampling) mediante interpolación lineal (es la que yo uso y consume muy, muy pocos recursos.

En el enlace que te he pasado hay código de ejemplo que puedes decargar. Yo no le he dedicado tiempo aún a probar, así que no te puedo ayudar, pero si consigues algo avisa :)

Suerte!
Subir
Hilos similares
Respuesta rápida

Regístrate o para poder postear en este hilo