今天在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,0
和hw: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,即从VMPK
到FLUID 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了。。