高级篇——听音练习

【疑惑篇】

点击绿旗按钮,舞台上方出现12个音符名称,点击音符演奏对应音符声。

点击音符下方的绿色方框,选择需要练习的音符。可以设置演奏乐器、演奏速度和演奏的音符个数。

点击生成按钮,从选择的音符中随机选取练习音符,保存至答案列表。

点击播放按钮,按顺序演奏答案列表中的音符。

点击显示/隐藏按钮,显示或隐藏答案列表。

视频演示open in new window

亲自操作open in new window

案例分析

它们发生的场景是什么?

默认场景

每个场景中有哪些角色?

音符

选中框

播放按钮

生成按钮

显示/隐藏按钮

乐器选项

每个场景中的每个角色在做什么?

  1. 点击音符,演奏相应的音符声
  • 可以切换乐器
  1. 听音练习
  • 挑选练习音符
  • 播放练习音符
  • 修改演奏音符个数
  • 修改演奏速度
  1. 显示/隐藏练习答案

积木提示

当绿旗被点击

移动(10)步

移到x:(0) y:(0)

将x坐标增加(10)

换成([造型1])造型

下一个造型

将[颜色]特效设定为(0)

清除图形特效

显示

隐藏

造型[编号]

当角色被点击

当接收到[消息1]

广播[消息1]

等待(1)秒

重复执行(10)次

重复执行

如果<>那么

如果<>那么否则

重复执行直到<>

当作为克隆体启动时

克隆[自己]

([舞台])的[背景编号]

在(1)和(10)之间取随机数

大于

小于

等于

变量

自制积木

音乐

解决篇

如果你正在学习音乐,视唱练耳就是一项你需要重点学习的基础技能。这个案例就是用来帮助你练习视唱练耳中其中一项,听觉训练。

基础口算练习的讲解类似,在这个案例中我也会带着你从一个简单的练习程序慢慢演变成最终的模样。

当你想要利用Scratch做听觉练习时有一个最简单的方法,通过点击演奏音符(60)(0.25)拍积木下面的琴键,就会发出对应音符的声音。

如果在练习的过程中你还想试听不同的乐器,只用在前面加上一个将乐器设为([(1)钢琴])积木即可。

不过你感觉这样操作不太方便,于是准备将它照搬到舞台上进行练习。

当提到编程或者软件开发时,通常你会想到的都是在电脑前敲代码,通过程序去完成某些功能。实际上编码只是软件开发过程中的一个步骤。

在你开始敲代码之前,还有一个十分重要,又经常会被人忽略的步骤,软件设计

一个软件被开发出来,通常都是为了满足人的一些需求,帮助人解决一些问题。也就是说,你首先需要明确你要开发的软件,它的作用是什么?

例如,office之类的办公软件是为了帮助人提高工作效率,各种视频软件或者游戏是为了让人获得娱乐打发时间。

确定好了软件的目标,接下来你就需要考虑,如何实现这个目标?

例如,这个软件中有哪些功能?每个功能有哪些东西?东西或者功能之间又有哪些联系等等。除此之外,软件最终是要交给人来使用,这里面就会涉及一个重点需要考虑的问题,如何进行人与软件的交互?

在规模较大的软件团队中,通常都会有一个交互设计师,他的工作内容就是,如何让使用软件的人更便捷更高效更爽。

回到刚刚的案例中。你通过点击演奏音符(60)(0.25)拍积木下方的琴键播放音符就是一种交互设计。

Scratch通过模拟琴键的方式,让人看见后就能想到,通过点击琴键就能发出声音。按下不同的琴键,发出的声音还会有所不同。除此之外,当你按下一个琴键,它的颜色会发生改变,琴键上方的音名也会发生改变,从而让你知道你正在演奏的是哪个音符。

现在如果由你来实现相同的功能,你也需要考虑相同的问题。你需要在舞台上展示哪些东西?用户如何通过它们来演奏不同的音符?用户如何知道这个音符是哪个音?

在你没有任何经验或想法时,最简单的方式就是去模仿别人。你可以在舞台上同样放置一个键盘,当用户去点击不同琴键时,就会发出不同声音,并且琴键的颜色也会发生改变。你还可以设计当琴键被按下时,一个对应的音符从琴键中出现,慢慢飞向空中,从而让用户知道正在弹的音是什么。

