Un logiciel de détection de battements pour Linux? [fermé]

29

Amarok 2 peut rechercher dans la collection de musique en utilisant le champ «bpm» de la balise ID3v2. Ce serait très bien de repenser l'intégralité de la collection de musique afin que je puisse trouver «l'humeur» du morceau que j'aime.

Cependant, je n'ai trouvé aucun logiciel de détection de battements qui aurait pu m'aider. En as-tu déjà utilisé une? CLI, de préférence. Je suis également intéressé s'il y a quelque chose de similaire pour marquer les FLAC avec le même champ «bpm».

Merci! :)

PS Je sais qu'il y a une belle fonction de barre d'humeur, mais elle est inutile pour la recherche.

kolypto
la source
3
avez-vous vu cette page? mmartins.com/mmartins/bpmdetection/bpmdetection.asp Semble exactement ce que vous recherchez.
DaveParillo
@DaveParillo que le lien "humeur d'une piste" est un lien vers votre disque dur, et en tant que tel inutile à quiconque sauf vous
Justin Smith
@Justin Smith, il voulait dire un fichier dans les documents BpmDj :) Voici la version en ligne: bpmdj.yellowcouch.org/clustering.html
kolypto
@Justin - désolé - doigt déclencheur nerveux, je suppose.
DaveParillo

Réponses:

17

Sur le site, DaveParillo a suggéré que j'avais trouvé le projet BpmDj . Il a un bpmcountexécutable qui calcule le bpm très bien: il gère aussi bien le mp3 que le flac:

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

La seule chose qui reste est de redéfinir la collection. Je mettrai à jour cette réponse chaque fois que je réussirai. Merci! :)


Étape 1

Exécutez bpmcountsur toute la collection et stockez les résultats dans un fichier texte. Le problème est qu'il se bpmcountbloque de temps en temps et essaie de consommer jusqu'à 2 Go de mémoire lorsqu'il traite plusieurs fichiers, nous devons donc l'alimenter avec les noms de fichiers un par un. Comme ça:

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

Étape 2

Nous aurons besoin de quelques paquets supplémentaires: apt-get install vorbis-tools flac python-mutagen. Maintenant, regardez comment la balise 'bpm' peut être ajoutée:

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

Hélas, je n'ai pas de pistes * .ape

Nous avons maintenant les BPM et toute la collection devrait être repensée. Voici le 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

Étape 2.1 revisitée Voici un script qui ajoutera des balises BPM à votre collection.

Il exécute un processus par CPU Core pour accélérer le processus. De plus, il n'utilise aucun fichier temporaire et il est capable de détecter si un fichier est déjà balisé.

De plus, j'ai découvert que FLAC contient parfois à la fois ID3 et VorbisComment. Ce script met à jour les deux.

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

Prendre plaisir! :)

kolypto
la source
Excellent! Je n'avais pas réussi à essayer ça hier soir. En ce qui concerne le balisage de ligne de commande, essayez mid3v2: linux.die.net/man/1/mid3v2 , réparable au moins jusqu'à ce qu'Ex Falso prenne en charge la modification de la ligne de commande. L'identifiant id3v2 estTBPM
DaveParillo
1
Merci, je vais essayer dans quelques jours et publier les résultats :) Je me demande si FLAC prend en charge une telle chose: je vais devoir vérifier cela.
kolypto
1
Beau travail à l'étape # 2. J'aimerais pouvoir voter deux fois!
DaveParillo
1
Merci :) Hélas, mon Amarok n'a pas remarqué la nouvelle balise FLAC que j'aime le plus :)) bug soumis.
kolypto
Comment l'avez-vous installé? le rpm qu'ils fournissent ne semble pas fonctionner sur mon ordinateur et j'ai du mal avec la compilation.
pedrosaurio
8

Il s'agit d'un outil en ligne de commande pour détecter le BPM et le placer dans les balises de fichier FLAC:

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

mmx
la source
La dernière version gère également les mp3 et les ogg vorbis.
codé le
Ubuntu a des paquets bpm-tools disponibles en saucy.
naught101
6

J'ai utilisé le script original de kolypto en l'utilisant bpmcountet le réécrit pour bpm-tag(utilité de bpm-tools) que j'ai eu plus de chance d'installer. J'ai également apporté quelques améliorations moi-même.

Vous pouvez le trouver sur GitHub https://github.com/meridius/bpmwrap

meridius
la source
Cela a nécessité quelques modifications pour fonctionner sur un Mac, que j'ai inclus dans ma propre réponse ci-dessous (car il est trop long pour un commentaire)
Adrian
2

Je ne connais pas d'outil qui fasse exactement ce que vous cherchez, mais j'ai joué avec MusicIP .

