Rundung auf 20er Schritte im Tag BMP

:music:

Hallo, ich suche eine Möglichkeit den TAG "BPM" zu runden. Und zwar soll die Endwerte in 20er Schritten (wenn gar nicht möglich dann in 10er Schritte) sein.

Sprich aus 123.56 wird 120,
aus 131,12 wird 140,

also als Ergebnis die Werte 40,60,80,100,120,140 ....
oder (wenn es nur in 10er Schritten geht) dann 40,50,60,70,80,90.

Die Rundung auf Integer-Werte geht mit problemlos:

$left($mul($replace(%BPM%,.,),10),$len($mul($div(%BPM%,1),10)))
$ifgreater($mod(%BPM%,10),4,$add($div(%BPM%,10),1),$div(%BPM%,10))

Aber den z.B. den Wert 129,65 auf 140 zu runden scheitere ich leider

Danke
Kersten
:music:

Du kannst eine dritte Aktion anhängen:

$ifgreater(%BPM%,$sub($add($mul($div(%BPM%,20),20),$max(1,$div(20,2))),1),$add($mul($div(%BPM%,20),20),20),$mul($div(%BPM%,20),20))

DD.20080725.1009.CEST

Dieser Vorschlag war nichts :frowning: , denn die Funktion $max() gibt es zurzeit nicht Mp3tag.

DD.20080726.1300.CEST

Hallo und vielen Dank für den Formatstring,

der aber immer aufrundet - sprich aus 144 wird 160 statt richtigerweise 140 - d.h. bei dem Beispiel müßten die Werte 140-149,99 auf 140 abgerundet werden und die Werte 150-160 auf 160 gerundet werden.

Danke
Kersten

Runden von BPM Werten mit bis zu 2 Dezimalstellen auf ganze Zahlen mit Rundungsschrittweite BPM_ROUNDBY = n (mit n als Element von N+):

$div($mul($mul(%BPM_ROUNDBY%,100),$ifgreater($sub($div($mul($left($replace(%BPM%,.,)00,$add($len($div(%BPM%,1)),2)),10),$mul(%BPM_ROUNDBY%,100)),$mul($div($left($replace(%BPM%,.,)00,$add($len($div(%BPM%,1)),2)),$mul(%BPM_ROUNDBY%,100)),10)),4,$add($div($left($replace(%BPM%,.,)00,$add($len($div(%BPM%,1)),2)),$mul(%BPM_ROUNDBY%,100)),1),$div($left($replace(%BPM%,.,)00,$add($len($div(%BPM%,1)),2)),$mul(%BPM_ROUNDBY%,100)))),100)

Beispiele:
BPM=149.99 und ROUNDBY=1 ergibt BPM=150.
BPM=149.99 und ROUNDBY=2 ergibt BPM=150.
BPM=149.99 und ROUNDBY=3 ergibt BPM=150.
BPM=149.99 und ROUNDBY=4 ergibt BPM=148.
BPM=149.99 und ROUNDBY=5 ergibt BPM=150.
BPM=149.99 und ROUNDBY=6 ergibt BPM=150.
BPM=149.99 und ROUNDBY=7 ergibt BPM=147.
BPM=149.99 und ROUNDBY=8 ergibt BPM=152.
BPM=149.99 und ROUNDBY=9 ergibt BPM=153.
BPM=149.99 und ROUNDBY=10 ergibt BPM=150.
BPM=149.99 und ROUNDBY=20 ergibt BPM=140.
BPM=149.99 und ROUNDBY=40 ergibt BPM=160.
BPM=149.99 und ROUNDBY=100 ergibt BPM=100.

Anfang Aktionengruppe Round BPM to integer

Aktion #1
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_MIXMEISTER
Formatstring: $if2(%BPM_MIXMEISTER%,%BPM%)

Aktion #2
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_ROUNDBY
Formatstring: 1

Aktion #3
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_A
Formatstring: $mul(%BPM_ROUNDBY%,100)

Aktion #4
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_B
Formatstring: $left($replace(%BPM%,.,)00,$add($len($div(%BPM%,1)),2))

Aktion #5
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_C
Formatstring: $div($mul(%BPM_B%,10),%BPM_A%)

Aktion #6
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_D
Formatstring: $div(%BPM_B%,%BPM_A%)

Aktion #7
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_E
Formatstring: $mul(%BPM_D%,10)

