Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi BASS.dll (FX): BPM aus RecordStream (https://www.delphipraxis.net/189102-bass-dll-fx-bpm-aus-recordstream.html)

Delphi-Narr 3. Mai 2016 18:39

BASS.dll (FX): BPM aus RecordStream
 
Hallo,

ich bin noch recht neu in der Verwendung der BASS.dll (und der BASS_FX ebenso).

Ich möchte den Ton, welcher via LineIn den PC erreicht, hinsichtlich BPM analysieren (oder bei jedem Beat benachrichtigt werden).

Bisher analysiere ich nur die Gesamtlautstärke (Peak) des Streams und versuche mir da mit diversen Algorithmen etwas auszulesen - klappt meistens auch, ist aber sehr störanfällig.

Hier erstmal die Initialisierung des Streams:

Delphi-Quellcode:
if (not BASS_RecordInit(-1)) then
begin
    Error('Error init record');
end else begin
    ChannelR := BASS_RecordStart(44100, 1, 0, @DuffRecording, NIL);
    if ChannelR = 0 then
      begin
        startedR := False;
          Error('Error starting recording!');
      end
    else
      begin
        // BASS_FX_BPM_CallbackSet(ChannelR, @bpmproc, 4, Makelong(45,230), BASS_FX_BPM_MULT2, 0); <- Problem
        startedR := True;
      end;
end;
Sobald ich die kommentierte Zeile wieder benutze, wird das Callback einmal aufgerufen und gibt einen recht beliebig wirkenden Wert aus. Anschließend bricht das Programm mit einer Array Index out Of Bounds ab.

Delphi-Quellcode:
procedure bpmproc(aStream: DWord; bpm: single; user: DWord);
begin
    Form3.Label3.Caption := FloatToStr(bpm);
end;
Benutze ich eine falsche Methode der bass_fx.dll oder wo liegt das Problem?!

Viele Grüße

EWeiss 3. Mai 2016 19:53

AW: BASS.dll (FX): BPM aus RecordStream
 
Einfach zu wenig Informationen.

Bass, Bass_FX Version..
Was gibst du im Callback DuffRecording zurück.
Welche Parameter für FX wurden gesetzt ?

gruss

Delphi-Narr 3. Mai 2016 20:01

AW: BASS.dll (FX): BPM aus RecordStream
 
Jeweils Version 2.4

Im DuffRecording gebe ich immer True zurück:

Delphi-Quellcode:
function DuffRecording(handle : HRECORD; const Buffer : Pointer; Length : DWORD; user : Pointer) : Boolean; stdcall;
begin
  Result := True;   // continue recording
end;
Ansonsten habe ich keine weiteren Parameter gesetzt - vielleicht liegt das dann daran?! :)

Viele Grüße

EWeiss 3. Mai 2016 20:11

AW: BASS.dll (FX): BPM aus RecordStream
 
EDIT:
Ich denke es liegt hier dran.
BASS_FX_BPM_BeatCallbackSet nicht BASS_FX_BPM_CallbackSet.

BASS_FX_BPM_CallbackSet = return(Beat Position)
Delphi-Quellcode:
BASS_FX_BPM_CallbackSet(chan, @GetBPM_Callback, StrToFloat(ebPeriod.Text), 0, BASS_FX_BPM_MULT2, nil)


BASS_FX_BPM_BeatCallbackSet = return(BPM pro definierter Sekunden)
Delphi-Quellcode:
BASS_FX_BPM_BeatCallbackSet(chan, @GetBeatPos_Callback, nil)


gruss

Delphi-Narr 3. Mai 2016 20:55

AW: BASS.dll (FX): BPM aus RecordStream
 
Liste der Anhänge anzeigen (Anzahl: 2)
Danke,

das sollte auf jeden Fall schonmal nen Unterschied machen - leider klappt es immer noch nicht.

Ich habe mal die Bass Units aus dem Projekt von dir genommen und hoffentlich alles angepasst.

