Linux 용 비트 감지 소프트웨어? [닫은]


29

Amarok 2는 ID3v2 태그의 'bpm'필드를 사용하여 음악 컬렉션을 검색 할 수 있습니다. 그 것이다 아주 내가 좋아하는 트랙의 '분위기'를 찾을 수 있도록 전체 음악 컬렉션을 태그를 다시 지정하는 것이 좋다.

그러나 나는 나를 도울 수있는 비트 감지 소프트웨어를 찾지 못했습니다. 당신은 하나를 사용한 적이 있습니까? CLI가 바람직합니다. 또한 동일한 'bpm'필드로 FLAC에 태그를 지정하는 것과 비슷한 것이 있는지 관심이 있습니다.

감사! :)

추신 : 나는 기분 바 기능이 훌륭하다는 것을 알고 있지만 검색에는 쓸모가 없습니다.


3
이 페이지를 보셨습니까? mmartins.com/mmartins/bpmdetection/bpmdetection.asp 원하는 것을 정확하게 보여줍니다.
DaveParillo

"DaveParillo" "트랙의 분위기"링크는 하드 디스크에 대한 링크이며, 귀하 외에는 다른 사람에게는 쓸모가 없습니다.
Justin Smith

@Justin Smith, 그는 BpmDj 문서의 파일을 의미했습니다 :) 온라인 버전은 다음과 같습니다. bpmdj.yellowcouch.org/clustering.html
kolypto

@Justin-죄송합니다-트위스 티 트리거 손가락.
DaveParillo

답변:


17

사이트에서 DaveParillo는 BpmDj 프로젝트를 찾았다 제안 했습니다. 그것은 bpmcountbpm을 아주 잘 계산 하는 실행 파일을 가지고 있습니다 : 그것은 flac뿐만 아니라 mp3를 처리합니다 :

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

즐겨! :)


우수한! 나는 지난 밤에 이것을 시도하지 않았다. 커맨드 라인 태깅에 관한 한 , 최소한 Ex Falso가 커맨드 라인 편집을 지원할 때까지 서비스 가능한 mid3v2 : linux.die.net/man/1/mid3v2를 사용해보십시오 . id3v2 tad id는TBPM
DaveParillo

1
고마워, 나는 며칠 안에 시도하고 결과를 게시 할 것입니다 :) FLAC이 그런 것을 지원하는지 궁금합니다. 이것을 확인해야합니다.
kolypto

1
2 단계에서 잘하셨습니다. 내가 두 번 투표 할 수 있으면 좋겠다!
DaveParillo

1
고마워 :) 아아, 내 Amarok는 내가 가장 좋아하는 FLAC의 새로운 태그를 보지 못했습니다 :)) 버그가 제출되었습니다.
kolypto

어떻게 설치 했습니까? 그들이 제공하는 rpm이 내 컴퓨터에서 작동하지 않는 것 같고 컴파일에 어려움을 겪고 있습니다.
pedrosaurio


6

kolypto의 원래 스크립트를 사용하여 사용 bpmcount하고 설치하는 것이 더 좋은 bpm-tag(유틸리티 bpm-tools)로 다시 작성했습니다 . 나는 또한 내 자신의 일부를 개선했다.

GitHub https://github.com/meridius/bpmwrap 에서 찾을 수 있습니다


Mac에서 작동하려면 몇 가지 수정 작업이 필요했습니다. 주석은 너무 길기 때문에 아래 답변에 포함 시켰습니다.
Adrian

2

나는 당신이 찾고있는 것을 정확하게하는 도구를 모르지만 MusicIP 와 함께 놀았습니다 .

