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的來源,我們可以選擇讀取一個MIDI檔案(Load MIDI file...
)或是連接到某個MIDI裝置(Connect to device...
)。在此以名偵探柯南主題曲的MIDI檔案來演示。
有了MIDI來源之後就可以按下Play
按鈕開始播放視覺化的結果(無合成聲音)。
設定視覺化樣式
視覺化的方式有很多項目可以設定,筆者建議品質(Quality
)一定要選到Double
並勾選平滑化(Smoothing
,也就是反鋸齒)以獲得最佳的畫面效果。
至於其它的項目依照個人喜好來設定即可,所有項目都建議點開來調整看看。以下是筆者調整後的樣子:
如上圖,筆者將鋼琴左手部份用綠色系,右手部份用藍色系來區分,縮小踏版圖示,讓畫面看起來乾淨清爽。
如果您滿意現在的樣式,可以按下Save config...
按鈕來保存設定檔,未來可以直接按下Load config...
按鈕來載入先前的樣式設定。這個設定檔在CLI模式下也是可以使用的!
輸出視覺化結果
按下Export...
按鈕可以將MIDI視覺化結果輸出成連續的圖片或是無聲影片。
筆者習慣將結果輸出成連續的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做成如下的影片: