Bueno,
Quería hacer un pequeño piano virtual en C++. Pero el problema, es que use la librería windows.h, que primero lo hace dependiente de Windows , que no me agrada, y segundo, uso la función Beep() que no está hecha para hacer música y es lenta y hace un ruido extraño al terminar el sonido, otra cosa es que no funciona en todos los ordenadores ya que es sonido interno, entonces:
Me gustaría que alguien me dijese una librería en la que pueda reproducir un sonido por ejemplo así: PlaySound("Do",2) En la que tocamos la nota Do por 2 segundos, o que simplemente use una frequencia.
Por cierto uso SDL para los eventos.
( Para correrlo necesitan SDL.dll )
#include <iostream>
#include <windows.h>
#include "SDL.h"
using namespace std;
int main(int argc,char* args[])
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface* screen;
screen = SDL_SetVideoMode(600,400,32,SDL_SWSURFACE);
SDL_WM_SetCaption("Alvii Board - Made by Sam",NULL);
bool running = true;
SDL_Event event;
int time = 0;
int key = 0;
while(running)
{
if(SDL_PollEvent(&event))
{
if(event.type==SDL_QUIT)
{
running = false;
}
if(event.type==SDL_KEYDOWN)
{
key = 1;
time = 300;
if(event.key.keysym.sym==SDLK_a)
{
Beep(262,time);
}
if(event.key.keysym.sym==SDLK_s)
{
Beep(294,time);
}
if(event.key.keysym.sym==SDLK_d)
{
Beep(330,time);
}
if(event.key.keysym.sym==SDLK_f)
{
Beep(349,time);
}
if(event.key.keysym.sym==SDLK_g)
{
Beep(392,time);
}
if(event.key.keysym.sym==SDLK_h)
{
Beep(440,time);
}
if(event.key.keysym.sym==SDLK_j)
{
Beep(494,time);
}
if(event.key.keysym.sym==SDLK_k)
{
Beep(523,time);
}
if(event.key.keysym.sym==SDLK_w)
{
Beep(277,time);
}
if(event.key.keysym.sym==SDLK_e)
{
Beep(311,time);
}
if(event.key.keysym.sym==SDLK_t)
{
Beep(370,time);
}
if(event.key.keysym.sym==SDLK_y)
{
Beep(415,time);
}
if(event.key.keysym.sym==SDLK_u)
{
Beep(466,time);
}
}
if(event.type==SDL_KEYUP)
{
key = 0;
time = 0;
}
}
SDL_Flip(screen);
}
return 0;
}
para los sonidos mu simple del piano tenes la midiOutShortMsg de Winmm :D
obviamente si es para windows tenes que agregar la windows.h, o que lo quiere hacer multiplataforma? :|
Lo mejor seria usar sample de piano en formato .wav, y asociarlas a cada teclas para reproducir su respectiva notas. cada instrumento virtual lleva consigo su propia libreria de sonidos (samples), creo que ese deberia ser tu caso.
Los samples puedes conseguirlos gogleando..
Mejor aún: qué tal reemplazar ese windows.h por SDL_mixer, que es portable y mantiene el estilo de programación "uniforme" con las otras funciones de SDL? http://www.libsdl.org/projects/SDL_mixer/
Pensalo :D
Saludos.
Buenos días,
Yo también tengo el interés de que mis programas sean portables. No se, si los sonidos se hacen con esta librería, pero los gráficos sí, es para C++. Es multiplataforma en los sistemas operativos Unix con GTK+, windows, MAC OS X, windows phone, etc.
La librería es wxWidgets, http://www.wxwidgets.org/ . Por ahí había un libro pdf de esto, ahora mismo no recuerdo donde está, pero si os interesa lo busco y lo posteo.
Es muy probable que para reproducir sonidos.
Un saludo, espero que haya sido de ayuda.