这个过程就是在锻炼你的软件设计能力,设计能力的好坏往往也决定了软件最终的使用效果。

接下来,我就按照自己的设计方式来实现演奏音符的功能。

1. 点击音符,演奏相应的音符声

我在设计这个功能时没有使用琴键,而是直接将音名作为按键放在舞台上让用户点击。除此之外,在每个音名的上面增加了一个数字,这是Scratch中特有的属性,代表了演奏音符(60)(0.25)拍积木中的音符参数,目的是为了方便之后的功能使用。

第一步,需要先添加被点击的音符角色,从C开始,按照音高的顺序依次排列,并且将造型名称改为演奏音符(60)(0.25)拍积木中对应的参数值。

例如,C的造型名称是60,D的造型名称是62,E的造型名称是64等等。

在这里会有一个问题,如果你的音符只是使用文字工具写了一个字母,用户在点击时会很难点中字母本身。为了达到类似按琴键一样的效果,方便用户点击,你可以在每个字母的底部,使用矩形工具增加一个白色的底框。如果底框挡住了字母,可以通过顶部的放最前面和放最后面按钮进行层级调整。这样一来,用户不需要点击字母C,只要点击了白框范围,都会演奏音符。

接下来,利用克隆功能,将音符依次排列在舞台上,音符之间保持适当的间距。

音符已经排列好了,接下来很简单,只用点击每个音符时,演奏对应的音符声即可。如何区分当前哪个音符被点击了?是不是看看它的造型名称就知道了。

点击绿旗按钮进行测试,当你点击不同音符名时,已经可以播放对应的音符声。

  • 可以切换乐器

之前通过积木进行演奏时,我们还可以设置不同的乐器。现在你同样想加上这个功能,应该如何做呢?这时候你就需要考虑交互问题,怎么样才能方便用户选择不同的乐器?

例如,你可以像音符一样,将不同的乐器做成不同的按钮放置在舞台上。

这种方案的优点是可以让用户直观看见有哪些乐器可选,比较适合乐器不多的情况。如果乐器很多的话,太多的按钮放在舞台上就会显得不太美观。另外,当用户选择某种乐器后,你还需要将它与其他未选择的乐器进行区分,方便用户知道当前正在演奏的乐器是什么。

除了使用按钮,你还可以使用滑杆变量的形式进行乐器选择。

这种方案的优点是不需要增加角色,用户拖动滑杆就能修改乐器类型,并且该变量还可以直接作为将乐器设为([(1)钢琴])积木的参数使用。不过问题是用户并不知道每个数字代表了什么乐器,所以你可能需要在旁边对每个数字进行额外的说明。

最终我选择了第一种按钮的形式,不过不是直接显示多个按钮,而是将它们合并为一个按钮,通过点击的方式进行乐器切换。这种方式既不会让舞台因为乐器太多变得混乱,同时按钮上的文字也能提示出当前所演奏的乐器是什么。

新增一个乐器角色,将不同乐器的名称作为不同的造型。另外,类似音符造型的操作,需要将乐器造型名称改为将乐器设为([(1)钢琴])积木的参数值。

例如,钢琴的造型名称是1,吉他的造型名称是4,大提琴的造型名称是8等等。

将乐器设为([(1)钢琴])积木中总共有21种不同乐器,你可以在造型中添加全部乐器,也可以只添加其中任意几种。

此外,你还单独增加了一个随机造型,将它的造型名称设置为-1。当用户选择随机乐器时,你就会随机从21种乐器中挑选一种进行演奏。

乐器角色的操作很简单,当绿旗被点击后将它显示在舞台合适的位置,再换成默认的造型。当角色被点击时它只用不停切换为下一个造型即可。

现在有了乐器选择,你在演奏音符之前就要切换为对应的乐器。使用的参数就是乐器角色的造型名称。当然别忘了,如果用户选择了随机造型,就在21种乐器中随机选择一个进行演奏。

点击绿旗按钮进行测试,现在你已经完成了选择一种乐器,点击音符后进行演奏。

2. 听音练习

接着,你想要进行听音练习。可是如果由你自己点击某个音符进行演奏,再自己来猜这个音符是什么,貌似不太合理。

你需要增加一个功能,先由自己挑选一些作为练习的音符,再由程序对它们进行随机播放。

  • 挑选练习音符

