![]() |
Beat Detection
Liste der Anhänge anzeigen (Anzahl: 2)
Der Beat Detector erkennt aus einer Aufnahmequelle heraus Beats. Es liefert allerdings nicht die bpm Zahl oder so etwas, sondern sendet bei jedem erkannten Beat eine MIDI-Signal.
Der Nutzen des Programms liegt in der Kombination mit anderen Programmen, z.B. ![]() Das Programm wurde darauf optimiert im laufenden Betrieb möglichst schnell zu sein. Wichtigste Besonderheit: Ab Windows Vista wird direkt auf die "Hauptlautstärke" zugegriffen. D.h. auch ohne Stereomix kann die Audioausgabe direkt abgegriffen werden. Beschreibung der neuesten Version ![]() Zur Erkennung des Beats wird ein Algorithmus verwendet, den ich ![]() Der Toneingang wird mittels der Bass.dll gelesen, auch die Fourier-Analyse übernimmt sie. Ich freue mich über jeden Verbesserungsvorschlag! Das Programm erstellt im Benutzerverzeichnis/Lokale Einstellungen/Anwendungsdaten eine Datei(.BeatDetector.ini). Damit die Core-Audio Features funktionieren(Aufnahme der Wiedergabe durch den Lautsprecher) muss die bass.dll aus diesem Beitrag verwendet werden: ![]() ![]() Grobe Funktion der Beat-Analyse(wird mit ca. 40Hz aufgerufen)
Delphi-Quellcode:
type
THistArray= array[0..43] of Single; var fft : array[0..1023] of Single; i, bound_lower, //untere - bound_upper:Integer; //obere Grenze zum erstellen der Bänder Sum:Single;//Energie eines Bandes BandHistory:array [0..31] of THistArray;//Alte Werte der Bänder gespeichert Histposition:0..43;//Aktuelle Stelle im Band History Array LastBeat:Cardinal;//GetTickCount beim letzten erkannten Beat //FFT berechnen, Amplituden speichern BASS_ChannelGetData(MainForm.Channel, @fft, BASS_DATA_FFT1024); // get the FFT data //FFT in Bänder aufteilen bound_lower:=0; for i := 0 to bands - 1 do begin //Bandbreite bestimmen bound_upper:=Trunc(Power(2, i * 10.0 / (BANDS - 1))); if bound_upper>1023 then bound_upper:=1023; if bound_upper<=bound_lower then//mindestens 1 FFT bin verwenden bound_upper:=bound_lower+1; //Summe der Amplituden innerhalb eines Bandes Sum:=0; while bound_lower<bound_upper do begin Sum:=Sum + fft[bound_lower+1]; inc(bound_lower); end; //Amplitude des ganzen Bandes speichern BandHistory[i,HistPosition]:=sum; end; Inc(MainForm.HistPosition); //Erkennen eines Beats(nur, wenn die gesamte Lautstärke nicht zu gering ist if LOWORD(BASS_ChannelGetLevel(Channel)) >= 500 then begin //Beat ist dann, wenn der Ausschlag des Bandes um den Faktor x größer ist als der Durchschnitt der letzten 43 Ausschläge if AverageBandEnergy(BandHistory[SelectedBand]) * DetectingFactor < BandHistory[SelectedBand,HistPosition-1] then //AverageBandEnergy berechnet den Durchschnitt der letzten 43 Ausschläge im gegebenen Band if gettickcount>lastbeat+WaitingTime then//zu schnell aufeinanderfolgende Beats vermeiden begin Beat;//Beat Signal weitergeben lastbeat:=gettickcount; end; end; |
Re: Beat Detection
Wenn ich die Anwendung unter Win7x64 starte (egal ob mit oder ohne Admin-Rechte, und mit Bass.dll), kommt nur eine Fehlermeldung "Can't initialize device", wenige Sekunden später stürzt dann auch noch das ganze Programm ab...
Sonst aber kuhle Sache |
Re: Beat Detection
Zitat:
Delphi-Quellcode:
gruss
DeviceName : PAnsiChar;
DeviceName := BASS_RecordGetInputName(0); while DeviceName <> nil do begin ... Inc(IntI); DeviceName := BASS_RecordGetInputName(IntI); end; if (BASS_RecordGetInput(IntI, Volumelevel) and BASS_INPUT_OFF) = 0 then begin SelectedItem := IntI; end; |
Re: Beat Detection
Hmm, bei mir kommt da nur etwa alle Sekunde ein Sound, obwohl eigentlich gar nichts aktiv ist im Moment. Aber das wird dann vermutlich richtig gehen, wenn man den Eingang auch auswählen kann, vielleicht ist da ein Eingang gestört oder so.
Zitat:
In jedem Fall solltest du die Datei ohne führenden Punkt speichern, das ist unter Windows unüblich. ;-) |
Re: Beat Detection
Hallo,
ich habe jetzt die Auswahl der Audioquelle implementiert. Den Fehler unter Windows 7 kann ich leider nicht nachprüfen. Allerdings habe ich festgestellt, dass ich unter Vista auch keine Audioquelle auswählen kann. Eine Fehlermeldung bekomme ich allerdings nicht. Außerdem wird das Spektrum nicht angezeigt. Im Mixer ist es mir auch nicht möglich den Stereomix als Aufnahmequelle zu wählen. Kann das jemand nachvollziehen? Bzw, kennt sich jemand aus, wie das bei Vista(auch manuell) funktioniert? Zitat:
@EWeiss: Vielen Dank! Für Suchende ergänze ich noch kurz, wie die Quelle dann letztendlich angewählt wird.
Delphi-Quellcode:
Vielen Dank fürs Testen!
BASS_RecordSetInput(IntI, BASS_Input_on, Volumelevel);//Kann einfach während der Aufnahme aufgerufen werden.
Benjamin |
Re: Beat Detection
Mit den von mir angegebenen Funktionen geht beides in Vista und Win7 bei mir
ohne nennenswerte probleme mit meinen Player. Und oder mit Bass_Vis und meinen Sample dafür. gruss |
Re: Beat Detection
Nja, unter Win7 tuts bei mir immernoch nicht resp. stürzt einfach ab.
Aufnahmequellen werden im Programm keine angezeigt. |
Re: Beat Detection
@Florian: Bei Windows 7 funktioniert es bei mir. Allerdings mit folgenden Einschränkungen:
Weiß jemand, woran das liegen könnte? Ich zeichne auf eine PaintBox. Viele Grüße, Benjamin |
Re: Beat Detection
Hi Benjamin,
ich bin noch auf der Suche nach einer vernünftigen Beat-Erkennung für das OpenSource-Projekt PC_DIMMER von ![]() vielen Dank, Christian :) |
Re: Beat Detection
Hallo,
nach langem herumfeilen gibt es jetzt eine neue Version. Folgendes wurde verbessert:
Viel Spaß damit. Wer mich direkt anschreibt, kann den Code einzelner Teile haben, bspws. der Detector-Klasse. Irgendwann werde ich mich auch dazu aufraffen das ganze direkt hier zu posten. Ich freue mich weiter über jede Anregung, jeden Fehlerbericht und jeden Tipp, wie ich etwas eleganter lösen kann. Viele Grüße, Benjamin Download im 1. Beitrag |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:45 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