리눅스 / 자바 버전을 사용했습니다-음악 라이브러리를 완전히 분석하는 데 오랜 시간이 걸리지 만 실제로 작동합니다. 다른 노래와 비슷한 노래를 찾을 수 있습니다. 생성 된 재생 목록을 마우스 오른쪽 버튼으로 클릭하고 옵션을 선택하여 선택한 노래와 같이 더 많거나 적은 노래를 선택할 수 있습니다. 특정 장르를 제거하도록 선택할 수도 있습니다. 시원하지만 와우 팩터가 사라진 후에는 사용을 중단했습니다.

무료 버전은 최대 75 곡의 노래를 (최소한) m3u 형식으로 내 보냅니다.

현재 지원되지 않지만 Predexis로 상용화하려고 시도한 것 같습니다 .


1

밴시 미디어 플레이어 는 당신이 찾고있는 도구 일뿐 만 아니라 bpm을 감지 할 수 있습니다.

모든 음악 재생, 구성 및 휴대용 플레이어와의 동기화에 Banshee를 사용합니다. 나는 제휴하지 않지만, 내가 시도한 것 중 가장 좋은 프로그램을 좋아합니다. 또한 bpm을 포함하여 트랙의 모든 종류의 속성을 기반으로 "스마트 재생 목록"을 생성 할 수 있습니다.

노래에 관한 모든 종류의 것들을 분석하는 확장 프로그램이 있으며 연주하는 노래와 비슷한 노래를 찾을 수 있습니다. 그것은 Mirage 라고 불리우며 잠시 동안 사용했지만 더 이상 사용하지 않습니다. 여러 가지 분위기에 맞는 여러 재생 목록을 만들었으므로 (Mirage에 따르면 반드시 비슷한 것은 아닙니다).

Banshee가 탐지 한 bpm을 파일의 ID3v2 "bpm"태그에 다시 저장할지 여부를 모르겠습니다. 누구나 프로그램 외부에서 bpm 태그를 쉽게 확인하는 방법을 알고 있다면 확인하겠습니다.



0

올바른 BPM 값으로 MP3 파일에 태그를 지정하는 다른 도구를 찾았습니다.

BPMDetect 라고 합니다 . 오픈 소스. QT 라이브러리는 Gnome에서 잘 작동합니다. GUI와 함께 제공되지만 콘솔 전용 버전으로 컴파일 할 수 있습니다 (readme.txt에 설명 된대로 "scons console = 1"실행).

그렇지 않으면 결국 64 비트 Ubuntu 호스트 (fmodex 종속성으로 인해)에서 BPMDetect를 컴파일하는 데 어려움이 있었기 때문에 BpmDJ의 "bpmcount"도 사용했습니다. BpmDJ 웹 사이트에서 사용할 수있는 [x64 .rpm] [3]에서 추출한 "bpmcount"바이너리 (위의 쿨하고 잘 작성된) 셸 스크립트를 가져 왔습니다 (.rpm을 추출했습니다). 와

pm2cpio bpmdj-4.2.pl2-0.x86_64.rpm|cpio -idv

그리고 그것은 매력처럼 작동했습니다. 방금 위의 스크립트를 수정해야 했으므로 내 측면에서 작동하지 않았습니다 (bpmcount 바이너리의 stdout / stderr에 문제가 있음). 내 수정은 파일 리디렉션에 관한 것입니다.

local bpm=$(bpmcount "$file" 3>&1 1>/dev/null 2>&3 | grep '^[0-9]' | cut -f1)

0

이 질문 에서 권장되는 또 다른 도구가 있습니다 : aubio , 파이썬 모듈과 함께 제공됩니다.

BpmDj 컴파일을 처리하는 데 바빴 기 때문에 시도하지 않았습니다 . 시도하는 동안 다른 사람이 비슷한 문제를 겪고 있다고 판단되는 경우 절대적으로 확인하는 것이 좋습니다.

  1. BpmDj 소스의 최신 릴리스를 다운로드 한 경우
  2. 적절한 부스트 라이브러리 설치

