scratch是一个非常小巧的青少年编程工具,自带程序编写语句,积木式语句非常直观、易用,可创作数学、科学、音乐、绘画等方面作品。本文用scratch“演奏”一首大家非常熟悉的《天空之城》,并向大家介绍一些基本乐理知识,以及scratch中消息、链表的使用。
目录
1、音乐基础
1.1 认识音符
1.1.1音符
1.1.2 音区
1.1.3 音变
1.1.4 scratch音符编码
1.2 认识节拍
1.2.1 音符时值与节拍
1.2.2 附点音符
1.2.3 减时线与增时线
1.2.4 连音线
1.2.5 scratch节拍编码
2、scratch与音乐
2.1 scratch声音语句
2.2 程序分析
2.3 程序设计
2.3.1 链表
2.3.2 消息
2.4 程序主体
2.5 仅仅是《天空之城》?
3、总结
我们一起来“搭”一个音乐演奏程序:
scratch:《天空之城》
1、音乐基础
我们知道,音乐有四个基本构成要素:音的高低、音的长短、音的力度(强度)和音质(音色)。因此,将一首乐曲用程序“唱出来”,得从这四个方面分析。就教学目标而言,我们将重点分析音的高低和音的长短。
1.1 认识音符
1.1.1音符
“音”是音乐的“原子”,体现为“音符”。音符是表达高低音的一种符号,目前普遍用到的音符一共有七个,(音名)分别为C、D、E、F、G、A、B,简谱中与之对应的是1、2、3、4、5、6、7,读作“do、ruai、mi、fa、sou、la、xi(斗、瑞、咪、发、搜、拉、西)”。
1.1.2 音区
如图,在钢琴琴键上,“音”从左至右依次增高。
在上图中可以看到,一个音符会多次出现,我们把相邻的同名音符之间的间距称为一个8度。例如“1”和“1(·)”相差一个8度,即“1(·)”比“1”高8度。一个8度内的音符构成一个音组,音组与音组可以形成音区。我们把1、2、3、4、5、6、7所在音组称为中央音区,中央音区左边(下边有点)为低音区,右边(上边带点)为高音区。所有音区一起形成一个音域。
下面这个程序演示相邻的低、中、高音区。
音乐基础知识:音符简介
注意,为使演示效果最佳,程序已将三音区的同名音符作叠加处理,请仔细辨听声音高低。
1.1.3 音变
在钢琴琴键图中,一个音区既有白键也有黑键。那么相邻的白键或相邻的白、黑键是什么关系呢?
半音或全音关系。
以中音区为例,在“1”和“2”之间有一个黑键,键名为“#1 b2”,表示该音比“1”高半音,比“2”低半音。
一个白键和一个相邻的黑键之间相差“一个半音”(反之亦然),一个白键和另一个(看起来相邻的)白键相差“一个全音”。
还是以中音区为例,只有“3”“4”之间是半音,其他两两音符间都是全音。实际上还有一个特殊的跨音区半音:“7”和高一个8度的“1”。
在原音的基础上,我们可以变音,将标准音升高或降低。
1.1.4 scratch音符编码
在scratch眼中,音符如下面蓝色数字所示:
例如,对于简谱
可编码为:0 0 0 69 71 72 71 72 76 71 64 69 67 69 72 67 64
简谱中的“0”是休止符,表示“静默(不发音)”,一般表示占位,在scratch中同样用0表示。
那么如何处理变音?
仔细观察音符对应图,我们发现具有全音关系的两个音符(如“2”和“3”)对应的scratch音符值(62和64)相差2,而具有半音关系的两个音符(如“3”和“4”)对应的scratch音符值(64和65)相差1,而一个全音相当于两个半音,由此可知,半音对应1,升或降多少个半音,就加或减多少个1。
简谱:
编码:71 66 66 71 71 69 71。
1.2 认识节拍
演绎一首音乐时,需要表现的要素有很多。表达一个音符时,除了要表现音的高低之外,还要表现音的长短,这个时候就关系到一个重要概念,节拍。
1.2.1 音符时值与节拍
音符和该音符在演奏时呈现的时长结合在一起产生出不同时值类型音符,包括全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符等。如有下表:
“表示”下的音符“1”可为任意音符“x”,当“x”为“0”时得到各类音符对应的休止符。
音符时值指演绎一首乐曲时当前音符持续的时间。全音符定义音符时值的“基本单位”,其他音符时值在全音符基础上依次除以2得到,例如,一个全音符在时值上相当于二个二分音符时值。这样,不同时值类型音符间的关系就确定了。
在音符时值基础上形成节拍时值。一个节拍的时值是多少首先看拍号。上表拍号为4/4,表示以四分音符为一拍,一小节四拍。我们还可能遇到2/4、3/4、6/8这样的拍号,分别表示以四分音符为一拍,一小节2拍;以四分音符为一拍,一小节3拍;以八分音符为一拍,一小节六拍。总之,在拍号中,分母决定以哪个音符为一拍,分子决定一小节有多少拍。
一拍的时值是相对的,与节奏有关。当节奏为每分钟60拍时,一拍为一秒;当节奏为每分钟120拍时,一拍为半秒;当节奏为每分种240拍时,一拍为1/4秒,依此类推。当一拍时值确定后,根据拍号以及不同时值类型音符间的关系,音符时值就很容易确定了。例如,拍号1/8,节奏每分钟60拍,则一拍为1秒,一个四分音符为二拍二秒,一个二分音符为四拍四秒,全音符为八拍八秒。
音符和节拍时值不影响音符的表示。
1.2.2 附点音符
当音符右边出现一个小圆点“·”时,该音符叫附点音符。附点音符表示将时值延长至“·”前音符一半。例如,四分附点音符时值:1·=1+1,八分附点音符时值:1·=1+1。
1.2.3 减时线与增时线
一个音符下边出现的横线叫减时线,一道减时线表示将该音符时值减少一半,可以有多道减时线,如。
一个音符右边出现的横线叫增时线,一道增时线表示将该音符时值增加一拍(4/4),可以有多道增时线,如1 — — —。
1.2.4 连音线
如果符号“⌒”出现在同名音符上面则表示延音线,同一个音延续多个节拍,如下图“2”上的延音线。
如果符号“⌒”出现在多个音上面,则表示圆滑线,连接两个以上不同的音,要求多个音表现(唱、演奏)得连贯、圆滑,如上图第二个“⌒”所示。
1.2.5 scratch节拍编码
如图,
当拍号为4/4,节奏每分钟一百二十拍时,scratch节拍编码如下(单位:拍):
1 1 1 0.5 0.5 1.5 0.5 1 1 3 1 1.5 0.5 1 1 3 1
再比如,
拍号不变,节奏不变,scratch节拍编码如下(单位:拍):
1 0.5 1.5 1 1 0.5 2.5
下面是我选用的《天空之城》曲谱:
《天空之城》对应音符与节拍如下所示(拍号4/4,节奏120bpm,节拍单位:拍):
音符 | 节拍 |
0 69 71 72 71 72 76 71 64 69 67 69 72 67 64 65 64 65 72 64 72 72 71 66 66 71 71 69 71 72 71 72 76 71 64 69 67 69 72 67 64 65 72 71 72 74 76 72 72 71 69 71 68 69 72 74 76 74 76 79 74 67 67 72 71 72 76 76 69 71 72 71 72 74 72 67 67 77 76 74 72 76 76 81 81 79 79 76 74 72 72 74 72 74 79 76 76 81 81 79 79 76 74 72 72 74 72 74 71 69 69 71 72 71 72 76 71 64 69 67 69 72 67 64 65 72 71 72 74 76 72 72 71 69 71 68 69 | 3 0.5 0.5 1.5 0.5 1 1 3 1 1.5 0.5 1 1 3 1 1.5 0.5 1 1 3 0.5 0.5 1.5 0.5 1 1 3 0.5 0.5 1.5 0.5 1 1 3 1 1.5 0.5 1 1 3 1 1 0.5 1.5 1 1 0.5 2.5 0.5 0.5 1 1 1 3 0.5 0.5 1.5 0.5 1 1 3 0.5 0.5 1.5 0.5 1 1 4 0.5 0.5 1 0.0 0.5 1 1.5 0.5 2 1 1 1 1 3 1 1.5 0.5 1.5 0.5 0.5 0.5 2 1 1.5 0.5 1 1 3 1 1.5 0.5 1.5 0.5 0.5 0.5 2 1 1.5 0.5 1 1 3 0.5 0.5 1.5 0.5 1 1 3 1 1.5 0.5 1 1 3 1 1 0.5 1.5 1 1 0.5 2.5 0.5 0.5 1 1 1 8 |
2、scratch与音乐
2.1 scratch声音语句
scratch中声音语句相当简单:
在演奏《天空之城》的这个程序中,我们主要用到以下语句:
2.2 程序分析
scratch:《天空之城》
我们主要完成的任务有两个:一个是《天空之城》的演奏,另一个是显示且仅显示出当前演奏的音符。
第一个任务的核心是音符与节拍的确定与存放,我们将用到“链表”;
第二个任务的核心是当前音符显示/隐藏的通知与执行,我们将用到“消息”。
2.3 程序设计
2.3.1 链表
在scratch中,链表可直接视为平常意义上的表格,但只能对它进行有限的一些操作。
程序中我们用到的主要操作如下所示(见主程序):
为能存放《天空之城》音符和节拍数据,我们要新建两个链表,名称分别为“音符”“节拍”,并设置为“适用于所有角色”:
然后,为这两个链表添加数据(一个接一个地添加,点击左下角加号“+”可增添一项):
2.3.2 消息
首先设置舞台背景:
由于舞台区域不大,这里将不同8度的音符集中在一起显示。为各音符添加“显示”角色:
音符对应的“显示”角色,如“1”对应的Sprite1,有多种添加方式,这里用的是“造型”设计。
我们要完成的任务二是“显示且仅显示出当前演奏的音符”,也即在弹奏一个音符前,让音符对应的“显示”角色显示,而在弹奏完成后,让其隐藏。这里将用到“消息”。
消息就像是信件,当我有事通知你时,就发一个消息给你。你接收到后执行即可。在scratch中,消息是一种事件,我们主要用到的消息语句如下所示:
消息要先建立再使用:
当新建好消息(以scratch音符编码表中每个音符编码为消息名各新建一个消息,再增设三个消息66、68与hide)后,我们要让“显示”角色们具备执行能力。
角色 | 操作脚本 |
Sprite1 |
|
Sprite2 |
|
Sprite3 |
|
Sprite4 | |
Sprite5 | |
Sprite6 | |
Sprite7 |
2.4 程序主体
当舞台、角色、消息、链表、变量都已设置好,主体程序就非常简单。
简要分析如下:
当程序被某个事件(这里是点击绿旗图标)启动后,首先将各个“显示”角色隐藏并移动到指定位置,然后设定节奏(定快慢)、选择乐器(定音色),初始化当前音符与节拍所在序号为1。接着依次从“音符”和“节拍”表中取出音符和节拍数据进行弹奏。弹奏前通知当前音符对应的“显示”角色显示,弹奏过后通知其隐藏。
“选择”和“n”是两个变量,分别确定弹奏乐器和“音符”“节拍”表中的第几项。
就这样,动听且充满想象的《天空之城》完成啦。
2.5 仅仅是《天空之城》?
只要找到任意你想演奏的音乐简谱,然后得出音符和节拍编码并放入链表中,就可以演奏任意你喜欢的音乐。
3、总结
scratch是一个非常小巧、直观的青少年编程工具,在程序逻辑已定的情况下进行程序编写非常简单(“搭积木”)。
将一首歌曲的简谱变为scratch认识的音符和编码相对来说,既是一个乐理知识上的难点,也是一个操作上的难点(繁琐),需要一定的耐心去学去实际操作。
如何在舞台上显示当前音符?对于青少年而言,这个问题实际上是一个从0到1的问题,没有灵感一现的那一瞬间,在scratch提供的语句集中很难设计出解决方案。
在整个程序设计过程中,需要将音乐、舞台视觉设计、角色(包括操作)、事件、消息、数据结构、主体程序流程综合统筹到一起进行思考分析,非常益于解决问题能力的培养,以及创新思维、艺术素质的提升。
音乐相关的乐理,我们只学习到非常少的一部分,但可由此进入音乐世界,既可以编写更多演奏音乐的程序,也可以为各类乐器兴趣班的学习打基础。