AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Frequenzen bei wav/mp3-dateien
Thema durchsuchen
Ansicht
Themen-Optionen

Frequenzen bei wav/mp3-dateien

Ein Thema von Illuminator-23-5 · begonnen am 14. Okt 2003 · letzter Beitrag vom 1. Mär 2009
Antwort Antwort
Seite 1 von 3  1 23      
Illuminator-23-5
(Gast)

n/a Beiträge
 
#1

Frequenzen bei wav/mp3-dateien

  Alt 14. Okt 2003, 16:59
Wie kann ich von einer mp3/wav-Datei die Frequenzen rausfiltern? (Sprich diese Schwingungen, die auch beim Windows mediaplayer angezeigt werden)
  Mit Zitat antworten Zitat
Illuminator-23-5
(Gast)

n/a Beiträge
 
#2

Re: Frequenzen bei wav/mp3-dateien

  Alt 15. Okt 2003, 15:15
/me.try(Wiederbelebungsversuch(ThisThread));
----------------------------
hat echt niemand 'ne ahnung?
  Mit Zitat antworten Zitat
Benutzerbild von nTE
nTE

Registriert seit: 8. Sep 2003
60 Beiträge
 
#3

Re: Frequenzen bei wav/mp3-dateien

  Alt 15. Okt 2003, 16:07
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 mp3-tech.org mal schauen.
(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.
  Mit Zitat antworten Zitat
Gandalfus

Registriert seit: 19. Apr 2003
407 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Frequenzen bei wav/mp3-dateien

  Alt 15. Okt 2003, 16:32
versuchs mal mit der bass.dll von http://www.un4seen.com/

hier mal meine alte bass unit:

Delphi-Quellcode:
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.
Anwendung:
Neue unit erstellen(und das von oben reinkopieren) diese in main unit einbinden und

var Bassplayer: TBassPlayer

....
create:
Delphi-Quellcode:
Bassplayer := TBassPlayer.create;
Bassplayer.initbassPlayer(Form1.handle);
play:
Bassplayer.play('c:\blablub.mp3') destroy:
Delphi-Quellcode:
Bassplayer.freebassPlayer;
Bassplayer.free;
so und jetzt noch die Visualisiereung:

Delphi-Quellcode:
var
  data: TFFTdata;
  backbild: TBitmap;
oncreate;
Delphi-Quellcode:
backbild := TBitmap.create;
backbild.width := 256;
backbild.height:= 150;

in einen Timer mit kleinem Intervall:
Delphi-Quellcode:
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
Ist jetzt nicht getestet.

Bei der darstellung sind dir fast keine Grenzen gesetzt. Kuck dir nur mal die vielen Visualierungs Plugins von Winamp an.


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
  Mit Zitat antworten Zitat
Illuminator-23-5
(Gast)

n/a Beiträge
 
#5

Re: Frequenzen bei wav/mp3-dateien

  Alt 17. Okt 2003, 21:38
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?
  Mit Zitat antworten Zitat
Benutzerbild von SleepyMaster
SleepyMaster

Registriert seit: 18. Mai 2003
634 Beiträge
 
#6

Re: Frequenzen bei wav/mp3-dateien

  Alt 18. Okt 2003, 20:35
Bei mir läuft zwar die Musik, aber die Visualisierung fehlt!
  Mit Zitat antworten Zitat
Benutzerbild von SleepyMaster
SleepyMaster

Registriert seit: 18. Mai 2003
634 Beiträge
 
#7

Re: Frequenzen bei wav/mp3-dateien

  Alt 18. Okt 2003, 20:49
BitBlt(Form1.Handle, 0, 0, backbild.width, backbild.height, backbild.Handle , 0, 0 , SRCCOPY);

Die Bitmap wird nicht kopiert bei mir!!!
Weiß jemand warum???
  Mit Zitat antworten Zitat
Gandalfus

Registriert seit: 19. Apr 2003
407 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Frequenzen bei wav/mp3-dateien

  Alt 22. Okt 2003, 23:07
der Fehler ist da:

BitBlt(Form1.Handle, 0, 0, backbild.width, backbild.height, backbild.Handle , 0, 0 , SRCCOPY);
richtig ist:

BitBlt(Form1.canvas.handle, 0, 0, backbild.Width, backbild.Height, backbild.canvas.handle, 0, 0, srccopy); Hmm sowas passiert wenn man nicht testet sorry.

ich hab nochmal ein beispiel Programm geschrieben.

Für das Beispiel brachst man die neurer Version meiner Unit:

Delphi-Quellcode:
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.
Neue Anwendung--> Button, Timer und Opendialog auf das Formular und dann so weiter:


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;
  Mit Zitat antworten Zitat
Benutzerbild von SleepyMaster
SleepyMaster

Registriert seit: 18. Mai 2003
634 Beiträge
 
#9

Re: Frequenzen bei wav/mp3-dateien

  Alt 23. Okt 2003, 11:38
Ja! Ich weiß ich nerv!

Aber es läuft immer noch nicht!
Sobald
  bassplayer := TBassplayer.create(Form1.handle); ausgeführt wird, wird das Programm ohne Fehlermeldung beendet!

Aber vermutlich nur weil ich da was falsches reingesetzt hab (Damit Delphi das auch coplimiert):


Original:
Delphi-Quellcode:
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;
Meins:
Delphi-Quellcode:
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;
Was muss in die Zeile wirklich rein???
  if BASS_GetVersion() <> MAKELONG(1,1) then Halt; Was macht makelong????
  Mit Zitat antworten Zitat
Benutzerbild von SleepyMaster
SleepyMaster

Registriert seit: 18. Mai 2003
634 Beiträge
 
#10

Re: Frequenzen bei wav/mp3-dateien

  Alt 23. Okt 2003, 11:43
Hab sie jetzt mal ganz weggemacht!
Und es läuft!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz