Differenze tra le versioni di "Generare un'onda sinusoidale con il componente gb.openal"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Utilizzando le risorse della Classe " ''Alc'' " del Componente ''gb.openal'' di Gambas, è possibile eseguire un'onda sinusoidale, i cui dati saranno realizzati mediante appso...")
 
Riga 2: Riga 2:
  
 
Vediamo un esempio pratico:
 
Vediamo un esempio pratico:
  Private Const AMPLITUD As Byte = 127
+
  Private Const AMPIEZZA As Byte = 127
  Private Const FRECUENCIA As Short = 880
+
  Private Const FREQUENZA As Short = 880
  Private Const MUESTREO As Integer = 44100
+
  Private Const CAMPIONAMENTO As Integer = 44100
  Private Const DURACION As Single = 4.0
+
  Private Const DURATA As Single = 4.0
 
   
 
   
 
   
 
   
Riga 34: Riga 34:
 
    
 
    
 
  <FONT Color=gray>' ''I dati audio sono caricati nel buffer audio:''</font>
 
  <FONT Color=gray>' ''I dati audio sono caricati nel buffer audio:''</font>
   Al.BufferData(buffer[0], Formato_audio, datos.Data, datos.Count, MUESTREO)
+
   Al.BufferData(buffer[0], Formato_audio, datos.Data, datos.Count, CAMPIONAMENTO)
 
    
 
    
 
  <FONT Color=gray>' ''Connette il buffer audio al sorgente audio:''</font>
 
  <FONT Color=gray>' ''Connette il buffer audio al sorgente audio:''</font>
Riga 43: Riga 43:
 
    
 
    
 
  <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 DURACION
+
   Sleep DURATA
 
    
 
    
 
  <FONT Color=gray>' ''Libera la memoria:''</font>
 
  <FONT Color=gray>' ''Libera la memoria:''</font>
Riga 58: Riga 58:
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
   For i = 0 To (DURACION * 2 * MUESTREO) - 1
+
   For i = 0 To (DURATA * 2 * CAMPIONAMENTO) - 1
     bb.Push(CByte(128 + AMPLITUD * Sin(CFloat(i / MUESTREO * FRECUENCIA * (2 * Pi)))))
+
     bb.Push(CByte(128 + AMPIEZZA * Sin(CFloat(i / CAMPIONAMENTO * FREQUENZA * (2 * Pi)))))
 
   Next
 
   Next
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione delle 14:47, 28 mar 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 datos As New Byte[]
   
' Configura il dispositivo e il contesto audio con la Clsase "Alc":
  disp = Alc.OpenDevice(Null)
  cont = Alc.CreateContext(disp)
  
  err = cont.MakeCurrent()
  If err = False Then Error.Raise("Impossibile creare il contesto audio !")
  
  src = Al.GenSources(1)
  
' Configura il buffer audio:
  buffer = Al.GenBuffers(1)
  
  Unda(datos)
  
  Formato_audio = 4352
  
' I dati audio sono caricati nel buffer audio:
  Al.BufferData(buffer[0], Formato_audio, datos.Data, datos.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
  
' Libera la memoria:
  Al.DeleteBuffers(buffer)
  Al.DeleteSources(src)
  Alc.DestroyContext(cont)
  Alc.CloseDevice(disp)
  
End


Private Function Unda(bb As Byte[])   ' Crea i dati dell'onda sonora
 
 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