Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Que me recomiendan para programar un "piano"

Estas en el tema de Que me recomiendan para programar un "piano" en el foro de C/C++ en Foros del Web. Supongamos que quiero hacer un teclado de 10 notas, para ello deberia tener 10 archivos de sonido: nota1.wav nota2.wav ... nota10.wav si se presiona una ...
  #1 (permalink)  
Antiguo 21/04/2011, 14:50
 
Fecha de Ingreso: septiembre-2010
Mensajes: 137
Antigüedad: 13 años, 7 meses
Puntos: 0
Que me recomiendan para programar un "piano"

Supongamos que quiero hacer un teclado de 10 notas, para ello deberia tener 10 archivos de sonido:
nota1.wav
nota2.wav
...
nota10.wav

si se presiona una tecla deberia sonar una nota:
tecla "1" --- nota1.wav
tecla "2" --- nota2.wav
...
tecla "0" --- nota 10.wav

Esto es fasil de programar, yo lo hice con la libreria allegro de C++. Pero no anda bien cuando empiezo a tocar notas rapido. Por ejemplo si toco una misma nota varias veses a una velocidad rapida (por ejmplo 6 veces por seg) empieza a saltearce notas (como si no le diera la capasidad para hacer sonar todas las notas), probe achicando el tamaño de los archivos wav pero no se soluciono el problema.

Supongo que C++ al ser un lenguaje de bajo nivel es bueno para programar este tipo de cosas, sin embargo no se si allegro sea una buena opcion.

¿allegro es una libreria eficiente o buena para programar lo que quiero?, sino que libreria puedo usar?
¿saben el porque de mi problema o la solucion?
  #2 (permalink)  
Antiguo 21/04/2011, 17:31
 
Fecha de Ingreso: julio-2010
Mensajes: 153
Antigüedad: 13 años, 9 meses
Puntos: 1
Respuesta: Que me recomiendan para programar un "piano"

mejor usa midi o tu mismo genera la onda dentro del programa
  #3 (permalink)  
Antiguo 21/04/2011, 17:57
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Que me recomiendan para programar un "piano"

Hola,

Cita:
Iniciado por Alfonso1 Ver Mensaje
... Por ejemplo si toco una misma nota varias veses a una velocidad rapida (por ejmplo 6 veces por seg) empieza a saltearce notas (como si no le diera la capasidad para hacer sonar todas las notas), ...
Normalmente eso viene de la polifonía, la capacidad de un instrumento de ejecutar varias notas al mismo tiempo. Y las librerías de sonido tienen mixers para poder escuchar dos o mas notas al mismo tiempo, sino se encolan una tras otra y no le da tiempo para reproducirlas todas.

Seguramente no estas usando las capacidades del mixer de la librería que estas usando, intenta crear un programa mas complejo que haga uso de las funciones de mezcla (mixer).

Como indica iwkillyou, si usas MIDI o creas la forma de onda dentro del programa no va a suceder esto, porque la mezcla la hace la tarjeta de sonido con el chip de hardware MIDI o el driver MIDI de software que tengas instalado. Pero crear la forma de onda tu mismo y mezlcarla no es tarea fácil en el segundo caso y para eso sirve la librería de sonido que estas usando.

Saludos,
  #4 (permalink)  
Antiguo 21/04/2011, 18:41
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: Que me recomiendan para programar un "piano"

No es mala idea.

Pero tengo otra que es lo que use en mi emulador.

Tengo la info del sonido en un arreglo.
Y no uso las funciones de allegro directamente para reproducirle.

Allegro tiene los streams donde segun recuerdo tu le vas pasando informacion al stream para que la reproduzca, pero para esto debes llamar una funcion para saber si el stream esta listo para recibir informacion.

No es tan complicado cuando llegas a entender como funciona.

Bueno, el punto es que si tienes muchos sonidos( en un arreglo ) a veces basta con hacer una suma de ellos para asi mezclarlos( no es la mejor opcion)

Un algoritmo que alguien me paso alguna vez y que me funciono a la perfeccion para los 4 canales de audio de mi emualdor es el siguiente:

Código:
sample1-=128;

sample2-=128;

sample3-=128;

sample4-=128;



finalSample=(sample1+sample2+sample3+sample4)>>4;



buffer[i]=(finalSample+128)&0xFF;
Los 4 samples son variables que obtienen solo un byte de informacion para ir llenando el buffer.
Obviamente todo esto esta bajo un loop que es el que hace el llenado completo del buffer generando los muestreos en cada vuelta y leugo escribiendolos en el buffer que al final sera enviado al stream para su reproduccion.

Espero que te sirva de algo, si tienes mas dudas pregunta.

Saludos
  #5 (permalink)  
Antiguo 21/04/2011, 18:51
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Que me recomiendan para programar un "piano"

Hola,

Bueno, yo personalmente no he tenido la oportunidad de usar Allegro, pero hay algo que definitivamente no es tan sencillo, normalmente, las librerías ofrecen un soporte mas complejo que simplemente unir 'samples', por ejemplo, ¿que sucede si una forma de onda está a 48.0 Mhz y la otra a 44.1 Mhz? ¿Que sucede con una de 32 bits y otra de 16? Downsampling, upsampling, convert with or without pitch, etc.

Además, al sumar samples casi siempre le estas subiendo el volumen a la mezcla final en un porcentaje muy alto y habría que normalizar el volumen después.

Supuestamente eso lo debe hacer la librería de sonido, ¿sino para que usar una librería de sonido? Sino sería unicamente por compatibilidad. Si Allegro no tiene la capacidad de mezclarlos, entonces definitivamente no es la mejor opción en librerías de sonido, pero de esto, no estoy seguro.

