Nel sito che DaveParillo mi ha suggerito ho trovato il progetto BpmDj. Ha un bpmcount
eseguibile che calcola il bpm molto carino:gestisce mp3 così come flac:
161.135 Metallica/2008 - Death Magnetic/01-That Was Just Your Life.flac
63.5645 Doom3.mp3
L'unica cosa che rimane è ritaggare la raccolta. Aggiornerò questa risposta ogni volta che avrò successo. Grazie! :)
Passaggio 1
Esegui bpmcount
contro l'intera raccolta e memorizzare i risultati in un file di testo. Il problema è che bpmcount
si blocca di tanto in tanto e cerca di consumare fino a 2 GB di memoria quando elabora diversi file, quindi dovremmo alimentarlo con i nomi dei file uno per uno. In questo modo:
musicdir='/home/ootync/music'
find "$musicdir" -iregex ".*\.\(mp3\|ogg\|flac\|ape\)" -exec bpmcount {} \; \
| fgrep "$musicdir" > "$musicdir/BPMs.txt"
Passaggio 2
Avremo bisogno di alcuni pacchetti aggiuntivi:apt-get install vorbis-tools flac python-mutagen
.Ora dai un'occhiata a come aggiungere il tag 'bpm':
mid3v2 --TBPM 100 doom3.mp3
vorbiscomment -a -t "BPM=100" mother.ogg
metaflac --set-tag="BPM=100" metallica.flac
Purtroppo non ho tracce *.ape
Ora abbiamo i BPM e l'intera raccolta dovrebbe essere rietichettata. Ecco lo script:
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
Passaggio 2.1 rivisitato Ecco uno script che aggiungerà i tag BPM alla tua raccolta.
Esegue un processo per CPU Core per rendere il processo più veloce. Inoltre, non utilizza file temporanei ed è in grado di rilevare se un file è già contrassegnato.
Inoltre, ho scoperto che FLAC a volte contiene sia ID3 che VorbisComment. Questo script aggiorna entrambi.
#!/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
Divertiti! :)
Questo è uno strumento da riga di comando per rilevare il BPM e inserirlo nei tag del file FLAC:
http://www.pogo.org.uk/~mark/bpm-tools/
Ho usato lo script originale di kolypto usando bpmcount
e l'ho riscritto per bpm-tag
(utilità di bpm-tools
) che ho avuto più fortuna con l'installazione. Ho anche apportato alcuni miglioramenti.
Puoi trovarlo su GitHub https://github.com/meridius/bpmwrap