bpmcounter.sh Beats per minute

Meine Audiodateien liegen auf einem Debian System und ich stand vor der Thematik das TBPM Tag meiner mp3 Dateien zu pflegen.

Nach längerer Recherche bin ich auf das Paket bpm-tools gestossen, mit dem das zählen der Beats sehr gut funktioniert.

Es würde diesen Beitrag nicht geben, wenn auch das schreiben der Tags funktionieren würde.

bpm-tag hat bei meinen Dateien (idv2.3/2.4) nicht nur das TBPM Feld beschrieben, sondern die Inhalte aller anderen (Ausnahme APIC) Tags gelöscht.

Daher der gute Rat – wer das script nutzen möchte – probiert vorher mit Kopien und nicht mit den einzigen originalen, ob es Nebenwirkungen gibt.

Die Problematik mit den gelöschten Feldern und der Tatsache, dass bpm-tag (nicht der spezifikation entsprechend) kommawerte in die Tags schreibt habe ich also mit dem folgenden Script/wrapper gelöst.

Aus den anderen Beiträgen weiß ich um die Problematik der Zeilenumbrüche – daher das Script als gezipter Anhang.

Folgende Pakete werden (mindestens) vorausgesetzt:


python
eyeD3
sudo apt-get install sox
sudo apt-get install lame
sudo apt-get install libsox-fmt-mp3
sudo apt-get install bpm-tools

Auch wenn es anders in der Hilfe von bpm-tag beschrieben ist – die beiden Schalter bpm-tag -f -n sind nötig, damit bpm-tag nur die bpm zählt und nicht in den Tag schreibt.

Da das zählen etwas Zeitaufwendig ist, wird zuerst mittels eyeD3 nachgesehen, ob das TBPM Feld beschrieben ist, bevor die bpm gezählt werden.
EyeD3 nutze ich (und damit der Wrapper/ das Script) auch zum schreiben der Tags.

Das Script geht rekursiv durch alle Unterordner.
Wem das Script gefällt, sollte den untenstehenden Anhang benutzen und nicht via copy & paste die Zeilen übernehmen, da alle Browser die Zeilen parsen und verarbeiten.


#!/bin/bash

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
VERSION=0.1

if (( $# < 1 )) ; then
cd "$1"
fi

header() {
# echo ----------------------------------------------------------
echo bpm.sh - adding bpm tag, version $VERSION
echo ----------------------------------------------------------
echo -ne "\n"
}

check_bpm-tools() {
local bpmtagok=$(which bpm-tag)
if [ -z "$bpmtagok" ]; then
echo "you need bpm-tag to run this script"
echo "apt-get install bpm-tools"
exit 1
fi
# checking for eyeD3 ...
local eyed3ok=$(which eyeD3)

if [ -z "$eyed3ok" ]; then
echo "you need eyeD3 (http://eyed3.nicfit.net/) to run this script"
exit 1
fi
}
echo " all tools found."

header
while [ "$1" ]; do
case $1 in
-v) exit 0;;
-c) check_bpm-tools; exit 0;;
-i) cover_img; exit 0;;
esac
shift
done

for d in */ ; do
echo cleaning up $d
cd "$d"
for file in $(find -iname '*.mp3' | sort); do
echo checking "$file"
bpmset=$(eyeD3 "$file" |grep BPM |cut -f2 -d':'|cut -f2 -d ' ')
if [ -z "$bpmset" ]; then
echo -n "no bpm tag "
bpm=$(bpm-tag -f -n "$file" 2>&1 | cut -f2 -d':' | cut -f1 -d '.')
echo "- set bpm to$bpm"
eyeD3 --preserve-file-times "$file" --bpm=$bpm &> /dev/null
else
echo bpm tag is set to $bpmset
fi
echo -ne "\n"
done
cd ..
done
IFS=$SAVEIFS

bpmcounter.sh