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.