7.3播放音乐

有时声音模式可以使你的作品独具特色。音乐比简单的音调更能丰富你的机器人的个性。一个摔跤机器人面对它的对手时,如果它演奏瓦格纳的“Ride of the Valkyries”,比演奏肖邦的钢琴奏鸣曲或什么都不演奏更具有活力,根据电影Short Circuit里的Johnny Five复制的机器人——见18章——他伴着Saturday Night Fever的主题曲起舞——但是如果你关掉音乐,它就变成了只会摇动胳膊和头的机器人。

演奏音乐需要你耐心地将每一个音节编入程序。乐高RCX Code不太适合编写稍长些的曲子,但是使用其他的文本语言,如NQC,你就可以编写、储存长些的歌曲了。

曲子的每个音符都有两个特征:定调和持续时间——第一个用频率表达,第二个用时间表达。你必须在两个音调之间插入延时,以使CPU保证音调持续时间再处理下一个音调。

PlayTone(440,50);

Wait(50);

PlayTone(220,100);

Wait(100);

在这个例子里,RCX演奏A调(440赫兹)半秒钟长,等待音调结束,然后演奏其他一个低八度A调(220赫兹)音符1秒钟。

RCX仅限于每次演奏一个单音符,因此我们说他是单频道设备,无法演奏和音,因为和音需要同时演奏两个或更多的音符,但是你可以调整音符时间达到不同效果。在前面的例子里,在第二个音符发出前,一直演奏第一个音符,以产生连奏效果。同样,要得到一个断奏效果也很容易——使用Wait语句减少音符持续时间——相当于在两个音符之间加入一个没有声音的休止符:

PlayTone(440,10);

Wait(50);

PlayTone(220,100);

Wait(100);

编写一段悦耳的音乐程序是一件冗长的工作。编完后,如果你发现执行得比你预想的要快或慢时,你会怎么做?不幸的,你必须返回修改所有的时间间隔。更好的方式是采用许多文本编程环境提供的方法:定义常数。利用常量,你就可以使间隔根据特定的连续时间来控制执行速度。

#define BEAT 50

PlayTone(440, BEAT);

Wait(BEAT);

PlayTone(220, 2*BEAT);

Wait(2*BEAT);

这段程序代表的动作与我们的第一个例子相似,但是你将知道通过定义一个常数,程序将更清楚更容易管理,仅简单地改变BEAT的值使之改变整个速度。进一步,我们可以将音调频率定义为常数,从而让程序更具有易读性:

#define BEAT 50

#define A3 220

#define A4 440

PlayTone(A3, BEAT);

Wait(BEAT);

PlayTone(A4, 2*BEAT);

Wait(2*BEAT);

你也可以为所有的音调编写常量表,以便在不同程序里重复使用:

#define C1 33

#define Cs1 35

#define D1 37

#define Ds1 39

//...

#define C4 262

#define Cs4 277

//...

#define B8 7902

例如,我们将D#定为DsD大调),因为大多数语言不允许在常量和变量中使用象#这样的特殊符号。不要担心这个表会太长,因为编译器会负责处理常量,不改变你的实际的程序的长度或它所占用的存储空间。

为你的机器人编写音乐,这是一个证明多任务功能非常有用的典型案例。你需要在一个单独任务中处理歌曲,然后根据环境需要在主任务执行的某个时候过程开始或结束它。

7.4MIDI文件

使用常量,程序会变的更清晰,但是你却无法节约编写乐曲的时间。你只能一个一个地写入音调。不过,一些工具能够帮你全部或部分完成这一工作。例如,Bricx Command CenterRCC)可以让你在PC屏幕通过一个虚拟的钢琴键盘键入音调,并自动生成相应的NQC程序。还有一个彻底的解决方案,即标准音乐文件转换功能。

乐器数字接口Musical Instruments Digital Interface (MIDI)是一个复杂的标准:包括在设备和计算机之间的通讯协议,硬件连接和存储格式。MIDI文件是根据这标准定义的格式被储存在文件中的歌曲。

MIDI文件在专家、业余爱好者与乐器制造厂商中都取得了令人难以置信的成功,是音乐家交流声音的首选方法。因此,你可以很容易地找到以MIDI文件格式存储的所有现有歌曲。

那么,什么是MIDI文件呢?它只是一演奏的音调串,其持续时间、强度、以及表明所使用乐器的程序。因此MIDI文件不是声音文件。也不包括象CDWAV 文件、MP3文件或其他普通的声音格式那样的数字音乐文件。但是,它包括一些指南,使演奏者(人或者机器)可以复制这首歌曲、或乐谱,并可以让音乐家来演奏。并且,就象真正的乐谱一样,结果很大程度上依赖于由谁来演奏。对于MIDI文件,意味着其输出取决于演奏音乐的仪器。使用专业的MIDI音响可以得到很强烈的效果,而使用低档的PC声卡可能会使效果很差。音乐家们之所以对MIDI文件这么感兴趣,是因为作为标准音调,易于读取和编辑(使用特殊程序)。

