SCRATCH 三国小游戏

第7集 周郎古琴曲

作者:杨振鹏   日期:2020/6/7

游戏介绍:

诸葛亮出山后,刘备安排他去江东说服孙权联手对付曹操。到了江东,诸葛亮先去拜访了仰慕已久的周瑜。

周瑜是江东第一帅哥、才子,也是东吴水军的大统领。周瑜擅长弹琴,别人弹的曲子如果出现了一个小错,周瑜都会马上纠正,人称“曲有误,周郎顾”。

看到诸葛亮来了,周瑜给他弹了一首曲子,小朋友们听听周瑜弹的是什么曲子呢?

代码量:25 块积木

素材

周瑜:zhou

造型1 - zhou.png

造型2 - zhou2.png

造型2 - zhou3.png

古筝:zheng

造型1 - zheng.png

舞台背景

Scratch 内置背景 Theater。

素材来源:周瑜造型改编自Scratch内置角色Dorian. 读者还可以添加一些无代码的观众。

添加扩展:音乐

建立一个列表:track1

创建变量:在变量栏目中,通过“建立一个变量”按钮,依次创建变量 i、n、t。

将乐谱数据导入列表:首先准备乐谱数据,可使用我们附带的 ragtime.txt,该文件内容如下:

ragtime.txt (以下内容中 “ / ” 代表换行,共68行)A little bit of rag by John Thompson

69 / 1 / 72 / 2 / 69 / 1 / 65 / 4 / 64 / 1 / 67 / 2 / 64 / 1 / 60 / 4 / 69 / 1 / 72 / 2 / 69 / 1 / 65 / 1 / 0 / 1 / 69 / 1 / 0 / 1 / 67 / 8 / 69 / 1 / 72 / 2 / 69 / 1 / 65 / 4 / 64 / 1 / 67 / 2 / 64 / 1 / 60 / 4 / 72 / 1 / 74 / 2 / 72 / 1 / 69 / 1 / 65 / 1 / 67 / 1 / 0 / 1 / 65 / 4 / 77 / 1 / 0 / 3

在track1列表上点右键,然后选择import菜单项导入上边的文件。

代码

zhou:

讲解

本程序是将外部文件的数据导入列表,在程序中遍历列表,并根据每一次取到的数据,播放相应的音符。

在我们准备的ragtime.txt文件中,我们用每2行数字代表一个音符。其中,第一个数字表示这个音符的高低,60 为中央C,61为#C,62为D,59为低八度B,依此类推,0代表休止符;第二个数字表示音符时值,1代表1拍,0.5代表半拍,依次类推。 “69 / 1 / ”,就是1拍的la;“72 / 2 / ”,就是2拍的高音do。

对于高年级的小朋友,如果有兴趣,你们可以仔细研究一下本程序曲谱文件的格式含义,这样就可以自己编码甚至创作一些其他曲子,让周瑜演奏出来。

相信不少小朋友已经听出来了,这个ragtime.txt是《小汤普森3》里《小雷格泰姆》的主旋律。不过你马上就会问,怎么没有双音,也没有伴奏声部,听起来就像傻瓜弹的一样,难道周瑜就是这个水平吗? 其实,主要是Scratch的音乐扩展只能同时演奏1个音符。为了同时演奏多个音符,我们需要多个线程协同演奏,代码量就会增大不少。例如,如果你想添加伴奏声部,那就在诸葛亮的代码空间中,编写一段同样的程序就可以了。只是记得再添加一个track2列表,导入伴奏声部的乐谱。在诸葛亮的代码中,要把所有的track1替换为track2,变量i、n、t替换为i2、n2、t2。这样,点击绿旗子时,就能同时演奏2个声部了。

(-------以下内容难度突然增大-------)

对于需要弹奏双音的情况,我们可以扩展乐谱文件的定义,当遇到时长为0的音符时,即提示计算机,此处要同时弹奏另一个音,由“0”后的2行数字定义,而该音符真正的时长,由“0”后的第3行给出。

例如“60 / 0 / 64 / 1 / 1 / ”,代表同时弹奏do,mi 均1拍。

按照这种数据结构,我们可以把《知更鸟罗宾》的旋律和伴奏都编入一个音轨中:

robin.txt (以下内容中 “ / ” 代表换行,共161行)Robin Redbreast by John Thompson

60 / 0.5 / 0 / 0.5 / 62 / 0.5 / 0 / 0.5 / 64 / 0 / 48 / 1 / 0.5 / 67 / 0.5 / 0 / 1 / 64 / 0.5 / 0 / 0.5 / 62 / 0 / 53 / 1 / 0.5 / 67 / 0.5 / 0 / 1 / 64 / 1 / 60 / 0 / 52 / 1 / 1 / 0 / 1 / 55 / 1 / 55 / 2 / 60 / 0.5 / 62 / 0.5 / 64 / 0 / 48 / 1 / 0.5 / 67 / 0.5 / 0 / 1 / 64 / 0.5 / 0 / 0.5 / 62 / 0 / 53 / 1 / 0.5 / 67 / 0.5 / 0 / 1 / 64 / 1 / 60 / 0 / 52 / 4 / 4 / 60 / 1 / 62 / 1 / 64 / 0 / 57 / 3 / 0.5 / 60 / 0.5 / 0 / 1 / 62 / 0.5 / 0 / 0.5 / 64 / 0 / 56 / 3 / 0.5 / 60 / 0.5 / 0 / 1 / 62 / 0.5 / 0 / 0.5 / 64 / 0 / 55 / 3 / 0.5 / 60 / 0.5 / 0 / 1 / 62 / 0.5 / 0 / 0.5 / 63 / 0 / 53 / 1 / 1 / 0 / 1 / 60 / 0.5 / 62 / 0.5 / 64 / 0 / 55 / 1 / 0.5 / 67 / 0.5 / 0 / 1 / 64 / 0.5 / 0 / 0.5 / 62 / 0 / 53 / 1 / 0.5 / 67 / 0.5 / 0 / 1 / 64 / 1 / 60 / 0 / 52 / 3 / 3 / 48 / 1

在track1列表上点右键,然后选择import菜单项导入上边的文件。

然后,我们需要修改程序代码,添加能够读懂这种数据结构的逻辑,并通过广播消息,创建演奏双音的并行执行的线程:

注意,我们这里用的是“广播(消息1)”积木,不要带“并等待”字样的,这样才能创建同时并行执行的线程。如果用了“广播(消息1)并等待”,那么双音就会一先一后依次弹奏,失去双音的效果。

喜欢挑战的小朋友,可以按上图进行升级改造,添加额外的16块积木,让周瑜弹奏《知更鸟罗宾》。

另附一首加勒比海盗主题曲《He’s a pirate!》的乐谱(此乐谱改造前后均可播放):HeIsAPirate.txt

下一集 草船借箭

上一集