Ergebnis 1 bis 18 von 18

Thema: Anhand der bpm (beats per minute) die ms-Dauer eines einzelnen Beats ermitteln

  1. #1

    Anhand der bpm (beats per minute) die ms-Dauer eines einzelnen Beats ermitteln

    Hallo.

    Folgendes Problem:
    Ich habe hier ein Lied mit konstanten 170bpm. (Vier-Viertel-Takt, denke ich, aber hört nicht auf mich, ich habe keine Ahnung von Musik)

    Nun möchte ich die Länge in Millisekunden eines einzelnen Beats ermitteln. Durch stupides Herumprobieren (ja, das kann ich wiederum) habe ich herausgefunden, dass die Länge eines Beats bei etwa 86ms liegt. Da ich ein exakteres Ergebnis als das benötige (also auch die Kommastellen), suche ich nun nach der Umrechnungs-Formel, komme dabei aber jedes Mal auf andere Ergebnisse oder irgendwelchen Unsinn. Ich kenn mich mit Musik nicht aus. :/

    Weiß hier jemand mehr als ich?

  2. #2
    exakte ergebnisse bekommst du, wenn du das Lied mit irgendwas aufzeichnest (audacity bsp. ist umsonst) und anhand des "Histogramms" des Geräusches "beat" ausmisst wie lang dieser ist, das geht. Durch berechnen geht das überhaupt nicht, da du zwar weißt wie viele Beats pro ms kommen aber nie, wie lang die einzelnen sind. der eig. "ton" beat kann lang mit kurzer Pause oder Kurz mit langer Pause sein, kommt trotzdem die gleiche Anzahl raus.

  3. #3
    Mh, es geht Indy eher um den Abstand zwischen den Tonanfängen.

  4. #4
    Ja wenn du 170 beats per minute hast dann ist ein beat 1min/170 also 60*1000/170 in millisekunden.Das sind bei meinem Taschenrechner: 60000/170 ms = ~352.9411 ms

    Eine verschiebung von Tönen gegeneinander hörst du unter 2ms nicht mehr (sofern du nicht zwei gleiche Wellen übereinander legst).
    Ich nehme mal an du willst irgendwas zusammenschneiden? Du könntest uns das Lied auch mal nennen.
    170 bpm ist eher kein Techno oder Hiphop.

  5. #5

    Und es geht darum ein Rhythmgame zu entwicklen.

  6. #6
    Zitat Zitat von Tako Beitrag anzeigen

    Und es geht darum ein Rhythmgame zu entwicklen.
    WASS??? Ohne mich??? Seid ihr des Wahnsinns?

    Ich will im nächsten Jahr meinem Master auch eins machen,muss aber vorher noch ein kleines Projekt machen,sonst wird das nix.

    Wenn ihr selbst Musik macht,dann habt ihr mehr Überblick und Kontrolle.Und wenns lizenzfreie Musik ist,dann schreibt den Typ an er soll euch was machen.Natürlich nach dem ihr ein bisschen was entwickelt habt um es vorzuzeigen.Gib doch mal mehr Infos raus,ggf per Pn.

  7. #7
    Ein Beat hat keine Länge. Denn ziemlich genau das macht einen Beat aus - eine Lautstärkespitze bei den niedrigen Frequenzen. Die Spitze kennzeichnet den Beat. Hätte es eine Länge, wäre es kein Beat sondern irgendein Brei bzw. irgendein Gedröhne - also ein Geräusch. Die Länge eines Geräusches kann man nicht ausrechnen sondern nur ausmessen. Wie das geht, steht schon hier über mir. Die Datei in Audacity reinwerfen, reinzoomen, eine der Spitzen suchen und von dort messen, wie lang der Keil dahinter ist.

    Falls du wissen möchtest, wie lang die Zwischenräume zwischen zwei Beats sind, dann ist das nur wahrlich keine Raketenwissenschaft, das auszurechnen:
    170 pro Minute -> 2,83 pro Sekunde.
    2,83 pro Sekunde -> Alle 0,35 Sekunden.

    Also hast du 350 ms zwischen zwei Beats.

  8. #8
    Jo, so weit waren wir auch schonmal, aber irgendwie kam es nicht hin. Stellte sich aber mittlerweile heraus, dass das ein Latenzproblem war.

  9. #9
    Mit normalen Soundinterfaces kommt man bei musikartigen Spielen, bei denen man in Echtzeit auf die Musik reagieren soll, meist nicht sehr weit.
    Deren Latenz ist bedingt durch den Einsatz von Buffern, die erst gefüllt und dann abgespielt werden, kaum zu vermeiden. Eine Verkleinerung der Buffer ist nur bis zu einem bestimmten Wert möglich. Unterschreitet man diesen Wert, werden Aussetzer hörbar, denn wenn der Buffer ausläuft bevor ein neuer gefüllt wurde (Prozessor überlastet; Prozess, der den Buffer füllt, bekommt zu wenige Zeiteinheiten zugewiesen bzw. das Betriebssystem verhindert ein rechtzeitiges Befüllen des nächsten Bufferstücks), hört man in der Zeit einfach gar nix. Deutlich wahrnehmbar.

    Für dieses Problem gibt es auch Lösungen. Auch kostenlose, wie beispielsweise ASIO4ALL. Das umgeht sehr viel "Betriebsystembürokratie" und erleichert es einem, Latenzen von weit unter 10ms hinzubekommen.

  10. #10
    Jap, das was Tako sagt wars, sorry. Mittlerweile habe ich es geschafft, den 2ms-Lag aus meiner Gameloop zu entfernen (eigentlich sollte ein 16tel bei 170bpm 88.24ms dauern) und die Synchronität der Musik mit den Notesheets von 4-10ms Genauigkeit auf 1ms Genauigkeit verbessert. Recht viel mehr Genauigkeit ist vermutlich nicht mehr aus Javascript zu holen, aber warten wir erst einmal ab, was am Ende dabei herauskommt.

  11. #11
    Ich glaub, es würde mehr Sinn machen, eine Frequenzkurve zu erstellen, und sie dann mit der Abtastrate des Liedes (steht als Metadaten in der Musikdatei) abtasten, anstatt dort irgendwas zu berechnen.

    http://de.wikipedia.org/wiki/Abtastu...lverarbeitung)
    http://de.wikipedia.org/wiki/Abtastrate

    Übrigens ist dies auch die Art, wie andere Spiele es machen. Gerade in der Musik gibt es zu viele variablen, die man nicht berechnen kann.
    Es fängt doch schon damit an, wenn in einem Lied sich der Beat ändert. Dann wirst du schon große Probleme bekommen, weil deine Berechnung asynchron wird.
    Deswegen wird auch ein Lied immer zuerst analysiert, wenn man es in die Bibliothek des Spiels aufnimmt. Dort wird das Lied abgetastet und die Ergebnisse gespeichert.

    Geändert von Whiz-zarD (01.10.2013 um 11:30 Uhr)

  12. #12
    @Whizzard:
    Hast du mal in einem Soundstudio gearbeitet?

    Danke. In unserem Fall arbeiten wir zwar ohnehin immer mit konstanten bpm, aber dein Vorschlag mit der Abtastung klingt sinnvoll. (Web Audio API scheint in der Hinsicht eh recht mächtig zu sein)

  13. #13
    Zitat Zitat von Indy Beitrag anzeigen
    @Whizzard:
    Hast du mal in einem Soundstudio gearbeitet?
    Nein, ich bin nur ein Medieninformatiker.
    (Wobei ich sagen muss, dass ich von Audio auch nicht so viel Ahnung habe. Selbst während den Vorlesungen habe ich nur recht wenig zum Thema "Audio" verstanden ^^")

  14. #14
    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Ich glaub, es würde mehr Sinn machen, eine Frequenzkurve zu erstellen, und sie dann mit der Abtastrate des Liedes (steht als Metadaten in der Musikdatei) abtasten, anstatt dort irgendwas zu berechnen.

    http://de.wikipedia.org/wiki/Abtastu...lverarbeitung)
    http://de.wikipedia.org/wiki/Abtastrate

    Übrigens ist dies auch die Art, wie andere Spiele es machen. Gerade in der Musik gibt es zu viele variablen, die man nicht berechnen kann.
    Es fängt doch schon damit an, wenn in einem Lied sich der Beat ändert. Dann wirst du schon große Probleme bekommen, weil deine Berechnung asynchron wird.
    Deswegen wird auch ein Lied immer zuerst analysiert, wenn man es in die Bibliothek des Spiels aufnimmt. Dort wird das Lied abgetastet und die Ergebnisse gespeichert.
    Was ist denn eine Frequenzkurve in diesem Zusammenhang? Du meinst wahrscheinlich eine Wellenform... da diese aber nur eine graphische(!) Repräsentation des Signalverlaufs ist, ist diese hier nutzlos. Und abtasten muss man dort auch nichts, denn die Musikdateien sind bereits das Resultat einer Abtastung.

    Ich sehe momentan auch das Problem nicht. Wird dort eine Methode gesucht, um die Zeitstempel der Beats und so auch die (lokalen) bpm zu erhalten?
    Dies lässt sich auf verschiedene Arten regeln. Eine einfache Möglichkeit ist eine simple Kantendetektion, bei der man die Sample-Werte nacheinander durchläuft und jede Kante markiert. Man muss dann einen Grenzwert festlegen, mit dem man entscheiden kann, was noch eine interessante Kante ist und was nicht (also wie stark der plötzliche Signalwertabfall sein muss bspw.). Bei einfacher elektronischer Musik sollte das auch ausreichend zuverlässig sein. Jede markierte Kante kann anschließend einem Zeitpunkt zugeordnet werden, indem man die Position auf die Zeit umrechnet (mit Hilfe der Abtastrate).
    Falls es nicht ausreicht, gibt es auch ausgefeiltere Methoden, bspw. hier: https://www.clear.rice.edu/elec301/P.../beatalgo.html
    Diese sind dementsprechend schwieriger umzusetzen, aber es gibt mit Sicherheit fertige kostenlose Bibliotheken, die das umsetzen - falls man die Arbeit nicht selbst erledigen möchte.

  15. #15
    Zitat Zitat von Mono Beitrag anzeigen
    Was ist denn eine Frequenzkurve in diesem Zusammenhang? Du meinst wahrscheinlich eine Wellenform... da diese aber nur eine graphische(!) Repräsentation des Signalverlaufs ist, ist diese hier nutzlos.
    Die graphische Repräsentation erfolgt aber auch durch eine Abtastung und durch eine Auswertung der Daten. Meinst du, der zeichnet die Wellenform on-the-fly, ohne die Daten zu speichern?
    Wenn ja, dann mach dich mal mit dem Model-View-Controller vertraut. Eine grafische Darstellung entsteht nicht aus blauen Himmel, sondern wird immer durch eine Datenstruktur erzeugt.

    Ich meinte aber das Frequenzspektrum der jeweiligen Frequenzen. Mir fehlte nur das Wort ^^"

    http://de.wikipedia.org/wiki/Frequenzspektrum

    Zitat Zitat von Mono Beitrag anzeigen
    Und abtasten muss man dort auch nichts, denn die Musikdateien sind bereits das Resultat einer Abtastung.
    Eben doch, da es zu einem gewissen Alias-Effekt kommen kann, wenn die Abtastung von der Abtastrate abweicht.
    Öffne doch einfach mal eine Audiodatei mit einem Audiobearbeitungstool und ändere die Abtastrate (ohne zu konvertieren). Du wirst feststellen, dass sich die Tonlage und die Geschwindigkeit des Liedes ändert. Wenn du die Abtastrate höher stellst, wird das Lied schneller und die Tonlage höher. Stellst du sie niedriger, wird das Lied langsamer und die Tonlage tiefer.Das liegt daran, dass die Samples je nach Abtastrate in die Läge gestreckt (bei niedriger Abtastrate) oder gestaucht (bei höherer Abtastrate) wird. Der Soundchip bzw. die Software muss die Abtastrate kennen, um daraus wieder ein analoges Signal erstellen zu können, da er wissen muss, wie lang ein Sample ist.


    Zitat Zitat von Mono Beitrag anzeigen
    Dies lässt sich auf verschiedene Arten regeln. Eine einfache Möglichkeit ist eine simple Kantendetektion, bei der man die Sample-Werte nacheinander durchläuft und jede Kante markiert. Man muss dann einen Grenzwert festlegen, mit dem man entscheiden kann, was noch eine interessante Kante ist und was nicht (also wie stark der plötzliche Signalwertabfall sein muss bspw.). Bei einfacher elektronischer Musik sollte das auch ausreichend zuverlässig sein. Jede markierte Kante kann anschließend einem Zeitpunkt zugeordnet werden, indem man die Position auf die Zeit umrechnet (mit Hilfe der Abtastrate).
    Bingo! Und genau das habe ich auch gemeint

  16. #16
    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Die graphische Repräsentation erfolgt aber auch durch eine Abtastung und durch eine Auswertung der Daten. Meinst du, der zeichnet die Wellenform on-the-fly, ohne die Daten zu speichern?
    Wenn ja, dann mach dich mal mit dem Model-View-Controller vertraut. Eine grafische Darstellung entsteht nicht aus blauen Himmel, sondern wird immer durch eine Datenstruktur erzeugt.
    Ich glaube, du bringst hier gerade einige grundlegende Sachen durcheinander. Der MVC hat nichts hiermit zu tun und ein Durchlaufen eines Buffers würde ich nicht als Abtastung bezeichnen, da dieser Begriff für etwas ganz anderes benutzt wird. Im Allgemeinen ist es nicht sehr sinnvoll diskrete Buffer abzutasten. Das einzige, was man damit erreicht ist der Verlust von Daten, eine Absenkung der maximal darstellbaren Frequenz und Aliasing. Dies tritt nicht auf, wenn man die Abtastschrittweite auf 1 setzt. Dies entspricht aber einem simplen Durchlaufen des Buffers. Also sollte man das auch so nennen, um Missverständnisse zu vermeiden.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Ich meinte aber das Frequenzspektrum der jeweiligen Frequenzen. Mir fehlte nur das Wort ^^"

    http://de.wikipedia.org/wiki/Frequenzspektrum
    Das Frequenzspektrum hilft dir in diesem Fall nicht weiter. Du kannst höchstens mit lokalen Frequenzspektren die Änderungen der Frequenzen beobachten. Allerdings ist dies in diesem Szenario absoluter Overkill, da eine einfache Kantenerkennung auf dem Rohsignal ein bereits ausreichendes Resultat bildet bei viel geringerem Rechenaufwand. Im Extremfall einen leichten Tiefpass auf das Signal legen und dann die Kanten erkennen. Das ist immernoch sehr viel einfacher als dauernd FFTs auszuführen.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Eben doch, da es zu einem gewissen Alias-Effekt kommen kann, wenn die Abtastung von der Abtastrate abweicht.
    Öffne doch einfach mal eine Audiodatei mit einem Audiobearbeitungstool und ändere die Abtastrate (ohne zu konvertieren). Du wirst feststellen, dass sich die Tonlage und die Geschwindigkeit des Liedes ändert. Wenn du die Abtastrate höher stellst, wird das Lied schneller und die Tonlage höher. Stellst du sie niedriger, wird das Lied langsamer und die Tonlage tiefer.Das liegt daran, dass die Samples je nach Abtastrate in die Läge gestreckt (bei niedriger Abtastrate) oder gestaucht (bei höherer Abtastrate) wird. Der Soundchip bzw. die Software muss die Abtastrate kennen, um daraus wieder ein analoges Signal erstellen zu können, da er wissen muss, wie lang ein Sample ist.
    Das Öffnen einer Audiodatei hat nichts mit Abtastfrequenzen zu tun. Diese brauchst du nur für den ADC auf der Soundkarte, damit er aus dem diskreten Signal ein eindeutiges (zeit)kontinuierliches Erzeugen kann.
    Ebenfalls wird diese gebraucht, um die Frequenzen eindeutig aus den Rohdaten ableiten zu können (bspw. für weitere Verarbeitung). Eine Wellenform bspw. kannst du unabhängig der bei der Abtastung eingesetzten Abtastfrequenz erstellen, da diese allein keinerlei Bezug zu Frequenzen hat.

  17. #17
    Zitat Zitat von Mono Beitrag anzeigen
    Ich glaube, du bringst hier gerade einige grundlegende Sachen durcheinander. Der MVC hat nichts hiermit zu tun und ein Durchlaufen eines Buffers würde ich nicht als Abtastung bezeichnen, da dieser Begriff für etwas ganz anderes benutzt wird.
    Ich bin selber Softwareentwickler. Ich weiß, was der MVC ist. Danke für diese Belehrung -.-
    Der Graph, für die grafische Darstellung (View), braucht aber Daten, die er darstellen soll, und die kommen von einer Datenstruktur (Model), und diese Datenstruktur muss von irgendwo gefüllt werden.
    Es spielt also keine Rolle, ob ich nun die Wellenform grafisch darstelle, oder weiterbearbeite, da die Datenstruktur unabhängig von der grafischen Darstellung ist.

    Zitat Zitat von Mono Beitrag anzeigen
    Das Frequenzspektrum hilft dir in diesem Fall nicht weiter. Du kannst höchstens mit lokalen Frequenzspektren die Änderungen der Frequenzen beobachten. Allerdings ist dies in diesem Szenario absoluter Overkill, da eine einfache Kantenerkennung auf dem Rohsignal ein bereits ausreichendes Resultat bildet bei viel geringerem Rechenaufwand. Im Extremfall einen leichten Tiefpass auf das Signal legen und dann die Kanten erkennen. Das ist immernoch sehr viel einfacher als dauernd FFTs auszuführen.
    OK, ich habe mir noch mal den MP3-Standard angeschaut.
    Tatsächlich werden die einzelnen Frequenzbänder decodiert (bis zu 32 pro Sample). Dann könnte man auch einfach die Daten von den tiefen Frequenzen nehmen.
    Nicht desto trotz bleibt dir eine Analyse nicht erspart, um zu entscheiden, welcher Peak wichtig ist, und welcher nicht, und im Grunde ist das nichts weiter, als das Analysieren eines Frequenzspektrums.

    Zitat Zitat von Mono Beitrag anzeigen
    Das Öffnen einer Audiodatei hat nichts mit Abtastfrequenzen zu tun. Diese brauchst du nur für den ADC auf der Soundkarte, damit er aus dem diskreten Signal ein eindeutiges (zeit)kontinuierliches Erzeugen kann.
    Eben.
    Und nun lies noch mal, was ich geschrieben habe

    Zitat Zitat von Mono Beitrag anzeigen
    Ebenfalls wird diese gebraucht, um die Frequenzen eindeutig aus den Rohdaten ableiten zu können (bspw. für weitere Verarbeitung). Eine Wellenform bspw. kannst du unabhängig der bei der Abtastung eingesetzten Abtastfrequenz erstellen, da diese allein keinerlei Bezug zu Frequenzen hat.
    Ich habe auch nie gesagt, dass er die Wellenform nun irgendwo zeichnen soll, sondern dass er die Wellenform analysieren soll, und genau das musst du tun, was du auch schon geschrieben hast
    Eine Wellenform ist nichts weiter, als eine Anreihung von Daten. Im simpelsten Fall ein Array. Die Abtastrate wird dann benötigt, um herauszufinden, zu welcher Zeit ein Peak stattfindet.

    Geändert von Whiz-zarD (01.10.2013 um 14:36 Uhr)

  18. #18
    Gut gut... nach dem ganzen Geschwätz würde ich folgenden Plan vorschlagen, um die ganze Sache recht einfach hinzubekommen:

    Dazu sollten die Audiodaten aber bereits decodiert in irgendeinem Buffer bereit liegen, auf den man Zugriff hat. Somit erspart man sich irgendwelche Prügeleien mit Audioformaten und die Decodierung wird ohnehin zum Abspielen benötigt. Da wahrscheinlich recht einfache elektronische Musik zum Einsatz kommt, sollten die Resultate brauchbar sein.

    Es gibt einen Parameter (zwischen 0 und 1), der als Grundlage für den Grenzwert fungiert. Den müsste man durch Ausprobieren so einstellen, dass die Resultate ausreichend sind.

    Durchgang 1: Du suchst das Maximum im Buffer. Einfach Array durchgehen und das Maximum merken.
    Durchgang 2: Das Maximum wird mit dem Parameter multipliziert. Dies bildet den Grenzwert. In einfacher elektronischer Musik kann man die Eigenschaft ausnutzen, dass die rhythmus-bestimmenden Anteile deutlich lauter sind als der Rest. Damit erspart man sich das Gefummel mit Frequenzen komplett und sucht einfach nur die Spitzen in den Rohdaten, die über dem Grenzwert liegen. In diesem Durchgang gehst du also wieder das Array durch und ignorierst alle Werte unterhalb vom Grenzwert. Beim Auftreten von Werten über dem Grenzwert suchst du eine Spitze. Wie man das macht, bleibt jedem selbst überlassen. Man kann es auf verschiedene Weisen machen, manche einfacher als andere und das Resultat wird besser oder schlechter. Eventuell rumprobieren. Ein erster Ansatz wäre, beim Durchgehen des Arrays den aktuellen Wert mit dem vorherigen zu vergleichen, wenn der vorherige über dem Grenzwert lag. Liefert der Vergleich einen starken Abfall, dann fügt man den Index in eine Auflistung der Spitzen ein. Nach dem Abfall muss erst wieder ein Anstieg erfolgen, damit die Möglichkeit einer Spitze gegeben ist.
    Aber dort kann man ein wenig herumspielen und probieren, bis die Resultate gut genug sind.
    Durchgang 3: Du gehst die Liste mit den Indices der Spitzen durch und rechnest daraus deren Zeiten aus (Index durch Abtastrate). Damit bekommst du eine Liste von Peaks mit Zeitangaben in Sekunden.


    Btw. ich hab vor einigen Jahren mal ein Progrämmchen entwickelt, welches angespielte Noten auf einem an den Line-In angeschlossenen Bass richtig erkennt. Sowohl die Zeit als auch den Notenwert. Weiterhin konnte es auch in Echtzeit Beats in Musik erkennen, die ein angeschlossenes Mikrofon etc. gerade aufnimmt. Hat ziemlich gut funktioniert und der PeakDetector war ähnlich wie der Vorschlag, den ich oben geschrieben habe. Die Idee, die ich damals bei meinem Projekt hatte, wurde mittlerweile ja auch kommerziell umgesetzt und nennt sich RockSmith, wenn ich mich nicht irre. Tja.. wär ich mal an dem Projekt drangeblieben

    Geändert von Mono (01.10.2013 um 15:23 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •