在 Linux 环境下玩转 MIDI

今天在Ubuntu下搭了各种MIDI环境,为后边玩 Haskell School of Music 中讲的Euterpea音乐库做准备。网上相关的文章比较少,这里就写篇文章记录一下吧。。。

ASLA

首先介绍一下ASLA(Advanced Linux Sound Architecture),它为Linux提供了MIDI和音频功能,相当于Linux下音频的基础。Ubuntu应该自带ALSA。

查看一下当前系统的内核:

1
2
sczyh30@sczyh30-workshop:~$ uname -a
Linux sczyh30-workshop 3.19.0-49-generic #55-Ubuntu SMP Fri Jan 22 02:10:24 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

由于玩MIDI对时间要求严格,不能卡顿,因此推荐用低延时的内核(Low Latency Kernel),可以通过sudo apt-get install linux-lowlatency安装然后调整CONFIG_HZ参数。

然后我们来查看一下ALSA设备:

1
2
3
4
5
sczyh30@sczyh30-workshop:~$ cat /proc/asound/cards
0 [HDMI ]: HDA-Intel - HDA Intel HDMI
HDA Intel HDMI at 0xf7b14000 irq 34
1 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xf7b10000 irq 33

从出现的列表看不出哪个是声卡设备,因此再用aplay命令看一下详细信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sczyh30@sczyh30-workshop:~$ aplay -l
**** PLAYBACK 硬體裝置清單 ****
card 0: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0]
子设备: 1/1
子设备 #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1]
子设备: 1/1
子设备 #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2]
子设备: 1/1
子设备 #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
子设备: 0/1
子设备 #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 1: ALC892 Digital [ALC892 Digital]
子设备: 1/1
子设备 #0: subdevice #0

可以看到card 1位置为声卡,在ALSA设备里表示为hw:1,当然card 1处有两个子设备,可以分别用hw:1,0hw:1,1表示。在下边调用ALSA设备的时候都会用到hw:1

下面来测试一下ALSA音频功能。首先通过sox命令生成一段音频,然后用aplay播放:

1
2
sox -b 16 -n test.wav rate 44100 channels 2 synth 1 sine 440
aplay -D hw:1 test.wav

正常情况下会听到”滴”的一声,代表设备正常,否则就是设备设置的不对。如果提示设备忙,那么可能是其它程序(比如pulseaudio)占用了。

FluidSynth

下面来玩一下 FluidSynth ,它是一个音频合成器。它可以将MIDI数据通过soundfont转化为音频。先安装:sudo apt-get install fluidsynth

fluidsynth可以用来播放MIDI文件,命令:

1
fluidsynth --audio-driver=alsa -o audio.alsa.device=hw:1 /usr/share/sounds/sf2/FluidR3_GM.sf2 song.mid

当然fluidsynth也可以接受其它程序传输的MIDI数据并转化为音频。这时候fluidsynth将作为一个“音频服务器”。它会等待其它程序与它建立连接,并发送MIDI数据。命令:

1
fluidsynth --server --audio-driver=alsa -o audio.alsa.device=hw:1 /usr/share/sounds/sf2/FluidR3_GM.sf2

此时fluidsynth已开始运行,用aplaymidi -l命令可以看到fluidsynth正在监听的端口:

1
2
3
4
sczyh30@sczyh30-workshop:~$ aplaymidi -l
Port Client name Port name
14:0 Midi Through Midi Through Port-0
128:0 FLUID Synth (26298) Synth input port (26298:0)

然后就可以往这个端口传输MIDI数据,比如MIDI文件:aplaymidi -p 128:0 song.mid

再来玩一下VMPK(Virtual MIDI Pinao Keyboard),它是个MIDI Piano,产生MIDI数据。首先先安装:sudo apt-get install vmpk,然后启动。

这时候由于没有与音频设备建立连接,按琴键的时候不会有声音。我们需要通过aconnect命令与fluidsynth建立连接。首先查看一下当前的Audio IO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sczyh30@sczyh30-workshop:~$ aconnect -i
client 0: 'System' [type=内核]
0 'Timer '
1 'Announce '
client 14: 'Midi Through' [type=内核]
0 'Midi Through Port-0'
client 129: 'VMPK Output' [type=用户]
0 'VMPK Output '
sczyh30@sczyh30-workshop:~$ aconnect -o
client 14: 'Midi Through' [type=内核]
0 'Midi Through Port-0'
client 128: 'FLUID Synth (26298)' [type=用户]
0 'Synth input port (26298:0)'
client 130: 'VMPK Input' [type=用户]
0 'VMPK Input '

我们需要将MIDI转化为Audio,即从VMPKFLUID Synth。建立连接:aconnect 129:0 128:0,然后再测试一下VMPK,有声音输出了。

FluidSynth也有GUI版本Qsynth,可以很方便地合成声音。

Euterpea依赖

Euterpea需要asound:

1
apt-get install libasound2-dev jackd2

然而现在配置好Euterpea后,无论如何play它都不发声音。。。官网说这玩意只在某些特定的Haskell版本上正常运行,也是醉了。。待调试好后再来补充。。

【补充】Windows下不用配置就可以很愉快的玩Euterpea了。。

文章目录
  1. 1. ASLA
  2. 2. FluidSynth
  3. 3. Euterpea依赖