Timidity++
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 上。