MIDI
MIDI 本身,即“乐器数字接口”(Musical Instrument Digital Interface)的缩写,仅仅是一种协议和标准,用于乐器与任何理解该语言的设备之间的通信。它可以用于控制一系列合成器,使铁罐发出鼓声,甚至操作工业设备。
然而,本文的范围将主要集中于 MIDI 在计算机系统中的应用,用于播放包含 MIDI 数据的文件。这些文件通常带有 .mid
扩展名,并且在多媒体计算的黄金时代非常流行,用于分享音乐。在专业的音乐创作/编曲中,它仍然扮演着至关重要的角色。
MIDI 文件
无需深入了解该格式的组成细节,您只需要明白 MIDI 文件,例如 foobar.mid
,不包含任何数字音频数据,因此没有“PCM 流”。MIDI 是一种声音文件格式是一种常见的误解,因此您经常看到人们抱怨音乐播放器应用程序无法播放该文件。以下是 MIDI/MID 文件包含内容的非常初学者友好的概述
# FOOBAR.MID Note ON Use Instrument #1 Play Note C1 Set Volume at 100 Set Pitch at 50
为了使这样的文件有用,需要有一个“引擎”可以将数据转换为音乐。这个引擎将有一个“音调发生器”,这就是我们所说的“合成器”。因此,任何可以在没有 MIDI 硬件(您计算机的声卡)的情况下播放 MIDI 文件的播放器,都内置了合成器或使用了外部合成器。一个典型的键盘(不是您正在打字的键盘)实际上由两个组件组成——一个 MIDI“控制器”(琴键)和一个合成器(音调发生器/模块;发出声音的东西)。
所以到目前为止,您应该能够理解:
- 需要合成器才能播放 MIDI 文件。
- 合成器可以是硬件或软件。
- 大多数计算机声卡/芯片组不包含合成器。
- 您需要一个带有适当“音色库”(声音集合)的合成器,才能充分享受 MIDI 文件的美妙之处。
- 如果某个乐器不在音色库中,您的合成器将不会为使用该乐器的音符播放任何声音。
- 如果文件中某个乐器对应于音色库中不同的乐器,您的合成器将播放不同的声音(显然)。
通用 MIDI 音色库
通用 MIDI (GM) 是一种规范,用于标准化许多与 MIDI 相关的事项,特别是声音集合中乐器的布局。“音色库”与 GM 兼容意味着它符合通用 MIDI 的标准,并且只要 MIDI 文件也与 GM 兼容(即没有定义任何特殊的东西 - 例如引入新乐器或在音色库的不同位置放置一个乐器),回放将按预期进行,因为音色库具有 MIDI 消息/事件的正确乐器/处理程序。最流行的音色库格式之一是 SoundFont,特别是 SF2。另一种流行的格式是 Gravis UltraSound (GUS) 音色补丁文件。
- 如果您的声卡可以使用 SoundFont,您可以将 .sf2 文件加载到其中。
- 如果您没有可以使用 SoundFont 的声卡(基本上没有硬件合成器),您可以使用软件合成器并加载 SF2 文件。反过来,您可以找到某种方法全局使用此合成器。
SoundFont 列表
- FatBoy — 一个免费的 GM/GS SoundFont,用于经典视频游戏 MIDI、模拟和通用用途。
- Fluid — Frank Wen 的专业级 GM/GS SoundFont。
- FreePats — 免费且开放的通用 MIDI 音色集。
- https://web.archive.org/web/20240925205657/https://freepats.zenvoid.org/SoundSets/general-midi.html || freepats-general-midi
- GeneralUser GS — S. Christian Collins 制作的 GM 和 GS 兼容 SoundFont 音色库,用于作曲、播放 MIDI 文件和复古游戏。
AUR 中还有许多其他 SoundFont,例如:搜索 soundfont-。另请参阅 FluidSynth Wiki。
Gravis UltraSound 音色补丁集列表
- FreePats (legacy) — 旧版本的 FreePats 通用 MIDI 音色集,最初由 Eric A. Welsh 整理。
- https://web.archive.org/web/20240925205657/https://freepats.zenvoid.org/SoundSets/general-midi.html#OldFreePatsGM || freepats-legacyAUR
SoundFont 可以通过 unsf-gitAUR 包中的命令行工具 unsf 转换为 Gravis UltraSound 音色补丁集。
硬件回放
如果您只需要在支持 MIDI 的硬件设备(例如硬件合成器)上播放 MIDI 文件,您可以使用 alsa-utils 中的 aplaymidi
命令。
要获取可用 MIDI 端口的列表,请使用命令
$ aplaymidi -l
然后要播放 MIDI 文件,请指定它以及从上一个命令的输出中获得的所需 MIDI 设备的可用端口。例如像这样
$ aplaymidi -p 24:0 midi_file.mid
SB Audigy 1 - Emu10k1 波表
首先,确保 Synth 混音器控件未静音,并且 Audigy Analog/Digital output Jack 设置为 [Off]。
要检查和调整它们,请使用 alsamixer
或您选择的混音器。
接下来,从 AUR 构建并安装 awesfxAUR 包。然后,在 Emux 波表上加载 SoundFont 文件,如下所示
$ asfxload /path/to/any/file.sf2
.SF2 文件可以是任何 SoundFont。如果您可以访问 Windows 上的 2GMGSMT.SF2,您可以使用该文件。
您现在应该一切就绪。要使用 aplaymidi
播放您的 .mid 文件,您必须执行以下操作
通过运行以下命令获取可用 MIDI 端口的列表
$ aplaymidi -l
Port Client name Port name 14:0 Midi Through Midi Through Port-0 28:0 SB Live! 5.1 [SB0060] EMU10K1 MPU-401 (UART) 29:0 Emu10k1 WaveTable Emu10k1 Port 0 29:1 Emu10k1 WaveTable Emu10k1 Port 1 29:2 Emu10k1 WaveTable Emu10k1 Port 2 29:3 Emu10k1 WaveTable Emu10k1 Port 3
然后,选择一个可用的“Emu10k1 WaveTable”MIDI 端口,在本例中为 29:0,并按如下方式指定它
$ aplaymidi -p 29:0 midi_file.mid
软件回放
“那我为什么可以用 Windows Media Player 播放 MIDI 呢?”
嗯,因为 Windows 有一个默认的软件合成器,它可以全局运行。即便如此,它也缺乏现代计算机应有的质量。如果在 Linux 上有一种方法可以做到这一点,您也可以从任何播放器播放 MIDI。也许是一个 MIDI 服务器(它将保存一个选择的合成器),它位于声音服务器中,例如 Phonon 或 PulseAudio。然而,这种东西尚未实现,您只能使用具有插件来提供合成器或自身具有合成器的播放器或声音服务器来播放 MIDI。
合成器
FluidSynth
MIDI 播放器和一个为 ALSA 添加 MIDI 支持的守护进程。它仅支持 SoundFont。参见 FluidSynth。
TiMidity++
MIDI 到 WAVE 转换器和播放器。它同时支持 SoundFont 和 Gravis UltraSound 音色补丁文件。参见 Timidity++。
WildMIDI
WildMIDI 是一个简单的软件 MIDI 播放器。它使用 Gravis UltraSound 音色补丁文件将 MIDI 文件转换为音频。尚不支持 SoundFont。[1] 为了使用它,需要一个配置文件 wildmidi.cfg(5),它指向 GUS 音色补丁
/etc/wildmidi/wildmidi.cfg
dir /path/to/any source /path/to/any/timidity.cfg
配置文件格式主要与 TiMidity++ 兼容。
您可以简单地使用 WildMIDI 播放 MIDI 文件
$ wildmidi example.mid
要将 MIDI 文件转换为 WAV 格式
$ wildmidi example.mid -o example.wav
有关更多选项,请参阅 wildmidi(1)。
播放器
基于 GStreamer 的播放器
安装 gst-plugins-bad 和 SoundFont(例如 soundfont-fluid)后,可以在 GNOME Videos 和所有其他使用 GStreamer 作为后端的播放器中播放 MIDI 文件。它使用 FluidSynth 作为合成器,并从 /usr/share/soundfonts/
目录中选取第一个可用的 SoundFont。
VLC
FluidSynth 插件为 VLC 提供 MIDI 播放支持,使用 FluidSynth 作为合成器。需要安装 SoundFont,VLC 将自动检测到它。如果安装了多个 SoundFont,您可以在 VLC 首选项中选择一个(工具 > 首选项):您必须显示所有设置。然后,转到 输入/编解码器 > 音频编解码器 > FluidSynth。
并且,如果您安装了例如 Fluid,请将位置设置为
/usr/share/soundfonts/FluidR3_GM.sf2
Audacious
audacious-plugins 包中的 AMIDI-Plug 插件为 Audacious 提供 MIDI 播放支持,使用 FluidSynth 作为合成器。您可以在其 MIDI 输出插件的设置中指定用于播放的 SoundFont(文件 > 首选项 > 插件 > 输入 > AMIDI-Plug > 首选项)。
DeaDBeeF
deadbeefAUR 播放器能够通过其 WildMidi 播放器插件播放 MIDI 文件。它不支持 SoundFont,仅支持 Gravis UltraSound 音色补丁文件。您可以通过转到 编辑 > 首选项 > 插件 > WildMidi Player > 配置,在 DeaDBeeF 中指定配置文件位置。
Drumstick
Drumstick MIDI 文件播放器能够使用 FluidSynth 作为合成器来播放 MIDI 文件。安装 dmidiplayerAUR。