下一页 上一页 目录

10. 如何使用 MIDI 音序器与软音源。

Frank Barknecht <barknech@ph-cip.uni-koeln.de>

http://linux-sound.org/quick-toots/4-sequencers_and_softsynths/quick-toot-midisynth_howto.html

本 HOWTO 描述了在 ALSA 0.9 下,通过虚拟 MIDI 连接从 MIDI 音序器控制支持 MIDI 的软件合成器所需的设置。本文档可以自由翻译和分发。它根据 GNU 自由文档许可证发布。

10.1 介绍

像 Csound、PD、jMax 或 Spiral Synth Modular 这样的软件合成器提供了近乎无限的自由来创造已知或未知、常见或不寻常的声音体验。如果 Linux 完全支持这些软件合成器,它们还可以替代昂贵的硬件合成器或一些声卡上廉价但通常音质不佳的 MIDI 合成器。另一方面,在这些软音源中进行创作可能是一项繁琐的任务:例如在 Csound 中,人们必须以类似电子表格的方式编写无尽的数字行——这不是一种舒适的音乐创作方式。

MIDI 音序器应用程序更适合这项任务。它们提供了以便捷方式插入音符和控制数据的界面:以真实乐谱中的音符、钢琴卷帘中的标记或 MIDI 事件列表(如果您喜欢这种视图)的形式。另一种 MIDI 音序器提供了类似音轨器的音符输入方式,许多人从美好的旧时代就习惯了这种方式,那时这是场景中的最先进技术。最后但并非最不重要的一点是,一些 MIDI 音序器允许您录制自己在键盘或其他物理设备上的演奏,这对许多用户来说是最自然的音乐创作方式。

但是 MIDI 音序器喜欢将其音符输出到 MIDI 设备,这些设备通常将其事件路由到外部世界,即硬件合成器和采样器。借助虚拟 MIDI 设备,可以将 MIDI 数据保留在计算机内部,并让它控制在同一台机器上运行的其他软件。本 HOWTO 描述了实现此目标所需的一切。

10.2 设备设置

在我们的设置中,我们使用 ALSA 库和驱动程序模块,因为这是(或应该是)在 Linux 上进行严肃音频和 MIDI 的标准方式。本教程假设我们正在运行 ALSA 的 0.9.0 分支,但虚拟 MIDI 模块也存在于 ALSA 0.5.x 中,因此以下大部分内容也应适用于此版本。在 OSS/Free(2.5.x 之前的内核中发现的声音模块)和 OSS/Linux 声音架构中,可以使用 v_midi 模块,但这超出了本文档的范围。

要使用 ALSA 的虚拟 MIDI 声卡,必须存在 snd-card-virmidi 模块。在最新版本的 ALSA(以及 2.5.x 开发内核中),该模块失去了 '-card' 中间修复,并被重命名为 snd-virmidi。确保您已构建此模块,如果您配置 ALSA 仅构建用于您的实际声卡的模块,则它可能会丢失。

必须加载 virmidi 模块才能使虚拟 MIDI 端口可用。您可以使用以下命令手动测试加载它


 $ modprobe snd-virmidi snd_index=1
   

其中 snd_index 设置为适当的第一个可用声卡索引(如果您只有一张索引为 0 的声卡,则为 =1),但更方便的是调整您的模块配置,以便在您需要时它已经存在。为此,我们需要在 /etc/modules.conf(或另一个位置,具体取决于您的发行版)中的 ALSA 部分中扩展以下内容


 # Configure support for OSS /dev/sequencer and 
 # /dev/music (aka /dev/sequencer2)
 # (Takashi Iwai advises that it is unnecessary 
 # to alias these services beyond the first card, i.e., card 0)
 alias sound-service-0-1 snd-seq-oss
 alias sound-service-0-8 snd-seq-oss

 # Configure card 1 (second card) as a virtual MIDI card
 alias sound-slot-1 snd-card-1
 alias snd-card-1 snd-virmidi
   