최신 g ++ 컴파일러 업그레이드에서는 최근 데비안 및 우분투 릴리스와 관련하여 일부 문제가 발생한 것으로 보입니다. 이 문제를 알게 되 자마자 저자는 등장한 비 호환성을 고칠 수있는 친절 함을 갖게되었으며 이제는 매력처럼 편집되는 새로운 릴리스를 만들었습니다. 따라서 최근에 냉혹 한 컴파일 오류로 절망에 빠진 사람은 누구나 이제 구원을 얻습니다.

@ mmx 이면 도구도 좋아 보이지만 SoX기본적으로 mp3 기능이없는 에 의존 합니다. 그래서 그들은 Lame / MAD 지원으로 SoX를 먼저 컴파일해야합니다. 불행히도 나만큼 게으른 사람들에게는 너무 많은 노력입니다.


0

@meridius '솔루션을 Mac에서 작동 시키려면 약간의 추가 작업을 수행하고 스크립트를 약간 수정해야했습니다.

# Let's install bpm-tools
git clone http://www.pogo.org.uk/~mark/bpm-tools.git
cd bpm-tools
make && make install
# There will be errors, but they did not affect the result

# The following three lines could be replaced by including this directory in your $PATH
ln -s <absolute path to bpm-tools>/bpm /usr/local/bin/bpm
ln -s <absolute path to bpm-tools>/bpm-tag /usr/local/bin/bpm-tag
ln -s <absolute path to bpm-tools>/bpm-graph /usr/local/bin/bpm-graph
cd ..

# Time to install a bunch of GNU tools
# Not all of these packages are strictly necessary for this script, but I decided I wanted the whole GNU toolchain in order to avoid this song-and-dance in the future
brew install coreutils findutils gnu-tar gnu-sed gawk gnutls gnu-indent gnu-getopt bash flac vorbis-tools
brew tap homebrew/dupes; brew install grep

# Now for Mutagen (contains mid3v2)
git clone https://github.com/nex3/mutagen.git
cd mutagen
./setup.py build
sudo ./setup.py install
# There will be errors, but they did not affect the result
cd ..

그런 다음 모든 버전의 GNU 버전을 가리키고 스크립트를 수정해야했습니다.

#!/usr/local/bin/bash

# ================================= FUNCTIONS =================================

function help() {
    less <<< 'BPMWRAP

Description:
    This BASH script is a wrapper for bpm-tag utility of bpm-tools and several
    audio tagging utilities. The purpose is to make BPM (beats per minute)
    tagging as easy as possible.
    Default behaviour is to look through working directory for *.mp3 files
    and compute and print their BPM in the following manner:
        [current (if any)] [computed] [filename]

Usage:
    bpmwrap [options] [directory or filenames]

Options:
    You can specify files to process by one of these ways:
        1) state files and/or directories containing them after options
        2) specify --import file
        3) specify --input file
    With either way you still can filter the resulting list using --type option(s).
    Remember that the script will process only mp3 files by default, unless
    specified otherwise!

    -i, --import file
        Use this option to set BPM tag for all files in given file instead of
        computing it. Expected format of every row is BPM number and absolute path
        to filename separated by semicolon like so:
            145;/home/trinity/music/Apocalyptica/07 beyond time.mp3
        Remember to use --write option too.
    -n, --input file
        Use this option to give the script list of FILES to process INSTEAD of paths
        where to look for them. Each row whould have one absolute path.
        This will bypass the searching part and is that way useful when you want
        to process large number of files several times. Like when you are not yet
        sure what BPM limits to set. Extension filtering will still work.
    -o, --output file
        Save output also to a file.
    -l, --list-save file
        Save list of files about to get processed. You can use this list later
        as a file for --input option.
    -t, --type filetype
        Extension of file type to work with. Defaults to mp3. Can be specified
        multiple times for more filetypes. Currently supported are mp3 ogg flac.
    -e, --existing-only
        Only show BPM for files that have it. Do NOT compute new one.
    -w, --write
        Write computed BPM to audio file but do NOT overwrite existing value.
    -f, --force
        Write computed BPM to audio file even if it already has one. Aplicable only
        with --write option.
    -m, --min minbpm
        Set minimal BPM to look for when computing. Defaults to bpm-tag minimum 84.
    -x, --max maxbpm
        Set maximal BPM to look for when computing. Defaults to bpm-tag maximum 146.
    -v, --verbose
        Show "progress" messages.
    -c, --csv-friendly
        Use semicolon (;) instead of space to separate output columns.
    -h, --help
        Show this help.