Cita:
Iniciado por Instru Ver Mensaje
No es tan complicado cuando llegas a entender como funciona.
En eso tienes toda la razón, estuve leyendo un poco los ejemplos y la API de Allegro en estos momentos y parece que tiene múltiples voces por defecto. Posiblemente nuestro amigo Alfonso1 está haciendo algo 'extraño' o posiblemente no.

Saludos,

Última edición por HackmanC; 21/04/2011 a las 19:00 Razón: mezcla
  #6 (permalink)  
Antiguo 21/04/2011, 19:03
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: Que me recomiendan para programar un "piano"

Cita:
Iniciado por HackmanC Ver Mensaje
Hola,

Bueno, yo personalmente no he tenido la oportunidad de usar Allegro, pero hay algo que definitivamente no es tan sencillo, normalmente, las librerías ofrecen un soporte mas complejo que simplemente unir 'samples', por ejemplo, ¿que sucede si una forma de onda está a 48.0 Mhz y la otra a 44.1 Mhz? ¿Que sucede con una de 32 bits y otra de 16? Downsampling, upsampling, convert with or without pitch, etc.

Además, al sumar samples casi siempre le estas subiendo el volumen a la mezcla final en un porcentaje muy alto y habría que normalizar el volumen después.

Supuestamente eso lo debe hacer la librería de sonido, ¿sino para que usar una librería de sonido? Sino sería unicamente por compatibilidad.



En eso tienes toda la razón, estuve leyendo un poco los ejemplos y la API de Allegro en estos momentos y parece que tiene múltiples voces por defecto. Posiblemente nuestro amigo Alfonso1 está haciendo algo 'extraño' o posiblemente no.

Saludos,
De acuerdo con lo qeu dices.

Solo que si esta mezclando el mismo archivo supongo que es el mismo sonido con la misma frecuencia y el ancho de bits identico.

Ahora, el algoritmo no solo suma los muestreos, de cierta manera tambien los normaliza.

Y esto lo use porque yo usaba SDL y la funcion para mezclar en SDL realmente lo que hacia era una simple suma sin normalizar lo cual pues realmente no es mezclar.
Es verdad, allegro tiene mucho mas soporte para sonido. Pero pues si queremos algo especializado en sonido podriamos usar directamente DirectSound bajo Windows o portaudio, fmod, etc.

Pero pues depende de las necesidades.

Saludos
  #7 (permalink)  
Antiguo 21/04/2011, 19:23
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Que me recomiendan para programar un "piano"

Hola,

Cita:
Iniciado por Instru Ver Mensaje
... Solo que si esta mezclando el mismo archivo supongo que es el mismo sonido con la misma frecuencia y el ancho de bits identico. ...
Yo entendí que eran archivos diferentes, aunque en este caso particular seguramente todos tienen las mismas características y no es un detalle importante.

Cita:
Iniciado por Instru Ver Mensaje
... Ahora, el algoritmo no solo suma los muestreos, de cierta manera tambien los normaliza. ...
No interpreté el -128 correctamente, exactamente, al restarle 128 a una muestra de 256 la estas quitando una parte y por lo tanto le baja el volúmen antes de sumar.

Perdón ... es que no me explicas claramente (es broma).

Cita:
Iniciado por Instru Ver Mensaje
Y esto lo use porque yo usaba SDL y la funcion para mezclar en SDL realmente lo que hacia era una simple suma sin normalizar lo cual pues realmente no es mezclar.
Es verdad, allegro tiene mucho mas soporte para sonido. Pero pues si queremos algo especializado en sonido podriamos usar directamente DirectSound bajo Windows o portaudio, fmod, etc. ...
Tienes razón, solamente a veces me gusta ahondar en los temas para que todos tengamos una visión mas amplia de las cosas, pero como dices, depende de las necesidades de cada proyecto.

Saludos,
  #8 (permalink)  
Antiguo 22/04/2011, 12:27
 
Fecha de Ingreso: septiembre-2010
Mensajes: 137
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Que me recomiendan para programar un "piano"

Gracias por las respuestas

los sonidos son de la misma frecuencia de muestreo y la misma cantidad de bits por muestreo

Pruebo lo que me dijeron y luego comento
  #9 (permalink)  
Antiguo 22/04/2011, 13:43
 
Fecha de Ingreso: septiembre-2010
Mensajes: 137
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Que me recomiendan para programar un "piano"

Intente lo siguiente, pero cuando lo ejecuto no pasa nada:

Código C++:
Ver original
  1. #include <allegro.h>
  2.  
  3. int main()
  4. {  
  5.     allegro_init();
  6.     install_keyboard();
  7.     install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL);
  8.     //Creo el flujo de audio "stream"
  9.     AUDIOSTREAM *stream = play_audio_stream(1024, 8, FALSE, 22050, 255, 128);
  10.     //Luego creo el sample "archivo" cargando un wav
  11.     SAMPLE *archivo=load_wav("wav.wav");
  12.     while(!key[KEY_ESC]){
  13.         void *mem_chunk;
  14.         mem_chunk = get_audio_stream_buffer(stream);
  15.         //Cuando no halla nada en el buffer del flujo de audio "stream"
  16.         if (mem_chunk != NULL){
  17.             //Se coloca en el buffer el sample "archivo"
  18.             mem_chunk=&archivo;
  19.             //Se indica que el buffer ya ha sido cargado
  20.             free_audio_stream_buffer(stream);
  21.         }
  22.     }
  23. }
  24. END_OF_MAIN();

En el codigo deje comentarios que esplican lo que yo pretendia hacer con este codigo.

Pero como ya les dije, no pasa nada cuando ejecuto este codigo, ¿alguien sabe que estoy hacendo mal?

Etiquetas: piano
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:00.