Beatdetection
Beaterkennung
Ich habe mich mit Beaterkennung beschäftigt um die Geschwindigkeit eines Musikstücks herauszufinden. Ursprünglich entstammt dies einer größeren Idee. Es sollte anhand der ausgelesenen Zeiten ein Musikstück sinnvoll aufgetrennt werden und wieder zufällig zusammengesetzt werden. Aber schon der Beatcounter erwies sich für mich, als Programmierneuling in diesem Anfängerkurs, als nur schwer umsetzbare Aufgabe.
Ansätze zur Beaterkennung
Ansätze zur Beaterkennung habe ich mehrere gefunden. Die wohl berühmteste und am meisten umgesetzte Methode Takte zu erkennen hat Eric D. Scheirer mit „Tempo and Beat Analysis of Acoustic Musical Signals“ zu Papier gebracht. Aufs Wesentlichste reduziert arbeitet sein Algorithmus so, dass die Musik zuerst durch eine Filterbank in sechs Frequenzbänder geteilt wird. Dann werden die jeweiligen Hüllkurven berechnet und die wiederum durchlaufen Kammfilterresonatoren. Dort wird geschaut wo die Kammfilter das Signal periodisch sperren. Die periodischen Auslöschungen aller Frequenzbänder werden miteinander verglichen und dann gibt es in Echtzeit eine sehr präzise Angabe über die Geschwindigkeit. Durch die sechs Frequenzbänder funktioniert das Ganze Musikstilunabhängig. Dieser Algorithmus ist allerdings sehr komplex und übersteigt meine mathematischen Fähigkeiten bei weitem.
Ein neuer Weg den Takt zu erkennen kommt von Uchihashi Foote. Das zu analysierende Musikstück wird ausgelesen und in eine optische Form gebracht. Auf dieser Art Matrix aus Messwerten wird, ganz vereinfacht, geschaut man auf periodisch wiederkehrende Muster und setzt diese in ein Verhältnis zur Musik.
Ein weiterer Ansatz wäre es das Musikstück einfach mit vorher definierten Geschwindigkeiten zu vergleichen. Zum Beispiel könnte man alle Geschwindigkeiten von 60 – 160 Bpm nacheinander mit dem Stück zu vergleichen und sehen was am besten passt, ähnlich dem Anpassen der Geschwindigkeit zweier Vinylplatten beim Djing. Wenn ich eine Geschwindigkeit kenne bekomme ich damit auch die andere heraus.
Mein eigentlicher Ansatz war dann aber doch noch etwas anders. Auf das wesentliche reduziert messe ich die Zeitspanne zwischen den größten Amplituden, zähle wie oft die jeweiligen Zeiten vorkommen und die Zeitspanne, die am häufigsten auftaucht zeigt die zeigt die Geschwindigkeit an.
In pd habe ich das so umgesetzt – Am Anfang wird eine Tondatei über einen normalen Öffnen-Dialog ausgesucht und in ein Array geladen. Spielt man das Stück ab, wird das Frequenzspektrum zunächst durch zwei Lowpassfilter auf die tiefen Frequenzen begrenzt. Das ist nötig weil ich das wichtigste Objekt in diesem Patch, den [bonk~], nicht so nutzen konnte wie dies, eigentlich gedacht ist. [bonk~] kann „antrainiert“ werden, elf verschiedene perkussive Elemente zu erkennen und für jedes dieser kann er die Anschlagzeiten ausgeben, aber das hat in meinem Fall nicht funktioniert. Also habe ich mit der Begrenzung auf den Bass, schon die Funktion von [bonk~] auf das Wesentliche begrenzt. Aus dem Ausgang den ich nutze, kommt im Prinzip nur ein Wert, der anzeigt wie hoch die Amplitude ist, wenn ein bestimmter Wert überschritten wurde. Mit einem [timer] messe ich dann wie viele Millisekunde zwischen diesen Nachrichten liegen. Diese Werte setze ich dann in Relation zu einer Minute, und zähle wie oft welcher Wert vorkommt. Aus der Konsole wird dann ausgelesen welcher Wert am meisten vorkommt und das ist dann am wahrscheinlichsten die Geschwindigkeit in Beats per Minute.
Durch die Beschränkung auf die tiefen Frequenzen sind auch die Messerfolge auf Musik begrenzt, bei der der Takt auf dem Bassbereich liegt. Gut funktioniert es zum Beispiel bei einfacher elektronischer Musik mit Viervierteltakt. Tests mit Rock oder Hip Hop haben zu keinem sinnvollen Ergebnis geführt.
HIDin
Nach der Arbeit am Beatcounter habe ich ein paar Experimente mit dem [hidin] gemacht. Ziel war es Töne mit einem Xbox-Controller zu steuern. Zum Beispiel habe ich ein Wobbelbass mit den Hinteren Triggern in der Lautstärke und Wellenlänge der Trägerwelle für die Modulation gesteuert. Den Patch fertig zu stellen war mir allerdings nicht möglich, weil pd immer abgestürzt ist sobald ich am Controller etwas gedrückt hab und danach wieder in den Editiermodus zurück gewechselt bin Keines der vielen Nightlybuilds oder eine neue Komplettversion hat das Problem behoben. Audiotreiber habe ich auch zwei verschiedene probiert aber anscheinend liegt das Problem entweder direkt an Windows oder an der Verknüpfung zu den Usbports. An meinem anderen Computer lief es noch schlechter, dort ließ sich nicht einmal ein Asiotreiber ordentlich installieren.