第一步,就先来挑选作为练习的音符。

既然要从所有音符中挑选出几个作为练习使用,自然就需要记录下来被挑选的音符有哪些?

你马上就能想到使用列表来存储它们。新建一个列表可以取名叫“练习音符”。接着你又要考虑如何进行交互了?用户应该如何选择音符,将它添加进列表呢?

第一种方式,还是通过点击音符角色将它添加进入列表中。当角色被点击时,将该角色的造型名称加入列表即可。

现在会有两个问题需要思考。第一个问题,当用户多次点击同一个音符时会怎么样?往列表中加入多个相同的音符吗?第二个问题,如果用户不想练习某个音符了,它要如何将该音符从列表中删除?

在这里可以通过一个简单的处理来解决上面的问题,当用户第一次点击音符时,将该音符加入列表中;当用户再次点击相同音符时,就将它从列表中删除。这样既不会有重复的音符出现在列表中,也可以让用户完成删除操作。

具体的实现也很简单,只需要在将(东西)加入[列表]积木之前增加一个判断,如果被点击的音符已经存在列表中,那就将它从列表中删除,否则就将它加入列表。

现在用户已经可以添加用来练习的音符。可是对他来说有一个不太方便的地方,就是它不知道自己已经选中了哪些音符?

一种解决方案,你可以将练习音符的列表显示在舞台上让用户查看。只是这样并不是特别直观,用户需要将列表中的数字与音符上面的数字进行对比,才能看出来自己选择了哪些音符。

另一种解决方案,你可以考虑为不同音符准备两种不同的造型,或是使用将[颜色]特效设定为(0)积木改变角色的颜色,以便区分它是否已经加入列表。

使用前面这两种解决方案,解决了区分某个音符是否已经被加入练习音符列表的问题,但是还会存在另一个问题。

当你点击某个音符时,程序同时在进行两个不同的操作。一是演奏音符,二是添加/删除练习音符。如果你只想试听一下某个音符的音,不希望它被添加进列表,或是从列表中删除,这时操作起来就会比较麻烦。

为了避免这种情况发生,当你在对不同的功能设计交互方案时,最好能让每个操作之间保持彼此独立,互不影响。

所以在这个案例中,我选择了另一种解决方案,单独增加一个选中状态角色,利用它的不同颜色,区分某个音符是否加入了列表中。

接下来,你需要添加一个选中状态角色,使用矩形工具画出两个不同颜色的方块造型。

它的操作与音符角色类似,通过克隆依次排列在每个音符下方,默认选择未选中造型。因为该角色并没有想音符角色一样,通过造型区分代表音符的数字,所以需要单独建立一个“音符数字”变量,再将变量值设为每个选中状态角色上方的音符所代表的数字。

当它被点击时也和音符角色之前的操作类似,先根据音符数字变量值判断该音符是否已经加入列表中,然后根据判断结果切换成对应的造型,在将音符数字加入列表,或是从列表中删除。

之前音符角色用来添加和删除列表的指令串就可以删除掉了。

点击绿旗按钮进行测试,现在演奏音符和挑选练习音符这两个功能就分别由两个不同的角色来完成了,互不影响。

  • 播放练习音符

选择好了练习的音符,接下来就要开始随机演奏它们。又是一个需要考虑的交互问题,怎么样通知程序开始演奏?最简单的方式就是增加一个播放按钮,当点击按钮时就开始随机演奏。

从角色库中选择一个按钮角色,然后在按钮上添加上文字“播放”。

当绿旗被点击时先将它放在合适的位置。

当它被点击时,就开始随机演奏练习音符列表中的音符。现在你需要思考的问题是,如何随机打乱演奏的音符顺序呢?

你可以模仿猜数字中随机获取不同数字的操作。重新新建一个列表叫做“演奏列表”。

接着,随机从练习音符列表中取出一个音符加入演奏列表中。

在加入之前先判断一下随机选出的音符是否已经存在于演奏列表中?如果已存在,就要重新获取,直到取出演奏列表中没有的音符为止。你可以将这个步骤封装到自制积木中,取名叫“生成演奏列表”。

接下来就是将演奏列表中的所有音符,依次取出来,按顺序演奏。

