Comunidad Gambas-es
Representar onda senoidal - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: Representar onda senoidal (/thread-1466.html)



Representar onda senoidal - Shell - 26-07-2023

Buenas!.

Les muestro dos ejemplos que he realizado. Muestra la onda con desplazamiento horizontal.
Dos versiones. Una con SDL2, usando puntos y usando la clase Paint, trazando con líneas.

Versión con SDL2

[Imagen: LWr2cDz.png]

Adjunto el código fuente:

Y ahora la versión usando Paint con líneas.

[Imagen: rJvqSKv.png]

Saludos


RE: Representar onda senoidal - tercoide - 16-08-2023

muy bueno, pero mejor seria representar las ondas del sonido que ingrese por microfono

a ver quien se anima....

Sapo?


RE: Representar onda senoidal - Shell - 04-09-2023

(16-08-2023, 14:50)tercoide escribió: muy bueno, pero mejor seria representar las ondas del sonido que ingrese por microfono

Es que antes la dibujaba pero era estática. No resulta sencillo representar los cambios de frecuencia o velocidad según se mire.

Representar la onda del micrófono parece más para el lenguaje "C", debe ser algo muy rápido.
De todas formas, Shordi había creado un programa para representar mediante barras los cambios que producía
una canción. ( Una aplicación tipo WinAmp ) que luego esto se corresponda con una gama de frecuencias, eso no lo sé.

Es una buena tarea. Smile

Saludos


RE: Representar onda senoidal - vuott - 04-09-2023

Para la construcción de la onda, esta libreria puede ser útil:

https://www.gambas-it.org/wiki/index.php/Individuare_le_frequenze_presenti_in_un%27onda_audio_con_le_funzioni_esterne_della_libreria_Libaubio

(16-08-2023, 14:50)tercoide escribió: pero mejor seria representar las ondas del sonido que ingrese por microfono

Uhmmm.... podríamos utilizar los recursos del componente gb.media:

Código:
Private Const SEGUNDOS As Integer = 1  'Establece la duración de la onda que se dibujará en segundos

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, cnv, scp, snk As MediaControl
 Dim flt As MediaFilter
  
 pl = New MediaPipeline

 src = New MediaControl(pl, "alsasrc")  
 cnv = New MediaControl(pl, "audioconvert")
 scp = New MediaControl(pl, "wavescope")
 scp["style"] = 2
 flt = New MediaFilter(pl, "video/x-raw,width=1200,framerate=30" &/ CStr(SEGUNDOS))
 snk = New MediaControl(pl, "ximagesink")

 src.LinkTo(cnv)
 cnv.LinkTo(scp)
 scp.LinkTo(flt)
 flt.LinkTo(snk)
   
 pl.Play()
   
 Do         ' ...ὁ ἄπειρος κύκλος !
   Wait 0.01
 Loop

End



RE: Representar onda senoidal - Shell - 05-09-2023

Se supone que es algo que ocurre en tiempo real, ¿ no ?. Que no hay un tiempo o intervalo de retraso.

- Capturar el audio
- Presentarlo gráficamente

Vuott hace ya tiempo creaste un pequeño ejemplo, donde creabas una onda.
Es para la consola.

Código:
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 fl As File
  Dim filegrezzo As String
  Dim i, a, v, j As Integer
  Dim campionamento, canali, frequenza, volume As Integer
  Dim durata As Single
 
  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.0            ' 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(fl, v)
    Next
    a += (frequenza * FRAZIONE) / campionamento
  Next
 
  Crea_File_WAV(fl)
 
  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(sf As File, v As Integer)
 
  Write #sf, CByte(v And &ff) As Byte
 
  Write #sf, CByte((v \ CInt(2 ^ 8)) And &ff) As Byte
 
End

Private Procedure Crea_File_WAV(dg As File)
 
  Dim intes As File
  Dim bb As Byte[] = [&52, &49, &46, &46, &00, &00, &00, &00, &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]
 
  ' Scrive innanzitutto il blocco di intestazione del file WAV:
  intes = Open "/tmp/blocco_header" For Create
  bb.Write(intes, 0, 4)
  Write #intes, Lof(dg) + 36 As Integer
  bb.Write(Intes, 8, 32)
  Write #intes, Lof(dg) As Integer
  intes.Close
 
  ' Unisce il blocco di intestazione del file WAV ai dati audio grezzi presenti nel file "datigrezzi"
  ' (in questo esempio il file WAV finale viene scritto nella cartella "/tmp"):
  File.Save("/tmp/onda.wav", File.Load("/tmp/blocco_header") & File.Load("/tmp/datigrezzi"))
 
End

Saludos