为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

07播放声音和音乐

2018-08-03 8页 doc 23KB 1阅读

用户头像

is_833902

暂无简介

举报
07播放声音和音乐07播放声音和音乐 本章包含的内容: , 通过音调沟通 , 播放音乐 , 转换MIDI文件 , 转换WAV文件 7.1简介 RCX自身有一个内置扬声器及驱动它的硬件,这样可以使你的机器人能发声。这个特点却未被充分使用~它不仅仅通过一些有趣的方式使你的机器人更具有个性化,而且提供了一个简单的通信协议,以帮助测试程序,及排除程序错误。 这是我们为什么在本书中要用一个章节来介绍RCX的声音和音乐的原因了,虽然这个话题与编程有关,而不是搭建。不过,正象我们在第6章中介绍的那样,制作机器人时,这两个点很少是独立的。对于本...
07播放声音和音乐
07播放声音和音乐 本章包含的内容: , 通过音调沟通 , 播放音乐 , 转换MIDI文件 , 转换WAV文件 7.1简介 RCX自身有一个内置扬声器及驱动它的硬件,这样可以使你的机器人能发声。这个特点却未被充分使用~它不仅仅通过一些有趣的方式使你的机器人更具有个性化,而且提供了一个简单的通信,以帮助测试程序,及排除程序错误。 这是我们为什么在本书中要用一个章节来介绍RCX的声音和音乐的原因了,虽然这个话题与编程有关,而不是搭建。不过,正象我们在第6章中介绍的那样,制作机器人时,这两个点很少是独立的。对于本书第二部分将要介绍到的机器人,声音是他们与外界相联系的一个重要元素。对其他机器人来说,声音丰富了他们的行为。 如果你不熟悉音乐术语或声音文件格式,你可能会觉得本章的主题有一点复杂。但是这个努力是值得的,因为这项技术为你机器人世界带来更有趣的机会。你可以了解如何运用简单的音调,如何编写一小段曲子,以及如何将数字声音文件转换成可以嵌入程序的声音效果。 7.2 用音调沟通 我们在介绍中提过,RCX有一个内置的扬声器。其外侧特征为:在LEGO标志面,RCX1.5有两个小缝隙,声音就是从那发出来的。RCX的声音系统是通过程序编写完成的;你无法改变扬声器的音量,这是预先确定的,但是你可以控制音乐的频率(定调)和持续时间。NQC语言,在我们的里使用,包括两个基本命令来产生声音,叫PlaySound和PlayTone。通过PlaySound指令,可以使RCX输出6个预先设定的声音模式中的一个,如一个简短的滴答声,两声蜂鸣或短的音符串: PlaySound(SOUND_CLICK); PlaySound(SOUND_DOUBLE_BEEP); PlaySound(SOUND_UP); PlaySound(SOUND_DOWN); PlayTone命令可以演奏一个给定的音调(以赫兹为单位)并持续一段时间(1/100秒);下面这个语句可以演半秒钟262赫兹的音调。 PlayTone(262,50); RCX能够产生任何从31赫兹到16,000赫兹的频率:不过,你只能在音乐频率范围内编写音乐(见附件C)。所有可以为LEGO固件编程的语言都具有这项功能。而其他大多数语言都或多或少对需要一些复杂的方法对声音控制。 声音可以更直接地反映出RCX对特殊环境的变化。RCX有显示,但是我们并不能随时看到它,尤其是当你的机器人穿过房间运行的时候~它总是数据,你可以在PC上读取储存在RCX内的一个专门存储区的数据,但是,要使用这些数据,你就必须一直坐在计算机前。而声音,则可以在不打断任务其他工作的情况下发射,你可以听到,就算机器人远在你视野之外。 通过简单的声音模式,你能知道完成了工作,或是哪里出了问题或电池电量不足等等。它能知道按下按钮,或告诉你等待特殊的输入,如第6章校准程序的例子。在1999年MINDSTORMS爱好者和专业人员聚集在麻省理工学院(MIT),我们要设计一个了Tic-Tac-Toe机器人—见第20章—可以通过不同的主题音乐通知人类对手有关比赛的结果。 7.3播放音乐 有时声音模式可以使你的作品独具特色。音乐比简单的音调更能丰富你的机器人的个性。一个摔跤机器人面对它的对手时,如果它演奏瓦格纳的“Ride of the Valkyries”,比演奏肖邦的钢琴奏鸣曲或什么都不演奏更具有活力,根据电影Short Circuit里的Johnny Five复制的机器人——见 ——他伴着Saturday Night Fever的主题曲起舞——但是如果你关掉音乐,它就变成了只会18章 摇动胳膊和头的机器人。 演奏音乐需要你耐心地将每一个音节编入程序。乐高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,定为Ds(D大调),因为大多数语言不允许在常量和变量中使用象,这样的特殊符号。不要担心这个表会太长,因为编译器会负责处理常量,不改变你的实际的程序的长度或它所占用的存储空间。 为你的机器人编写音乐,这是一个证明多任务功能非常有用的典型案例。你需要在一个单独任务中处理歌曲,然后根据环境需要在主任务执行的某个时候过程开始或结束它。 7.4转MIDI文件 使用常量,程序会变的更清晰,但是你却无法节约编写乐曲的时间。你只能一个一个地写入音调。不过,一些工具能够帮你全部或部分完成这一工作。例如,Bricx Command Center(RCC)可以让你在PC屏幕通过一个虚拟的钢琴键盘键入音调,并自动生成相应的NQC程序。还有一个彻底的解决,即音乐文件转换功能。 乐器数字接口Musical Instruments Digital Interface (MIDI)是一个复杂的标准:包括在设备和计算机之间的通讯协议,硬件连接和存储格式。MIDI文件是根据这标准定义的格式被储存在文件中的歌曲。 MIDI文件在专家、业余爱好者与乐器制造厂商中都取得了令人难以置信的成功,是音乐家交流声音的首选方法。因此,你可以很容易地找到以MIDI文件格式存储的所有现有歌曲。 那么,什么是MIDI文件呢,它只是一演奏的音调串,其持续时间、强度、以及表明所使用乐器的程序。因此MIDI文件不是声音文件。也不包括象CD、WAV 文件、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文件转化为NQC和legOS指令。和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章飞行模拟装置的声音系统的声音系统将声音模拟作为其基本功能:制造发动机噪音。其他机器人,即使工作时不需要声音,有了声 、18章中动物或电影人物。在第21章,我们将采用不同的方法,教你音使其大为增色,如第17 如何让你的机器人自己演奏音乐。
/
本文档为【07播放声音和音乐】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索