Wellenform auslesen aus WAV & MP3

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Producer

Betreff: Wellenform auslesen aus WAV & MP3

BeitragDo, Okt 25, 2007 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich suche eine Möglichkeit aus Audioformaten (like MP3, WAV) die Wellenform zu generieren (ala Wavelab oder wie bei dem freien Projekt Audacity).
Gibt es irgendwelche Module oder ähnliches zu diesem Thema? Ich hab zwar eine DLL gefunden die das kann - aber für BlitzMax brauch man ja DLLs (mit spezillen Prozedureinsprüngen)... Rolling Eyes Müsste ja irgendwie das Frequenzspektrum auslesen können - hab zwar etwas im Internet gesucht aber nicht den genauen Aufbau von WAV (ich denke mal ist erstmal leichter als gleich MP3) gefunden... Müsste das dann ja sicher mitn normalen Stream auslessen wie ne Text/Binärdatei...

Wenn mir wer helfen kann bekommt derjenige nen virtuellen Kasten Bier Wink Das ist doch mal was....

Abrexxes

BeitragDo, Okt 25, 2007 1:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Programme berechnen die Wellenkurve nicht aus wav, mp3,ogg oder sonst was sondern immer aus dem dekomprimierten Material was im Speicher des Rechners als PCM vorliegt. (Weswegen beim normalen Playback das ganze auch nur gestreamt wird um Speicher zu sparen.

Das WAV Format ist daher auch ohne Audiolib lesbar da es eigentlich nur PCM mit einem Header ist. Für alle anderen Formate ist ein Decoder nötig der das Material erst mal "lesbar" macht. Du kannst dir gern mal in meiner Signatur BBS runterladen, da gibt es Infos zum WaveFormat (STUFF), einen bb Code zum Aufbau einer Wavdatei (STUFF) und den Dreamplayer von hectic der auch eine "Wellenform" erzeugt.

Allerdings ist wie gesagt alles Blitzbasic was aber leicht auf Blitzmax umzuschreiben ist. Was BASS angeht kannst du natürlich jede lib verwenden die dir den Zugriff auf die dekomprimierten Buffer zum auslesen der Daten ermöglicht. Ansonsten geht nur WAV direkt. Einige Kenntnisse über Audioformate und mathematische Grundkenntnisse sollten natürlich vorhanden sein.

cu

Vertex

BeitragDo, Okt 25, 2007 6:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei MP3 und Vorbis liegen solche Daten schon von Haus aus da, weil mit diesen Informationen komprimiert wird.

Aber zur Spektrumanalyse: Hier mein alter Code um FFT durchzuführen. FFT verlangt eine 2er Potenz an Datenlänge, sonst geht es nicht.

Code: [AUSKLAPPEN]
Function IntFFT(In:Int[], Out:Float[], Length:Int)
   Local Temp  : Float[,], ..
         Index : Int, ..
         Radix : Float[2]

   Temp = New Float[Length, 2]
   For Index = 0 Until Length
      Temp[Index, 0] = In[Index]
      Temp[Index, 1] = 0.0
   Next

   Radix[0] = Cos(360.0/Length)
   Radix[1] = Sin(360.0/Length)
   DoFFT(Temp, Length, 0, Radix)

   For Index = 0 Until Length
      Out[Index] = Sqr(Temp[Index, 0]*Temp[Index, 0] + ..
                       Temp[Index, 1]*Temp[Index, 1])
   Next
End Function

Function DoFFT(Data:Float[,], Length:Int, Start:Int, Radix:Float[])
   Local Index  : Int, ..
         Middle : Int, ..
         Z      : Float[2], ..
         V      : Float[2], ..
         H      : Float[2], ..
         TempA  : Float, ..
         TempB  : Float

   If Length =< 1 Then Return
   
   Middle = Length Shr 1
   Z[0] = 1.0
   Z[1] = 0.0
   
   For Index = Start To Start + Middle - 1
      H[0] = Data[Index, 0] - Data[Index + Middle, 0]
      H[1] = Data[Index, 1] - Data[Index + Middle, 1]

      Data[Index, 0] :+ Data[Index + Middle, 0]
      Data[Index, 1] :+ Data[Index + Middle, 1]

      Data[Index + Middle, 0] = H[0]*Z[0] - H[1]*Z[1]
      Data[Index + Middle, 1] = H[0]*Z[1] + H[1]*Z[0]

      TempA = Z[0]
      TempB = Z[1]
      Z[0] = TempA*Radix[0] - TempB*Radix[1]
      Z[1] = TempA*Radix[1] + TempB*Radix[0]
   Next

   ' v=w*w
   V[0] = Radix[0]*Radix[0] - Radix[1]*Radix[1]
   V[1] = Radix[0]*Radix[1] + Radix[1]*Radix[0]
   
   DoFFT(Data, Middle, Start, v)
   DoFFT(Data, Middle, Start + Middle, v)
   Shuffle(Data, Length, Start)
End Function

Function Shuffle(Data:Float[,], Length:Int, Start:Int)
   Local Index  : Int, ..
         Middle : Int, ..
         Temp   : Float[,]

   Middle = Length Shr 1

   Temp = New Float[Middle, 2]
   MemCopy(Temp, Byte Ptr(Data) + Start*8, Middle*4)

   For Index = 0 Until Middle
      Data[Start + Index + Index + 1, 0] = Data[Start + Index + Middle, 0]
      Data[Start + Index + Index + 1, 1] = Data[Start + Index + Middle, 1]
   Next

   For Index = 0 Until Middle
      Data[Start + Index + Index, 0] = Temp[Index, 0]
      Data[Start + Index + Index, 1] = Temp[Index, 1]
   Next
End Function


Ich habe hier IntFFT genommen, da Int in BMax nativ mit Vorzeichen arbeitet. Ginge also auch mit Signed Short, musst bloß auf das MSB achten.

Also die Samples müssen in Vorzeichen behaftete Int-Werte umgewandelt werden und dann übergibst du diese IntFFT. IntFFT wandelt diese dann in komplexe Werte, berechnet die erste Wurzel W, führt FFT aus und anschließend wandelt er die komplexen Werte in Float Werte um.

Der erste Wert bei Out ist die DC Spannung, dann kommen die Frequenzanteile, die sich dann aber bei Length/2 spiegeln.

Ich mach vllt. heute dir mal noch ein Beispiel mit OpenAL und Mikrofoneingabe.

mfg olli
vertex.dreamfall.at | GitHub

Producer

BeitragDo, Okt 25, 2007 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Abrexxes hat Folgendes geschrieben:

Allerdings ist wie gesagt alles Blitzbasic was aber leicht auf Blitzmax umzuschreiben ist. Was BASS angeht kannst du natürlich jede lib verwenden die dir den Zugriff auf die dekomprimierten Buffer zum auslesen der Daten ermöglicht. Ansonsten geht nur WAV direkt. Einige Kenntnisse über Audioformate und mathematische Grundkenntnisse sollten natürlich vorhanden sein.

Danke erstmal... Schaue mir jetzt mal BASS genauer an... Hoffe das unter BMax lauffähig zu kriegen (bzw. mit dem Wrapper http://www.blitzbasic.com/Comm...opic=46059)... Genau sowas hab ich gesucht - Danke Very Happy

Danke auch für den FFT Code @ Vertex... Das mit OpenAL klingt auch sehr intressant Very Happy


Edit: Hab ein Problem mit dem BASS-Studio... obwohl ich alles nach Anleitung installiert hab bekomm ich beim kompilieren der example Dateien "Can´t find interface for module mgekit.mgebass"...
HWeiß wer worans liegt? hab auch schon versucht die *.i & *.a in den lib ordner zu kopieren (so musst ichs bei Irrlicht machen ) Confused

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group