你同样可以将它封装到自制积木中,取名叫“演奏练习音符”。演奏的过程中你还可以利用将[颜色]特效设定为(0)积木和清除图形特效积木,改变按钮的颜色,以表示当前正在演奏中。

点击绿旗按钮进行测试,现在你先选中几个作为练习的音符,接着点击播放按钮,程序每次都会随机演奏你所挑选的音符。

如果现在的你正在练习,可能会遇到一个问题。当你第一次点击播放按钮后,你没有完全听出来刚刚播放的音符是什么,你希望可以重新听一遍。可是当你再一次点击播放按钮后,程序又会生成新的演奏顺序,无法复现。

如何解决这个问题呢?很简单,你只用将生成演奏列表和演奏练习音符这两个步骤拆开来操作即可。

你可以将播放按钮角色复制一份,然后修改按钮上的文字。

当绿旗被点击后重新将这两个角色放在合适的位置上。

接下来,当播放按钮被点击时,只完成演奏练习音符的操作。

当生成按钮被点击时,只完成生成练习音符的操作。

除此之外,你还可以在增加一个功能。

每当用户点击选中状态角色,去选中或者删除某个音符时,说明需要练习的音符发生了改变。这时你可以自动帮助用户根据最新的练习音符,重新生成一个演奏列表。

具体的实现也很简单。在选中状态角色被点击的最后,增加一个广播[生成演奏列表]积木。

当生成按钮角色接收到这个消息时,就可以执行一次生成演奏列表积木。

  • 修改演奏音符个数

现在每次重新生成的演奏列表中的音符个数,与练习音符列表中的数量一模一样,每个音符都只会演奏一次。你想增加一点练习难度,可以自己来设置需要演奏的音符个数。

例如,你选中了C,D,E三个音符作为练习音符,但是希望可以从这3个音符中随机挑选出5个作为练习。

为了完成这个功能,你又需要思考交互方式了。这一次你需要修改的是进行演奏的音符数量,它是一个变动的数字,最简便的交互方式就是通过滑杆变量来进行修改。

你可以新建一个变量叫做“音符个数”,将它修改为滑杆模式显示。

还可以根据具体的练习需要去设置滑杆的调整范围。例如,最少练习3个音符,最多练习20个音符。

接下来就要修改定义生成演奏列表的指令串,将原本重复执行(10)次积木中的参数,从练习音符的项目数改变为音符个数。

循环中你也不用再去考虑音符是否会重复的问题,只用随机从练习音符列表中选取音符加入演奏列表即可。

  • 修改演奏速度

接下来,你还可以继续增加练习难度。除了可以调整演奏音符的数量之外,你还想要调整演奏时的速度。

实现方法和修改演奏音符个数类似。先增加一个变量“演奏速度”,将它调整为滑杆模式显示。

同样可以设置演奏速度的调整范围,例如30~260。

最后,演奏速度需要在你演奏之前进行设置,将演奏速度设定为(60)积木添加到播放按钮角色的定义演奏练习音符的指令串中,参数使用演奏速度的变量值。

3. 显示/隐藏练习答案

最后,当你听完演奏的音符,说出自己的答案后,你需要知道自己是否答对了。如何才能知道呢?很简单,只需要将自己的答案和演奏列表中的数字进行对比就可以了。

为了能在练习时不看见答案,练习完成后再显示答案,你又可以增加一个按钮来控制演奏列表的显示和隐藏。

重新将所有角色、变量和演奏列表调整到合适的位置显示。

默认将演奏列表隐藏起来,显示/隐藏按钮默认换成显示造型。当按钮被点击时你切换按钮的造型,同时切换演奏列表的隐藏状态。

类似的操作你已经在电子闹钟里学习过。你可以这样实现。

也可以这样实现。

这样一来,你就完成了一个听觉训练的小游戏。

实现上面的功能后,你还可以继续将它完善。例如,现在演奏列表中显示的是数字,不方便用户对比答案,你可以考虑能否将数字换成音符。另外,你还可以根据节拍器的做法,增加节拍练习。这些功能就留给你自己作为课后练习了。

想看更多学习案例,欢迎点击查看《Scratch 3学习手册》open in new window

想要获取所有案例源码和素材,以及获得我对你在学习中所遇问题的一对一解答,欢迎加入石头解忧杂货店

Last Updated:
Contributors: lanheixingkong