MIDI Visualizer是一個使用C++程式語言以及OpenGL開發的免費開源工具,可以讀取MIDI檔案或是連接到MIDI裝置並依照時間點產生出對應的鋼琴捲簾(Piano Roll)圖形,除了能即時預覽也能製作成影音檔,支援Ubuntu、Windows、macOS等主流作業系統。MIDI Visualizer還同時具有圖形化介面(GUI)以及命令列介面(CLI),十分方便。



MIDI Visualizer的GitHub:

取得 MIDI Visualizer

到MIDI Visualizer的GitHub的Releases頁面可以下載到給不同作業系統使用的可執行檔。直接執行檔案即可開始使用。

使用 MIDI Visualizer

設定 MIDI 來源

如果您沒有MIDI檔案,可以點我下載演示用的MIDI音樂檔案

執行MIDI Visualizer的圖形化介面會看到如下的畫面。

midi-visualizer

一開始要設定好MIDI的來源,我們可以選擇讀取一個MIDI檔案(Load MIDI file...)或是連接到某個MIDI裝置(Connect to device...)。在此以名偵探柯南主題曲的MIDI檔案來演示。

midi-visualizer

有了MIDI來源之後就可以按下Play按鈕開始播放視覺化的結果(無合成聲音)。

midi-visualizer

設定視覺化樣式

視覺化的方式有很多項目可以設定,筆者建議品質(Quality)一定要選到Double並勾選平滑化(Smoothing,也就是反鋸齒)以獲得最佳的畫面效果。

midi-visualizer

至於其它的項目依照個人喜好來設定即可,所有項目都建議點開來調整看看。以下是筆者調整後的樣子:

midi-visualizer

如上圖,筆者將鋼琴左手部份用綠色系,右手部份用藍色系來區分,縮小踏版圖示,讓畫面看起來乾淨清爽。

如果您滿意現在的樣式,可以按下Save config...按鈕來保存設定檔,未來可以直接按下Load config...按鈕來載入先前的樣式設定。這個設定檔在CLI模式下也是可以使用的!

輸出視覺化結果

按下Export...按鈕可以將MIDI視覺化結果輸出成連續的圖片或是無聲影片。

midi-visualizer

筆者習慣將結果輸出成連續的PNG圖片,再用FFmpeg來做影片編碼並合併音軌。並且會透過MIDI Visualizer的CLI來完成連續圖片的輸出,方便撰寫腳本將這些步驟自動化。

以下指令可以利用MIDI Visualizer和樣式設定檔來將MIDI檔案轉成為連續的PNG圖片:

MIDIVisualizer --hide-window 1 --config <樣式設定檔路徑> --show-pedal <0|1> --format PNG --framerate 60 --png-alpha 0 --size 1920 1080 --preroll 1 --postroll 2 --midi <MIDI檔路徑> --export <連續的PNG圖片儲存的目錄路徑>

以上指令中,--hide-window 1用來取消GUI;--show-pedal可以用來設定是否顯示踏版圖示,因為有些有歌曲是不需要踩踏版的;--format PNG --framerate 60用來設定要輸出連續的PNG圖片且每秒60張(60 fps);--png-alpha 0用來取消透明;--size 1920 1080用來設定輸出的圖像解析度為1920x1080;--preroll 1在MIDI開始之前預留1秒的時間;--postroll 2在MIDI結束之後預留2秒的時間。

輸出完連續的PNG圖片後,就可以將其串接起來做成影片並併入聲音。關於聲音,若您想要直接用這個MIDI檔案的演奏結果,由於MIDI並不是聲音檔,需先使用其它軟體將它轉為聲音檔才能將其做成影片音軌。如果您不知道怎麼轉,可以參考以下文章使用MuseScore來轉:

有了連續的PNG圖片和聲音檔案等素材後,就可以用FFmpeg來將它們做成影片了。有關於如何用FFmpeg來串接連續的圖片的作法,可以參考以下這篇文章:

MIDI Visualizer輸出的連續圖片符合「圖片檔名有連續不中斷的數字編號」的情境,因此您必須要先確認您的MIDI檔案所輸出連續圖片的數量,這樣才能知道數字的位數。

有了連續的PNG圖片檔案、圖片檔案的數量和聲音檔案等資料後,終於可以用FFmpeg來將它們做成影片了。可以參考看看以下的FFmpeg指令:

ffmpeg -r 60 -i <連續的圖片檔案路徑(記得用%d)> -f lavfi -t 1.05 -i anullsrc -i <聲音檔案路徑> -filter_complex "[1:a][2:a]concat=n=2:v=0:a=1[outa]" -vcodec libx264 -crf 22 -tune animation -acodec libfdk_aac -vbr 5 -map 0:0 -map "[outa]" -pix_fmt yuv420p <輸出的影片檔案路徑>

以上指令中,特別去對聲音訊號做了一些處理,在原本輸入的聲音訊號之前加上了1.05秒的空白,1秒是因為在輸出MIDI視覺化的結果時,在MIDI開始之前多預留了1秒,0.05秒則是在模擬手指剛接觸到琴鍵正要按下,到琴鎚敲到琴弦所產生的延遲,這樣影音搭配起來會更自然一點。另外,以上指令也加上-tune animation參數來讓FFmpeg輸出體積更小的影片。

最終,可以將MIDI做成如下的影片: