Conversion d'un fichier MIDI en WAV avec bash
Certains pianos électroniques, comme le Clavinova CLP-535 de chez Yamaha, permettent d’enregistrer ses “performances” au format MIDI.
Relancer la lecture du morceau pour s’accompagner est souvent peu pratique car cela monopolise une main…
Transférer le morceau sur un looper comme le BOSS RC3 est intéressant car cela permet de lancer le morceau avec le pied.
Il devient alors nécessaire de convertir le fichier MIDI en fichier WAV, le BOSS RC3 acceptant uniquement ce format.
Le script bash proposé ci-dessous permet en une seul commande la transformation “par lot” de fichiers au format MIDI.
Les “blancs” de début et de fin de morceau sont éliminés, le volume peut-être “normalisé”.
Les programmes suivants sont utilisés pour réaliser le travail :
- fluidsynth pour la conversion MIDI vers WAV. (timidity générant des bruits parasites en début de morceau…)
- sox pour la suppression des “blancs” et la normalisation du volume.
#!/bin/bash
#
# but: convertir des fichiers *.mid en fichier *.mp3 en normalisant le volume et en supprimant les blancs en début et fin de morceau
# Auteur : AlGau
# Date : septembre 2018
#
#
# aide
#
Aide() {
cat <<EOF
Utilisation : ls *.mid | mid2wav.sh [OPTIONS]
Convertir au format WAV les fichiers au format MIDI passés par l'entrée standard (*.mid vers *.wav)
Options :
+norm : normalise le volume sonore
-g : fixe le gain principal [0 < gain < 10, defaut = 2.0]
-h : affiche cette aide.
EOF
exit 0 # sort du programme
}
#
# test que les programmes fluidsynth et sox sont installés
#
command -v fluidsynth >/dev/null 2>&1 || { echo >&2 "Veuillez installer le programme fluidsynth."; exit 1; }
command -v sox >/dev/null 2>&1 || { echo >&2 "Veuillez installer le programme sox."; exit 1; }
#
# test s'il y a quelque chose sur l'entrée standard
#
if [ -t 0 ]
then
Aide
exit 0
fi
#
# initialisation des variables
#
i=0 # départ du compteur
g=2.0 # gain "volume" de 0 à 10
norm="non" # normaliser le volume
ftemp="temp.wav" # fichiers wav temporaire
ftemp2="temp2.wav"
while [ "$1" != "" ]; do # parcours la liste des paramètres
case $1 in
+norm )
norm="oui"
;;
-g )
shift # passe au paramètre suivant
g="$1"
;;
-h )
Aide
;;
* )
Aide
;;
esac
shift # passe au paramètre suivant
done
#
# boucle de lecture de l'entrée standart
#
while read;
do
fichier=("$(echo "$REPLY")") # lit l'entrée standart
nom_fichier=${fichier%.*}
echo -e "\n $fichier -> $nom_fichier.wav \n"
if [ -f "$fichier" ]; then # test si le fichier est bien présent
fluidsynth -g $g -F "$ftemp" /usr/share/sounds/sf2/FluidR3_GM.sf2 "$fichier" # converti le mid en wav
if [ -f $ftemp ]; then # si tout c'est bien passé avant, un fichier wav temporaire est présent
if [ "$norm" = "oui" ]; then
sox --norm "$ftemp" "$ftemp2" # normalise le fichier son (volume)
# supprime les "blancs en défaut et fin de morceau
sox "$ftemp2" "${nom_fichier}.wav" silence -l 1 0.1 1% -1 2.0 1%
rm "$ftemp" # supprime le fichier temporaire
rm "$ftemp2" # supprime le fichier temporaire
else
mv "$ftemp" "$nom_fichier.wav"
fi
let "i+=1" # incrémente le compteur de fichiers
echo -e "\n $i fichiers traités \n"
else
echo Erreur de conversion, le fichier $nom_fichier.wav est absent.
exit 1
fi
else
echo Le fichier "${fichier}" est absent.
exit 1
fi
done
exit 0 # quitte le script (0 = sans erreur)Vos commentaires et propositions d’améliorations sont les bienvenus.