跳转到内容

Timidity++

来自 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 上。

参见[编辑 | 编辑源代码]