Ergebnis 1 bis 18 von 18

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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 10:30 Uhr)

  2. #2
    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.

  3. #3
    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

  4. #4
    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.

  5. #5
    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 13:36 Uhr)

  6. #6
    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 14:23 Uhr)

Berechtigungen

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