Generare un'onda sinusoidale con il componente gb.openal: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 50: Riga 50:
  <FONT Color=gray>' ''Consente l'esecuzione per l'intera durata dell'onda sonora:''</font>
  <FONT Color=gray>' ''Consente l'esecuzione per l'intera durata dell'onda sonora:''</font>
   Sleep DURATA
   Sleep DURATA
 
  al.SourceStop(src[0])
 
<FONT Color=gray>' ''Libera la memoria:''</font>
  Al.DeleteBuffers(buffer)
  Al.DeleteSources(src)
  Alc.DestroyContext(cont)
  Alc.CloseDevice(disp)
 
'''End'''
'''Private''' Function Onda(bb As Byte[])  <FONT Color=gray>' ''Crea i dati dell'onda sinusoidale''</font>
 
  Dim i As Integer
 
  For i = 0 To (DURATA * 2 * CAMPIONAMENTO) - 1
    bb.Push(CByte(128 + AMPIEZZA * Sin(CFloat(i / CAMPIONAMENTO * FREQUENZA * (2 * Pi)))))
  Next
 
'''End'''
In quest'altro codice, simile al precedente, appllicheremo ai dati dell'onda sinusoidale l'effetto della ''[https://it.wikipedia.org/wiki/Funzione_finestra Funzione Finestra di Hamming]'':
Private Const AMPIEZZA As Byte = 127
Private Const FREQUENZA As Short = 440
Private Const CAMPIONAMENTO As Integer = 44100
Private Const DURATA As Single = 20.0
Private Const AMP_HAMM As Single = 0.95
Private Const TEMPO_DISCRETO As Integer = 16384
'''Public''' Sub Main()
 
  Dim disp As AlcDevice
  Dim cont As AlcContext
  Dim src, buffer As Integer[]
  Dim err As Boolean
  Dim Formato_audio As Integer
  Dim dati As New Byte[]
   
<FONT Color=gray>' ''Configura il dispositivo audio con la Classe "Alc":''</font>
  disp = Alc.OpenDevice(Null)
  If IsNull(disp) Then Error.Raise("Impossibile configurare il dispositivo audio !")
 
<FONT Color=gray>' ''Configura il contesto audio con la Classe "Alc":''</font>
  cont = Alc.CreateContext(disp)
  If IsNull(cont) Then Error.Raise("Impossibile configurare il contesto audio !")
 
  err = cont.MakeCurrent()
  If err = False Then Error.Raise("Impossibile creare il contesto audio !")
 
  src = Al.GenSources(1)
  If IsNull(src) Then Error.Raise("Errore !")
 
<FONT Color=gray>' ''Configura il buffer audio:''</font>
  buffer = Al.GenBuffers(1)
  If IsNull(buffer) Then Error.Raise("Errore !")
 
  Onda(dati)
 
  Formato_audio = 4352
 
<FONT Color=gray>' ''I dati audio sono caricati nel buffer audio:''</font>
  Al.BufferData(buffer[0], Formato_audio, dati.Data, dati.Count, CAMPIONAMENTO)
 
<FONT Color=gray>' ''Connette il buffer audio al sorgente audio:''</font>
  Al.Sourcei(src[0], Al.BUFFER, buffer[0])
 
<FONT Color=gray>' ''Esegue il sorgente audio:''</font>
  Al.SourcePlay(src[0])
 
<FONT Color=gray>' ''Consente l'esecuzione per l'intera durata dell'onda sonora:''</font>
  Sleep DURATA
 
  al.SourceStop(src[0])
    
    
  <FONT Color=gray>' ''Libera la memoria:''</font>
  <FONT Color=gray>' ''Libera la memoria:''</font>
Riga 66: Riga 143:
   For i = 0 To (DURATA * 2 * CAMPIONAMENTO) - 1
   For i = 0 To (DURATA * 2 * CAMPIONAMENTO) - 1
     bb.Push(CByte(128 + AMPIEZZA * Sin(CFloat(i / CAMPIONAMENTO * FREQUENZA * (2 * Pi)))))
     bb.Push(CByte(128 + AMPIEZZA * Sin(CFloat(i / CAMPIONAMENTO * FREQUENZA * (2 * Pi)))))
<FONT Color=gray>' ''Applichiamo la Funzione Finestra di Hamming:''</font>
    bb[i] *= AMP_HAMM * (0.54 - 0.46 * Cos(2.0 * Pi * i / (TEMPO_DISCRETO - 1)))
   Next
   Next
    
    
  '''End'''
  '''End'''

Versione delle 20:35, 6 apr 2018

Utilizzando le risorse della Classe " Alc " del Componente gb.openal di Gambas, è possibile eseguire un'onda sinusoidale, i cui dati saranno realizzati mediante appsota formula matematica.

Vediamo un esempio pratico:

Private Const AMPIEZZA As Byte = 127
Private Const FREQUENZA As Short = 880
Private Const CAMPIONAMENTO As Integer = 44100
Private Const DURATA As Single = 4.0


