Wellenform auslesen aus WAV & MP3
Übersicht

![]() |
ProducerBetreff: Wellenform auslesen aus WAV & MP3 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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)... ![]() Wenn mir wer helfen kann bekommt derjenige nen virtuellen Kasten Bier ![]() |
||
![]() |
Abrexxes |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Danke auch für den FFT Code @ Vertex... Das mit OpenAL klingt auch sehr intressant ![]() 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 ) ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group