Algum software de detecção de batidas para Linux? [fechadas]


29

O Amarok 2 pode pesquisar na coleção de músicas usando o campo 'bpm' da tag ID3v2. Seria muito bom repetir toda a coleção de músicas, para que eu possa encontrar o 'clima' da faixa que eu gosto.

No entanto, não encontrei nenhum software de detecção de batimentos que pudesse me ajudar. Você já usou um? CLI, de preferência. Também estou interessado em saber se há algo parecido para marcar FLACs com o mesmo campo 'bpm'.

Obrigado! :)

PS Estou ciente de que existe um bom recurso da barra de humor, mas é inútil para pesquisar.


3
você viu esta página? mmartins.com/mmartins/bpmdetection/bpmdetection.asp Parece exatamente o que você está procurando.
DaveParillo

@DaveParillo que "humor de uma faixa" link é um link para seu disco rígido, e como tal inútil para ninguém além de você
Justin Smith

@Justin Smith, ele quis dizer um arquivo em docs BpmDj :) Aqui está a versão on-line: bpmdj.yellowcouch.org/clustering.html
kolypto

@Justin - desculpe - dedo no gatilho, acho.
precisa saber é o seguinte

Respostas:


17

No site, DaveParillo sugeriu que eu encontrasse o projeto BpmDj . Possui um bpmcountexecutável que calcula muito bem o bpm: lida com mp3 e flac:

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

A única coisa que resta é remarcar a coleção. Vou atualizar esta resposta sempre que tiver sucesso. Obrigado! :)


Passo 1

Execute bpmcounta coleção inteira e armazene os resultados em um arquivo de texto. O problema é que bpmcounttrava de vez em quando e tenta consumir até 2 GB de memória ao processar vários arquivos, portanto, devemos alimentá-lo com nomes de arquivos um por um. Como isso:

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

Passo 2

Vamos precisar de alguns pacotes adicionais: apt-get install vorbis-tools flac python-mutagen. Agora, veja como a tag 'bpm' pode ser adicionada:

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

Infelizmente, não tenho faixas * .ape

Agora temos os BPMs e toda a coleção deve ser alterada novamente. Aqui está o 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

Etapa 2.1 Revisitada Aqui está um script que adicionará tags BPM à sua coleção.

Ele executa um processo por CPU Core para acelerar o processo. Além disso, ele não usa arquivos temporários e é capaz de detectar se um arquivo já está marcado.

Além disso, descobri que o FLAC às vezes tem o ID3 e o VorbisComment dentro. Este script atualiza ambos.

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

Apreciar! :)


Excelente! Eu não tinha tentado isso ontem à noite. No que diz respeito à marcação da linha de comando, tente mid3v2: linux.die.net/man/1/mid3v2 , que pode ser reparado pelo menos até o Ex Falso suportar a edição da linha de comando. O id3v2 tad id éTBPM
DaveParillo

1
Obrigado, tentarei em alguns dias e publicarei os resultados :) Gostaria de saber se o FLAC suporta isso: vou ter que verificar isso.
Kolypto #

1
Bom trabalho no passo 2. Gostaria de poder votar duas vezes!
precisa saber é o seguinte

1
Obrigado :) Infelizmente, meu Amarok não notou a nova tag nos FLACs que eu mais gosto :)) bug enviado.
Kolypto #

Como você instalou? o rpm que eles fornecem parece não funcionar no meu computador e estou tendo problemas com a compilação.
31412 pedrosaurio


6

Eu usei o script original do kolypto usando bpmcounte reescrevi-o para bpm-tag(utilitário de bpm-tools), o qual tive mais sorte com a instalação. Também fiz algumas melhorias por conta própria.

Você pode encontrá-lo no GitHub https://github.com/meridius/bpmwrap


Isso exigiu algumas modificações para trabalhar em um Mac, que eu incluí na minha própria resposta abaixo (porque é muito tempo para um comentário)
Adrian

2

Não conheço uma ferramenta que faça exatamente o que você está procurando, mas eu brinquei com o MusicIP .