Public Sub Main()
 
 Dim disp As AlcDevice
 Dim cont As AlcContext
 Dim src, buffer As Integer[]
 Dim err As Boolean
 Dim Formato_audio As Integer
 Dim dati As New Byte[]
   
' Configura il dispositivo audio con la Classe "Alc":
  disp = Alc.OpenDevice(Null)
  If IsNull(disp) Then Error.Raise("Impossibile configurare il dispositivo audio !")
  
' Configura il contesto audio con la Classe "Alc":
  cont = Alc.CreateContext(disp)
  If IsNull(cont) Then Error.Raise("Impossibile configurare il contesto audio !")
  
  err = cont.MakeCurrent()
  If err = False Then Error.Raise("Impossibile creare il contesto audio !")
  
  src = Al.GenSources(1)
  If IsNull(src) Then Error.Raise("Errore !")
  
' Configura il buffer audio:
  buffer = Al.GenBuffers(1)
  If IsNull(buffer) Then Error.Raise("Errore !")
  
  Onda(dati)
  
  Formato_audio = 4352
  
' I dati audio sono caricati nel buffer audio:
  Al.BufferData(buffer[0], Formato_audio, dati.Data, dati.Count, CAMPIONAMENTO)
 
' Connette il buffer audio al sorgente audio:
  Al.Sourcei(src[0], Al.BUFFER, buffer[0])
  
' Esegue il sorgente audio:
  Al.SourcePlay(src[0])
  
' Consente l'esecuzione per l'intera durata dell'onda sonora:
  Sleep DURATA
  
  al.SourceStop(src[0])
  
' Libera la memoria:
  Al.DeleteBuffers(buffer)
  Al.DeleteSources(src)
  Alc.DestroyContext(cont)
  Alc.CloseDevice(disp)
  
End


Private Function Onda(bb As Byte[])   ' Crea i dati dell'onda sinusoidale
 
 Dim i As Integer
  
  For i = 0 To (DURATA * 2 * CAMPIONAMENTO) - 1
    bb.Push(CByte(128 + AMPIEZZA * Sin(CFloat(i / CAMPIONAMENTO * FREQUENZA * (2 * Pi)))))
  Next
  
End


In quest'altro codice, simile al precedente, appllicheremo ai dati dell'onda sinusoidale l'effetto della Funzione Finestra di Hamming:

Private Const AMPIEZZA As Byte = 127
Private Const FREQUENZA As Short = 440
Private Const CAMPIONAMENTO As Integer = 44100
Private Const DURATA As Single = 20.0
Private Const AMP_HAMM As Single = 0.95
Private Const TEMPO_DISCRETO As Integer = 16384


Public Sub Main()
 
 Dim disp As AlcDevice
 Dim cont As AlcContext
 Dim src, buffer As Integer[]
 Dim err As Boolean
 Dim Formato_audio As Integer
 Dim dati As New Byte[]
   
' Configura il dispositivo audio con la Classe "Alc":
  disp = Alc.OpenDevice(Null)
  If IsNull(disp) Then Error.Raise("Impossibile configurare il dispositivo audio !")
  
' Configura il contesto audio con la Classe "Alc":
  cont = Alc.CreateContext(disp)
  If IsNull(cont) Then Error.Raise("Impossibile configurare il contesto audio !")
  
  err = cont.MakeCurrent()
  If err = False Then Error.Raise("Impossibile creare il contesto audio !")
  
  src = Al.GenSources(1)
  If IsNull(src) Then Error.Raise("Errore !")
  
' Configura il buffer audio:
  buffer = Al.GenBuffers(1)
  If IsNull(buffer) Then Error.Raise("Errore !")
  
  Onda(dati)
  
  Formato_audio = 4352
  
' I dati audio sono caricati nel buffer audio:
  Al.BufferData(buffer[0], Formato_audio, dati.Data, dati.Count, CAMPIONAMENTO)
 
' Connette il buffer audio al sorgente audio:
  Al.Sourcei(src[0], Al.BUFFER, buffer[0])
  
' Esegue il sorgente audio:
  Al.SourcePlay(src[0])
  
' Consente l'esecuzione per l'intera durata dell'onda sonora:
  Sleep DURATA
  
  al.SourceStop(src[0])
  
' Libera la memoria:
  Al.DeleteBuffers(buffer)
  Al.DeleteSources(src)
  Alc.DestroyContext(cont)
  Alc.CloseDevice(disp)
  
End


Private Function Onda(bb As Byte[])   ' Crea i dati dell'onda sinusoidale
 
 Dim i As Integer
  
  For i = 0 To (DURATA * 2 * CAMPIONAMENTO) - 1
    bb.Push(CByte(128 + AMPIEZZA * Sin(CFloat(i / CAMPIONAMENTO * FREQUENZA * (2 * Pi)))))
' Applichiamo la Funzione Finestra di Hamming:
    bb[i] *= AMP_HAMM * (0.54 - 0.46 * Cos(2.0 * Pi * i / (TEMPO_DISCRETO - 1)))
  Next
  
End