现在您已将虚拟 MIDI 声卡配置为索引为 1 的第二张声卡,假设您有一张真实的声卡(这将非常有用)。如果您像我一样有第二张真实声卡,请更改上面的配置以读取
 # Configure card 2 (third card) as a virtual MIDI card
 alias sound-slot-2 snd-card-2
 alias snd-card-2 snd-virmidi
   

如果您有更多声卡,那么,您现在应该知道该怎么做了...

可能需要重启 ALSA 声音系统,之后应在 /proc/asound/cards 中看到虚拟 MIDI 声卡


$ cat /proc/asound/cards 
 0 [card0          ]: ICE1712 - M Audio Audiophile 24/96
                      M Audio Audiophile 24/96 at 0xb800, irq 5
 1 [card1          ]: EMU10K1 - Sound Blaster Live!
                      Sound Blaster Live! at 0xc800, irq 11
 2 [card2          ]: VirMIDI - VirMIDI
                      Virtual MIDI Card 1
   

在我自己的机器的这个示例中,VirMIDI 声卡是第三张声卡,索引为 2。此设置产生以下原始 MIDI 设备,在 /proc/asound/devices 中找到 [仅显示 MIDI 设备]


 $ cat /proc/asound/devices 
   8: [0- 0]: raw MIDI
  41: [1- 1]: raw MIDI
  42: [1- 2]: raw MIDI
  75: [2- 3]: raw MIDI
  74: [2- 2]: raw MIDI
  73: [2- 1]: raw MIDI
  72: [2- 0]: raw MIDI
   

以 '2-' 开头的设备是我的虚拟 MIDI 设备。如果您的系统中只有一张物理声卡,则您的设备将以 '1-' 开头。

您可以使用 ALSA 自己的 aconnect 实用程序获得更好的列表,我们无论如何都需要它。使用选项 -o(或 -lo)调用它将显示能够进行 MIDI 输出的 MIDI 设备,而使用 -i 调用则显示具有 MIDI 输入功能的设备


 $ aconnect -o
 [...]
 client 80: 'Virtual Raw MIDI 2-0' [type=kernel]
     0 'VirMIDI 2-0     '
 client 81: 'Virtual Raw MIDI 2-1' [type=kernel]
     0 'VirMIDI 2-1     '
 client 82: 'Virtual Raw MIDI 2-2' [type=kernel]
     0 'VirMIDI 2-2     '
 client 83: 'Virtual Raw MIDI 2-3' [type=kernel]
     0 'VirMIDI 2-3     '
 $ aconnect -i
 [...]
 client 80: 'Virtual Raw MIDI 2-0' [type=kernel]
     0 'VirMIDI 2-0     '
 client 81: 'Virtual Raw MIDI 2-1' [type=kernel]
     0 'VirMIDI 2-1     '
 client 82: 'Virtual Raw MIDI 2-2' [type=kernel]
     0 'VirMIDI 2-2     '
 client 83: 'Virtual Raw MIDI 2-3' [type=kernel]
     0 'VirMIDI 2-3     '
   

显示的设备对应于 ALSA 自己的 OSS 兼容原始 MIDI 设备,位于 /proc/asound/dev 目录树中。例如,/proc/asound/dev/midiC2D0 是索引为 2 的虚拟 MIDI 声卡的第一个 MIDI 设备,aconnect 称其为 Virtual Raw MIDI 2-0。在 Debian 中,这些设备也在 /dev/snd/ 中可用,并且它们也在内部与旧的 OSS 设备位置链接:/dev/midiXX。为了确保我可以从 /dev/midiXX 获取 ALSA 原始 MIDI 端口,我使用以下命令对它们进行了符号链接


 $ ln -s /dev/snd/midiC2D0 /dev/midi20
 $ ln -s /dev/snd/midiC2D1 /dev/midi21
 [...]
   

