Differenze tra le versioni di "Generare un'onda sinusoidale con il componente gb.openal"
Da Gambas-it.org - Wikipedia.
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 19: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