知:音乐天才莫扎特
如果你对音乐感兴趣并且有一定了解,那你不会不知道莫扎特。
莫扎特这个人,在音乐界就是大神中的大神,天才中的天才;或者如果用我们写程序的话说——“Bug般的存在”。
你不信?那说明你不了解这个人。我来告诉你这个人有多牛:他于1756年1月27日出生,1791年12月5日去世——你没看错,他只活了不到36岁。但就是这短短的30多年人生,他完美演绎了从神童到大师的成长过程——3岁显露音乐天赋,5岁谱曲,7岁欧洲巡演,15岁获得骑士勋章与乐长头衔。在音乐史上,能够演奏家的作曲家少之又少,像贝多芬那样能同时精通小提琴和钢琴的就属于凤毛麟角了,而莫扎特呢?他作为演奏家的同时基本上把能写的乐器都写了个遍……难怪伟大的德国诗人歌德曾说莫扎特是“神的创造力在人间的化身”了。
莫扎特一生为后人留下了数百篇震撼音乐史的不朽杰作——其中最神秘的当数编号为K448的《D大调双钢琴奏鸣曲》了,根据英国《自然》杂志的论文《音乐和空间任务能力》,听这首曲子能够改善人的智商——这种现象就是全世界广泛传播、产生巨大的社会影响的“莫扎特效应”——还等什么,赶紧去找来听啊同学!
这次,让我们来做一个音乐播放程序,在K448的旋律中,遇见神秘的莫扎特。
思:程序设计
为了匹配莫扎特这位大师的古典音乐家气质,我们特意选择制作一台黑胶唱片机,来播放载有音乐的“唱片”,点击选择不同的唱片,它就为我们播放不同的曲子——我们选择哪些曲子呢?K448肯定要的,提升智商啊,谁不想多听几遍呢,另外一首是《G大调弦乐小夜曲》(简称小夜曲),还有就是《小星星变奏曲》(简称小星星)。这些音乐的素材在很多音乐App中都可以找到,我们主要来编写唱片机的程序。
如果你见过现实中的黑胶唱片机,会发现它有一个很关键的机构叫做“唱臂”,当播放唱片的时候,需要把唱臂放到唱片上,让它读取数据。典型的音乐播放APP如图所示:
我们可以参照上图进行自己的背景和角色设计:
1、背景:使用绘图编辑器绘制一个基本的播放器背景;
2、唱片:播放音乐时显示并旋转,停止时隐藏;
3、唱臂:播放音乐时旋转到唱片上,停止时复位;
4、播放按钮:点击可在播放和停止之间切换;
5、下一曲:切换到下一曲音乐进行播放;
6、上一曲:切换到上一首音乐进行播放;
7、小球:显示在当前曲目前面
8、其它:因为这是一个与莫扎特有关的专用播放器,我们再放置一个莫扎特的头像作为装饰。
用思维导图来梳理一下角色,我们就可以开始了:
行:编程实现
1、打开 Scratch 3.0 新建项目,先来绘图编辑器,绘制一个背景。这个背景由一个方形和两个大小不同的圆形组成,采用灰色基调。为了增加立体感,我们在填充形状的时候,使用了渐变方式:
2、绘制唱片角色,它由三个同心圆构成,最外圈是一个灰色边框(轮廓宽度大一些,设置为15)、黑色渐变填充的圆,向内依次是红色和黑色的圆,需要注意的是,你一定要注意让这三个圆的圆心尽可能在一个点上——角色的中心点,这样播放音乐时旋转不会变形。
3、绘制唱臂角色,它也由基本的圆形和方形组成,需要注意的是要把唱臂上方的圆形中心与角色中心点保持一致:
4、绘制播放按钮角色,它有两个造型,造型一由一个作为阴影的灰色圆形、一个圆形按钮和一个三角形构成。三角形怎么绘制呢?你可以先画一个方形,然后用调整工具删除掉其中一个节点,再调整节点位置即可。造型二则是复制造型一,把按钮上的图形改成两个小方形。
5、复制绘制好的播放按钮角色,将它改造为下一曲、上一曲按钮:
6、需要绘制的角色基本完成了。如果你觉得绘图过程太麻烦,也可以直接使用我们提供的素材——当然,如果你能跟着本书附带的视频一步步做下来,会更有成就感!现在,我们再添加一个 Scratch 角色库中的 “Ball”角色,并添加一张莫扎特的头像,调整舞台布置如下图:
7、到编写代码的时候了。不过在开始之前,我们需要新建一个“列表”来保存我们要播放的曲目。什么是“列表”呢?你可以理解为装有一系列变量的盒子,我们通过 Scratch 提供的指令,可以方便地往这个盒子里添加变量、删除变量,或者修改某一个变量的值。列表是我们实现较为复杂程序时一个很重要的功能,新建的方法如下:
在指令区找“变量”类型,点击“建立一个列表”按钮,出现下图所示的窗口界面:
在此输入列表名称“莫扎特经典曲目”,由于这个列表不需要修改适用范围,直接确定,列表就会出现在舞台区域,同时,指令区也多出了一些有关列表操作的积木:
舞台区域的列表初始状态是空的,它的左下方有一个“+”号,点击就会在列表中增加一项,手动输入内容即可。我们用这个方法可以在列表中添加“K448”、“小夜曲”和“小星星变奏曲”三项,并把它放到舞台区域与“Ball”角色邻近的位置,让“Ball”恰好对应第一项。
11、播放按钮是最主要的控制角色,我们先给它编写程序。在绘制角色的时候,你已经发现它有两个造型,分别是播放和暂停,那么在这个角色被点击的时候,它怎么知道应该显示哪个造型,执行播放还是暂停操作呢?这里我们新建一个“播放状态”变量来保存当前状态,在程序启动的时候设置为0(停止状态),同时按钮设置为造型1(播放),此时点击会发送一个“开始播放”消息,并将播放状态变量设置为1。当播放状态为1时,表明在执行停止操作,则广播一条“暂停”消息,将播放状态变量设置为0。在收到相应的消息后,按钮要将自己的造型切换。我们还建立了一个“歌曲序号”变量,用来保存当前播放的歌曲序号,在程序启动时设为1,即表示播放第一首:
12、播放按钮发送了播放和停止的消息,谁来负责实际播放音乐呢?是唱片角色。在给唱片角色写代码之前,我们需要先给它配上相应的音乐。为角色添加声音,可以切换到项目操控区的“声音”标签,这里已经列出了角色自带的声音,我们将鼠标移动到左下角的小喇叭图标上,会弹出菜单:
从下向上分别是从声音库选择、录制、随机和上传。如果是普通的音效,可以去声音库查找,而我们要用的曲子声音库里是没有的,可以采用录制和上传音乐文件两种方式。考虑到音乐的版权,我们不需要去找原声音乐,只需要用手机或电脑查找到相应的曲子,录制一部分片断就可以了,毕竟我们的重点在编程嘛。
在声音录制界面点录制按钮就可以了,注意不要录制时间太长,播放的音量尽可能大一些,避免环境噪声,这样效果会好一些。
用这种录制的方法,分别录制K448、小夜曲和小星星变奏曲三个曲子,并注意把声音的名称修改一下,确保和你刚才建立的列表中三首曲子的名称、顺序一致。
完成之后,可以为唱片编写代码了。这里要注意的是,唱片播放声音使用的是“播放声音XX等待播完”指令,这样一首曲子播完才会继续执行下一条指令——将歌曲序号增加1,如果歌曲序号已经大于3,则恢复为1,再广播“变更歌曲”的消息(这个消息是为了修改当前播放歌曲的名称和指标器,下面会用到)并等待,等接收消息的角色代码执行完,启动下一轮循环,播放下一首曲子。
12、为唱臂编写代码,它在播放和停止状态时显示不同的角度:
13、为“下一首”和“上一首”按钮编写代码,它们的指令非常类似,就是实现歌曲序号的增加或减少,然后发送变更歌曲和暂停、开始播放的消息。为什么要先暂停再播放呢?这是为了防止两首曲子一起播放。
14、为小球(Ball)角色编写代码,它起到一个进度指令器的作用,我们这里简单地根据歌曲序号让它移动到对应的位置,你可以根据自己舞台的设置来修改X、Y坐标,并把唱片机上方显示的歌曲名称变量设置为正在播放的曲子名称。
15、程序完成!你可以陶醉在K448优美的旋律中休息一下啦!
悟:总结与拓展
本作品中用到了一个新的知识点:列表。列表是进一步学习 Scratch 进行高级编程的重要概念,你可以把 Scratch 提供的和列表操作有关的指令都测试一下,了解它们提供的功能,这对于以后的编程会很有帮助。
Scratch 提供的声音处理功能也很强大,除了录制和上传,它还提供了对声音进行编辑的界面,比如你可以加快音乐的节奏、增加响度甚至让它“机械化”——像机器人的语调,这些功能对我们增强程序的趣味性是必不可少的。
最后,本着“举一反三”的思想,你可以考虑一下同类程序的设计与实现,比如让你做《遇见贝多芬》、《2019流行歌曲串烧》,是不是就可以信手拈来呢?(提示:只是列表内容和播放的声音发生了变化!)