Autore Topic: [C] Eseguire file Wav e Midi con le risorse della libreria di "Allegro"  (Letto 2425 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.721
  • Ne mors quidem nos iunget
    • Mostra profilo
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: allegro4

Va precisato, inoltre, che bisognerà installare anche la libreria " liballegro4.4-plugin-alsa " !


Eseguire un file Wav
Codice: c [Seleziona]

#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 Midi
Per 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 -8
Tale 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:
Codice: c [Seleziona]
#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.cc
Manuale di Allegro

L'esecuzione di un file Midi potrà essere effettuata solo utilizzando la libreria allegro4 .
« Ultima modifica: 20 Settembre 2015, 18:51:09 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.721
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Eseguire file audio con le risorse della libreria di "Allegro"
« Risposta #1 il: 06 Febbraio 2015, 11:00:07 »
Mostriamo, invece, un semplice esempio per eseguire un file audio mediante la libreria "Allegro 5":

Codice: c [Seleziona]
#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>
 

int main(int argc, char *argv[]){

   ALLEGRO_SAMPLE *sample = NULL;
   unsigned int pos, frequenza;


   if(!al_init()){
      fprintf(stderr, "Impossibile inizializzare la libreria Allegro 5 !\n");
      return -1;
   }
 
   if(!al_install_audio()){
      fprintf(stderr, "Impossibile inizializzare l'audio!\n");
      return -1;
   }
 
   if(!al_init_acodec_addon()){
      fprintf(stderr, "Impossibile inizializzare le codifiche audio !\n");
      return -1;
   }
 
   if (!al_reserve_samples(1)){
      fprintf(stderr, "Impossibile riservare un numero di campioni audio!\n");
      return -1;
   }
 
   sample = al_load_sample(argv[1]);
 
   if (!sample){
      printf( "File audio non caricato !\n" );
      return -1;
   }

   frequenza = al_get_sample_frequency(sample);
   printf("Frequenza di campionamento: Hz %d\n", frequenza);

   pos = al_get_sample_length(sample);

   printf("Durata: %.2f secondi\n", (float)pos / frequenza);
 
   /* Esegue il file audio. */
   al_play_sample(sample, 1.0, 0.0, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL);

   /* Consente l'esecuzione per l'intera durata del file. */
   al_rest(pos / frequenza);
 
   /* Va in chiusura. */
   al_destroy_sample(sample);

   return 0;

}

questo codice va compilato con la seguente riga di comando:
gcc -o /percorso/programma /percorso/programma.c -L/usr/local/lib -lallegro -lallegro_main -lallegro_audio -lallegro_acodec


Riferimenti:
WIKI Allegro 5



Rinvio a questa discussione per l'uso della versione 5 di Allegro in Gambas:
http://www.gambas-it.org/smf/index.php?topic=3910.msg34994
« Ultima modifica: 20 Settembre 2015, 18:51:43 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »