1. 让 CoCube 在地图上演奏

在迷宫或足球场地图上,CoCube 是精准的运动员,能够准确感知自身的坐标和旋转方向;而在音乐地图上,它又会变成一位小乐手。通过识别地图上不同区域对应的卡片ID,我们就能让 CoCube 实时判断自己踩在了哪个“琴键”上,并触发相应的 MIDI 音符。

MIDI Map

2. 准备工作

步骤1:导入 MIDI 合成器库

在 MicroBlocks IDE 中,打开积木库,在“声音”库文件夹下找到“MIDI 合成器”并添加。

先来看一下我们接下来会用到的几个积木。

Code1

步骤2:唤醒 MIDI 模块

将 MIDI 模块稳固连接至 CoCube后,我们需要通过代码为模块供电。

  • 确保 CoCube 已通过 USB 或 BLE 成功连接。

  • 在“CoCube 外接模块”库中,找到并执行 “开启外接模块电源”。

  • 观察灯光:看到 MIDI 模块上的绿灯常亮,就说明它已经准备好了。

3. 基础探索

在正式演奏前,我们先弄清楚音乐地图是如何交互的。

实验:查看卡片ID

编写一个简单的循环程序,让 CoCube “说”出当前的卡片ID。

Code2

你会发现两个重要规律:

  • 在键位上:卡片ID 会输出当前琴键对应的 MIDI 数值(如 60、61……)。

  • 离开地图:卡片ID 会立刻变回 0。

4. 进化之路

步骤1:初试发声

我们先尝试最直观的逻辑:如果 CoCube 正踩在琴键区间(60-84),就播放一个 500 ms 的音符;离开后则停止。

用一个全局变量 key 来储存每一次读到的卡片ID。

Code3

编写好程序后,运行试试吧!

步骤2:修改积木

刚刚写的程序里,每一个发音都被固定成 500 ms 的整数倍。我们能不能再优化一下,让 CoCube 站在键盘上时立即发声,离开键盘时及时停止呢?

首先,我们想到可以先去掉 500 ms 的演奏时间,尝试把“播放 MIDI 音符”积木改成“设置 MIDI 音符”。

代码如下:

Code4

但这样听起来会有些奇怪,对不对?例如当 CoCube 机器人停在 60 号琴键上时,程序会不断触发“设置 MIDI 音符”,反而让完整的 MIDI 音符没法正常播放。

步骤3:状态监控

为了解决这个问题,我们需要引入“状态对比”机制:增加一个全局变量 lastkey,并在每次循环结束后把 lastkey 更新为 key。

只有当当前琴键(key)和上一次记录的琴键(last_key)不同时,才触发新的音符。

Code5

这样一来,程序的表现已经顺畅很多了,对不对?

步骤4:完美消音

当你快速扫过琴键时,不同音符可能会堆叠在一起,听起来会有些嘈杂。特别是当你把 MIDI 乐器设置为弦乐、合奏、铜管、簧管、笛子或合成音色等长音色时,这个问题会更明显。

为了解决这个小瑕疵,我们可以这样做:

Code6

在开启新音符之前,先强制关闭上一个音符。

现在再快速滑动一下,声音就会干净很多,即使是长音色(如弦乐)也能清脆切换。

5. 挑战与创作

音乐不仅好听,也可以很好看!尝试给你的程序加入视觉反馈:让不同的音高触发屏幕显示不同的颜色。

Code6

你还可以继续开发:当 CoCube 落在音乐地图第一行的不同乐器区域时,为 MIDI 模块切换不同的音色,看看能否找到最适合你的组合。

CC-BY-SA

© 来自 CoCube 2024-2026.

This work is licensed under a CC-BY-SA 4.0 license.