Aktion #8
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_F
Formatstring: $ifgreater($sub(%BPM_C%,%BPM_E%),4,$add(%BPM_D%,1),%BPM_D%)

Aktion #9
Aktionstyp 5: Tagfeld formatieren
Feld: BPM
Formatstring: $div($mul(%BPM_A%,%BPM_F%),100)

Aktion #10
Aktionstyp 9: Tagfelder entfernen
Folgende Tagfelder entfernen (mit Semikolon getrennt): BPM_A;BPM_B;BPM_C;BPM_D;BPM_E;BPM_F;BPM_ROUNDBY

Ende Aktionengruppe Round BPM to integer (10 Aktionen)

oder

Anfang Aktionengruppe Round BPM to integer

Aktion #1
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_MIXMEISTER
Formatstring: $if2(%BPM_MIXMEISTER%,%BPM%)

Aktion #2
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_ROUNDBY
Formatstring: 1

Aktion #3
Aktionstyp 5: Tagfeld formatieren
Feld: BPM
Formatstring: $div($mul($mul(%BPM_ROUNDBY%,100),$ifgreater($sub($div($mul($left($replace(%BPM%,.,)00,$add($len($div(%BPM%,1)),2)),10),$mul(%BPM_ROUNDBY%,100)),$mul($div($left($replace(%BPM%,.,)00,$add($len($div(%BPM%,1)),2)),$mul(%BPM_ROUNDBY%,100)),10)),4,$add($div($left($replace(%BPM%,.,)00,$add($len($div(%BPM%,1)),2)),$mul(%BPM_ROUNDBY%,100)),1),$div($left($replace(%BPM%,.,)00,$add($len($div(%BPM%,1)),2)),$mul(%BPM_ROUNDBY%,100)))),100)

Ende Aktionengruppe Round BPM to integer (3 Aktionen)

DD.20080726.1602.CEST

Aktion angepasst für BPM Werte mit bis zu 2 Dezimalstellen.

DD.20080728.1152

Hallo DetlefD,

vielen Dank für die perfekte Erklärung und Lösung meines Problemes. Deine Lösung 2 funktioniert perfekt. Aufpassen sollte man nur, wenn der Tag BPM bereits gerundete Werte enthält (weil z.B. die CD ausnahmsweise schon Werte enthält, den sonst ist das Ergebnis der Aktionen gleich 0. Nachdem ich jetzt rund 10.000 Titel mit BPM Werten versehen habe, kann ich als Rundungsergebnis am besten die 10 er Schrittweite empfehlen. Bei der von mir angedachten 20er Schrittweite fallen zu viele Titel in eine Kategorie.

Nochmals vielen Dank
otifant :smiley:

Das sollte mit der geänderten Version nicht mehr vorkommen (siehe oben).
Die Formel akzeptiert neben Zahlen mit 1..2 Dezimalstellen auch ganze Zahlen als BPM Eingabewerte.

DD.20080728.1159.CEST

Huch, wie kompliziert! Ohne jetzt die Chance zu haben, das nachzuprüfen (sitze grade an einer Linux-Box ohne MP3Tag), sollte doch auch Folgendes funktionieren:

Runden von BPM auf ganze 10er-Werte

$sub($add(%BPM%,5),$mod($add(%BPM%,5),10))

Sollte m.E. sowohl für Werte der Form "xxx.xx" als auch "xxx" funktionieren, da die Arithmetik-Funktionen (zumindest bei foobar) Strings zuerst in Integer-Werte konvertieren.

:sunglasses:

Nur mal interessehalber: Wozu benötigst Du eine solche "Vergröberung"?

Professionelle DJs bestätigen mir, dass für eine gute Arbeit beim Mixen eine Präzision von mindestens 0.05 BPM erwartet wird. (Das ist ja auch der Grund, warum sich beim TBPM-Tag etliche Tools über die ID3v2-Spezifikation hinwegsetzen, die ja ein ganzzahliges (Integer-)BPM fordert.)

Tja, die ID3v2 Spezi + der Inhalt der Felder hat ein wohl ahnungsloser geschrieben. Ist ja nicht das einzige Feld.

Meiner Meinung nach gehört das was neues gescheites her - was für alle Formate gültig wäre. Habe auch schon eine E-Mail an w3.org geschrieben, evtl. ein XML Format wäre etwas lesbarer (und erweiterbarer), aber ...