Wie kann das Tempo / BPM eines Songs programmgesteuert bestimmt werden? Welche Algorithmen werden üblicherweise verwendet und welche Überlegungen müssen angestellt werden?
Antworten:
Dies ist schwierig in einem einzelnen StackOverflow-Beitrag zu erklären. Im Allgemeinen arbeiten die einfachsten Beat-Erkennungsalgorithmen, indem sie Spitzen in der Schallenergie lokalisieren, was leicht zu erkennen ist. Anspruchsvollere Methoden verwenden Kammfilter und andere statistische / Wellenformmethoden. Eine ausführliche Erklärung mit Codebeispielen finden Sie in diesem GameDev-Artikel .
Die zu suchenden Schlüsselwörter sind "Beat Detection", "Beat Tracking" und "Music Information Retrieval". Hier gibt es viele Informationen: http://www.music-ir.org/
Es gibt einen (vielleicht) jährlichen Wettbewerb namens MIREX, bei dem verschiedene Algorithmen auf ihre Schlagerkennungsleistung getestet werden.
http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/
Das sollte Ihnen eine Liste der zu testenden Algorithmen geben.
Ein klassischer Algorithmus ist Beatroot (google it), der schön und leicht zu verstehen ist. Es funktioniert so:
Nachteile dieses Algorithmus meiner Erfahrung nach:
Hier ist eine Demo einer Live-Version dieses Algorithmus, die den Spektralfluss (schwarze Linie unten) und den Beginn (grüne Kreise) zeigt. Es ist zu bedenken, dass der Beat nur aus den grünen Kreisen extrahiert wird . Ich habe die Onsets nur als Klicks wiedergegeben, und um ehrlich zu sein, glaube ich nicht, dass ich den Beat von ihnen hören konnte. In mancher Hinsicht ist dieser Algorithmus also besser als Leute bei der Beat-Erkennung. Ich denke, die Reduktion auf ein so niedrigdimensionales Signal ist jedoch sein schwacher Schritt.
Ärgerlicherweise habe ich vor einigen Jahren eine sehr gute Seite mit vielen Algorithmen und Code zur Beat-Erkennung gefunden. Ich habe es jedoch völlig versäumt, es wiederzufinden.
Hier sind einige großartige Links, die Ihnen den Einstieg erleichtern sollen:
Die Beat-Extraktion beinhaltet die Identifizierung kognitiver metrischer Strukturen in der Musik. Sehr oft entsprechen diese nicht der physischen Schallenergie - zum Beispiel gibt es in den meisten Musikstücken eine Synkopierungsstufe, was bedeutet, dass der von uns wahrgenommene "Fußklopf" -Beat nicht dem Vorhandensein eines physischen Klangs entspricht. Dies bedeutet, dass dies ein ganz anderes Feld ist als die Onset-Erkennung , dh die Erkennung der physischen Geräusche, und auf eine andere Art und Weise durchgeführt wird.
Sie können die Aubio- Bibliothek ausprobieren , eine einfache C-Bibliothek, die sowohl Tools zum Einsetzen als auch zum Extrahieren von Beats bietet.
Es gibt auch die Online- Echonest-API , obwohl dies das Hochladen einer MP3- Datei auf eine Website und das Abrufen von XML umfasst und daher möglicherweise nicht so geeignet ist.
EDIT: Ich bin letzte Nacht auf eine sehr vielversprechend aussehende C / C ++ - Bibliothek gestoßen, obwohl ich sie selbst nicht benutzt habe. Vamp Plugins
Das allgemeine Forschungsgebiet, an dem Sie interessiert sind, heißt MUSIC INFORMATION RETRIEVAL
Es gibt viele verschiedene Algorithmen, die dies tun, aber alle konzentrieren sich im Wesentlichen auf ONSET DETECTION.
Die Onset-Erkennung misst den Beginn eines Ereignisses. In diesem Fall handelt es sich bei dem Ereignis um eine gespielte Note. Sie können nach Änderungen in der gewichteten Fourier-Transformation (Hochfrequenzinhalt) suchen. Sie können nach großen Änderungen im spektralen Inhalt suchen. (Spektraldifferenz). (Es gibt ein paar Artikel, die Sie weiter unten untersuchen sollten.) Sobald Sie einen Algorithmus zur Erkennung des Einsetzens angewendet haben, wählen Sie über die Schwellenwerte aus, wo die Beats sind.
Es gibt verschiedene Algorithmen, die Sie verwenden können, sobald Sie diese Zeitlokalisierung des Beats erhalten haben. Sie können daraus eine Impulsfolge machen (erstellen Sie ein Signal, das für alle Zeiten Null und nur dann 1 ist, wenn Ihr Beat auftritt), dann wenden Sie eine FFT darauf an, und BAM hat jetzt eine Häufigkeit von Einsätzen am größten Peak.
Hier sind einige Papiere, die Sie in die richtige Richtung führen sollen:
http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf
http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf
Hier ist eine Erweiterung dessen, was einige Leute diskutieren:
Jemand erwähnte die Anwendung eines Algorithmus für maschinelles Lernen: Sammeln Sie im Grunde genommen eine Reihe von Merkmalen aus den Funktionen zur Erkennung des Einsetzens (siehe oben) und kombinieren Sie sie mit dem Rohsignal in einem neuronalen Netzwerk / einer logistischen Regression und lernen Sie, was einen Schlag zu einem Schlag macht.
Schauen Sie sich Dr. Andrew Ng an, er hat kostenlose Online-Vorlesungen über maschinelles Lernen von der Stanford University (nicht die langwierigen Videovorträge, es gibt tatsächlich einen Online-Fernkurs).
Wenn Sie es schaffen, mit Python-Code in Ihrem Projekt zu kommunizieren , ist die Echo Nest Remix-API eine ziemlich raffinierte API für Python:
Es gibt eine Methode analysis.tempo
, mit der Sie den BPM erhalten. Es kann viel mehr als nur einfaches BPM, wie Sie den API-Dokumenten oder diesem Tutorial entnehmen können
Führen Sie eine Fourier-Transformation durch und finden Sie Spitzen im Leistungsspektrum. Sie suchen nach Spitzen unterhalb des 20-Hz-Grenzwerts für das menschliche Gehör. Ich würde normalerweise im Bereich von 0,1 bis 5 Hz als großzügig empfinden.
SO Frage, die helfen könnte: Bpm Audio Detection Library
Hier ist auch eine von mehreren "Peak Finding" -Fragen zu SO: Peak Detection des gemessenen Signals
Bearbeiten: Nicht, dass ich Audioverarbeitung mache. Es ist nur eine Vermutung, die auf der Tatsache basiert, dass Sie nach einer Frequenzdomäneneigenschaft der Datei suchen ...
Eine weitere Änderung: Es ist erwähnenswert, dass verlustbehaftete Komprimierungsformate wie MP3 in erster Linie Fourier-Domänendaten anstelle von Zeitdomänendaten speichern. Mit ein wenig Klugheit können Sie sich einige schwere Berechnungen ersparen ... aber sehen Sie sich den nachdenklichen Kommentar von Cobbal an.
Eine genaue BPM-Erkennung ist sehr schwierig. Siehe diese Stackoverflow-Frage und meine Antwort darauf.
Um meine Antwort erneut zu veröffentlichen: Der einfache Weg, dies zu tun, besteht darin, den Benutzer im Rhythmus des Schlags auf eine Schaltfläche tippen zu lassen und die Anzahl der Taps geteilt durch die Zeit zu zählen.
Andere haben bereits einige Beat-Detection-Methoden beschrieben. Ich möchte hinzufügen, dass einige Bibliotheken verfügbar sind, die Techniken und Algorithmen für diese Art von Aufgabe bereitstellen.
Aubio ist einer von ihnen, hat einen guten Ruf und ist in C mit einem C ++ - Wrapper geschrieben, sodass Sie es problemlos in eine Kakaoanwendung integrieren können (alle Audio-Inhalte in Apples Frameworks sind auch in C / C ++ geschrieben).
Es gibt verschiedene Methoden, um die BPM zu erhalten, aber die, die ich am effektivsten finde, ist das "Beat-Spektrum" ( hier beschrieben ). Dieser Algorithmus berechnet eine Ähnlichkeitsmatrix, indem er jedes kurze Musikbeispiel miteinander vergleicht. Sobald die Ähnlichkeitsmatrix berechnet ist, ist es möglich, eine durchschnittliche Ähnlichkeit zwischen jedem Abtastpaar {S (T); S (T + 1)} für jedes Zeitintervall T zu erhalten: Dies ist das Schwebungsspektrum. Der erste hohe Peak im Beat-Spektrum ist meistens die Beat-Dauer. Das Beste daran ist, dass Sie auch Dinge wie Musikstruktur- oder Rhythmusanalysen durchführen können.
Hier ist ein kostenloses Programm , das BPM analysiert und in das ID3V2-Tag schreibt. Keine Ahnung wie gut
Ich würde mir vorstellen, dass dies bei 4-4 Tanzmusik am einfachsten ist, da es ungefähr zweimal pro Sekunde einen einzelnen Niederfrequenzschlag geben sollte.