但这应该不是必要的,所以孩子们,不要在家里这样做!

现在我们已经创建并配置了 VirtualMIDI 声卡,我们可以在我们的应用程序中像使用任何其他 MIDI 设备一样使用它。只需在您喜欢的音序器和合成器应用程序的正确配置点插入所需的设备,无论是 OSS 兼容的 /dev/midi20 还是像 80:0 这样的 ALSA MIDI 端口。

10.3 路由 MIDI 事件

aconnect

如果没有进一步的安排,我们将无法将 MIDI 事件从音序器发送到软音源。为此,我们首先需要使用(您猜对了)aconnect 实用程序连接两个端口。此工具连接两个或多个端口。其上面的 -i 和 -o 输出已经向我们展示了可用的端口,现在可以使用简单的语法将这些端口单向连接


 $ aconnect [sender port] [receiver port]
 $ aconnect 80:0 81:0
    

这将所有发送到端口 80:0 的 MIDI 数据路由到端口 80:1。在我们的设置中,这意味着每个在 /dev/midi20 输入的事件都会发送到 /dev/midi21,在那里它可以被另一个应用程序读取(“接收”)。

如果您已将 VirMIDI 声卡配置为第二张声卡(声卡索引为 1),则您应该具有以下端口


 $ aconnect -lo
 client 72: 'Virtual Raw MIDI 1-0' [type=kernel]
     0 'VirMIDI 1-0     '
 client 73: 'Virtual Raw MIDI 1-1' [type=kernel]
     0 'VirMIDI 1-1     '
 client 74: 'Virtual Raw MIDI 1-2' [type=kernel]
     0 'VirMIDI 1-2     '
 client 75: 'Virtual Raw MIDI 1-3' [type=kernel]
     0 'VirMIDI 1-3   
    

在这里,您可以例如使用以下命令将端口 72:0 (/dev/midi10) 连接到端口 73:0 (/dev/midi11)


 $ aconnect 72:0 73:0
    

aconnect 可以使用其 -lo 和 -li 选项向我们展示创建的内容


 $ aconnect -lo
 client 72: 'Virtual Raw MIDI 1-0' [type=kernel]
     0 'VirMIDI 1-0     '
         Connecting To: 73:0
 client 73: 'Virtual Raw MIDI 1-1' [type=kernel]
     0 'VirMIDI 1-1     '
         Connected From: 72:0
 client 74: 'Virtual Raw MIDI 1-2' [type=kernel]
     0 'VirMIDI 1-2     '                       
 client 75: 'Virtual Raw MIDI 1-3' [type=kernel]
     0 'VirMIDI 1-3
    

您会看到 'Virtual Raw MIDI 1-0' 现在已连接到 'Virtual Raw MIDI 1-1'。现在,根据您的应用程序,您可以从 'Virtual Raw MIDI 1-1' 读取发送到 'Virtual Raw MIDI 1-0' 的 MIDI 数据,或者用 OSS 设备术语来说:发送到 /dev/midi10 的内容被路由到 /dev/midi11,并且可以从那里读取。

您还可以将多个端口连接到一个端口。如果您像这样两次调用 aconnect


 $ aconnect 72:0 73:0
 $ aconnect 72:0 74:0
    

您也可以在 /dev/midi11 和 /dev/midi12 上接收发送到 /dev/midi10 的相同数据。当然,如果您创建更多 VirMIDI 声卡并随意连接它们,您真的可以让您的机器崩溃。现在没有人能阻止我们了...

要断开所有端口,请使用


 $ aconnect -x 
    

或仅使用以下命令断开一个连接


 $ aconnect -d 72:0 74:0
    

10.4 图形 MIDI 矩阵

