2024年2月5日 星期一

播放 midi 音樂, 馬虎版

今天終於學會播放 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, 就開始有一點音樂的品質了。 轉換速度其實比播放歌曲本身快很多。

linux 音效系統簡圖 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 跟真正的演奏當然不能比; 不過檔案超小的啊!

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。