Eseguire un file MIDI mediante il componente gb.openal
Il componente gb.openal utilizza le risorse dell'API di Openal.
Oltre all'esecuzione dei file audio, con il componente gb.openal è possibile eseguire anche i file Midi, utilizzando in particolare la funzione
SetStreamPatchset(Stream as AlureStream, Patchset As String) As Boolean
appartenente alla Classe Alure. |1|
Questa funzione specifica il patchset da utilizzare per i flussi MIDI. Tale patchset è sostanzialmente un file contenente il banco di suoni (soundfont bank) con estensione .sf2 . Pertanto sarà sufficiente in quel parametro indicare il percorso del file soundfont .sf2 che si intende utilizzare.
Mostriamo di seguito un semplice codice per eseguire un file Midi:
Private src As Integer[] Private ast As AlureStream Private ciclo As Boolean Public Sub Form_Open() Dim err As Boolean ' Inizializza la libreria "Alure": err = Alure.InitDevice(Null, Null) If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !") End Public Sub Button1_Click() Dim percorsoFile As String = "/percorso/del/file.mid" Dim lungh As Integer If IsNull(src) = False Then al.DeleteSources(src) src = Al.GenSources(1) lungh = Stat(percorsoFile).Size ast = Alure.CreateStreamFromFile(percorsoFile, lungh, 0) ' Nel secondo parametro della seguente funzione va specificato il percorso del file soundfont-bank di formato .SF2: Alure.SetStreamPatchset(ast, "/percorso/del/soundfont/file.sf2") ' Esegue il flusso di dati Midi. ' Il terzo parametro della funzione rappresenta il numero dei buffer utilizzati da accodare alla fonte di "OpenAL". ' Ogni buffer verrà riempito con la lunghezza del "chunk" specificato quando il flusso è stato creato. ' Tale valore nell'esecuzione di un file Midi deve essere di almeno 2. Alure.PlaySourceStream(src[0], ast, 3, 0) ciclo = True Do ' Una brevissima attesa consente di agire su eventuali oggetti posti sul "Form": Wait 0.01 Alure.Update() Loop Until ciclo = False End Public Sub Button2_Click() ' Arresta l'esecuzione del file Midi If IsNull(ast) Then Return Alure.StopSource(src[0]) ciclo = False End Public Sub Button3_Click() ' Arresta l'esecuzione del file Midi e chiude la finestra del programma ciclo = False If IsNull(ast) = False Then Alure.DestroyStream(ast) al.DeleteSources(src) Alure.StopSource(src[0]) Endif Alure.ShutdownDevice() Me.Close End
Caso di applicazione a riga di comando
Nel caso in cui l'applicazione per l'esecuzione di file Midi sia stata realizzata senza componenti grafici, e dunque a riga di comando, al termine del codice sarà assolutamente necessario prevedere un ciclo, all'interno del quale si dovrà porre la funzione Alure.Update():
Private s As String Public Sub Main() Dim err As Boolean Dim src As Integer[] Dim lungh As Integer Dim ast As AlureStream Dim percorsoFile As String = "/percorso/del/file.mid" ' Inizializza la libreria "Alure": err = Alure.InitDevice(Null, Null) If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !") src = Al.GenSources(1) lungh = Stat(percorsoFile).Size ast = Alure.CreateStreamFromFile(percorsoFile, lungh, 0) ' Nel secondo parametro della seguente funzione va specificato il percorso del file soundfont-bank di formato .SF2: Alure.SetStreamPatchset(ast, "/percorso/del/soundfont/file.sf2") Alure.PlaySourceStream(src[0], ast, 3, 0) ' Inviando il carattere "p" dal Terminale o dalla console, l'esecuzione è posta in "Pausa", ' inviando ogni altro carattere essa viene terminata: Do Alure.Update() Wait 0.01 If s = "p" Then Pausa(src) Loop Until s <> Null ' Va in chiusura: Alure.DestroyStream(ast) Al.DeleteSources(src) Alure.StopSource(src[0]) Alure.ShutdownDevice() Quit End Private Procedure Pausa(sAl As Integer) Dim ripresa As String Al.SourcePause(sAl) Print "Pausa !" ' Per riprendere l'esecuzione, è sufficiente premere il tasto "Invio": Input ripresa Al.SourcePlayv([sal]) Print "Riprende esecuzione." s = Null End Public Sub Application_Read() Input s End
Note
[1] La Classe Alure del componente gb.openal consente di gestire le funzioni di ALURE, che è una libreria di supporto di Openal.