Utilisé la version linux / java - il faut beaucoup de temps pour analyser complètement une bibliothèque musicale, mais cela fonctionne vraiment. Vous pouvez trouver des chansons similaires à d'autres chansons. Vous pouvez cliquer avec le bouton droit sur la liste de lecture générée et sélectionner l'option pour sélectionner plus ou moins de chansons comme celle sélectionnée. Vous pouvez également choisir d'éliminer certains genres. C'est plutôt cool, mais une fois que le facteur wow s'est dissipé, j'ai cessé de l'utiliser.

La version gratuite exporte des listes de lecture jusqu'à 75 chansons au format (au moins) m3u.

Il n'est actuellement pas pris en charge, mais je pense qu'ils ont essayé de le commercialiser sous le nom de Predexis .

DaveParillo
la source
1

Bien que ce ne soit pas seulement un outil comme vous dites que vous recherchez, le lecteur multimédia Banshee peut détecter les bpm.

J'utilise Banshee pour toute ma musique, mon organisation et ma synchronisation avec des lecteurs portables. Je ne suis pas affilié, mais j'aime le programme le mieux que j'ai essayé. Il peut également générer des "listes de lecture intelligentes" basées sur toutes sortes de propriétés des pistes, y compris bpm.

Il y a une extension qui analyse toutes sortes de choses sur la chanson et trouvera des chansons similaires à celle que vous jouez. C'est appelé Mirage , et je l'ai utilisé pendant un certain temps, mais je ne le fais plus, car j'ai créé un certain nombre de listes de lecture qui correspondent à différentes humeurs (pas nécessairement similaires selon Mirage).

Je ne sais pas si Banshee enregistrera le bpm détecté dans la balise ID3v2 "bpm" du fichier. Si quelqu'un sait comment vérifier facilement la balise bpm de l'extérieur du programme, je vérifierai.

Dom
la source
1

Ce n'est pas Linux mais peut bien fonctionner dans Wine - j'utilise MixMeister BPM Analyzer

Shevek
la source
0

J'ai trouvé un autre outil pour marquer des fichiers MP3 avec la valeur BPM correcte.

Cela s'appelle BPMDetect . Open source. Les librairies QT fonctionnent donc très bien sous Gnome. Livré avec une interface graphique mais peut être compilé comme une version console uniquement (exécutez "scons console = 1" comme indiqué dans le fichier readme.txt).

Sinon, à la fin, j'ai également utilisé le "bpmcount" de BpmDJ car j'ai eu des difficultés à compiler BPMDetect sur un hôte Ubuntu 64 bits (en raison de la dépendance fmodex). J'ai donc pris le script shell (très cool et bien écrit) ci-dessus (voir ci-dessous), le binaire "bpmcount" extrait du [x64 .rpm] [3] disponible sur le site BpmDJ (je viens d'extraire le .rpm avec

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

Et ça a fonctionné comme un charme. J'ai juste eu à modifier le script ci-dessus car, hors de la boîte, il ne fonctionnait pas de mon côté (problème avec stdout / stderr du binaire bpmcount). Ma modification concerne la redirection de fichiers:

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

Il y a un autre outil recommandé dans cette question sur stackoverflow: aubio , qui vient avec les modules python.

Je ne l'ai pas essayé car j'étais un peu occupé à m'occuper de la compilation de BpmDj . Juste au cas où quelqu'un d'autre se trouverait aux prises avec des problèmes similaires en essayant, je recommande fortement de vous assurer absolument:

  1. avoir téléchargé la dernière version des sources BpmDj
  2. avoir les bibliothèques de boost appropriées installées

Avec les dernières mises à jour du compilateur g ++, certains problèmes semblent être survenus, en particulier concernant les versions récentes de Debian et Ubuntu. Dès qu'il a pris conscience de ces problèmes, l'auteur a eu la gentillesse de corriger les incompatibilités apparues et de monter une nouvelle version qui se compile désormais comme un charme. Donc, quiconque a failli sombrer dans le désespoir ces dernières années sur les erreurs de compilation implacables: vous économisez maintenant.

@ mmx , vos outils sont également beaux, mais ils comptent sur SoX, qui par défaut n'a pas de fonctionnalités mp3. Ils nécessitent donc de compiler SoX avec le support Lame / MAD, ce qui est malheureusement trop d'effort pour des gens aussi paresseux que moi.

J. Katzwinkel
la source
0

Pour que la solution de @meridius fonctionne sur mon Mac, j'ai dû faire un peu de travail supplémentaire et modifier un peu le 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 ..

Ensuite, j'ai dû modifier le script pour pointer vers les versions GNU de tout, et quelques autres ajustements:

#!/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š ([email protected])
    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"

Merci pour votre travail acharné @kolypto et @meridius.

... la douleur que je traverse pour maintenir un flux de travail CLI et ne pas payer d'argent pour les outils musicaux ...

Adrian
la source