Piano Virtual - Ayuda

Iniciado por prometheus48, 12 Junio 2012, 19:38 PM

0 Miembros y 1 Visitante están viendo este tema.

prometheus48

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;
}

"Si tú tienes una manzana, y yo otra, y las intercambiamos, tu sigues teniendo una manzana, y yo sigo teniendo una manzana.
Pero, si tu tienes una idea, y yo otra, y nos las intercambiamos, tu tienes dos ideas, y yo tengo dos ideas"
The knowledge is free

x64core

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? :|

d(-_-)b

#2
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..
Max 400; caracteres restantes: 366

Foxy Rider

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.

vikour92

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.