Differenze tra le versioni di "Eseguire un file MIDI mediante il componente gb.openal"
Riga 9: | Riga 9: | ||
Mostriamo di seguito un semplice codice per eseguire un file Midi: | 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 | ||
+ | |||
+ | <FONT color=gray>' ''Inizializza la libreria "Alure":''</font> | ||
+ | err = Alure.InitDevice(Null, Null) | ||
+ | If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !") | ||
+ | |||
+ | '''End''' | ||
Riga 19: | Riga 30: | ||
Dim lungh As Integer | Dim lungh As Integer | ||
+ | If IsNull(src) = False Then al.DeleteSources(src) | ||
− | + | src = Al.GenSources(1) | |
− | |||
− | |||
− | src = Al.GenSources(1) | ||
lungh = Stat(percorsoFile).Size | lungh = Stat(percorsoFile).Size | ||
Riga 29: | Riga 38: | ||
ast = Alure.CreateStreamFromFile(percorsoFile, lungh, 0) | ast = Alure.CreateStreamFromFile(percorsoFile, lungh, 0) | ||
− | Alure.SetStreamPatchset(ast, "''/percorso/del/soundfont/file.sf2''") | + | Alure<FONT color=B22222>.SetStreamPatchset(ast, "''/percorso/del/soundfont/file.sf2''")</font> |
<FONT color=gray>' ''Esegue il flusso di dati Midi.'' | <FONT color=gray>' ''Esegue il flusso di dati Midi.'' | ||
Riga 35: | Riga 44: | ||
' ''Ogni buffer verrà riempito con la lunghezza del "chunk" specificato quando il flusso è stato creato.'' | ' ''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.''</font> | ' ''Tale valore nell'esecuzione di un file Midi deve essere di almeno 2.''</font> | ||
− | Alure.PlaySourceStream(src, ast, 3, 0) | + | Alure.PlaySourceStream(src[0], ast, 3, 0) |
ciclo = True | ciclo = True | ||
Do | Do | ||
− | <FONT color=gray>' ''Una brevissima attesa consente di agire su eventuali oggetti posti sul "Form": | + | <FONT color=gray>' ''Una brevissima attesa consente di agire su eventuali oggetti posti sul "Form":''</font> |
Wait 0.01 | Wait 0.01 | ||
Alure.Update() | Alure.Update() | ||
Riga 48: | Riga 57: | ||
− | '''Public''' Sub Button2_Click() | + | '''Public''' Sub Button2_Click() <FONT color=gray>' ''Arresta l'esecuzione del file Midi''</font> |
+ | |||
+ | If IsNull(ast) Then Return | ||
+ | Alure.StopSource(src[0]) | ||
+ | |||
+ | ciclo = False | ||
+ | |||
+ | '''End''' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | '''Public''' Sub Button3_Click() <FONT color=gray>' ''Arresta l'esecuzione del file Midi e chiude la finestra del programma''''</font> | ||
+ | |||
ciclo = False | ciclo = False | ||
− | + | ||
+ | If IsNull(ast) = False Then | ||
+ | Alure.DestroyStream(ast) | ||
+ | al.DeleteSources(src) | ||
+ | Alure.StopSource(src[0]) | ||
+ | Endif | ||
+ | |||
+ | Alure.ShutdownDevice() | ||
+ | |||
+ | Me.Close | ||
+ | |||
'''End''' | '''End''' | ||
+ | |||
Riga 65: | Riga 89: | ||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
− | Dim src | + | Dim err As Boolean |
+ | Dim src As Integer[] | ||
+ | Dim lungh As Integer | ||
+ | Dim ast As AlureStream | ||
Dim percorsoFile As String = "''/percorso/del/file.mid''" | Dim percorsoFile As String = "''/percorso/del/file.mid''" | ||
− | + | <FONT Color=gray>' ''Inizializza la libreria "Alure":''</font> | |
− | Alure.InitDevice(Null, Null) | + | err = Alure.InitDevice(Null, Null) |
+ | If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !") | ||
− | src = Al.GenSources(1) | + | src = Al.GenSources(1) |
lungh = Stat(percorsoFile).Size | lungh = Stat(percorsoFile).Size | ||
Riga 79: | Riga 107: | ||
Alure.SetStreamPatchset(ast, "''/percorso/del/soundfont/file.sf2''") | Alure.SetStreamPatchset(ast, "''/percorso/del/soundfont/file.sf2''") | ||
− | Alure.PlaySourceStream(src, ast, 3, 0) | + | Alure.PlaySourceStream(src[0], ast, 3, 0) |
<FONT color=B22222>While True | <FONT color=B22222>While True |
Versione delle 10:48, 2 ago 2015
Con la revisione 5753 di Gambas-3 è stato aggiunto il componente: gb.openal che 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) 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():
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) Alure.SetStreamPatchset(ast, "/percorso/del/soundfont/file.sf2") Alure.PlaySourceStream(src[0], ast, 3, 0) While True Alure.Update() Wend End
Note
[1] La Classe Alure del componente gb.openal consente di gestire le funzioni di ALURE, che è una libreria di supporto di Openal.