Timidity++
TiMidity++ 是一个 软件合成器,可以无需硬件合成器播放 MIDI 文件。它可以实时渲染到声卡,或者将结果保存到文件,例如 PCM .wav 文件。
安装
安装 timidity++ 软件包。
您还应该安装 SoundFont 或 Gravis 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 键盘。
$ 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 中输入以下内容以创建一个配置文件
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。