MIDI *load_midi(char *filename);
Carga un fichero MIDI (maneja ambos formatos 0 y 1), devolviendo un
puntero a la estructura MIDI, o NULL si hubo problemas.
void destroy_midi(MIDI *midi);
Destruye una estructura MIDI cuando ya no la necesite. Es seguro llamar
esto incluso cuando el fichero MIDI está siendo reproducido, porque lo
comprueba y para en caso de que esté activo.
int play_midi(MIDI *midi, int loop);
Reproduce el fichero MIDI especificado, deteniendo cualquier música
anterior. Si el biestable loop está activado, los datos serán repetidos
hasta que los sustituya con otra cosa, de otro modo se parará la música
al final del fichero. Pasando un puntero NULL parará cualquier música que
esté siendo reproducida. Devuelve no-cero si hubo problemas (esto puede
ocurrir si un controlador wavetable cacheable no consigue cargar los
samples requeridos, o al menos ocurrirá en el futuro cuando alguien
escriba algunos controladores wavetable cacheables :-)
int play_looped_midi(MIDI *midi, int loop_start, int loop_end);
Reproduce un fichero MIDI con una posición de loop definida por el
usuario. Cuando el reproductor llega al final del loop o al final del
fichero (loop_end puede ser -1 para repetir en EOF), volverá al principio
del comienzo del loop. Ambas posiciones son especificadas en el mismo
formato de golpes de ritmo que la variable midi_pos.
void stop_midi();
Para la música que esté siendo reproducida. Esto es lo mismo que llamar
play_midi(NULL, FALSE).
void midi_pause();
Pone el reproductor MIDI en pausa.
void midi_resume();
Continua la reproducción de un MIDI pausado.
int midi_seek(int target);
Avanza hasta la posición especificada (midi_pos) en el fichero MIDI
usado. Si el objetivo está antes en el fichero que el midi_pos actual,
avanza desde el principio; de otro modo busca desde la posición actual.
Devuelve cero si no lo ha conseguido, no-cero si llega al final del
fichero (1 significa que paró la reproducción, 2 significa que volvió a
reproducir desde el principio).
void midi_out(unsigned char *data, int length);
Introduce un bloque de comandos MIDI en el reproductor en tiempo real,
permitiéndole activar notas, tocar campanas, etc, sobre el fichero MIDI
que esté siendo reproducido.
int load_midi_patches();
Fuerza al controlador MIDI a cargar un conjunto de patches completo para
ser usados. Normalmente no deberá llamar esto, porque Allegro
automáticamente carga todos los datos requeridos por el fichero MIDI
seleccionado, pero debe llamar esto antes de mandar mensajes de cambio de
programa vía comando midi_out(). Devuelve no-cero si ocurrió un fallo.
extern volatile long midi_pos;
Contiene la posición actual (número de beat) del fichero MIDI, o un
número negativo si no se está reproduciendo ninguna música. Util para
sincronizar animaciones con la música, y para chequear si un fichero MIDI
se ha acabado de reproducir.
extern long midi_loop_start;
extern long midi_loop_end;
Los puntos de comienzo y final del loop, ajustados por la función
play_looped_midi(). Estos pueden ser alterados mientras suena la música,
pero debería estar seguro de ponerlos a valores sensatos (comienzo <
final). Si está cambiando ambos al mismo tiempo, asegúrese de alterarlos
en el mismo orden en caso de que una interrupción midi ocurra entre sus
dos cambios. Si los valores están a -1, representan el comienzo y final
del fichero respectivamente.
extern void (*midi_msg_callback)(int msg, int byte1, int byte2);
extern void (*midi_meta_callback)(int type, unsigned char *data, int length);
extern void (*midi_sysex_callback)(unsigned char *data, int length);
Funciones de enganche que permiten interceptar eventos MIDI del
reproductor. Si se activan a cualquier cosa menos NULL, estas rutinas
serán llamadas por cada mensaje MIDI, meta-evento, y bloque de datos
exclusivo del sistema respectivamente. Estas funciones serán ejecutadas
en un contexto de control de interrupción, por lo que todo el código y
datos que usen debería estar fijado (locked), y no deben llamar funciones
del sistema operativo. En general, simplemente use estas rutinas para
activar algunos biestables y para responder a ellos más tarde en su
código principal.
int load_ibk(char *filename, int drums);
Lee una definición de un fichero de patch .IBK usado por el controlador
Adlib. Si los tambores están activados, lo cargará como un patch de
percusión, de otro modo reemplazará el conjunto de instrumentos MIDI
General. Puede llamar esto antes o después de iniciar el código de
sonido, o simplemente puede activar las variables ibk_file e
ibk_drum_file en el fichero de configuración para cargar los datos
automáticamente. ¡Fíjese que esta función no tiene ningún efecto en otros
controladores que no sean Adlib!