AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bass.dll Wave Data / FFT Data ?
Thema durchsuchen
Ansicht
Themen-Optionen

Bass.dll Wave Data / FFT Data ?

Ein Thema von Blamaster · begonnen am 22. Jan 2009 · letzter Beitrag vom 7. Feb 2009
 
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#13

Re: Bass.dll Wave Data / FFT Data ?

  Alt 24. Jan 2009, 15:32
Hi,

ich habe ebend mal wieder ein bisschen gebastelt und mir das Custom loop Beispiel der bass.dll mal genauer angesehen. (Custom Loop im Anhang)

Dann hab ich mich dran gesetzt und versucht die Funktion zu extrhieren und abzuändern.

Folgendes kam dabei raus:

Deklarationen:

Delphi-Quellcode:
WaveBufR: array of smallint;
WaveBufL: array of smallint;
Scan Peaks:

Delphi-Quellcode:
procedure TBassPlayer.ScanPeaks(filename: string; PB: TPaintbox);
var
  cpos,level : DWord;
  peak : array[0..1] of DWORD;
  position,bpp : DWORD;
  counter, i : integer;
  decoder: HStream;
begin
  cpos := 0;
  peak[0] := 0;
  peak[1] := 0;
  counter := 0;
  setlength(wavebufL,PB.ClientWidth);
  setlength(wavebufR,PB.ClientWidth);

  decoder := BASS_StreamCreateFile(false, PChar(filename), 0, 0, BASS_STREAM_DECODE);
   if (decoder = 0) then
    decoder := BASS_MusicLoad(false, PChar(filename), 0, 0, BASS_MUSIC_DECODE, 0);

  bpp := BASS_ChannelGetLength(decoder) div PB.ClientWidth; // stream bytes per pixel
  if (bpp < BASS_ChannelSeconds2Bytes(decoder, 0.02)) then // minimum 20ms per pixel (BASS_ChannelGetLevel scans 20ms)
    bpp := BASS_ChannelSeconds2Bytes(decoder, 0.02);

  for i:= 1 to length(wavebufL) do
  begin
    level := BASS_ChannelGetLevel(decoder); // scan peaks
    if (peak[0]<LOWORD(level)) then
      peak[0]:=LOWORD(level); // set left peak
      if (peak[1]<HIWORD(level)) then
      peak[1]:=HIWORD(level); // set right peak

    if BASS_ChannelIsActive(decoder) <> BASS_ACTIVE_PLAYING then
    begin
      break; // reached the end
      end else
      position := BASS_ChannelGetPosition(decoder) div bpp;

    if position > cpos then
    begin
      inc(counter);
      if counter <= length(wavebufL)-1 then
      begin}
        wavebufL[i] := peak[0];
        wavebufR[i] := peak[1];
      end;

      if (position >= dword(PB.ClientWidth)) then
        break;
      cpos := position;
     end;

    peak[0] := 0;
    peak[1] := 0;
  end;
  BASS_StreamFree(decoder); // free the decoder
end;
GetPeak:

Delphi-Quellcode:
function TBassPlayer.GetLPeak(position:integer): Integer;
begin
   result:= WaveBufL[position];
end;

function TBassPlayer.GetRPeak(position:integer): Integer;
begin
   result:= WaveBufR[position];
end;
Und Aufruf + zeichnen im eigentlichen Programm:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
MPlayer.ScanPeaks(ListBox1.Items.Strings[0],PB);
DrawSpectrum;
end;

procedure TForm1.DrawSpectrum;
var
  i,ht : integer;
begin

  //draw peaks

  ht := PB.ClientHeight div 2;

  for i:=1 to PB.ClientWidth do
  begin
      bmp.Canvas.MoveTo(i, ht);
       bmp.Canvas.Pen.Color := clLime;
      bmp.Canvas.LineTo(i,ht-trunc((MPlayer.GetLPeak(i-1) / 32768) * ht));
      bmp.Canvas.Pen.Color := clLime;
      bmp.Canvas.MoveTo(i, ht+2);
      bmp.Canvas.LineTo(i, ht+2+trunc((MPlayer.GetRPeak(i-1) / 32768) * ht));
  end;

  PB.Refresh;
end;
Nun ist aber das Problem, dass die Grafik nicht richtig angezeit wird. (Im Anhang einmal ein Bild wie es aussehen müsste und eins wie es aussieht)

Jemand eine Idee woran das liegen kann ?

mfg Blamaster
Angehängte Grafiken
Dateityp: png richtig_108.png (7,5 KB, 54x aufgerufen)
Dateityp: png falsch_444.png (3,7 KB, 51x aufgerufen)
Angehängte Dateien
Dateityp: rar custloop_110.rar (272,2 KB, 56x aufgerufen)
  Mit Zitat antworten Zitat
 


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 15:12 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