Bob Ham 的 ALSA MIDI 矩阵是 ALSA MIDI 连接设置的一个非常有用的图形前端。用法非常简单直观:左侧是能够发送 MIDI 事件的 MIDI 端口,而右侧您看到的是具有接收功能的端口。如果您单击左侧端口,它将被选中用于与您接下来单击的右侧端口建立新连接。单击右侧端口将断开端口的连接(如果已连接)。一个干净易用的工具,有可能使本 HOWTO 变得多余。;)

aseqview

另一个用于路由 MIDI 事件的有用工具是 ALSA 开发人员 Takashi Iwai 开发的 aseqview。您可以在 Iwai-sama 的主页 http//members.tripod.de/iwai/alsa.html 上下载它,但它也包含在许多发行版中。此图形实用程序旨在查看和更改通过计算机的 MIDI 事件,但它也具有像 aconnect 一样将事件路由到不同 MIDI 端口的功能。当您必须处理使用 OSS 音序器设备的应用程序时,这会派上用场,aconnect 有时无法访问该设备。如果您在没有任何选项的情况下启动 aseqview,您将获得一个漂亮的 GUI 和一个新的 MIDI 端口。默认端口为 128:0,它看起来像这样


 client 128: 'MIDI Viewer' [type=user] 
    0 'Viewer Port 0 ' 
    

通过此端口,到目前为止我们已经看到的所有的 aconnect 技巧都是可能的。但是,如果您只需要将 aseqview 端口连接到另一个端口,aseqview 可以使用 -d 选项自行完成此操作


 $ aseqview -d 73:0 &
    

这将端口 128:0(如果可用)连接到端口 73:0,从 aseqview 启动时开始。

还有一些功能非常相似的图形 aconnect 工具。Maarten de Boer 使用了大部分原始 aconnect 源代码编写了一个名为“aconnectgui”的图形前端,它使用了 FLTK 工具包。它在 http://www.iua.upf.es/~mdeboer/ 上可用。在我看来,他的软件外观最好。

我个人使用 kaconnect,也许是因为它的名字最短,输入速度最快。kaconnect 由 Suse 自己的 Matthias Nagorni 博士开发,作为他为 ALSA 开发的一系列工具和软音源的一部分,即 kalsatools。不要让名称中的“k”迷惑您,该软件不需要 KDE,它使用纯 QT GUI 库。kaconnect 和更多内容可在 http://www.suse.de/~mana/kalsatools.html 上获得。

10.5 应用

在最后一部分,我将展示一些示例,说明如何在各种应用程序中使用虚拟 MIDI 连接。我将假设 VirMIDI 声卡是系统中的第三张声卡,使用 ALSA MIDI 端口 80:0 到 83:0,它们对应于原始 OSS MIDI 设备 /dev/midi20 到 /dev/midi23 以及 ALSA 原始 MIDI 设备 /dev/snd/midiC2D0 到 /dev/snd/midiC2D3。其中,前两个已使用以下命令“aconnected”


 $ aconnect 80:0 81:0
   

如所示,这意味着,发送到 /dev/midi20(或端口 80:0 或 /dev/snd/midiC2D0)的所有 MIDI 数据现在都可以在 /dev/midi21(或端口 80:1 或 /dev/snd/midiC2D1)上读取。

10.6 音序器

MusE

MusE 是 Werner Schweer 编写的全功能 MIDI 音序器,可在 http://muse.seh.de 上获得。我们需要在“Config->MIDI Ports”部分中将虚拟 MIDI 端口配置为输出端口。在 MusE 中,端口以其 ALSA 名称 'VirMIDI X-X' 命名

现在确保选择正确的端口作为您希望软件合成器监听和播放 MIDI 事件的通道的输出端口

由于某些原因,我无法在 MusE 0.4.9 中使用 'VirMIDI 2-0' 作为输出设备。当我想在 'VirMIDI 2-1' 上接收时,这是预期的设备,但我不得不反过来使用它。我不知道为什么,可能是我太笨了,您可能需要稍微试验一下。也可以使用 midi02 或 midi2 设备。