Usou a versão linux / java - leva muito tempo para analisar completamente uma biblioteca de música, mas realmente funciona. Você pode encontrar músicas semelhantes a outras músicas. Você pode clicar com o botão direito do mouse na lista de reprodução gerada e selecionar a opção para selecionar mais ou menos músicas como a selecionada. Você também pode optar por eliminar certos gêneros. É meio legal, mas depois que o fator uau desapareceu, eu parei de usá-lo.

A versão gratuita exporta playlists de até 75 músicas no formato (pelo menos) m3u.

No momento, não há suporte, mas acho que eles tentaram comercializá-lo como Predexis .


1

Embora não seja apenas uma ferramenta como você diz estar procurando, o Banshee media player pode detectar bpm.

Eu uso o Banshee para todas as minhas músicas, organização e sincronização com players portáteis. Não sou afiliado, mas gosto do programa o melhor de tudo que já tentei. Também pode gerar "listas de reprodução inteligentes" com base em todos os tipos de propriedades das faixas, incluindo bpm.

Há uma extensão que analisa todo tipo de coisa sobre a música e encontra músicas semelhantes às que você está tocando. Ele se chama Mirage , e eu o usei por um tempo, mas não o faço mais, pois criei várias listas de músicas que se adequam a vários humores (não necessariamente semelhantes de acordo com o Mirage).

Não sei se o Banshee salvará os bpm detectados novamente na tag ID3v2 "bpm" do arquivo. Se alguém souber como verificar facilmente a tag bpm de fora do programa, vou verificar.



0

Encontrei outra ferramenta para marcar arquivos MP3 com o valor BPM correto.

Chama-se BPMDetect . Código aberto. As bibliotecas QT funcionam bem no Gnome. Vem com uma GUI, mas pode ser compilada como uma versão apenas do console (execute "scons console = 1", conforme indicado no readme.txt).

Caso contrário, no final, eu também usei o "bpmcount" do BpmDJ, pois tive dificuldades para compilar o BPMDetect em um host Ubuntu de 64 bits (devido à dependência do fmodex). Então, peguei o shell script (muito legal e bem escrito) acima (veja abaixo), o binário "bpmcount" extraído do [x64 .rpm] [3] disponível no site do BpmDJ (eu apenas extraí o .rpm com

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

e funcionou perfeitamente. Eu apenas tive que modificar o script acima porque, fora da caixa, ele não estava funcionando do meu lado (problema com stdout / stderr do bpmcount binário). Minha modificação é sobre o redirecionamento de arquivos:

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

0

Há outra ferramenta recomendada nesta pergunta no stackoverflow: aubio , que acompanha os módulos python.

Eu não tentei porque estava meio ocupado cuidando da compilação do BpmDj . No caso de alguém mais se deparar com problemas semelhantes ao tentar, eu recomendo fortemente que tenha certeza absoluta:

  1. tendo baixado a versão mais recente das fontes BpmDj
  2. tendo as bibliotecas de impulso apropriadas instaladas

Com as atualizações mais recentes do compilador g ++, alguns problemas parecem ter surgido, especialmente em relação aos lançamentos recentes do debian e do ubuntu. Assim que tomou conhecimento desses problemas, o autor teve a gentileza de corrigir as incompatibilidades surgidas e montar um novo lançamento que agora é compilado como um encanto. Portanto, qualquer pessoa que esteja desesperada com erros de compilação implacáveis ​​ultimamente: você está salvando agora.

@ mmx , suas ferramentas também parecem boas, mas contam com as SoXquais, por padrão, não possuem recursos de mp3. Portanto, eles exigem a compilação do SoX com suporte Lame / MAD primeiro, o que infelizmente é muito esforço para pessoas tão preguiçosas quanto eu.


0

Para que a solução @meridius 'funcione no meu Mac, tive que fazer um pouco de trabalho extra e modificar um pouco o script:

# 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 ..

Então eu tive que modificar o script para apontar para as versões GNU de tudo, e alguns outros ajustes:

#!/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"

Obrigado por seu trabalho duro @kolypto e @meridius.

... a dor que passo para manter um fluxo de trabalho da CLI e não pagar dinheiro pelas ferramentas de música ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.