MIDI本身並不是聲音訊號,而是聲音該用哪種樂器、要以哪個音高、在什麼時候、以多長的長度、以多大的力道等數值來演奏的訊息。那麼在Linux作業系統上要如何把MIDI檔案轉成一般的FLAC、MP3、OGG等等的音樂檔案呢?



安裝 FluidSynth

Debian系的Linux發行版可以用以下指令來安裝FluidSynth:

sudo apt install fluidsynth

紅帽系的Linux發行版可以用以下指令來安裝FluidSynth:

sudo dnf install fluidsynth

使用 FluidSynth

透過FluidSynth,將MIDI檔案轉成一般音樂檔案的指令格式如下:

fluidsynth -T flac -F /path/to/output-flac-file -r 48000 /path/to/sound-font-file /path/to/input-midi-file

fluidsynth指令的-r參數可以設定輸出的音訊取樣頻率,通常會使用44100或是48000赫茲。至於/path/to/sound-font-file是SoundFont檔案的路徑,如果您不知道什麼是SoundFont,或是沒有SoundFont檔案,可以參閱這篇文章

fluidsynth指令輸出的音樂檔的音量並沒有經過正規化,播放出來的聲音可能會偏小聲。若要做正規化處理,可以搭配FFmpeg來使用,指令如下:

fluidsynth -T flac -F temp.flac -r 48000 /path/to/sound-font-file /path/to/input-midi-file && ffmpeg -i temp.flac -filter:a "volume=$(ffmpeg -i temp.flac -filter:a volumedetect -f null - 2>&1 | grep max_volume | awk -F " " '{print -$(NF-1) - 0.1}')dB" /path/to/output-audio-file && rm temp.flac

如果想要更深入了解透過FFmpeg來進行音量正規化的方式,可以參考這篇文章

linux-midi-audio

如果還要在音樂的頭、尾再加上一段空白時間,指令如下:

fluidsynth -T flac -F temp.flac -r 48000 /path/to/sound-font-file /path/to/input-midi-file && ffmpeg -i temp.flac -filter_complex "[1:a]volume=$(ffmpeg -f lavfi -t 1 -i anullsrc -i temp.flac -filter:a volumedetect -f null - 2>&1 | grep max_volume | awk -F " " '{print -$(NF-1) - 0.1}')dB[na];[0:a][na][0:a]concat=n=3:v=0:a=1[outa]" -map "[outa]" /path/to/output-audio-file && rm temp.flac

以上指令中,ffmpeg-f lavfi -t 1 -i anullsrc參數可以輸入一段時長1秒的空白音訊。

不過使用這樣的方式產生出來的音樂檔會有一個很明顯的缺點,那就是聲音在結尾的時候會直接結束,缺少殘響與淡出,還會有喀答聲(click)產生,目前還不知道這要怎麼解決比較好。