La libreria
Allegro fornisce risorse per la programmazione di giochi. Essendo una libreria multimediale, è possibile utilizzare alcune sue funzioni per eseguire file audio di formato
Wav e file musicali
Midi.
Sono riuscito in linguaggio C ad ottenere l'esecuzione dei due tipi di file. Purtroppo, invece, nel mio intento di riportare e richiamare in Gambas le funzioni esterne del API della libreria di
Allegro non sono riuscito ad ottenere l'emissione di suoni, neppure richiamando da Gambas l'intero codice C da una libreria esterna appositamente realizzata. ...non ne comprendo il perché.
L'unico risultato positivo con Gambas è stato quello di far eseguire il codice in C compilato mediante la solita funzione
Shell... ma è una magra consolazione.
Riporto, comunque, di seguito dunque i codici in linguaggio C per l'esecuzione dei due tipi di file. Per entrambi gli esempi bisognerà aver installato nel proprio sistema la versione:
allegro4Va precisato, inoltre, che bisognerà installare
anche la libreria "
liballegro4.4-plugin-alsa " !
Eseguire un file Wav
#include <allegro.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
SAMPLE *audio;
int pos, vox;
// Inizializza la libreria 'allegro':
if (install_allegro(SYSTEM_AUTODETECT, NULL, NULL)!= 0) {
allegro_exit();
printf("Errore: impossibile inizializzare la libreria ''allegro' !");
exit(-1);
}
// Installa il modulo sonoro:
if (install_sound(DIGI_AUTODETECT, MIDI_NONE, NULL)!= 0) {
allegro_exit();
printf("Errore: impossibile installare il modulo sonoro !");
exit(-1);
}
// Carica il file wav:
audio = load_wav(argv[1]);
if (!audio) {
allegro_exit();
printf("Errore: impossibile caricare il file !");
exit(-1);
}
// Estrae alcune informazioni generali del file wav:
printf("Risoluzione del campionamento: %dbit\n", audio->bits);
printf("Canali audio di uscita: %d\n", audio->stereo*-1+1);
printf("Frequenza del campionamento: Hz %d\n", audio->freq);
printf("Durata del brano: %.2f secondi\n", (float)audio->len / audio->freq);
// Esegue il file wav:
vox = play_sample(audio, 255, 128, 1000, 0);
do {
pos = voice_get_position(vox);
printf("Secondi trascorsi: %.2f\r", (float)pos / audio->freq);
} while (pos!=-1);
// Va in chiusura:
destroy_sample(audio);
remove_sound();
return 0;
}
questo codice va compilato con la seguente riga di comando:
gcc -o /percorso/programma /percorso/programma.c `allegro-config --libs`Eseguire un file MidiPer l'esecuzione dei file Midi la procedura è più complessa, poiché è necessario preparare un apposito file banco di suoni, chiamato
patches.dat, che consenta la riproduzione sonora dei dati Midi. Tale file banco viene utilizzato da un driver musicale
wavetable autonomo proprio di
Allegro, chiamato
DigiMid.
E' possibile creare tale file banco di suoni da un pre-esistente file
.sf2 lanciando da terminale il comando
pat2dat, come segue:
pat2dat -o patches.dat /percorso/del/soundfont_bank.sf2 -8Tale file
patches.dat va inserito
preferibilmente nella Home.
Ottenuto comunque il file
soundfont, per eseguire un file Midi compileremo e lanceremo il seguente codice C:
#include <allegro.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
MIDI *mid;
int dur;
// Inizializza la libreria 'allegro':
if (install_allegro(SYSTEM_AUTODETECT, NULL, NULL)!= 0) {
allegro_exit();
printf("Errore: impossibile inizializzare la libreria ''allegro' !");
exit(-1);
}
// Installa il temporizzatore interno della libreria 'allegro':
install_timer();
// Installa il modulo sonoro:
if (install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL)!= 0) {
allegro_exit();
printf("Errore: impossibile installare il modulo sonoro Midi !");
exit(-1);
}
// Carica il file Midi da eseguire:
mid = load_midi(argv[1]);
if (!mid) {
allegro_exit();
printf("Errore: impossibile caricare il file !");
exit(-1);
}
// Estrae la durata del file Midi:
dur = get_midi_length(mid);
printf("Durata del file Midi: %d secondi\n", dur);
// Esegue il file Midi:
if (play_midi(mid, 0)!= 0) {
allegro_exit();
printf("Errore: impossibile eseguire il file Midi !");
exit(-1);
}
do
printf("Secondi trascorsi: %ld\r", midi_time);
while (midi_time != dur);
// Va in chiusura:
destroy_midi(mid);
return 0;
}
questo codice va compilato con la seguente riga di comando:
gcc -o /percorso/programma /percorso/programma.c `allegro-config --libs`Riferimenti:
Allegro.ccManuale di AllegroL'esecuzione di un file Midi potrà essere effettuata solo utilizzando la libreria
allegro4 .