因此,关键问题是:用什么方法能够将MIDI文件传递给RCX?虽然你不能直接输入给RCX,有一个非常好的方法,MIDI2RCX,可以将任何MIDI文件转换成正确的程序。是Guido Truffelli开发的,免费提供。目前它只能运行在Windows操作系统,可生成NQC legOS程序,不过Truffelli希望能用于更多语言,并在为之努力。可在Truffelli网站(见附件A)下载。

在深入讨论如何使用MIDI文件及用这做什么以前,还需要了解它的另一个特性。MIDI 文件的音调是打包在通道中传输的,每个通道都分配乐器来复制音调。例如,通道1分配给一个钢琴调,通道2是一个低音器,通道3给吉他等等。通道10永远是鼓声,通道4通常是赋予悦耳的音调,也就是说音乐家声音的音调或主要器具的演奏,但也不是必须这样分配。如前面所述,RCX有单频道的声音性能,它不能同时产生多个的音调,因此你必须小心选择音调让它演奏。在你开始把MIDI文件直接转换成程序码前,建议你用一些特殊的软件做一些测试,看一下哪个通道能更好地传递歌曲。市场上有许多商品,几乎可以处理任何MIDI文件,但是实际上你并不需要所有功能及其所提供的复杂的东西。因特网上有许多免费软件和共享程序,非常适合完成分辨哪个单通道适合将MIDI文件转换成RCX指令的工作。用编辑器打开MIDI文件,并闭所有通道,然后依次打开,每次打开一个,选出合适的通道。如果你很熟悉MIDI文件编辑器,可以从选中的通道中删除一些音调,因为你可能并不需要整首歌曲,只要其中的一节,如重复部分与主题曲。如果你通过编辑器完成,你可以保存改好的MIDI文件。

注意

如果你能找到适合蜂窝电话的MIDI文件,就可以少做很多工作,因为这种格式与RCX的非常相似。

现在你可以使用MIDI2RCX了。它是一个控制平台,而不是图形化界面,因此你需要在DOS命令窗口下运行它。它需要MIDI文件名,2个可选择参数来指定进行转换的通道(默认为all)和选择目标语言(默认legOS)。你的命令基本如下:

c:\midi2rcx>midi2rcx letitbe.mid 4 nqc

letitbe.mid是你的原始MIDI文件,4是修改的通道,以及NQC语言。使用这个命令,MIDI2RCX将生成一个文件名为letitbe.nqc的,包含用于编辑的简单的NQC程序的文件,下载到你的RCX,运行,可能的话,粘贴到你的程序里。我们强烈建议不要转换所有的通道:导致的结果将是无法预知的。

7.5转WAV文件

Guido Truffelli还写了WAV2RCX应用程序,可将WAV文件转化为NQClegOS指令。和MIDI文件不同的是,WAV文件包括可以运行的数字化音频内容。如果你很熟悉图形化文件格式,你可以把MIDI文件看成是矢量图,而WAV文件为栅图

MIDI文件转换成RCX程序并不容易。而播放WAV文件则更难。就我们所知,还没有人取得好的声音质量。这是RCX声音硬件所限制的。

Truffelli程序采用一个简单的策略,使用很多的WAV文件以得到好的效果:将源文件分成小段,然后用FFT算法为每段计算主频;最后,用与MIDI2RCX相同的方法将频率转换成RCX编程语句。但还不能让你的RCX说话。只能发出简单的音调,就象Win系统下的ding.wav ringing.wav文件。WAV2RCX是一个有用的工具,可以让你的机器人跟传统的科幻小说中的那样:产生激光枪,跳跃斯帕克斯和翁翁响的效果!

小结

本章对RCX声音系统的简要介绍就为了说明:无论有多大局限性,它都是一个无价的资源。它能帮助你调试程序,返回形式不同模式或频率的声音信息,或者使你的机器人更具个性。

NQC提供两种控制声音系统的命令:PlaySound演奏预先确定的声音模式PlayTone播放你需要的音调和持续时间。当PlaySound适合多数用户需求,PlayTone提供更好的机会让你编写悦耳的曲子。

鉴于RCX硬件的局限性, MIDI文件转化的非常好,可以为你的机器人提供很好的音乐声道。另外,WAV文件的转化,现在有更大的困难,效果很不理想;不过,它们都能用为你的机器人带来奇妙的声音效果。

在这本书中更多的机器人以声音为特点。例如,第20章介绍的Tic-Tac-Toe和玩象棋的机器人,用蜂鸣声通知使用者它做好接受信息输入的准备,在第24章飞行模拟装置的声音系统的声音系统将声音模拟作为其基本功能:制造发动机噪音。其他机器人,即使工作时不需要声音,有了声音使其大为增色,如第1718章中动物或电影人物。在第21章,我们将采用不同的方法,教你如何让你的机器人自己演奏音乐。

回顶部 回目录
下一章

北京:010-62143699
上海:021-64157585
江苏:025-3248801
深圳:0755-26965280
广州:020-83517600