技术提示
我们中的许多人喜欢编译自己的内核。就我而言,我编译自己的内核有两个原因。首先,库存内核包含initrd映像,这些映像倾向于以错误的顺序发现我的SCSI设备。您可以修复initrd以正确发现设备(我在之前的技术提示专栏中解释了如何在Ubuntu/Kubuntu中执行此操作)。但是,我更喜欢通过将驱动程序编译到内核中而不是作为模块加载来避免问题。其次,我只是喜欢运行最新的稳定内核。
我一直在玩带有USB/MIDI连接的合成器。令我沮丧的是,我似乎无法使USB/MIDI连接与我自己的编译内核一起工作。我在网上找不到任何可以指出问题所在的信息,但我最终偶然发现了答案。
一旦您浏览了足够的内核配置选项,解决方案就变得非常简单和明显。一个问题是内核驱动程序的组织方式,以至于不明显(至少对我来说不明显)应该包含哪些驱动程序才能使其工作。我选择了所有MIDI音序器驱动程序,但为什么它不起作用呢?您需要的USB驱动程序实际上位于声音驱动程序的树中,而不是USB驱动程序中。从“make menuconfig”(或您首选的内核配置方法)中选择以下内容:设备驱动程序→声音→高级Linux声音架构→USB设备→USB音频/MIDI驱动程序。
虽然,正如我所说,我通常将驱动程序直接编译到内核中,但我建议您将这个特定的驱动程序编译为模块。在您不使用合成器键盘的时候,没有必要加载该模块。
将上述驱动程序选择为模块,它将创建一个名为snd-usb-audio的模块。模块名称是我困惑的根源。当我试图追踪是什么使库存内核工作时,我找到了snd-usb-audio模块,但我忽略了这个模块,因为它可能无法解决这个问题,原因是它的名称。我没有想到snd-usb-audio与MIDI有任何关系,直到我在内核配置中偶然发现了“USB音频/MIDI”标签。模块名称本身似乎表明该模块是为外部声音源而不是外部MIDI源设计的。
顺便说一句,我受到启发设置这个,是因为给我女儿买了一台Korg X50,这是一款非常实惠且出色的合成器键盘。最新的Korg键盘似乎不需要任何特殊配置即可连接USB/MIDI端口。但是,我后来发现雅马哈键盘不太友好。您必须更改雅马哈Motif ES键盘上的一些MIDI设置,才能使键盘通过USB端口与计算机一起工作。
这可能看起来是显而易见的,但诀窍是遵循雅马哈Motif ES手册中关于将USB/MIDI连接到计算机的说明。好吧,废话,对吧?RTFM,或者更礼貌地说,阅读精细手册。但是,当您遇到问题时,有时很想在网上寻找使键盘工作的技巧。请注意,您应该不要遵循您在网上找到的许多说明。这些说明通常适用于Windows和Mac,它们会告诉您如何配置雅马哈键盘以通过计算机发送MIDI信号并将其回传到键盘。可能可以设置Linux驱动程序和/或补丁守护程序(例如jackd)以使Linux应用程序与此配置一起工作,但这不是Linux默认的行为方式。因此,这绝对是一个您应该避免上网而改用RTFM的情况。
也许您甚至买不起Korg X50,但您想尝试创作音乐,甚至只是播放MIDI文件。问题是大多数与Linux配合使用的声卡都没有配备令人印象深刻的MIDI声音集合(这些集合通常被称为音色库)。免费音色库是可用的,但它们听起来不如您可以购买的一些音色库专业。例如,SONiVOX MI销售一种出色的通用MIDI(GM)音色库,价格不到100美元。如果您想使用键盘录制MIDI序列,您可以购买许多廉价的MIDI键盘,这些键盘除了发送MIDI信号外什么也不做(它们不包含合成器)。这些键盘的售价远低于100美元,具体取决于您认为满意的质量。
以下是如何使用SONiVOX音色库。首先,从下面列出的URL购买字体。自从我购买我的副本以来已经太久了,以至于我不记得您下载的文件是ZIP文件还是Windows可执行文件。即使它是Windows EXE文件,您也应该能够使用Wine解压缩它。
现在,下载并安装fluidsynth和Qsynth前端(就像一个apt-get install fluidsynth qsynth来自Debian和许多基于Debian的发行版)。您可能必须手动加载ALSA音序器驱动程序,或者在/etc/modules之类的文件中指定模块。您要加载的模块是snd-seq,加载它的命令是modprobe snd-seq.
启动Qsynth,您将看到一个如图1所示的窗口。
按Setup按钮。您可能必须根据您使用的发行版和设置,在MIDI和音频选项卡中配置Qsynth。
现在,单击音色库选项卡(图2),然后单击打开按钮,导航到您下载并安装的SONiVOX音色库。单击文件选择器中的打开按钮,您就完成了。单击窗口上的确定按钮,您应该可以开始了。
SONiVOX 250MB GM 音色库: www.sonivoxmi.com/ProductDetail.asp?Item=GMWavetable250Meg
在大多数PC上,您可以启动多个X会话,并使用Ctrl-Alt-F7和Ctrl-Alt-F8等在它们之间切换。您为什么要这样做?嗯,有些X应用程序实际上不需要完整的窗口管理器来占用您宝贵的RAM和CPU。例如,VMware Workstation和Stellarium是我使用的两个应用程序(顺便说一句,很少同时使用),它们除了显示器之外什么都不需要。我不需要与Stellarium进行剪切和粘贴,而VMware本身基本上就是一个显示管理器。此外,仅仅以这种方式玩X可以使您了解X、您的窗口管理器和您的应用程序之间的相互关系。
启动您的X引擎(又名隐式xinit)。您可能只是使用startx,它会读取您的.xinitrc文件,并按照它的指示,从而在第一个可用的控制台上启动X,并带有窗口管理器。这可能是显示器:0。
启动您的X2引擎(又名显式xinit)。从终端,您可以在您的机器上启动另一个X服务器
xinit /opt/vmware/workstation/bin/vmware ↪-display :1 -- :1 &
xinit接受的第一个参数是将启动的客户端的路径。它必须是以/开头的绝对路径。-- 之后的所有内容都传递给X服务器。阅读xinit(1)手册页,了解更多精彩示例。
仅仅为了从远程计算机上fork您的程序而在远程主机上运行xterm通常是非常令人沮丧或耗时的。为什么不简单地在那里运行您的窗口管理器,即使您不在其控制台上?毕竟,窗口管理器只是另一个X应用程序,不是吗?
启动您的本地X服务器
xinit /usr/bin/xterm -- :1 &
这将产生一个基本的X会话,仅运行一个xterm——没有窗口管理器。现在,您需要为远程主机向此窗口会话添加权限。如果您的网络不安全,您可以通过SSH隧道传输连接,但这会带来明显的性能损失。如果您的网络是安全的,您可以简单地执行xhost +remotehost并直接喷射到您的X服务器。
对于隧道SSH
ssh -fY remotehost /usr/bin/wmaker
对于直接喷射
xhost +remotehost ssh -f remotehost /usr/bin/wmaker ↪-display localmachine:1
第一个选项(如果您的远程SSH服务器支持)使用本地定义的DISPLAY,然后通过SSH隧道传输到您的本地端。第二个选项允许remotehost将X数据直接发送到您的本地显示器,然后在那里运行Window Maker,但在本地显示它。现在,您的所有桌面操作都在远程计算机上完成,而不是本地完成。
Linux Journal为我们发布的读者投稿技术提示支付100美元。请将您的提示和联系方式发送至techtips@linuxjournal.com。