跳至內容
出自 Arch Linux 中文维基

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 鍵盤。

你可以安裝 vkeybdAUR,然後如此使用:

$ 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 0.72 版本。

首先,你需要寫配置。在 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 上。

參見