Hola, gentes de la scene.
Antes de nada, gracias a los que hacen posible esto de la scene. Los catetos como yo que tenemos cuatro nociones de programación nos aprovechamos cual sanguijuelas de vuestros conocimientos (léase, de vuestras librerías), que lo sepáis.
Pues si, el "amigo que lo está haciendo" soy yo. ¡En buena hora me dejé convencer! Nomentero tiene una gran capacidad de persuasión. En fin, como siempre, lo que empieza pareciendo algo sencillo termina por desbordarte. Más o menos así me encuentro.
Weno, menos rollo y al grano.
El proyecto en cuestión es un theremin. Ya sabéis, ese cacharro electrónico con dos antenas que la gente toca moviendo las manos alrededor, y que suena como por arte de magia a película de ciencia ficción de los 50. Bueno, pues esto pretende ser algo parecido, pero para la DS.
La idea básica ya la comentaba nomentero: es un oscilador (en principio, senoidal) al que cambiamos la frecuencia al tocar la pantalla táctil en sentido horizontal.
Como soy nuevo en eso de la scene y mis dotes programantes están un poco olvidadas, he empezado a hacerlo con las PALibs.
El tema de capturar la posición del Stylus en la pantalla táctil es facil, ya hay una función que lo hace. Otra historia ha sido convertir esto a frecuencia, pero vamos, esto está controlado.
La idea inicial era sintetizar el sonido desde su origen. Esto implica tener los datos de la señal del oscilador en una variable y pasársela al sistema de sonido de la DS. Por desgracia, no hay ninguna función que haga eso (o por lo menos yo no la he encontrado) ni con las PALib, ni con las eSound, ni con las libnds. Todo lo que hay son funciones para reproducir ficheros (raw o mod), y en principio esto es algo que quería evitar (ahora veréis por qué).
De todas formas, de momento no me ha quedado más remedio, así que me he creado una señal senoidal con un editor de audio y la he pasado a raw. Lo he incorporado al programa con la función PA_PlaySound de las PAlibs, y he loopeado el fichero. Realmente no cambio la frecuencia fundamental del sonido contenido en el fichero, sino la frecuencia de reproducción del mismo, que es la calculada antes a partir de la posición del Stylus. Es una triquiñuela un poco cutre, vale, pero de momento funciona.
Problema: al llamar a un fichero, abrirlo, leerlo y cerrarlo, se tarda un tiempo. Esto se traduce en que el sonido se entrecorte cuando el loop vuelve a iniciarse, dejando un corte de unos 80 ms.
Ver Dibujo1
http://img110.imageshack.us/img110/9870/dibujo1pv4.jpg
Dibujo2
http://img81.imageshack.us/img81/1791/dibujo2pa1.jpg
(Como podéis ver, la señal senoidal sale deformada. Supongo que se debe a que la frecuencia de muestreo de la DS tampoco es que sea la caña. Tengo alguna idea para solucionarlo, aunque por otro lado así la señal es más rica en armónicos, y si se filtra, el efecto puede molar... ya se verá). Ver Dibujo3.
http://img59.imageshack.us/img59/15/dibujo3lk9.jpg
Una posible solución para esto sería modificar la propia función PA_PlaySound: al fin y al cabo, la función abre un fichero, pasa el contenido a una variable, pasa estos datos al sistema de sonido, y luego cierra el fichero. La idea sería acceder directamente a esa variable, saltándonos el resto de los pasos. Para eso, necesito el código fuente de esa función, y sorpresa, no lo encuentro.
Otro problema: el valor de la frecuencia del sonido que se reproduce no es la que debería ser. Es inferior. El porqué no lo tengo muy claro. Tiene que ver con la frecuencia de reproducción, la frecuencia del sample y la longitud del sample que hay que pasarle a la función PA_PlaySound. Cuando sepa cómo se relacionan estas tres variables me sentiré más realizado y feliz. Hasta entonces, la frustración me corroe. Intentaré corregirlo ajustando la frecuencia de reproducción (aunque el hecho de que el ajuste sea lineal, es algo que está por ver)
Weno, hasta aquí la sección de problemas. Ahora viene la sección de futuras ideas si estos problemas se solucionan (jojo):
- Menú para elegir la forma de onda del oscilador.
- Indicador de la nota que estás tocando.
- Efectos: filtro (necesito un algoritmo de FFT??), reverb, delay.
- Interfaz gráfica decente, por diox.
En fin, de momento así están las cosas. Si os cuento todo este rollo es porque, además de compartir la idea, ni que decir tiene que cualquier sugerencia para ir solucionando los problemas que os he comentado será más que bienvenida
Por si acaso, aquí os dejo dos preguntas que me vendría muy bien saber:
- Dónde encuentro el código fuente de PA_PalySound?
- Cuál es la frecuencia de muestreo de los DAC de la NDS?
Chaoooo
^_^V