阳光总在风雨后, 请相信有彩虹

我喜欢这个粉色少女心的题目

演示

我们先来看看演示效果:在桌子上一字排开彩虹糖,按照你喜欢的颜色去摆放,这些彩虹糖将被演奏为一首音乐

缘起

我非常喜欢Scratch团队成员Eric Rosenbaum发起的颜色编程项目。颜色编程的基本想法是使用日常物体表面的颜色与计算机中的虚拟事物进行互动

颜色编程由一系列的实验构成:

  • Twinkle
  • Color Code
  • Scratch Color Code
  • Programming with Color

我们下边将逐一做个简单介绍

Twinkle

Twinkle 使用一个颜色传感器将颜色序列转化为一首旋律,于是你可以将一幅画、一个乐高建筑以及你身上衬衫上的条纹演奏为一首歌

Color Code

Color Code 的想法是: 物体的颜色可以控制屏幕里的运动,于是你可以利用这个概念创造从乒乓球游戏、音序器以及人工生命模拟。

Scratch Color Code

Scratch Color Code则将Color Code的想法带入到Scratch中,如此一来,人们可以使用友好的scratch图形化编程环境来创建项目,与外部世界的彩色物体交互

视频里展示的例子包括一个cookie怪物游戏、一个叶子平台游戏,以及一个糖果鼓机(candy drum machine)

Programming with Color

Programming with Color将前头的概念延伸到最远处:使用颜色来编程,用Scratch Color Code来创造一个微型编程语言,在这门语言里颜色代表着指令。

这是个极为有趣的想法,我们来看看这个想法的细节

  • 一个小角色在屏幕移动,画出一条线;
  • 一个黑色箭头在屏幕的底部,从左向右滑动,读取由彩色物体组成的“程序”。
  • 当黑色箭头碰到红色时,小角色向右转。
  • 当黑色箭头碰到绿色时,小角色正在绘制的线条会改变颜色。
  • 箭头碰到黄色时小角色向左转,碰到蓝色时小角色回到初始位置重新开始。

这是一种有形的编程语言,指令由对象表示,即便在程序运行时也可以重新排列程序(如果你是一名职业程序员,可能想到了热重载或者LISP)。

与其他有形编程语言不同的是,指令块可以由任何对象来表示,不必是特定的指令块,只要颜色对了就行。对比PETSCubetto,我们可以看到它们的目标上的相似,以及策略上的差别

与其他编程语言不同,Programming with Color的指令具有连续的效应,举例来说明:红色物体越宽,角色右转的时间越长。

这些属性为创造新的编程语言提供了一些有趣的探索。

Scratch颜色编程

本文主要受Scratch Color Code的启发,准备在最新发布的Scratch3.0,使用彩虹糖来演奏乐曲,这便是少女心题目彩虹的旋律之来由

原理

Programming with Color部分其实已经将原理说清楚了,在此我们将原理与当前项目:彩虹🌈的旋律结合起来说明

  1. 彩虹糖在桌子上排成一列,使用摄像头对着它们, 彩虹糖被投影到scratch舞台
  2. 一个粉色箭头在屏幕中间,从左向右滑动
  3. 当粉色箭头碰到不同颜色的彩虹糖时,演奏不同旋律的音符

接着,让我们一起动起手来

需要的材料

  • 一些彩虹糖
  • 一个usb摄像头
  • 一台笔记本电脑(安装chrome浏览器)

Do-Re-Mi

让我们从音乐届的hello world开始: 演奏:Do Re Mi

回顾下原理,看看我们都需要做些什么:

  1. 彩虹糖在桌子上排成一列,使用摄像头对着它们, 彩虹糖被投影到scratch舞台
  2. 一个粉色箭头在屏幕中间,从左向右滑动
  3. 当粉色箭头碰到不同颜色的彩虹糖时,演奏不同旋律的音符

动起手来,首先取出三种颜色的彩虹糖,在桌子上摆开,使用摄像头对着它们,我原先准备使用乐高积木搭建一个摄像头支架,由于心急想快些看到效果,于是我给了我同事一颗彩虹糖,让他帮我拿着USB摄像头

摆好彩虹糖和摄像头后,就可以开始在scratch里开始编写程序了

接下来需要在scratch的角色库里选择一个粉色箭头精灵,只所以把他们称为精灵,是因为游戏里的角色在传统上都被称为精灵。

聪明的你可能要打破沙锅,问为何它们在传统上会被称为精灵呢?我想,可能是因为这些角色和童话里的精灵一样,它们会运动,会生气,会砰地一声消失不见。你通过编程来操控这些精灵,就这点来说,编程和魔法是很相似的,这是个很好的隐喻。你写出一串咒语,然后故事里的精灵就动了起来、远处的灯亮了、而手中的飞行器嗖地飞上了天,这是今天利用程序能做到的事,在很久很久以前的这种开头的故事里,这种事情往往是魔法师的专属权力。我相信今天程序做到的事情,会让历史上每一位伟大的巫师/魔法师大为震惊,这些魔法师不只是大卫·科波菲尔,也包括哈利.波特

选择好精灵之后,我们就开始来为精灵编程了,在开始编写程序之前,我们先想想我们希望精灵做什么事呢

  1. 一个粉色箭头在屏幕中间,从左向右滑动,读取由彩虹糖组成的“程序”。

我们希望粉色箭头在屏幕中间从左向右滑动,目标明确之后,我们就开始动手写程序

上边这段程序表达的意思是:箭头不断往右边移动,如果到了舞台边缘就回到初始位置。怎么知道哪儿是舞台边缘呢?这就是程序里看起来奇怪的数字212出现的原因。212是坐标值,如果你不知道坐标的概念也没关系,知道212表示舞台上右边缘的位置就行。写出有趣的程序和数学好不好并没什么太大关系,别听信大家恐吓你数学不好就学不好编程。如果你喜欢编程,你的数学很可能会得到提高,但你目前的数学不好却不意味着你不适合编程,它可能更多意味着你的数学老师上课太无聊。数学课大多情况下总是那么无聊,这也是我们喜欢在编程中学习的原因

运行程序,我们就看到箭头完成了我们期望它做的事情:不断从左往右滑动

下边来实现最后一步

  1. 当粉色箭头碰到不同颜色的彩虹糖时演奏不同旋律的音符

为了实现这一步,我们需要先启用摄像头,让糖果投影到屏幕上, 首先选择scratch扩展里的视频侦测插件

接着编写碰到不同颜色时演奏不同旋律的代码

  • 黄色对应"Do"
  • 橙色对应"Re"
  • 褐色对应"Mi"

现在就可以开始Do Re Mi的演奏啦:

欢乐颂

我们来演奏贝多芬《欢乐颂》的开头: 33455432

挑一首你自己喜欢的乐曲,试着用彩虹糖演奏它

想象空间

程序是一种指令序列,上边的教程里,我们已经学会了将彩虹糖映射为一个指令(演奏旋律),我们当然也可以将彩虹糖映射为其他指令,诸如

  • 映射为画笔移动
  • 映射为机器人的移动
  • 映射为智能家居的设备行为

如此一来我们就可以在桌子上摆放彩虹糖,去探索绘画、音乐和改造你的家庭

我们甚至可以用彩虹糖去制作了一门新的编程语言: Candy Language

参考