Timidity++

出自 ArchWiki

TiMidity++ 是一个软件合成器,可以在没有硬件合成器的情况下播放 MIDI 文件。它可以实时渲染到声卡,也可以将结果保存到文件,例如 PCM .wav 文件。

安装

安装 timidity++ 软件包。

您还应该安装 SoundFontGravis UltraSound (GUS) 音色库文件,以便能够产生声音。请参阅 MIDI#SoundFont 列表

如果您使用 pipewire,请安装 pipewire-alsa,因为 TiMidity++ 有时依赖于 Alsa

配置

要配置您首选的 SoundFont,请根据您的选择将以下行添加到 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 以获得基于文本的界面。TiMidity++ 还有许多其他选项。请参阅 timidity(1) 或使用 -h 获取帮助。

守护进程模式

如果您以守护进程(ALSA 音序器客户端)运行 TiMidity++,它将为其他程序(如 rosegarden、aplaymidi、vkeybd 等)提供 MIDI 输出支持。

这将为您提供四个输出软件 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 '

您现在可以使用 aplaymidi 播放 MIDI 文件

$ aplaymidi filename.mid --port 128:0

另一个例子是 vkeybd,一个用于 X 的虚拟 MIDI 键盘。

您可以安装 vkeybdAUR

$ vkeybd --addr 128:0

选项 --addr 128:0 将 vkeybd 提供的输入(可读)软件 MIDI 端口连接到 Timidity 提供的第一个输出(可写)ALSA 端口。或者,您可以使用 aconnect、patchageAUR 或 kaconnect。因此,当您在 vkeybd 上操作琴键时,TiMidity++ 会播放相应的音符。

连接到虚拟 MIDI 设备

一旦您运行了 TiMidity++ 守护进程并且它与 aplaymidi 一起工作,您就可以将其连接到虚拟 MIDI 设备,该设备将在 rosegarden 或 scala 等程序中工作。

加载 snd-virmidi 内核模块,并(可选)配置您的系统以在启动时加载模块

使用 aconnect 验证端口号

$ 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

您现在应该在您的系统上有一个可用的 MIDI 输出设备 (/dev/snd/midiC1D0)。

技巧和提示

转换文件

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

您可以将 dosbox.conf 替换为您想要的任何名称,如果您想隐藏它,请在前面添加一个点。

确保您已按照上述说明以守护进程身份启动了 TiMidity++,并使用 aconnect 命令。

使用任何编辑器编辑此配置文件,转到以下部分

dosbox.conf
[midi]
mpu401=intelligent
device=default
config=

将 ALSA 连接端口放入 config= 的末尾,默认为

config=128:0

在终端中重启 DOSBox,以便您可以查看其调试信息,不出意外的话,您应该看到端口 128:0 上的成功初始化。

故障排除

TiMidity++ 不播放 MIDI 文件

可能是您的 SoundFile 未正确设置。只需运行

$ timidity example.mid

如果您在终端输出中找到类似这样的行,则说明您的 SoundFile 未正确设置。

No instrument mapped to tone bank 0, program XX - \
this instrument will not be heard

确保您已安装了一些采样,并且您的 SoundFile 已添加到 /etc/timidity/timidity.cfg。有关更多详细信息,请参阅配置

守护进程模式播放声音不同步

TiMidity++ 的 ALSA 输出模块(默认)可能会在 ALSA 服务器模式下导致此问题。尝试另一个输出选项,例如 libao

$ timidity -iA -OO

并使用 aplaymidi 进行测试。如果这不起作用,您可能需要配置 JACK 并将 TiMidity++ 的输出设置为 jack。

参见