TiMidity++ 是用於在不使用硬體合成器的情況下播放 MIDI 文件的軟體合成器。它可以實時將 MIDI 翻譯給音效卡,或是將成果存儲到文件中,比如存儲到 PCM.wav 文件格式。
安裝
安裝 timidity++包 包。
你還應當安裝音色庫(SoundFont)或 Gravis UltraSound(GUS) 補丁文件來獲得產生音頻的能力。參見 MIDI#SoundFont 列表
如果你使用 pipewire包,由於 TiMidity++ 有時依賴 ALSA 工作,你需要安裝 pipewire-alsa包。
配置
將下面的配置加入到 timidity.cfg(5) 來選用你想用的音色庫。
FreePats:
/etc/timidity/timidity.cfg
soundfont /usr/share/soundfonts/freepats-general-midi.sf2
Fluid:
/etc/timidity/timidity.cfg
soundfont /usr/share/soundfonts/FluidR3_GM.sf2
守護進程
如果你希望將 TiMidity++ 用作 ALSA 的音序器,你應當將用戶加入到 audio
用戶組。就像大部分用戶組更改一樣,你可能需要重啟會話(比如登出後再登入),來使新加入的組可以通過 groups
指令顯示出來。
啟動/啟用 timidity.service
用戶單元。注意,當你沒有在加入 audio
組後沒有重啟會話時,你可能無法正常啟動這個服務。
使用 PulseAudio 的環境下,這個服務可能無法啟動。你可能需要在你的桌面環境中將下列指令設為自啟動項。如果你只想以守護進程模式運行 TiMidity++ 一次,你也可以直接使用這串指令來獲得相對更易讀的終端輸出。
$ timidity -iA
用例
播放文件
TiMidity++ 有兩種用法:將它用作一個 MIDI 播放器,或是為 ALSA 添加 MIDI 支持的守護進程。
獨立模式
你可以用 TiMidity++ 播放 MIDI 文件:
$ timidity example.mid
-in
選項會喚出一個基於文本的界面。TiMidyty++ 還有很多其他選項。詳見 timidity(1) 或使用 -h
選項。
守護進程模式
如果你選擇將 TiMidity++ 用作守護進程,它將為 rosegarden、aplaymidi、vkeybd 之類的程序提供 MIDI 輸出支持。
Timidity++ 會提供軟 MIDI 接口(如果你的系統有硬體 MIDI 接口的話,就會另外創建一些):
$ aconnect -o
client 128: 'TiMidity' [type=user] 0 'TiMidity port 0 ' 1 'TiMidity port 1 ' 2 'TiMidity port 2 ' 3 'TiMidity port 3 '
你現在可以如此播放 MIDI 文件:
$ aplaymidi filename.mid --port 128:0
另一個典型例子是 vkeybd,一個 X 下的虛擬 MIDI 鍵盤。
$ vkeybd --addr 128:0
選項 --addr 128:0
將軟體 MIDI 輸入接口(本例是由 vkeybd 提供的)連接到第一個 ALSA 輸出接口(本例中是由 Timidity++ 提供的)。另外,你也可以使用 aconnect,patchageAUR 或是 kaconnect。最終,當你使用 vkeybd 提供的按鍵彈奏時,TiMidity++ 將演奏出恰當的樂聲。
連接到虛擬 MIDI 設備
如果你有一個 Timidyty++ 守護進程和 aplaymidi 一起運行,你可以將這個守護進程與虛擬 MIDI 設備連接,來使 rosegarden 或 scala 之類的程序運行。
加載 snd-virmidi
內核模塊。如果你願意,也可以讓系統啟動時加載模塊。
用 acconnect 來確認接口數:
$ aconnect -o
client 14: 'Midi Through' [type=kernel] 0 'Midi Through Port-0' client 20: 'Virtual Raw MIDI 1-0' [type=kernel] 0 'VirMIDI 1-0 ' client 21: 'Virtual Raw MIDI 1-1' [type=kernel] 0 'VirMIDI 1-1 ' client 22: 'Virtual Raw MIDI 1-2' [type=kernel] 0 'VirMIDI 1-2 ' client 23: 'Virtual Raw MIDI 1-3' [type=kernel] 0 'VirMIDI 1-3 ' client 128: 'TiMidity' [type=user] 0 'TiMidity port 0 ' 1 'TiMidity port 1 ' 2 'TiMidity port 2 ' 3 'TiMidity port 3 '
然後創建連接:
$ aconnect 20:0 128:0
現在,系統中的 /dev/snd/midiC1D0
MIDI 虛擬輸出設備應該可以使用了。
小技巧
轉換文件
Timidity++ 可以將 MIDI 文件轉為其他格式。下列指令將結果輸出到 WAV 文件中:
$ timidity input.mid -Ow -o out.wav
用 FFmpeg 可以轉為其他模式。此例轉為 mp3:
$ timidity input.mid -Ow -o - | ffmpeg -i - -acodec libmp3lame -ab 256k out.mp3
如何使 DOSBox 使用 TIMIdity++
首先,你需要寫配置。在 DOSBox 中輸入下列指令創建配置文件:
config -writeconf dosbox.conf
你可以將 [[ic|dosbox.conf}} 替換成任何你想要的名字。如果你想要隱藏文件,在文件名前加點。
在執行下列指令前,使用 aconnect 指令以確保 Timidity++ 已經作為守護進程啟動。
使用任何編輯器編輯配置,你需要直接跳轉到此節:
dosbox.conf
[midi] mpu401=intelligent device=default config=
把 ALSA 連接埠寫到 config= 後,默認是:
config=128:0
在終端中重啟 DOSBox 以閱讀調錯信息。情況下,你應該看見 128:0 接口已成功初始化。
疑難解惑
TiMidity++ 並不能播放 MIDI 文件
可能是你的聲音文件沒有正確配置。運行:
$ timidity example.mid
如果終端輸出如下,那麼你的聲音文件可能沒有正確配置。
No instrument mapped to tone bank 0, program XX - \ this instrument will not be heard
確保你已經安裝了聲音文件,並且你的聲音文件已經列入 /etc/timidity/timidyty.cfg
。詳見#配置。
守護進程模式下,播放聲音速度過快
TiMidity++ 的默認 ALSA 輸出模塊可能在 ALSA 服務模式下導致這個問題。嘗試其他輸出選項,例如 libao:
$ timidity -iA -OO
然後用 aplaymidi 測試。如果不起效,你可能需要配置 JACK 然後將 Timidity++ 的輸出改到 JACK 上。