Note:
    Program bpm-tag (on whis is this script based) is looking only for lowercase
    file extensions. If you get 0 (zero) BPM, this should be the case. So just
    rename the file.

License:
    GPL V2

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

Dependencies:
    bpm-tag mid3v2 vorbiscomment metaflac

Author:
    Martin Lukeš (martin.meridius@gmail.com)
    Based on work of kolypto (http://superuser.com/a/129157/137326)
    '
}

# Usage: result=$(inArray $needle haystack[@])
# @param string needle
# @param array haystack
# @returns int (1 = NOT / 0 = IS) in array
function inArray() {
    needle="$1"
    haystack=("${!2}")
    out=1
    for e in "${haystack[@]}" ; do
        if [[ "$e" = "$needle" ]] ; then
            out=0
            break
        fi
    done
    echo $out
}

# Usage: result=$(implode $separator array[@])
# @param char separator
# @param array array to implode
# @returns string separated array elements
function implode() {
    separator="$1"
    array=("${!2}")
    IFSORIG=$IFS
    IFS="$separator"
    echo "${array[*]}"
    IFS=$IFSORIG
}

# @param string file
# @returns int BPM value
function getBpm() {
    local file="$1"
    local ext="${file##*.}"
    declare -l ext # convert to lowercase
    { case "$ext" in
        'mp3')  mid3v2 -l "$file" ;;
        'ogg')  vorbiscomment -l "$file" ;;
        'flac') metaflac --export-tags-to=- "$file" ;;
    esac ; } | fgrep 'BPM=' -a | cut -d'=' -f2
}

# @param string file
# @param int BPM value
function setBpm() {
    local file="$1"
    local bpm="${2%%.*}"
    local ext="${file##*.}"
    declare -l ext # convert to lowercase
    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
}

# # @param string file
# # @returns int BPM value
function computeBpm() {
    local file="$1"
    local m_opt=""
    [ ! -z "$m" ] && m_opt="-m $m"
    local x_opt=""
    [ ! -z "$x" ] && x_opt="-x $x"
    local row=$(bpm-tag -fn $m_opt $x_opt "$file" 2>&1 | fgrep "$file")
    echo $(echo "$row" \
        | gsed -r 's/.+ ([0-9]+\.[0-9]{3}) BPM/\1/' \
        | gawk '{printf("%.0f\n", $1)}')
}

# @param string file
# @param int file number
# @param int BPM from file list given by --import option
function oneThread() {
    local file="$1"
    local filenumber="$2"
    local bpm_hard="$3"
    local bpm_old=$(getBpm "$file")
    [ -z "$bpm_old" ] && bpm_old="NONE"
    if [ "$e" ] ; then # only show existing
        myEcho "$filenumber/$NUMFILES${SEP}$bpm_old${SEP}$file"
    else # compute new one
        if [ "$bpm_hard" ] ; then
            local bpm_new="$bpm_hard"
        else
            local bpm_new=$(computeBpm "$file")
        fi
        [ "$w" ] && { # write new one
            if [[ ! ( ("$bpm_old" != "NONE") && ( -z "$f" ) ) ]] ; then
                setBpm "$file" "$bpm_new"
            else
                [ "$v" ] && myEcho "Non-empty old BPM value, skipping ..."
            fi
        }
        myEcho "$filenumber/$NUMFILES${SEP}$bpm_old${SEP}$bpm_new${SEP}$file"
    fi
}

