![]() |
Frequenzen bei wav/mp3-dateien
Wie kann ich von einer mp3/wav-Datei die Frequenzen rausfiltern? (Sprich diese Schwingungen, die auch beim Windows mediaplayer angezeigt werden)
|
Re: Frequenzen bei wav/mp3-dateien
/me.try(Wiederbelebungsversuch(ThisThread));
---------------------------- hat echt niemand 'ne ahnung? |
Re: Frequenzen bei wav/mp3-dateien
Also bei MP3 Dateien stehen diese Informationen im Header der Datei und ich würde sagen bei WAVE sollte es genauso sein.
Zu WAVE Headern musst du mal ein wenig bei Google suchen und für Infos über MP3 Header kannst du bei ![]() (Unter "Programmer's corner" -> MPEG Layer I/II/III frame header documentation) ------ Mmh, ich hoffe mal du meintest das, wenn du dir allerdings einen Equalizer bauen willst, kann ich dir nicht viel mehr helfen. Schau mal in der Programmer's Corner, da sind auch Sourcecodes. Vielleicht ist da was für dich dabei. |
Re: Frequenzen bei wav/mp3-dateien
versuchs mal mit der bass.dll von
![]() hier mal meine alte bass unit:
Delphi-Quellcode:
Anwendung:
unit U_BassPlayer;
interface uses bass, Windows; type TFFTData = array[0..256] of float; TBassPlayer = class private { Private declarations } channel: HCHANNEL; status: byte; public function play(filename: string): boolean; procedure initbassPlayer(mainwindowhandle: HWND); procedure freebassPlayer; procedure setvolume(volume: byte); {0 bis 100} function getvolume: byte; property volume: byte read getvolume write setvolume ; procedure setposition(position: integer); function getposition: integer; {in sekunden} property position: integer read getposition write setposition; function getlength: integer; property length: integer read getlength; function getRightPeak: dword; property RightPeak: dword read getRightPeak; {von 0 bis 128} function getLeftPeak: dword; property LeftPeak: dword read getLeftPeak; {von 0 bis 128} function getfftdata: TFFTData; { Public declarations } end; implementation function TBassPlayer.getfftdata: TFFTData; begin if (BASS_ChannelGetData(Channel, @Result, BASS_DATA_FFT512) = 2048) = false then begin ZeroMemory(@Result, SizeOf(Result)); end; end; function TBassPlayer.getRightPeak: dword; begin result := HIWORD(BASS_ChannelGetLevel(channel)); end; function TBassPlayer.getLeftPeak: dword; begin result := LOWORD(BASS_ChannelGetLevel(channel)); end; function TBassPlayer.getvolume: byte; begin result := BASS_GetVolume; end; procedure TBassPlayer.setvolume(volume: byte); begin //BASS_SetVolume(volume); BASS_SetGlobalVolumes(-1,-1,volume); end; function TBassPlayer.getposition: integer; begin result := round(BASS_ChannelBytes2Seconds(channel,BASS_ChannelGetPosition(channel))); end; procedure TBassPlayer.setposition(position: integer); begin BASS_ChannelSetPosition(Channel,BASS_ChannelSeconds2Bytes(Channel, position)); end; function TBassPlayer.getlength: integer; begin result := round(BASS_ChannelBytes2Seconds(channel,BASS_StreamGetLength(channel))); end; function TBassPlayer.play(filename: string): boolean; begin If BASS_ChannelIsActive(channel)=1 then begin BASS_StreamFree(channel); end; channel:=BASS_StreamCreateFile(False,PChar(filename),0,0,BASS_STREAM_AUTOFREE or BASS_SAMPLE_FX); BASS_StreamPlay(channel,false,0); end; {es würde sich hier noch anbieten den Constructor zu überschreiben} {das müsstest du aber selber noch verändern.} procedure TBassPlayer.initbassPlayer(mainwindowhandle: HWND); begin if BASS_GetVersion() <> MAKELONG(1,8) then Halt; BASS_Init(-1, 44100, BASS_DEVICE_LEAVEVOL, mainwindowhandle); BASS_Start; end; procedure TBassPlayer.freebassPlayer; begin Bass_streamFree(channel); BASS_Stop; BASS_Free; end; end. Neue unit erstellen(und das von oben reinkopieren) diese in main unit einbinden und var Bassplayer: TBassPlayer .... create:
Delphi-Quellcode:
play:
Bassplayer := TBassPlayer.create;
Bassplayer.initbassPlayer(Form1.handle);
Delphi-Quellcode:
destroy:
Bassplayer.play('c:\blablub.mp3')
Delphi-Quellcode:
so und jetzt noch die Visualisiereung:
Bassplayer.freebassPlayer;
Bassplayer.free;
Delphi-Quellcode:
oncreate;
var
data: TFFTdata; backbild: TBitmap;
Delphi-Quellcode:
backbild := TBitmap.create;
backbild.width := 256; backbild.height:= 150; in einen Timer mit kleinem Intervall:
Delphi-Quellcode:
Ist jetzt nicht getestet.
Data:= BassPlayer.GetFFTData;
for i := 1 to 256 do begin data[i] := (Data[i] * (backbild.height)); //Werte anpassen end; backbild.Canvas.Brush.Color := clBlack; //Bild "löschen" backbild.Canvas.Rectangle(0,0,backbild.Width,backbild.Height); backbild.Canvas.Brush.Color := clred;//Farbe der Balken backbild.Canvas.pen.Color := clred; for i:=1 to 256 do begin //DAs zeichnen der Balken backbild.canvas.moveto(i,backbild.height) backbild.canvas.lineto(i,backbild.height-round(Data[i])) end; BitBlt(Form1.Handle, 0, 0, backbild.width, backbild.height, backbild.Handle , 0, 0 , SRCCOPY); //der Backpuffer wird aufs Formular kopiert Bei der darstellung sind dir fast keine Grenzen gesetzt. Kuck dir nur mal die vielen Visualierungs Plugins von Winamp an. :zwinker: Jetzt hast du ein schöne Copy and paste Lösung. Das hättest du übrigens auch alles im Forum finden können wenn du gesucht hättest. mfg |
Re: Frequenzen bei wav/mp3-dateien
1. die lösung funktioniert perfekt!
2. kann man das auch machen, ohne dass das File abgespielt werden muss? Dass ich mit einer For-schleife von vorne bis hinten alles durchgehe und abfrage. Geht das auch? |
Re: Frequenzen bei wav/mp3-dateien
Bei mir läuft zwar die Musik, aber die Visualisierung fehlt!
|
Re: Frequenzen bei wav/mp3-dateien
BitBlt(Form1.Handle, 0, 0, backbild.width, backbild.height, backbild.Handle , 0, 0 , SRCCOPY);
Die Bitmap wird nicht kopiert bei mir!!! Weiß jemand warum??? |
Re: Frequenzen bei wav/mp3-dateien
der Fehler ist da:
Delphi-Quellcode:
BitBlt(Form1.Handle, 0, 0, backbild.width, backbild.height, backbild.Handle , 0, 0 , SRCCOPY);
richtig ist:
Delphi-Quellcode:
Hmm sowas passiert wenn man nicht testet sorry.
BitBlt(Form1.canvas.handle, 0, 0, backbild.Width, backbild.Height, backbild.canvas.handle, 0, 0, srccopy);
ich hab nochmal ein beispiel Programm geschrieben. Für das Beispiel brachst man die neurer Version meiner Unit:
Delphi-Quellcode:
Neue Anwendung--> Button, Timer und Opendialog auf das Formular und dann so weiter:
unit U_BassPlayer;
interface uses bass, Windows, Messages; type TFFTData = array[0..256] of float; TBassPlayer = class private { Private declarations } channel: HCHANNEL; status: byte; FFilename: string; public constructor create(mainwindowhandle: HWND); destructor destroy; override; function play(filename: string): boolean; procedure setvolume(volume: byte); {0 bis 100} function getvolume: byte; property volume: byte read getvolume write setvolume ; procedure setposition(position: integer); function getposition: integer; {in sekunden} property position: integer read getposition write setposition; function getlength: integer; property length: integer read getlength; function getRightPeak: dword; property RightPeak: dword read getRightPeak; {von 0 bis 128} function getLeftPeak: dword; property LeftPeak: dword read getLeftPeak; {von 0 bis 128} function getfftdata: TFFTData; property filename: string read FFilename; { Public declarations } end; implementation function TBassPlayer.getfftdata: TFFTData; begin if (BASS_ChannelGetData(Channel, @Result, BASS_DATA_FFT512) = 2048) = false then begin ZeroMemory(@Result, SizeOf(Result)); end; end; function TBassPlayer.getRightPeak: dword; begin result := HIWORD(BASS_ChannelGetLevel(channel)); end; function TBassPlayer.getLeftPeak: dword; begin result := LOWORD(BASS_ChannelGetLevel(channel)); end; function TBassPlayer.getvolume: byte; begin result := BASS_GetVolume; end; procedure TBassPlayer.setvolume(volume: byte); begin BASS_SetGlobalVolumes(-1,-1,volume); end; function TBassPlayer.getposition: integer; begin result := round(BASS_ChannelBytes2Seconds(channel,BASS_ChannelGetPosition(channel))); end; procedure TBassPlayer.setposition(position: integer); begin BASS_ChannelSetPosition(Channel,BASS_ChannelSeconds2Bytes(Channel, position)); end; function TBassPlayer.getlength: integer; begin result := round(BASS_ChannelBytes2Seconds(channel,BASS_StreamGetLength(channel))); end; function TBassPlayer.play(filename: string): boolean; begin If BASS_ChannelIsActive(channel)=1 then begin BASS_StreamFree(channel); end; FFilename := filename; channel:=BASS_StreamCreateFile(False,PChar(filename),0,0,BASS_STREAM_AUTOFREE or BASS_SAMPLE_FX); result := BASS_StreamPlay(channel,false,0); end; constructor TBassPlayer.create(mainwindowhandle: HWND); begin inherited create;; if BASS_GetVersion() <> MAKELONG(1, then Halt; BASS_Init(-1, 44100, BASS_DEVICE_LEAVEVOL, mainwindowhandle); BASS_Start; end; destructor TBassPlayer.destroy; begin Bass_streamFree(channel); BASS_Stop; BASS_Free; inherited destroy; end; end.
Delphi-Quellcode:
uses
.....,U_bassplayer,...... var Form1: TForm1; BassPlayer: TBassPlayer; backbild: TBitmap; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin IF Opendialog1.Execute then bassplayer.play(Opendialog1.FileName); Timer1.Enabled := true; end; procedure TForm1.FormDestroy(Sender: TObject); begin bassplayer.free; backbild.Free; end; procedure TForm1.Timer1Timer(Sender: TObject); var i: integer; data: TFFTdata; begin Data:= BassPlayer.GetFFTData; for i := 1 to 256 do begin data[i] := (Data[i] * (backbild.Height)*(i * 0.25)); //Werte anpassen end; backbild.Canvas.pen.Color := clBlack; backbild.Canvas.Brush.Color := clBlack; //Bild "löschen" backbild.Canvas.Rectangle(0,0,backbild.Width,backbild.Height); backbild.Canvas.Brush.Color := clred;//Farbe der Balken backbild.Canvas.pen.Color := clred; for i:=1 to 256 do begin //DAs zeichnen der Balken backbild.canvas.moveto(i*2,backbild.Height); backbild.canvas.lineto(i*2,backbild.Height-(round(Data[i]))); end; BitBlt(Form1.canvas.handle, 0, 0, backbild.Width, backbild.Height, backbild.canvas.handle, 0, 0, srccopy); //der Backpuffer wird aufs Formular kopiert end; procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Enabled := false; Timer1.Interval := 55; bassplayer := TBassplayer.create(Form1.handle); backbild := TBitmap.create; backbild.width := 600; backbild.height:= 200; end; |
Re: Frequenzen bei wav/mp3-dateien
Ja! Ich weiß ich nerv! :-D
Aber es läuft immer noch nicht! Sobald
Delphi-Quellcode:
ausgeführt wird, wird das Programm ohne Fehlermeldung beendet!
bassplayer := TBassplayer.create(Form1.handle);
Aber vermutlich nur weil ich da was falsches reingesetzt hab (Damit Delphi das auch coplimiert): Original:
Delphi-Quellcode:
Meins:
constructor TBassPlayer.create(mainwindowhandle: HWND);
begin inherited create;; if BASS_GetVersion() <> MAKELONG(1, then Halt; BASS_Init(-1, 44100, BASS_DEVICE_LEAVEVOL, mainwindowhandle); BASS_Start; end;
Delphi-Quellcode:
Was muss in die Zeile wirklich rein???
constructor TBassPlayer.create(mainwindowhandle: HWND);
begin inherited create;; if BASS_GetVersion() <> MAKELONG(1,1) then Halt; BASS_Init(-1, 44100, BASS_DEVICE_LEAVEVOL, mainwindowhandle); BASS_Start; end;
Delphi-Quellcode:
Was macht makelong????
if BASS_GetVersion() <> MAKELONG(1,1) then Halt;
|
Re: Frequenzen bei wav/mp3-dateien
Hab sie jetzt mal ganz weggemacht! ;)
Und es läuft! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz