AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi BASS.dll (FX): BPM aus RecordStream

BASS.dll (FX): BPM aus RecordStream

Ein Thema von Delphi-Narr · begonnen am 3. Mai 2016 · letzter Beitrag vom 4. Mai 2016
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#1

BASS.dll (FX): BPM aus RecordStream

  Alt 3. Mai 2016, 19:39
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

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

  Alt 3. Mai 2016, 20:53
Einfach zu wenig Informationen.

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

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#3

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

  Alt 3. Mai 2016, 21:01
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

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

  Alt 3. Mai 2016, 21:11
EDIT:
Ich denke es liegt hier dran.
BASS_FX_BPM_BeatCallbackSet nicht BASS_FX_BPM_CallbackSet.

BASS_FX_BPM_CallbackSet = return(Beat Position)
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)
BASS_FX_BPM_BeatCallbackSet(chan, @GetBeatPos_Callback, nil)

gruss

Geändert von EWeiss ( 3. Mai 2016 um 22:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#5

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

  Alt 3. Mai 2016, 21:55
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
  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...
Miniaturansicht angehängter Grafiken
error.jpg  
Angehängte Dateien
Dateityp: pas Unit3.pas (2,8 KB, 10x aufgerufen)

Geändert von Delphi-Narr ( 3. Mai 2016 um 22:06 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

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

  Alt 3. Mai 2016, 22:06
Habe meinen Beitrag editiert..


Nebenbei
BASS_FX_BPM_BeatCallbackSet(ChannelR, @bpmproc, 0);

gleicht
BASS_FX_BPM_BeatCallbackSet(ChannelR, @bpmproc, nil);

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#7

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

  Alt 3. Mai 2016, 22:14
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?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

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

  Alt 3. Mai 2016, 22:18
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
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

Geändert von EWeiss ( 3. Mai 2016 um 22:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#9

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

  Alt 3. Mai 2016, 22:35
Die aktuelle Version habe ich jetzt runtergeladen und es funktioniert sogar

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:

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

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

Oder es lag an irgendwelchen Build-Artefakten, die das verunreinigt haben...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

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

  Alt 3. Mai 2016, 22:42
procedure irgendwas(handle: DWORD; beatpos: DOUBLE; user: Pointer); stdcall; klappt nicht...
Funktioniert auch wenn du die Callback vorher initialisierst.

Anstelle von
BASS_FX_BPM_BeatCallbackSet(chan, @GetBeatPos_Callback, nil)
dies
BASS_FX_BPM_BeatCallbackSet(chan, @irgendwas, nil)

Welchen Namen du für die Callback verwendest ist schnuppe

gruss

Geändert von EWeiss ( 3. Mai 2016 um 22:48 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:36 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