AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Beat Detection
Thema durchsuchen
Ansicht
Themen-Optionen

Beat Detection

Ein Thema von BenjaminH · begonnen am 7. Sep 2009 · letzter Beitrag vom 2. Mai 2014
Antwort Antwort
Seite 1 von 2  1 2      
BenjaminH
Registriert seit: 14. Okt 2004
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. DMXControl(Lichtsteuerung über DMX Controller am PC) wobei hier mit jedem Beat in eine neue Lichtszene gewechselt wird(Lauflicht o.ä.).
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 hier


Zur Erkennung des Beats wird ein Algorithmus verwendet, den ich bei Gamedev gefunden habe. Wahrscheinlich habe ich nicht alles genau richtig gemacht, weil ich nicht alles so genau verstanden habe. Aber es funktioniert.
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: http://www.un4seen.com/forum/?topic=8816 (Bzw direktlink: http://www.un4seen.com/stuff/bass.dll)

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;
Miniaturansicht angehängter Grafiken
screenshot-1-1-0.png  
Angehängte Dateien
Dateityp: exe beatdetector_307.exe (542,5 KB, 202x aufgerufen)

Geändert von BenjaminH (22. Jun 2010 um 13:08 Uhr)
 
Florian H

 
Delphi 6 Professional
 
#2
  Alt 7. Sep 2009, 21:24
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
Florian Heft
  Mit Zitat antworten Zitat
EWeiss
 
#3
  Alt 8. Sep 2009, 03:21
Zitat:
Die Auswahl der Aufnahmequelle ist noch nicht implementiert(weiß jemand, wie das geht?) Man muss also selbst im Mixer z.B. Stereomix auswählen
Delphi-Quellcode:
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;
gruss
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

 
Delphi 11 Alexandria
 
#4
  Alt 8. Sep 2009, 06:23
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 von BenjaminH:
Das Programm erstellt im Benutzerverzeichnis/Lokale Einstellungen/Anwendungsdaten eine Datei(.BeatDetector.ini).
Du solltest dich lieber ganz an die Standards halten. Dass du es dort speicherst, ist auf jeden Fall schön, aber normalerweise erstellt man dort noch einen Ordner für die Dateien, in deinem Fall z.B. den Ordner BeatDetector und darin dann erst die Datei BeatDetector.ini.
In jedem Fall solltest du die Datei ohne führenden Punkt speichern, das ist unter Windows unüblich.
Sebastian Jänicke
  Mit Zitat antworten Zitat
BenjaminH

 
Turbo Delphi für Win32
 
#5
  Alt 8. Sep 2009, 18:50
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 von jaenicke:
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.
Wenn die Eingangsempfindlichkeit zu hoch gewählt ist, passiert das bei mir auch, selbst dann, wenn eigentlich garkein Ton kommt.

@EWeiss: Vielen Dank!
Für Suchende ergänze ich noch kurz, wie die Quelle dann letztendlich angewählt wird.
BASS_RecordSetInput(IntI, BASS_Input_on, Volumelevel);//Kann einfach während der Aufnahme aufgerufen werden. Vielen Dank fürs Testen!

Benjamin
Benjamin
  Mit Zitat antworten Zitat
EWeiss
 
#6
  Alt 9. Sep 2009, 04:23
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
  Mit Zitat antworten Zitat
Florian H

 
Delphi 6 Professional
 
#7
  Alt 15. Sep 2009, 22:02
Nja, unter Win7 tuts bei mir immernoch nicht resp. stürzt einfach ab.
Aufnahmequellen werden im Programm keine angezeigt.
Florian Heft
  Mit Zitat antworten Zitat
BenjaminH

 
Turbo Delphi für Win32
 
#8
  Alt 24. Okt 2009, 15:52
@Florian: Bei Windows 7 funktioniert es bei mir. Allerdings mit folgenden Einschränkungen:
  • Die Equalizer Anzeige bleibt sofort stehen und verschwindet nach dem Aus- und wieder einbleden komplett.
  • Die Auswahl der Aufnahmequelle ist nicht möglich. Allerdings kann die Eingangsempfindlichkeit der (mit Hilfe von Windows) gewählten Aufnahmequelle gesteuert werden.
Der 1. Fehler tauchte bei mir auch bei Windows XP in etwa so auf. Nur war es so, dass sobald ich den Equalizer aus und wieder eingeblendet habe, das Bild wieder zu sehen war.
Weiß jemand, woran das liegen könnte? Ich zeichne auf eine PaintBox.
Viele Grüße,
Benjamin
Benjamin
  Mit Zitat antworten Zitat
Benutzerbild von christian.noeding
christian.noeding

 
Delphi XE2 Professional
 
#9
  Alt 4. Dez 2009, 12:21
Hi Benjamin,


ich bin noch auf der Suche nach einer vernünftigen Beat-Erkennung für das OpenSource-Projekt PC_DIMMER von http://www.pcdimmer.de. Da das Programm auch in Delphi geschrieben ist, würde ich gerne Teile deines Codes verwenden. Könntest du mir eventuell deine Sourcen mal zukommen lassen (christian.noeding [ att ] arcor.de). Ich würde auch einen entsprechenden Hinweistext auf die Quellen einbauen.


vielen Dank,
Christian
Christian Nöding
  Mit Zitat antworten Zitat
BenjaminH

 
Turbo Delphi für Win32
 
#10
  Alt 16. Apr 2010, 18:36
Hallo,
nach langem herumfeilen gibt es jetzt eine neue Version.
Folgendes wurde verbessert:
  • Anzeige des Spektrums bleibt nicht mehr hängen
  • Keine Abstürze mehr beim laufenden Programm, dafür aber beim beenden
  • Die Auswahl der Audioquelle ist sowohl mit Systemen vor, als auch nach Vista möglich.
  • Ab Vista können auch Audioausgänge als Quelle gewählt werden(So wie Stereo-Mix, nur besser )
    Achtung dafür braucht man die Modifizierte Bass.dll, die in diesem Beitrag zu finden ist.
  • Skalierung des Spektrums
Und einige Dinge unter der Haube.
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
Benjamin
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:28 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