有没有适用于 Linux 的节拍检测软件?

有没有适用于 Linux 的节拍检测软件?

Amarok 2 可以使用 ID3v2 标签的“bpm”字段搜索音乐收藏。非常很高兴重新标记整个音乐收藏,这样我就能找到我喜欢的曲目的“情绪”。

但是我找不到任何可以帮助我的节拍检测软件。你用过吗?最好是 CLI。另外,我想知道是否有类似的软件可以用相同的“bpm”字段标记 FLAC。

谢谢! :)

PS,我知道有一个不错的情绪栏功能,但它对于搜索来说毫无用处。

答案1

在 DaveParillo 建议的网站上,我找到了点播项目。它有一个bpmcount可执行文件,可以很好地计算 bpm:它可以处理 mp3 以及 flac:

161.135 Metallica/2008 - Death Magnetic/01-That Was Just Your Life.flac
63.5645 Doom3.mp3

剩下的唯一一件事就是重新标记该集合。一旦我成功,我就会更新这个答案。谢谢!:)


步骤1

对整个集合运行bpmcount并将结果存储到文本文件中。问题是,它bpmcount会不时崩溃,并在处理多个文件时尝试消耗多达 2GB 的内存,因此我们应该逐个向其提供文件名。如下所示:

musicdir='/home/ootync/music'
find "$musicdir" -iregex ".*\.\(mp3\|ogg\|flac\|ape\)" -exec bpmcount {} \; \
    | fgrep "$musicdir" > "$musicdir/BPMs.txt"

第2步

我们需要一些额外的包:apt-get install vorbis-tools flac python-mutagen。现在看看如何添加“bpm”标签:

mid3v2 --TBPM 100 doom3.mp3
vorbiscomment -a -t "BPM=100" mother.ogg
metaflac --set-tag="BPM=100" metallica.flac

唉,我没有 *.ape 曲目

现在我们有了 BPM,整个合集应该重新标记了。以下是脚本:

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

回顾步骤 2.1 这是一个可以将 BPM 标签添加到您的收藏中的脚本。

它在每个 CPU 核心上运行一个进程,以加快进程。此外,它不使用临时文件,并且能够检测文件是否已被标记。

此外,我发现 FLAC 有时同时包含 ID3 和 VorbisComment。此脚本会更新两者。

#!/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 $@ -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

享受! :)

答案2

这是一个用于检测 BPM 并将其放入 FLAC 文件标签中的命令行工具:

http://www.pogo.org.uk/~mark/bpm-tools/

答案3

我使用了 kolypto 的原始脚本,bpmcount并将其重写为bpm-tag(实用程序bpm-tools),安装时我运气更好。我还做了一些自己的改进。

你可以在 GitHub 上找到它https://github.com/meridius/bpmwrap

答案4

还有另一个推荐的工具这个问题在 stackoverflow 上:奥比奥,它与 Python 模块一起提供。

我没有尝试过,因为我有点忙于编译点播。为了防止其他人在尝试时遇到类似的麻烦,我强烈建议确保:

  1. 下载了最新版本的 BpmDj 源代码
  2. 安装适当的 boost 库

随着最新的 g++ 编译器升级,似乎出现了一些问题,尤其是与最近的 debian 和 ubuntu 版本有关的问题。作者一意识到这些问题,就很贴心地修复了出现的不兼容性,并发布了一个新版本,现在编译起来非常顺利。所以,最近因无休止的编译错误而濒临绝望的人:你现在有救了。

@韓國,您的工具看起来也不错,但它们依赖于SoX默认情况下不具有 mp3 功能的。因此它们需要先编译支持 Lame/MAD 的 SoX,不幸的是,对于像我这样懒惰的人来说,这太费劲了。

相关内容