![]() |
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:
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.
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;
Delphi-Quellcode:
Benutze ich eine falsche Methode der bass_fx.dll oder wo liegt das Problem?!
procedure bpmproc(aStream: DWord; bpm: single; user: DWord);
begin Form3.Label3.Caption := FloatToStr(bpm); end; Viele Grüße |
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 |
AW: BASS.dll (FX): BPM aus RecordStream
Jeweils Version 2.4
Im DuffRecording gebe ich immer True zurück:
Delphi-Quellcode:
Ansonsten habe ich keine weiteren Parameter gesetzt - vielleicht liegt das dann daran?! :)
function DuffRecording(handle : HRECORD; const Buffer : Pointer; Length : DWORD; user : Pointer) : Boolean; stdcall;
begin Result := True; // continue recording end; Viele Grüße |
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 |
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:
eine Zugriffsverletzung in der DLL auf...
BASS_FX_BPM_BeatCallbackSet(ChannelR, @bpmproc, 0);
Anbei mal die gesamte Unit, die ist betzüglich des Ablaufs mit deinem Beispielprojekt identisch soweit ich das sehe... :( EDIT Doch nicht... |
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 |
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? |
AW: BASS.dll (FX): BPM aus RecordStream
Zitat:
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 ![]() Sonst wird das nie was :) Dort ist auch ein BPM Sample enthalten. gruss |
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:
klappt,
procedure GetBeatPos_Callback(handle: DWORD; beatpos: DOUBLE; user: Pointer); stdcall;
Delphi-Quellcode:
klappt nicht...
procedure irgendwas(handle: DWORD; beatpos: DOUBLE; user: Pointer); stdcall;
Sehr interessant^^ Oder es lag an irgendwelchen Build-Artefakten, die das verunreinigt haben... |
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 15:09 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