Auf der Website, die DaveParillo vorgeschlagen hat, habe ich das BpmDj-Projekt gefunden. Es hat einen bpmcount
ausführbare Datei, die die BPM sehr gut berechnet:Sie verarbeitet sowohl mp3 als auch flac:
161.135 Metallica/2008 - Death Magnetic/01-That Was Just Your Life.flac
63.5645 Doom3.mp3
Das Einzige, was übrig bleibt, ist, die Sammlung neu zu taggen. Ich werde diese Antwort aktualisieren, wenn ich Erfolg habe. Danke! :)
Schritt 1
Führen Sie bpmcount
aus gegen die gesamte Sammlung und speichern Sie die Ergebnisse in einer Textdatei. Das Problem ist, dass bpmcount
stürzt von Zeit zu Zeit ab und versucht, bis zu 2 GB Speicher zu verbrauchen, wenn es mehrere Dateien verarbeitet, also sollten wir es nacheinander mit Dateinamen füttern. So:
musicdir='/home/ootync/music'
find "$musicdir" -iregex ".*\.\(mp3\|ogg\|flac\|ape\)" -exec bpmcount {} \; \
| fgrep "$musicdir" > "$musicdir/BPMs.txt"
Schritt 2
Wir benötigen einige zusätzliche Pakete:apt-get install vorbis-tools flac python-mutagen
.Schauen Sie sich nun an, wie das 'bpm'-Tag hinzugefügt werden kann:
mid3v2 --TBPM 100 doom3.mp3
vorbiscomment -a -t "BPM=100" mother.ogg
metaflac --set-tag="BPM=100" metallica.flac
Leider habe ich keine *.ape-Tracks
Jetzt haben wir die BPMs und die gesamte Sammlung sollte neu getaggt werden. Hier ist das Skript:
cat "$musicdir/BPMs.txt" | while read bpm file ; do
bpm=`printf "%.0f" "$bpm"` ;
case "$file" in
*.mp3) mid3v2 --TBPM "$bpm" "$file" > /dev/null ;;
*.ogg) vorbiscomment -a -t "BPM=$bpm" "$file" ;;
*.flac) metaflac --set-tag="BPM=$bpm" "$file" ;;
esac
done
Schritt 2.1 erneut besucht Hier ist ein Skript, das Ihrer Sammlung BPM-Tags hinzufügt.
Es führt einen Prozess pro CPU-Kern aus, um den Prozess zu beschleunigen. Außerdem verwendet es keine temporären Dateien und kann erkennen, ob eine Datei bereits getaggt ist.
Außerdem habe ich festgestellt, dass FLAC manchmal sowohl ID3 als auch VorbisComment enthält. Dieses Skript aktualisiert beides.
#!/bin/bash
function display_help() {
cat <<-HELP
Recursive BPM-writer for multicore CPUs.
It analyzes BPMs of every media file and writes a correct tag there.
Usage: $(basename "$0") path [...]
HELP
exit 0
}
[ $# -lt 1 ] && display_help
#=== Requirements
requires="bpmcount mid3v2 vorbiscomment metaflac"
which $requires > /dev/null || { echo "E: These binaries are required: $requires" >&2 ; exit 1; }
#=== Functions
function bpm_read(){
local file="$1"
local ext="${file##*.}"
declare -l ext
# Detect
{ case "$ext" in
'mp3') mid3v2 -l "$file" ;;
'ogg') vorbiscomment -l "$file" ;;
'flac') metaflac --export-tags-to=- "$file" ;;
esac ; } | fgrep 'BPM=' | cut -d'=' -f2
}
function bpm_write(){
local file="$1"
local bpm="${2%%.*}"
local ext="${file##*.}"
declare -l ext
echo "BPM=$bpm @$file"
# Write
case "$ext" in
'mp3') mid3v2 --TBPM "$bpm" "$file" ;;
'ogg') vorbiscomment -a -t "BPM=$bpm" "$file" ;;
'flac') metaflac --set-tag="BPM=$bpm" "$file"
mid3v2 --TBPM "$bpm" "$file" # Need to store to ID3 as well :(
;;
esac
}
#=== Process
function oneThread(){
local file="$1"
#=== Check whether there's an existing BPM
local bpm=$(bpm_read "$file")
[ "$bpm" != '' ] && return 0 # there's a nonempty BPM tag
#=== Detect a new BPM
# Detect a new bpm
local bpm=$(bpmcount "$file" | grep '^[0-9]' | cut -f1)
[ "$bpm" == '' ] && { echo "W: Invalid BPM '$bpm' detected @ $file" >&2 ; return 0 ; } # problems
# Write it
bpm_write "$file" "${bpm%%.*}" >/dev/null
}
NUMCPU="$(grep ^processor /proc/cpuinfo | wc -l)"
find [email protected] -type f -regextype posix-awk -iregex '.*\.(mp3|ogg|flac)' \
| while read file ; do
[ `jobs -p | wc -l` -ge $NUMCPU ] && wait
echo "$file"
oneThread "$file" &
done
Genießen! :)
Dies ist ein Befehlszeilentool zum Erkennen des BPM und Einfügen in die Tags der FLAC-Datei:
http://www.pogo.org.uk/~mark/bpm-tools/
Ich habe Kolyptos Originalskript mit bpmcount
verwendet und umgeschrieben für bpm-tag
(Dienstprogramm von bpm-tools
), mit der ich mehr Glück bei der Installation hatte. Ich habe auch selbst einige Verbesserungen vorgenommen.
Sie finden es auf GitHub https://github.com/meridius/bpmwrap