function myEcho() {
    [ "$o" ] && echo -e "$1" >> "$o"
    echo -e "$1"
}


# ================================== OPTIONS ==================================

eval set -- $(/usr/local/Cellar/gnu-getopt/1.1.6/bin/getopt -n $0 -o "-i:n:o:l:t:ewfm:x:vch" \
    -l "import:,input:,output:,list-save:,type:,existing-only,write,force,min:,max:,verbose,csv-friendly,help" -- "$@")

declare i n o l t e w f m x v c h
declare -a INPUTFILES
declare -a INPUTTYPES
while [ $# -gt 0 ] ; do
    case "$1" in
        -i|--import)                shift ; i="$1" ; shift ;;
        -n|--input)                 shift ; n="$1" ; shift ;;
        -o|--output)                shift ; o="$1" ; shift ;;
        -l|--list-save)         shift ; l="$1" ; shift ;;
        -t|--type)                  shift ; INPUTTYPES=("${INPUTTYPES[@]}" "$1") ; shift ;;
        -e|--existing-only) e=1 ; shift ;;
        -w|--write)                 w=1 ; shift ;;
        -f|--force)                 f=1 ; shift ;;
        -m|--min)                       shift ; m="$1" ; shift ;;
        -x|--max)                       shift ; x="$1" ; shift ;;
        -v|--verbose)               v=1 ; shift ;;
        -c|--csv-friendly)  c=1 ; shift ;;
        -h|--help)                  h=1 ; shift ;;
        --)                                 shift ;;
        -*)                                 echo "bad option '$1'" ; exit 1 ;; #FIXME why this exit isn't fired?
        *)                                  INPUTFILES=("${INPUTFILES[@]}" "$1") ; shift ;;
    esac
done


# ================================= DEFAULTS ==================================

#NOTE Remove what requisities you don't need but don't try to use them after!
#         always  mp3/flac     ogg       flac
REQUIRES="bpm-tag mid3v2 vorbiscomment metaflac"
which $REQUIRES > /dev/null || { myEcho "These binaries are required: $REQUIRES" >&2 ; exit 1; }

[ "$h" ] && {
    help
    exit 0
}

[[ $m && $x && ( $m -ge $x ) ]] && {
    myEcho "Minimal BPM can't be bigger than NOR same as maximal BPM!"
    exit 1
}
[[ "$i" && "$n" ]] && {
    echo "You cannot specify both -i and -n options!"
    exit 1
}
[[ "$i" && ( "$m" || "$x" ) ]] && {
    echo "You cannot use -m nor -x option with -i option!"
    exit 1
}
[ "$e" ] && {
    [[ "$w" || "$f" ]] && {
        echo "With -e option you don't have any value to write!"
        exit 1
    }
    [[ "$m" || "$x" ]] && {
        echo "With -e option you don't have any value to count!"
        exit 1
    }
}

for file in "$o" "$l" ; do
    if [ -f "$file" ] ; then
        while true ; do
            read -n1 -p "Do you want to overwrite existing file ${file}? (Y/n): " key
            case "$key" in
                y|Y|"") echo "" > "$file" ; break ;;
                n|N)        exit 0 ;;
            esac
            echo ""
        done
        echo ""
    fi
done

