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

2. 准备工作
步骤1:导入 MIDI 合成器库
在 MicroBlocks IDE 中,打开积木库,在“声音”库文件夹下找到“MIDI 合成器”并添加。
先来看一下我们接下来会用到的几个积木。

步骤2:唤醒 MIDI 模块
将 MIDI 模块稳固连接至 CoCube后,我们需要通过代码为模块供电。
确保 CoCube 已通过 USB 或 BLE 成功连接。
在“CoCube 外接模块”库中,找到并执行 “开启外接模块电源”。
观察灯光:看到 MIDI 模块上的绿灯常亮,就说明它已经准备好了。
3. 基础探索
在正式演奏前,我们先弄清楚音乐地图是如何交互的。
实验:查看卡片ID
编写一个简单的循环程序,让 CoCube “说”出当前的卡片ID。

你会发现两个重要规律:
在键位上:卡片ID 会输出当前琴键对应的 MIDI 数值(如 60、61……)。
离开地图:卡片ID 会立刻变回 0。
4. 进化之路
步骤1:初试发声
我们先尝试最直观的逻辑:如果 CoCube 正踩在琴键区间(60-84),就播放一个 500 ms 的音符;离开后则停止。
用一个全局变量 key 来储存每一次读到的卡片ID。

编写好程序后,运行试试吧!
步骤2:修改积木
刚刚写的程序里,每一个发音都被固定成 500 ms 的整数倍。我们能不能再优化一下,让 CoCube 站在键盘上时立即发声,离开键盘时及时停止呢?
首先,我们想到可以先去掉 500 ms 的演奏时间,尝试把“播放 MIDI 音符”积木改成“设置 MIDI 音符”。
代码如下:

但这样听起来会有些奇怪,对不对?例如当 CoCube 机器人停在 60 号琴键上时,程序会不断触发“设置 MIDI 音符”,反而让完整的 MIDI 音符没法正常播放。
步骤3:状态监控
为了解决这个问题,我们需要引入“状态对比”机制:增加一个全局变量 lastkey,并在每次循环结束后把 lastkey 更新为 key。
只有当当前琴键(key)和上一次记录的琴键(last_key)不同时,才触发新的音符。

这样一来,程序的表现已经顺畅很多了,对不对?
步骤4:完美消音
当你快速扫过琴键时,不同音符可能会堆叠在一起,听起来会有些嘈杂。特别是当你把 MIDI 乐器设置为弦乐、合奏、铜管、簧管、笛子或合成音色等长音色时,这个问题会更明显。
为了解决这个小瑕疵,我们可以这样做:

在开启新音符之前,先强制关闭上一个音符。
现在再快速滑动一下,声音就会干净很多,即使是长音色(如弦乐)也能清脆切换。
5. 挑战与创作
音乐不仅好听,也可以很好看!尝试给你的程序加入视觉反馈:让不同的音高触发屏幕显示不同的颜色。

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