[LinuxFocus-icon]
首页  |  站点地图  |  索引  |  搜索

新闻 | 过往期刊 | 链接 | 关于LF
This article is available in: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Russian  Turkce  

[Photo of the Author]
by Guido Socher (homepage)

关于作者:

Guido 喜欢Linux不仅仅是因为了解操作系统如何工作是一件有趣的事, 而是那些能将自身的设计融入其中的人。


目录:

 

Midi with alsa

[Illustration]

摘要:

Midi是一种声音文件格式,它不包含采样的数码声音,但它包含如何生成声音的描述信息。这和一个带有说明的表格类似,每一个说明表示一种声调。因此,相对于其它声音格式的文件。比如:Wav格式的文件,midi文件就显得小得多。

为了将Midi 转化为实际的声音,你需要一个Midi合成器。Midi合成器是一种硬件或软件,它能利用一种乐器(比如钢琴)的数字采样频率来产生声调。这些声音样本被称为"声音字体"。

这篇文章将讨论如何使用ALSA(Advanced Linux Sound Architecture)的接口来实现一个Midi合成器。



 

介绍

几年前你可以在任何计算机商店里找到象"Gravis UltraSound"或"SoundBlaster Gold" 这样有名的声卡。这两款声卡都有内置的Midi合成器。不幸的是,今天你已经买不到它了。即使你能够买到,也无法安装进你现在的机器了,因为它们是ISA总线。今天的计算机都采用了PCI总线,通常在主板上已经有一个声音控制芯片了。但这些芯片几乎都不支持Midi合成。 如果你想知道应该买什么样的声卡,你可以查看ALSA支持的声卡列表 。这个主意听起来不错,但事实上,迄今为止,只有一种声卡支持Midi合成,你可以在正规的计算机商店里买到,那就是:Soundblaster live。

即使你没有Soundblaster live的声卡,你也可以通过软件来模拟Midi的合成。在这篇文章里,我将解释如何来做。  

准备工作

目前,ALSA 处于一种发展阶段。稳定的版本是0.5, 而0.9 还处于开发状态。如果你确实需要在ALSA下运行Midi的应用程序,你可以使用0.5 版本,因为在0.9 版本,你几乎找不到应用程序,而且0.5 和 0.9 并不兼容(注意:pcm声音采样,wav文件,以及基于采样声音的应用程序在0.9 下并没有问题。在这里,我仅仅讨论Midi。)
0.5 版的软件包如下: 你可以在ALSA HOWTO 中查到如何编译ALSA包(参见参考站点)。基本上你需要在dirver目录下运行如下命令:

tar jxvf alsa-driver-0.5.12a.tar.bz2
cd alsa-driver-0.5.12a
./configure --with-sequencer=yes --with-oss=yes --with-isapnp=no
make
make install
./snddevices

对于其余的包,运行"./configise;make;make install"。

在安装好后,你需要将模块加到内核中。 对Soundblaster live (emu'look' 芯片),命令如下:

modprobe snd-card-emu10k1
modprobe snd-synth-emu10k1
modprobe snd-seq-midi
modprobe snd-pcm-oss
modprobe snd-mixer-oss
modprobe snd-seq-oss

