Differenze tra le versioni di "Generare un'onda sinusoidale con le sole funzioni di Gambas"
Da Gambas-it.org - Wikipedia.
(Creata pagina con 'E' possibile generare un'onda sinusoidale con le sole risorse di Gambas. Mostriamo un possibile esempio (convertito qui in Gambas con modifiche ed integrazioni da un analogo...') |
|||
Riga 91: | Riga 91: | ||
− | Private Procedure Scrivi_File(v As Integer) | + | '''Private''' Procedure Scrivi_File(v As Integer) |
Write #fl, CByte(v And &ff) As Byte | Write #fl, CByte(v And &ff) As Byte | ||
Riga 100: | Riga 100: | ||
− | Private Procedure Crea_File_WAV() | + | '''Private''' Procedure Crea_File_WAV() |
Dim bb As Byte[] = [&52, &49, &46, &46, &64, &82, &64, &02, &57, &41, &56, | Dim bb As Byte[] = [&52, &49, &46, &46, &64, &82, &64, &02, &57, &41, &56, |
Versione delle 19:35, 21 gen 2015
E' possibile generare un'onda sinusoidale con le sole risorse di Gambas.
Mostriamo un possibile esempio (convertito qui in Gambas con modifiche ed integrazioni da un analogo codice scritto in C da Fabrice Bellard), al termine del quale verrà creato un file di tipo WAV contenente i dati audio e che consentirà di eseguire l'onda sinusidale campionata:
Private fl As File Private Const RISOL_BIT As Integer = 16 Private Const COST_TAB_VAL As Integer = 7 Private FRAZIONE As Integer = 1 * CInt(2 ^ RISOL_BIT) Private CSHIFT As Integer = RISOL_BIT - COST_TAB_VAL - 2 Private Tabella_Valori As Integer[] = [&8000&, &7ffe, &7ff6, &7fea, &7fd9, &7fc2, &7fa7, &7f87, &7f62, &7f38, &7f0a, &7ed6, &7e9d, &7e60, &7e1e, &7dd6, &7d8a, &7d3a, &7ce4, &7c89, &7c2a, &7bc6, &7b5d, &7aef, &7a7d, &7a06, &798a, &790a, &7885, &77fb, &776c, &76d9, &7642, &75a6, &7505, &7460, &73b6, &7308, &7255, &719e, &70e3, &7023, &6f5f, &6e97, &6dca, &6cf9, &6c24, &6b4b, &6a6e, &698c, &68a7, &67bd, &66d0, &65de, &64e9, &63ef, &62f2, &61f1, &60ec, &5fe4, &5ed7, &5dc8, &5cb4, &5b9d, &5a82, &5964, &5843, &571e, &55f6, &54ca, &539b, &5269, &5134, &4ffb, &4ec0, &4d81, &4c40, &4afb, &49b4, &486a, &471d, &45cd, &447b, &4326, &41ce, &4074, &3f17, &3db8, &3c57, &3af3, &398d, &3825, &36ba, &354e, &33df, &326e, &30fc, &2f87, &2e11, &2c99, &2b1f, &29a4, &2827, &26a8, &2528, &23a7, &2224, &209f, &1f1a, &1d93, &1c0c, &1a83, &18f9, &176e, &15e2, &1455, &12c8, &113a, &0fab, &0e1c, &0c8c, &0afb, &096b, &07d9, &0648, &04b6, &0324, &0192, &0000, &0000] Public Sub Main() Dim filegrezzo As String Dim i, a, v, j As Integer Dim campionamento, canali, frequenza, durata, volume As Integer filegrezzo = "/tmp/datigrezzi" ' File contenente i dati audio grezzi dell'onda campionamento = 44100 ' Frequenza di campionamento dell'onda canali = 2 ' Numero canali del file WAV frequenza = 440 ' Frequenza dell'onda durata = 3 ' Durata in secondi volume = 10000 ' Volume audio dell'onda fl = Open filegrezzo For Create If IsNull(fl) Then Error.Raise("Impossibile creare il file dei dati audio grezzi !") ' Genera 3 secondi di un'onda sinusoidale alla frequenza di Hz 440: For i = 0 To (durata * campionamento) - 1 v = (int_cos(a) * volume) \ CInt(2 ^ RISOL_BIT) For j = 0 To canali - 1 Scrivi_File(v) Next a += (frequenza * FRAZIONE) / campionamento Next Crea_File_WAV() fl.Close Print "Fine creazione dell'onda." End Private Function Int_Cos(a As Integer) As Integer Dim neg, v, f As Integer Dim p As Integer[] a = a And (FRAZIONE - 1) If a >= (FRAZIONE / 2) Then a = FRAZIONE - a neg = 0 If a > (FRAZIONE / 4) Then neg = -1 a = (FRAZIONE / 2) - a Endif p = Tabella_Valori.Copy(a \ CInt(2 ^ CSHIFT), Tabella_Valori.Count - a \ CInt(2 ^ CSHIFT)) ' Interpolazione lineare: f = a And ((1 * CInt(2 ^ CSHIFT)) - 1) v = p[0] + (((p[1] - p[0]) * f + (1 * CInt(2 ^ (CSHIFT - 1)))) / CInt(2 ^ CSHIFT)) v = (v Xor neg) - neg v = v * CInt(2 ^ (RISOL_BIT - 15)) Return v End Private Procedure Scrivi_File(v As Integer) Write #fl, CByte(v And &ff) As Byte Write #fl, CByte((v \ CInt(2 ^ 8)) And &ff) As Byte End Private Procedure Crea_File_WAV() Dim bb As Byte[] = [&52, &49, &46, &46, &64, &82, &64, &02, &57, &41, &56, &45, &66, &6D, &74, &20, &10, &00, &00, &00, &01, &00, &02, &00, &44, &AC, &00, &00, &10, &B1, &02, &00, &04, &00, &10, &00, &64, &61, &74, &61, &00, &00, &00, &00] File.Save("/tmp/onda.wav", bb.ToString(0, 44) & File.Load("/tmp/datigrezzi")) End