今天終於學會播放 midi 音樂! 暫時先不管播放品質了, 可以盡快試車比較重要。 我的測試環境是 LMDE 5 (Elsie); 主要參考 archlinux 的教學文; 我猜大部分 debian 系列應該也都可以。
先安裝套件:
apt install fluidsynth fluid-soundfont-gm pmidi
其中 fluidsynth 負責把 midi 檔轉成普通的聲音格式;
fluid-soundfont-gm 是各種樂器音色集; pmidi 則是命令列的 midi 播放軟體。
安裝完成後, 系統會多出一個 "fluidsynth" 的 user service。
編輯系統設定檔 /usr/lib/systemd/user/fluidsynth.service
閱讀內容, 可以猜到: 個人設定檔是 ~/.config/fluidsynth 。
可以複製過去並修改個人設定檔, 或是直接修改系統設定檔,
把 OTHER_OPTS 前面的註解拿掉, 並且改成這樣:
OTHER_OPTS='-a pulseaudio -m alsa_seq -g 0.2 -o midi.autoconnect=1 -r 48000'
因為我桌面環境的聲音系統由 pulseaudio 再透過 alsa 來控制;
而如果不特別指定 -a pulseaudio, fluidsynth 會採直接透過 alsa 輸出聲音,
於是圖形介面的音量調整等等調節棒就會失效。
至於 -g 0.2 則是調整整體音量。 這是預設值。
如果設太大, 遇到音量過大的檔案, 會破音。
先檢查一下有哪些 alsa output ports:
aconnect -o
然後以普通用戶身份啟動服務:
systemctl --user start fluidsynth
再下一次 aconnect -o
應該會看到類似以下:
client 128: 'FLUID Synth (14883)' [type=user,pid=14883] 0 'Synth input port (14883:0)'
這表示 fluidsynth 已經開始在 port 128 提供服務。
於是可以用 pmidi -p 128:0 xyz.mid
播放 xyz.mid。
第一次聽到我的電腦播放 midi 檔, 超感動的啊~
不過呢, 因為即時轉檔即時播放比較挑戰, 每當我開其他視窗或做一些比較吃力的事, 播音品質就會變差。
先處理另一個比較簡單的問題: 音色品質。 觀察設定檔裡的這一句:
SOUND_FONT=/usr/share/sounds/sf3/default-GM.sf3
一路循著各種線索 (symbolic link、 套件內的檔案) 查過去,
發現我的系統原先因為已安裝 MuseScore 所以本來就已有一個輕量級 (lite) 的音色集。
我的人體 I/O 裝置沒有很先進 (耳朵辨識力不強), 那就直接以檔案名稱 (lite)
及檔案大小來判斷, 直接改用 fluid-soundfont-gm 所提供的較大版本囉:
ls -l /usr/share/sounds/sf3/default-GM.sf3 ls -l /etc/alternatives/default-GM.sf3 dpkg -L fluid-soundfont-gm ls -l /usr/share/sounds/sf3/MuseScore_General_Lite.sf3 /usr/share/sounds/sf2/FluidR3_GM.sf2 rm /etc/alternatives/default-GM.sf3 ln -s /usr/share/sounds/sf2/FluidR3_GM.sf2 /etc/alternatives/default-GM.sf3
回到即時性的問題。 比較簡單的做法是先轉成聲音檔再播放,
例如 fluidsynth -T oga -F bolero-1.ogg bolero-1.mid
然後用 vlc (經過 pulseaudio 再經過 alsa) 或 ogg123 (直接從 alsa)
播放 bolero-1.ogg, 就開始有一點音樂的品質了。
轉換速度其實比播放歌曲本身快很多。
Ted's Linux MIDI Guide 有很豐富的資訊。 他的文章裡沒有提到 systemd, 我猜資訊可能有點舊; 我安裝 fluidsynth 時, Ted Felix 文章當中的很多步驟都可以省略。 但這篇是很好的出發點; 我就是從這篇裡面開始找搜尋關鍵詞的。 取自 Ted 網頁的右圖是 linux 音效系統簡圖; 當然, 用 「linux sound system」 作圖片搜尋, 會找到較新、較複雜的系統圖。 Ted 的文章中有提到如何安裝 low-latency kernel 以便解決即時性的問題。 但是 較新的討論串 說現在可以用普通的 kernel, 只需要調參數即可。 找到 這篇教學, 不過我累了... 本文就馬馬虎虎結束吧。
對了, 波麗露舞曲裡面有很多樂器輪流演奏, 它的 midi 檔, 我是從 BitMidi 這個網站找到的。 搜尋 「midi classic」 或 「midi repository」 可以找到很多專門蒐集 midi 檔的網站。 Midi 跟真正的演奏當然不能比; 不過檔案超小的啊!
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。