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.