Differenze tra le versioni di "Eseguire un file MIDI mediante il componente gb.openal"

Da Gambas-it.org - Wikipedia.
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 src As Integer[]
  '''Private''' ast As AlureStream
+
Private ast As AlureStream
  '''Private''' ciclo As Boolean
+
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)
 
   
 
   
<FONT color=gray>' ''Inizializza la libreria "Alure":''</font>
+
   src = Al.GenSources(1)
  Alure.InitDevice(Null, Null)
 
 
   src = Al.GenSources(1)[0]
 
 
   
 
   
 
   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>
+
  <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'''
 
   
 
   
  With Alure
 
    .StopSource(src)
 
    .DestroyStream(ast)
 
    .ShutdownDevice()
 
  End With
 
 
   
 
   
 +
'''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, ast, lungh As Integer
+
  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)[0]
+
   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.