[ ${#INPUTTYPES} -eq 0 ] && INPUTTYPES=("mp3")

# NUMCPU="$(ggrep ^processor /proc/cpuinfo | wc -l)"
NUMCPU="$(sysctl -a | ggrep machdep.cpu.core_count | gsed -r 's/(.*)([0-9]+)(.*)/\2/')"
LASTPID=0
TYPESALLOWED=("mp3" "ogg" "flac")
# declare -A BPMIMPORT # array of BPMs from --import file, keys are file names
declare -A BPMIMPORT # array of BPMs from --import file, keys are file names

for type in "${INPUTTYPES[@]}" ; do
    [[ $(inArray $type TYPESALLOWED[@]) -eq 1 ]] && {
        myEcho "Filetype $type is not one of allowed types (${TYPESALLOWED[@]})!"
        exit 1
    }
done

### here are three ways how to pass files to the script...
if [ "$i" ] ; then # just parse given file list and set BPM to listed files
    if [ -f "$i" ] ; then
        # myEcho "Setting BPM tags from given file ..."
        while read row ; do
            bpm="${row%%;*}"
            file="${row#*;}"
            ext="${file##*.}"
            ext="${ext,,}" # convert to lowercase
            if [ -f "$file" ] ; then
                if [ $(inArray $ext INPUTTYPES[@]) -eq 0 ] ; then
                    FILES=("${FILES[@]}" "$file")
                    BPMIMPORT["$file"]="$bpm"
                else
                    myEcho "Skipping file on row $rownumber (unwanted filetype $ext) ... $file"
                fi
            else
                myEcho "Skipping non-existing file $file"
            fi
        done < "$i"
    else
        myEcho "Given import file does not exists!"
        exit 1
    fi
elif [ "$n" ] ; then # get files from file list
    if [ -f "$n" ] ; then
        rownumber=1
        while read file ; do
            if [ -f "$file" ] ; then
                ext="${file##*.}"
                ext="${ext,,}" # convert to lowercase
                if [ $(inArray $ext INPUTTYPES[@]) -eq 0 ] ; then
                    FILES=("${FILES[@]}" "$file")
                else
                    myEcho "Skipping file on row $rownumber (unwanted filetype $ext) ... $file"
                fi
            else
                myEcho "Skipping file on row $rownumber (non-existing) ... $file"
            fi
            let rownumber++
        done < "$n"
        unset rownumber
    else
        myEcho "Given input file $n does not exists!"
        exit 1
    fi
else # get files from given parameters
    [ ${#INPUTFILES[@]} -eq 0 ] && INPUTFILES=`pwd`
    for file in "${INPUTFILES[@]}" ; do
        [ ! -e "$file" ] && {
            myEcho "File or directory $file does not exist!"
            exit 1
        }
    done
    impl_types=`implode "|" INPUTTYPES[@]`
    while read file ; do
        echo -ne "Creating list of files ... (${#FILES[@]}) ${file}\033[0K"\\r
        FILES=("${FILES[@]}" "$file")
    done < <(gfind "${INPUTFILES[@]}" -type f -regextype posix-awk -iregex ".*\.($impl_types)")
    echo -e "Counted ${#FILES[@]} files\033[0K"\\r
fi

[ "$l" ] && printf '%s\n' "${FILES[@]}" > "$l"

NUMFILES=${#FILES[@]}
FILENUMBER=1

[ $NUMFILES -eq 0 ] && {
    myEcho "There are no ${INPUTTYPES[@]} files in given files/paths."
    exit 1
}

declare SEP=" "
[ "$c" ] && SEP=";"


# =============================== MAIN SECTION ================================

if [ "$e" ] ; then # what heading to show
    myEcho "num${SEP}old${SEP}filename"
else
    myEcho "num${SEP}old${SEP}new${SEP}filename"
fi

for file in "${FILES[@]}" ; do
    [ `jobs -p | wc -l` -ge $NUMCPU ] && wait
    [ "$v" ] && myEcho "Parsing (${FILENUMBER}/${NUMFILES})\t$file ..."
    oneThread "$file" "$FILENUMBER" "${BPMIMPORT[$file]}" &
    LASTPID="$!"
    let FILENUMBER++
done

[ "$v" ] && myEcho "Waiting for last process ..."
wait $LASTPID
[ "$v" ] && myEcho \\n"DONE"

@kolypto와 @meridius의 노고에 감사드립니다.

... CLI 워크 플로를 유지하고 음악 도구에 대한 비용을 지불하지 않기 위해 겪는 고통 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.