对于其它类型的声卡,只需将上述命令中前两行替换掉即可(比如:基于VIA686芯片的内置声卡,采用snd-cond-via686a模块。Mandrake 和Suse均支持ALSA,因为你也可以使用包含在Linux发行版(harddrake和yast2)中的硬件检测工具和配置程序。如果你对你的声卡芯片种类一无所知,你运行"lspci- v"命令来查看(lspci命令包含在pciutus包中)。

现在,你可以测试声卡是否能够工作。运行程序
alsamixer
并敲击"M"键来打开"Master"和"PCM"声音,然后使用箭头键来改变音量。当配置好后,敲"ESC"退出。

[alsamixer]

为了将设置保存在/etc/asound.conf文件中,运行:

/usr/sbin/alsactl store

好了,现在运行

play flute.wav

你应该能够听到一些声音了。如果没有听到,进入/proc/asound目录,检查/proc/asound/devices和/proc/asound/oss-devices,应该存在"mixer"和 "digital audio" (在我的计算机)。

这仅仅测试了"PCM OSS"模拟和声卡能够工作。稍后,我将解释如何修改/etc/modules.conf.以使得模块能够自动加载 ,但下一步要使Midi开始工作。

 

midi

如果你有一块内置Midi合成器的声卡(比如:Soundblaster live),你必须将"声音字体"(声音样本)加入到声卡的芯片中。如果你没有这样的声卡,你可以安装timidity软件包(参见附录的参考站点),并将其当作ALSA Midi合成器,运行于ALSA之上的应用程序并不能分辨出两者的差异。

加载声音字体

检查你是否已安装了sfxload 程序(/bin/sfxload),如果没有请安装它。它是awesfx软件包的一部分。(你可以在你的Linux CD中找到,http://mitglied.lycos.de/iwai/awedrv.html).下一步,将Soundblaster Live CD 中的8MBGMSFX.SF2(/mnt/cdrom/AUDIO/Common/SFBANK/8MBGMSFX.SF2)拷贝到/etc/midi/8MBGMSFX.SF2.运行如下命令,加载声音字体:

/bin/sfxload /etc/midi/8MBGMSFX.SF2

一个比较好的测试程序是pmidi(参见附录),运行
pmidi -l
将产生如下信息:

Port Client name Port name
64:0 External MIDI 0 MIDI 0-0
65:0 Emu10k1 WaveTable Emu10k1 Port 0
65:1 Emu10k1 WaveTable Emu10k1 Port 1
65:2 Emu10k1 WaveTable Emu10k1 Port 2
65:3 Emu10k1 WaveTable Emu10k1 Port 3

现在运行

pmidi -p 65:0 test.mid

你应该能够听到Midi 的声音了。真酷!

运行TiMidity作为软件合成器

下载TiMidity++-2.11.3.tar.gz软件包(见参考站点)并解压(tar zxvf TiMidity++-2.11.3.tar.gz),编辑common.makefile.in。将有关pentium的CFLAGS行的注释去掉:

CFLAGS = -O3 -mpentium -march=pentium -fomit-frame-pointer \
-funroll-all-loops -malign-double -ffast-math

现在你可以使用timidity漂亮的图形配置界面来配置它了,但我们感兴趣的是"-enable-alsaseq"选项。该选项对其它一些的图形组件的配置是无关的:

./configure --enable-ncurses --enable-xaw --enable-spectrogram --enable-xaw=dynamic --enable-audio=oss,alsa --enable-alsaseq --prefix=/usr/local/timidity-2.11.3
make
make install

将把timidity安装到期/usr/local/timidity-2.11.3/bin 目录下,不会把你从Linux发行版本中已安装的timidity覆盖掉。我们重新安装timidity是因为在任何一个单独的Linux发行版本的timidity中alsaseq界面是无效的。
为了使用timidity,你也需要声音字体。他们现在被称为乐器文件。 一个好的、完整的乐器文件是非常大的(大约10Mb)。 最快的方法是当你在从发行版CD中安装timidity++时, 顺便将这些文件拷贝过来(比如, 下载Redhat 7.3 版本的timidity++-2.11.3-1.i386.rpm)。 将这些文件从/usr/share/timidity/instruments目录拷贝到 /usr/local/timidity-2.11.3/share/timidity/instruments 目录下,运行:

cd /usr
find share/timidity -print | cpio -dump /usr/local/timidity-2.11.3

现在我们可以开始测试了,以root用户运行timidity:

/usr/local/timidity-2.11.3/bin/timidity -iA -B2,8 -Os -EFreverb=0
以ALSA服务器模式运行TiMidity
set SCHED_FIFO
打开合成器端口:128:0 128:1

然后运行 pmidi -l:

Port Client name Port name
128:0 Client-128 TiMidity port 0
128:1 Client-128 TiMidity port 1

瞧,我们现在有了两个TiMidity合成器端口了。
现在运行:

pmidi -p 128:0 test.mid

你应该能够听Midi的声音了。  

/etc/modules.conf

为了自动配置和加载模块到内核中,你需要在/etc/modules.conf中增加如下几行,如果你的声卡为soundblaster live:

alias char-major-116 snd
alias char-major-14 soundcore
alias snd-card-0 snd-card-emu10k1
alias sound-slot-0 snd-card-0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
alias midi snd-synth-emu10k1
below snd-seq-oss snd-synth-emu10k1
post-install snd-synth-emu10k1 /bin/sfxload /etc/midi/8MBGMSFX.SF2 ; alsactl restore
# uncomment to save volume settings at shutdown:
#pre-remove snd-synth-emu10k1 alsactl store

对于一个没有Midi合成器的声卡,比如内置的via686:

alias char-major-116 snd
alias char-major-14 soundcore
alias snd-card-0 snd-card-via686a
alias sound-slot-0 snd-card-0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-12 snd-pcm-oss
# restore original mixer:
post-install snd-card-via686a alsactl restore
# uncomment to save volume settings at shutdown:
#pre-remove snd-synth-emu10k1 alsactl store

为了能够在启动时自动运行timidity,我建议在/etc/init.d/alsasound(这些脚本文件在安装驱动程序时已经安装,但未被激活。可运行命令chkconfig来激活)中增加如下几行:

echo "starting timidity"
timidiy=/usr/local/timidity-2.11.3/bin/timidity # do not forget the "&" in the next line:
$timidity -iA -B2,8 -Os -EFreverb=0 > /dev/null &

 

使用ALSA 和Midi

[kmid] 你已经能够使用上文介绍的pmidi应用程序来播放midi文件了。 其实,KDE包含了一个非常漂亮的Midi播放器: kmid(不要和kmidi混淆)。 Kmid可以被编译成支持或不支持ALSA。 Redhat将其编译成支持OSS。 Mandrake和Suse使用了Alsa。你可以在Redhat上直接运行Mandrake的二进制文件。
在这篇文章中解释了如何安装ALSA,这对其它应用软件来说是必须的,这些应用软件将在未来的几篇文章里介绍。比如我们将发表一篇有关Jazz的文章。Jazz是一个Mide 的音序器和Midi文件编辑器。在这篇文章的最后你也将看到其它应用程序的参考站点。

在Midi合成器软件包中,也包含了timidity(timidity -ig运行 gtk界面)或kmidi(不是kmid)等应用程序。在这种情况下,你就不再需要内核支持Midi了,不管是从硬件上还是通过timidity软件来模拟。一般来说最好是提供一个通用的Midi应用程序接口,而不是每个软件中来重新实现midi 合成器。

ALSA目前正在进行比较大的改动。正如前面所说的0.9版不能运行本文所讨论的基于0.5版的许多应用程序。另外,OSS音序模拟器(/dev/sequencer)也不能工作(它仅能工作于老的Soundblaster awe声卡,你现在已经买不到了)。这意味着只有 ALSA支持的Midi应用程序能够工作。在0.9版中将出现很多有希望的改进。这篇文章在未来也是有用的,即使在0.9版中提供的了更多的功能,也仅需作一些小的改动,比如基于0.5和0.9的模块名,但基本原理还是一样的。  

参考站点

 

对这篇文章发表评论

每篇文章都有各自的反馈页面。在这个页面里,您可以提交评论,也可以查看其他读者的评论:
 反馈页面 

主页由LinuxFocus编辑组维护
© Guido Socher, FDL
LinuxFocus.org

点击这里向LinuxFocus报告错误或提出意见
翻译信息:
en --> -- : Guido Socher (homepage)
en --> zh: Gcc <gnucplus2(at)yahoo.com>

2002-10-31, generated by lfparser version 2.25