Ir al contenido

publicidad
publicidad

Foto

Curso MM: 12 Música midi


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
No hay respuestas en este tema

#1

Escrito 15 agosto 2009 - 18:18

Música MIDI

Para trabajar con MIDI hay que utilizar un API multimedia especial llamado Media Control Interface (MCI). Sirve también para reproducir video y es más complejo que PlaySound(). Nos comunicamos con un dispositivo multimedia enviándole comandos.

Abrir un dispositivo MIDI

Hay que familiarizarse con ésta función:
[code:1]MCIERROR mciSendCommand(MCIDEVICEID IDDevice, UINT uiMsg, DWORD dwCommand, DWORD_PTR pdwParam);[/code]

Se usa para enviar mensajes al dispositivo MIDI. Lo primero es enviarle un mensaje para abrir un dispositivo MIDI con MCI_OPEN, que requiere una estructura de datos llamada MCI_OPEN_PARMS:

[code:1]typedef struct {
DWORD_PTR dwCallback;
MCIDEVICEID wDeviceID;
LPCSTR lpstrDeviceType;
LPCSTR lpstrElementName;
LPCSTR lpstrAlias;
} MCI_OPEN_PARMS;[/code]

wDeviceID almacena la identificación del dispositivo al abrirlo. lpstrDeviceType debe ponerse con el valor "sequencer" al abrir el dispositivo. lpstrElementName debe contener el nombre del archivo a reproducir. Ahora vemos el código para abrir el dispositivo:

[code:1]UINT uiMIDIPlayerID;
MCI_OPEN_PARMS mciOpenParms;
mciOpenParms.lpstrDeviceType = "sequencer";
mciOpenParms.lpstrElementName = "Music.mid";
if (mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD_PTR)&mciOpenParms) == 0)
// Get the ID for the MIDI player
uiMIDIPlayerID = mciOpenParms.wDeviceID;[/code]

Para poder compilarlo en Borland hay que sustituir DWORD_PTR por DWORD. Las banderas pasadas como tercer parámetro son los valores de la estructura que se van a tener en cuenta.

Ejecutando un sonido

Ahora el comando que enviamos con mciSendCommand() es MCI_PLAY. Necesitamos otra estructura llamada MCI_PLAY_PARMS. Si vamos a tocar una canción de principio a fin no hace falta inicializar la estructura.

[code:1]MCI_PLAY_PARMS mciPlayParms;
mciSendCommand(uiMIDIPlayerID, MCI_PLAY, 0, (DWORD_PTR)&mciPlayParms);[/code]

Pausando una canción MIDI

Comando MCI_PAUSE:

[code:1]mciSendCommand(uiMIDIPlayerID, MCI_PAUSE,0,NULL);[/code]

Para volver a ponerlo en marcha mandamos otro mensaje MCI_PLAY.

Cerrando un dispositivo MIDI

Mensaje MCI_CLOSE:

[code:1]mciSendCommand(uiMIDIPlayerID, MCI_CLOSE,0,NULL);[/code]

Si encontramos un error ejecutando música midi debemos cerrar:

[code:1]MCI_PLAY_PARMS mciPlayParms;
if (mciSendCommand(uiMIDIPlayerID, MCI_PLAY, 0, (DWORD_PTR)&mciPlayParms) != 0)
{
mciSendCommand(uiMIDIPlayerID, MCI_CLOSE, 0, NULL);
uiMIDIPlayerID = 0;
}[/code]

Añadiendo soporte MIDI al motor del juego

UINT m_uiMIDIPlayerID; sirve para guardar el identificador del dispositivo. Si es 0 está cerrado y hay que inicializarlo así en el constructor de GameEngine. También se añaden tres métodos: PlayMIDISong(), PauseMIDISong() y CloseMIDIPlayer(). El dispositivo se abre en PlayMIDISong() y además tiene un valor por defecto en el nombre de archivo TEXT("") así nos sirve para continuar una música que estaba en pausa. El otro parámetro bRestart indica si debemos continuar desde donde se pausó o volver a empezar.

Programa de ejemplo: Henway 2
Henway.h , Henway.cpp

En GameStart() usamos la siguiente línea.

_pGame->PlayMIDISong(TEXT("Music.mid"));

Y luego en GameEnd(): _pGame->CloseMIDIPlayer();

En GameActivate() y GameDeactivate() usamos las opciones de pausa y continuar. El resto es sólo añadir algunos sonidos a ciertos eventos.



Código fuente


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
publicidad
publicidad