it-swarm-eu.dev

Beats pro Minute von Echtzeit-Audioeingang

Ich möchte eine einfache C # -Anwendung schreiben, um das Line-In-Audio zu überwachen und mir die aktuellen Schläge pro Minute (gut, den laufenden Durchschnitt) zu geben.

Ich habe diesen gamedev-Artikel gesehen, und das war absolut keine Hilfe. Ich ging durch und versuchte zu implementieren, was er tat, aber es funktionierte einfach nicht.

Ich weiß, dass es hierfür eine Unmenge an Lösungen geben muss, da jede Menge DJ-Software dies tut, aber ich habe kein Glück, eine Open-Source-Bibliothek oder Anweisungen dazu zu finden, sie selbst auszuführen.

42
Karl

Berechnen Sie ein Leistungsspektrum mit einem Schiebefenster FFT: Nehmen Sie 1024 Proben: 

double[] signal = stream.Take(1024);

Füttere es mit einem FFT-Algorithmus: 

double[] real = new double[signal.Length];
double[] imag = new double[signal.Length);
FFT(signal, out real, out imag);

Sie erhalten einen Realteil und einen Imaginärteil. Werfen Sie den imaginären Teil NICHT weg. Machen Sie dasselbe mit dem Realteil wie mit dem Imaginären. Zwar ist der Imaginärteil pi/2 außer Phase mit dem Real, aber er enthält immer noch 50% der Spektrumsinformationen.

BEARBEITEN:

Berechnen Sie die Leistung im Gegensatz zur Amplitude, so dass Sie eine hohe Zahl haben, wenn sie laut ist und nahe an Null ist, wenn sie leise ist:

for (i=0; i < real.Length; i++) real[i] = real[i] * real[i];

Ähnlich für den Imaginärteil.

for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i];

Jetzt haben Sie ein Leistungsspektrum für die letzten 1024 Samples. Wo der erste Teil des Spektrums die niedrigen Frequenzen und der letzte Teil des Spektrums die hohen Frequenzen sind.

Wenn Sie BPM in der populären Musik finden möchten, sollten Sie sich wahrscheinlich auf den Bass konzentrieren. Sie können die Bassintensität erfassen, indem Sie den unteren Teil des Leistungsspektrums summieren. Welche Zahlen verwendet werden, hängt von der Abtastfrequenz ab:

double bassIntensity = 0;
for (i=8; i < 96; i++) bassIntensity += real[i];

Machen Sie dasselbe noch einmal, verschieben Sie das Fenster jedoch um 256 Samples, bevor Sie ein neues Spektrum berechnen. Nun endet die Berechnung der bassIntensity für alle 256 Samples. 

Dies ist eine gute Eingabe für Ihre BPM-Analyse. Wenn der Bass leise ist, haben Sie keinen Beat und wenn er laut ist, haben Sie einen Beat. 

Viel Glück!

26
Hallgrim

Es gibt ein hervorragendes Projekt namens Dancing Monkeys, bei dem DDR-Tanzschritte aus der Musik prozedural generiert werden. Ein großer Teil dessen, was es tut, basiert auf (notwendigerweise sehr genauen) Beat-Analysen. In der Projektarbeit werden die verschiedenen Beat-Erkennungsalgorithmen und ihre Eignung für die Aufgabe ausführlich beschrieben. Sie enthalten Verweise auf die Originalarbeiten für jeden der Algorithmen. Sie haben auch den Matlab-Code für ihre Lösung veröffentlicht. Ich bin mir sicher, dass Sie zwischen ihnen finden können, was Sie brauchen.

Es ist alles hier verfügbar: http://monket.net/dancing-monkeys-v2/Main_Page

15
Nick Johnson

Nicht, dass ich eine Ahnung habe, wie ich dies implementieren kann, aber aus Audiotechnik-Sicht müssten Sie zuerst filtern. Bassdrum-Hits wären die ersten, die nachgesehen haben. Ein Tiefpassfilter, der alles unter 200 Hz liefert, sollte ein ziemlich klares Bild der Bassdrum vermitteln. Ein Gate könnte auch erforderlich sein, um Störungen durch andere Instrumente mit so niedrigen Oberwellen zu beseitigen.

Der nächste zu überprüfende Punkt wäre ein Snare-Hit. Sie müssten dieses EQ EQ. Der "Crack" einer Snare liegt etwa 1,5 kHz vom Speicher entfernt, aber Sie müssten diese definitiv aufgreifen.

Die nächste Herausforderung wäre, einen Algorithmus für funky Beats auszuarbeiten. Wie würdest du programmatisch Beat 1 finden? Ich vermute, Sie würden die vorherigen Beats verfolgen und ein Muster verwenden, das zu dem Anderen passt. Sie benötigen also wahrscheinlich ein paar Takte, um den Takt genau zu finden. Dann gibt es Timing-Probleme wie 4/4, 3/4, 6/8, wow, ich kann mir nicht vorstellen, was nötig wäre, um dies genau zu tun! Ich bin mir sicher, dass es für Audio-Hardware-/Software-Unternehmen einiges wert ist.

8
Dan Harper

Dies ist keineswegs ein einfaches Problem. Ich werde versuchen, Ihnen nur einen Überblick zu geben.

Was Sie tun könnten, ist etwa Folgendes:

  1. Berechnen Sie die durchschnittliche (mittlere quadratische) Lautstärke des Signals über Blöcke von beispielsweise 5 Millisekunden. (Da ich das noch nie gemacht habe, weiß ich nicht, was eine gute Blockgröße wäre.)
  2. Nehmen Sie die Fourier-Transformation des "blockierten" Signals mit dem FFT-Algorithmus vor.
  3. Finden Sie die Komponente im transformierten Signal mit der größten Stärke.

Eine Fourier-Transformation ist im Wesentlichen eine Methode zur Berechnung der Stärke aller im Signal vorhandenen Frequenzen. Wenn Sie dies über das "blockierte" Signal tun, wird die Taktfrequenz hoffentlich die stärkste sein.

Möglicherweise müssen Sie zuerst einen Filter anwenden, um auf bestimmte Frequenzen (wie den Bass) zu fokussieren, die normalerweise die meisten Informationen zum BPM enthalten.

6
Thomas

Ich habe diese Bibliothek gefunden, die eine ziemlich solide Implementierung für die Erkennung von Beats pro Minute . http://soundtouchdotnet.codeplex.com/ aufweist.

Es basiert auf http://www.surina.net/soundtouch/index.html , das in vielen DJ-Projekten verwendet wird http://www.surina.net/soundtouch/applications.html

5
eandersson

Zunächst produziert Hallgrim nicht die spektrale Leistungsdichtefunktion. Statistische Periodizitäten in jedem Signal können durch eine Autokorrelationsfunktion herausgearbeitet werden. Die Fourier-Transformation des Autokorrelationssignals ist die spektrale Leistungsdichte. Dominierende Peaks in der PSD mit Ausnahme von 0 Hz entsprechen der effektiven Periodizität des Signals (in Hz) 

1
pete

Ich empfehle die BASS-Audiobibliothek und den BASS.NET-Wrapper. Es hat eine eingebaute BPMCounter-Klasse. 

Details zu dieser spezifischen Funktion finden Sie unter http://bass.radio42.com/help/html/0833aa5a-3be9-037c-66f2-9adfd42a8512.htm .

0
Matt Williams

Der einfachste Weg ist, den Benutzer im Rhythmus des Beats auf eine Taste tippen zu lassen und die Anzahl der Taps durch die Zeit zu zählen.

0
Lucius Kwok