In dieser Herausforderung besteht Ihre Aufgabe darin, eine einfache Aufnahme im MP3-Format zu erstellen und die Zeitversätze der Beats in der Datei zu ermitteln. Zwei Beispielaufnahmen sind hier:
https://dl.dropboxusercontent.com/u/24197429/beats.mp3 https://dl.dropboxusercontent.com/u/24197429/beats2.mp3
Hier ist die dritte Aufnahme mit viel mehr Rauschen als die beiden vorherigen:
https://dl.dropboxusercontent.com/u/24197429/noisy-beats.mp3
Zum Beispiel ist die erste Aufnahme 65 Sekunden lang und enthält genau 76 Beats (es sei denn, ich habe falsch gezählt!). Ihre Aufgabe ist es, ein Programm zu entwickeln, das eine solche MP3-Datei als Eingabe verwendet und eine Folge der Zeitversätze in Millisekunden der Beats in der Datei ausgibt. Ein Beat wird natürlich definiert, wenn der Gitarrist eine oder mehrere Saiten zupft.
Ihre Lösung muss:
- Arbeiten Sie an jeder MP3-Datei mit ähnlicher "Komplexität". Es kann zu lauten Aufnahmen oder zu schnell gespielten Melodien kommen - das ist mir egal.
- Sei ziemlich genau. Die Toleranz beträgt +/- 50 ms. Wenn der Beat also bei 1500 ms auftritt und Ihre Lösung 1400 meldet, ist dies nicht akzeptabel.
- Verwenden Sie nur freie Software. Das Aufrufen von ffmpeg ist zulässig, da jede frei verfügbare Software von Drittanbietern für die Sprache Ihrer Wahl verwendet wird.
Das Gewinnkriterium ist die Fähigkeit, Beats trotz Rauschen in den gelieferten Dateien erfolgreich zu erkennen. Im Falle eines Gleichstands gewinnt die kürzeste Lösung (die Länge des Drittanbietercodes wird nicht zur Zählung hinzugefügt).
Antworten:
Python 2.7 492 Bytes (nur beats.mp3)
Diese Antwort kann die Beats in identifizieren
beats.mp3
, identifiziert jedoch nicht alle Noten aufbeats2.mp3
odernoisy-beats.mp3
. Nach der Beschreibung meines Codes werde ich näher darauf eingehen, warum.Dies verwendet PyDub ( https://github.com/jiaaro/pydub ), um die MP3 einzulesen. Alle anderen Verarbeitungen sind NumPy.
Golf Code
Nimmt ein einzelnes Befehlszeilenargument mit dem Dateinamen an. Es gibt jeden Schlag in ms in einer separaten Zeile aus.
Ungolfed Code
Warum ich Notizen zu den anderen Dateien vermisse (und warum sie unglaublich herausfordernd sind)
Mein Code untersucht Änderungen in der Signalstärke, um die Noten zu finden. Denn
beats.mp3
das funktioniert wirklich gut. Dieses Spektrogramm zeigt, wie sich die Leistung über die Zeit (x-Achse) und die Frequenz (y-Achse) verteilt. Mein Code reduziert die y-Achse im Grunde genommen auf eine einzelne Zeile. Visuell ist es sehr einfach zu erkennen, wo die Beats sind. Es gibt eine gelbe Linie, die sich immer wieder verjüngt. Ich ermutige Sie sehr, zuzuhörenbeats.mp3
während Sie dem Spektrogramm folgen, um zu sehen, wie es funktioniert.Als nächstes gehe ich zu
noisy-beats.mp3
(weil das eigentlich einfacher ist als ...)beats2.mp3
. Noch einmal, sehen Sie, ob Sie die Aufnahme mitverfolgen können. Die meisten Zeilen sind schwächer, aber immer noch vorhanden Die leisen Noten fangen an, was es besonders schwierig macht, sie zu finden.beats2.mp3
ist unglaublich herausfordernd. Hier ist das Spektrogramm. Im ersten Bit gibt es einige Linien, aber einige Noten bluten wirklich über die Linien. Um Noten zuverlässig zu identifizieren, müssen Sie zunächst die Tonhöhe der Noten (Grund- und Obertöne) nachverfolgen und feststellen, wo sich diese ändern. Sobald das erste Bit funktioniert, ist das zweite Bit doppelt so hart wie das doppelte Tempo!Grundsätzlich, um all dies zuverlässig zu identifizieren, ist meiner Meinung nach ein ausgefallener Notenerkennungscode erforderlich. Scheint, als wäre dies ein gutes Abschlussprojekt für jemanden in einer DSP-Klasse.
quelle