ttrk

Billy Biggs 的 ttrk 是一款简单、快速且紧凑的 MIDI 音序器,具有音轨器界面。它可以将其 MIDI 数据输出到在文件 $HOME/.ttrkrc 中配置的任何 MIDI 端口。

在那里放置这一行,让 ttrk 写入 /dev/snd/midiC2D0:您就可以开始了...

Shaketracker

Juan Linietsky 的 Shaketracker 恢复了像 ttrk 这样的 MIDI 音轨器界面,但它更完整地将经典的音轨器效果转换为 MIDI 数据。不幸的是,它使用 OSS 音序器设备 (/dev/sequencer) 进行 MIDI 输出,而不是原始 MIDI 设备,我无法让它与 aconnect 一起工作。但是有一个涉及 aseqview 的解决方法。如果我们先启动 aseqview,Shaketracker 将识别并使用 aseqview 端口。只需在 Shaketracker 的“用户设备”部分中选择它,它会以其 ALSA 名称 'Viewer Port 0' 显示出来

将此用户设备命名为一个好名称而不是“Null Output”是很方便的。

如果我们不带选项启动 aseqview,我们需要将 aseqview 端口与软音源端口连接,但如前所示,我们也可以直接使用目标端口启动 aseqview。不要忘记在每个应转到软音源的音轨中使用新的用户设备。我总是使用一个小 shell 脚本运行 Shaketracker,该脚本启动 aseqview,等待端口的创建,然后启动 Shaketracker


 #!/bin/sh
 aseqview -d 81:0 &
 # sleep 2 seconds to let aseqview do its work:
 sleep 2
 shaketracker
     

10.7 软件合成器

Pure Data

Miller Puckette 是开源软件合成和多媒体开发环境 Pure Data (PD) 背后的天才,它从 MAX 演变而来,反过来又是 MAX 扩展 MSP 的基础。PD 可以使用原始 MIDI 设备来读取使用选项 '-midiindev <devnumber>' 指定的 MIDI 事件,但它在指定要使用的设备方面有一种令人恼火的方式。公式如下:要使用 /dev/midi0,请使用 'midiindev 1' 启动 PD,要使用 /dev/midi1,请使用 '-midiindev 2' 启动它,依此类推。明白了吗?您必须在此处指定实际设备编号加 1。另一个示例:对于 /dev/midi21,请使用 '-midiindev 22' 启动 PD

PD 有一个帮助补丁 'Test audio and MIDI',这对于定位正确的 MIDI 设备非常宝贵

Csound

Csound 是当今大多数软件合成器的鼻祖,它也学习了 MIDI。运行 'csound --help' 会显示必须配置 MIDI 输入设备的位置

-M dnam 或 --midieventdev=dnam ........ 从设备读取 MIDI 实时事件

所以在我们的示例中,我们需要像这样启动 Csound


 $ csound -M /dev/midi22 -o devaudio midi.csd

结论

到现在您应该知道如何使用软件合成器来编排在 MIDI 音序器中创作和播放的音乐。当然,像 aconnect 和 aseqview 这样的工具不需要与 MIDI 软件音序器一起使用。您也可以将从外部音序器或外部 MIDI 键盘进入您机器的事件直接重定向到软件合成器,而无需 MIDI 音序器步骤。只需将外部 MIDI 设备“aconnect”到您的软音源或声卡的板载合成器。或者反过来:PD、Csound 或像 KeyKit 这样的环境允许您以算法方式创建 MIDI 事件,这对于经典的 Cubase 类 MIDI 音序器来说几乎是不可能的。使用 aconnect,您可以将这些事件路由到您拥有的任何支持 MIDI 的声音模块。

10.8 致谢

作者要感谢 Takashi Iwai 在准备本文时提供的技术帮助,以及他在日语方面的宝贵建议。谢谢你,Takashi!


下一页 上一页 目录