Dennoch tritt nach
Delphi-Quellcode:
  BASS_FX_BPM_BeatCallbackSet(ChannelR, @bpmproc, 0);
eine Zugriffsverletzung in der DLL auf...

Anbei mal die gesamte Unit, die ist betzüglich des Ablaufs mit deinem Beispielprojekt identisch soweit ich das sehe... :(

EDIT
Doch nicht...

EWeiss 3. Mai 2016 21:06

AW: BASS.dll (FX): BPM aus RecordStream
 
Habe meinen Beitrag editiert..


Nebenbei
Delphi-Quellcode:
BASS_FX_BPM_BeatCallbackSet(ChannelR, @bpmproc, 0);


gleicht
Delphi-Quellcode:
BASS_FX_BPM_BeatCallbackSet(ChannelR, @bpmproc, nil);


gruss

Delphi-Narr 3. Mai 2016 21:14

AW: BASS.dll (FX): BPM aus RecordStream
 
Bei der Verwendung von nil als drittem Parameter meckert der Compiler, da Cardinal und Pointer inkompatibel sind.

Den Edit hatte ich bemerkt - die andere Funktion nutze ich ja bereits. Die führt jetzt nur zu einer Zugriffsverletzung statt zu einer OOB Exception.

Oder habe ich da jetzt was übersehen?

EWeiss 3. Mai 2016 21:18

AW: BASS.dll (FX): BPM aus RecordStream
 
Zitat:

Zitat von Delphi-Narr (Beitrag 1337413)
Bei der Verwendung von nil als drittem Parameter meckert der Compiler, da Cardinal und Pointer inkompatibel sind.

Den Edit hatte ich bemerkt - die andere Funktion nutze ich ja bereits. Die führt jetzt nur zu einer Zugriffsverletzung statt zu einer OOB Exception.

Oder habe ich da jetzt was übersehen?

Sorry keine Ahnung was du da verwendest ;)
Delphi-Quellcode:
function BASS_FX_BPM_BeatCallbackSet(handle: DWORD; proc: BPMBEATPROC; user: Pointer): BOOL;


ist bei mir ein Pointer = Nil kein Cardinal = 0

Lade dir doch bei Un4Seen mal die letzte Version herunter
Sonst wird das nie was :)
Dort ist auch ein BPM Sample enthalten.

gruss

Delphi-Narr 3. Mai 2016 21:35

AW: BASS.dll (FX): BPM aus RecordStream
 
Die aktuelle Version habe ich jetzt runtergeladen und es funktioniert sogar :D

Wobei es auch mit der alten funktioniert - wenn ich die Callback Methode exakt so benenne wie im Beispiel...

Habe es jetzt mit beiden Versionen getestet:

Delphi-Quellcode:
procedure GetBeatPos_Callback(handle: DWORD; beatpos: DOUBLE; user: Pointer); stdcall;
klappt,

Delphi-Quellcode:
procedure irgendwas(handle: DWORD; beatpos: DOUBLE; user: Pointer); stdcall;
klappt nicht...
Sehr interessant^^

Oder es lag an irgendwelchen Build-Artefakten, die das verunreinigt haben...

EWeiss 3. Mai 2016 21:42

AW: BASS.dll (FX): BPM aus RecordStream
 
Delphi-Quellcode:
procedure irgendwas(handle: DWORD; beatpos: DOUBLE; user: Pointer); stdcall; klappt nicht...

Funktioniert auch wenn du die Callback vorher initialisierst.

Anstelle von
Delphi-Quellcode:
BASS_FX_BPM_BeatCallbackSet(chan, @GetBeatPos_Callback, nil)

dies
Delphi-Quellcode:
BASS_FX_BPM_BeatCallbackSet(chan, @irgendwas, nil)


Welchen Namen du für die Callback verwendest ist schnuppe ;)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr.
Seite 1 von 2  1 2      

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