记录并回放音乐
在上一节《用地图演奏蜂鸣器音乐》 中,CoCube 可以读取音乐地图的卡片 ID,并用蜂鸣器实时播放对应音符。
这一次,我们要给它增加一项新本领:记住经过的琴键,并自动重放刚才的旋律。
在线程序:在 MicroBlocks 中打开程序
程序文件:Buzzer_Record_and_Replay.ubp
1. 操作方法
- 按下 A 键,屏幕显示
Recording...,开始一次新的录音。 - 推动 CoCube 经过音乐地图上的琴键。
- 按下 B 键,屏幕显示
Playing...,CoCube 自动回放刚才的旋律。 - 可以反复按 B 键,多次播放同一段旋律。
- 再次按 A 键会清除旧旋律,并开始重新录音。
程序只记录经过的音符顺序,不记录滑动速度。回放时,每个音符固定持续 300 毫秒,音符之间等待 50 毫秒。
2. 准备一个音符列表
程序使用三个变量:
key:当前琴键的卡片 ID。last_key:上一次读取到的卡片 ID。notes:按顺序保存录制的所有音符。

启动时,把 key 和 last_key 设为 0,并把 notes 设为空列表。
列表就像一个可以不断加长的盒子。例如,CoCube 依次经过编号为 60、64、67 的琴键,列表会变成 notes = [60, 64, 67]。
3. 按 A 键开始录音

按下 A 键后,程序先清空屏幕并显示 Recording...,然后做两项准备:
- 把
notes设为空列表 last_key = 0
这会删除上一段旋律,并开始一次全新的录音。
后面的琴键读取与上一节基本相同:程序不断读取卡片 ID,只有当 key 和 last_key 不同时才切换音符。
新增加的积木是:
“添加 key 至列表 notes”
每当 CoCube 进入一个有效琴键,程序不仅播放这个音符,还把琴键编号添加到 notes 的末尾。这样,经过的所有琴键就会按顺序保存下来。
4. 按 B 键回放旋律

按下 B 键后,“停止其他任务”会结束正在运行的录音循环。程序随后遍历 notes 列表:
- 对于
notes中的每一个note: - 播放
note,持续300毫秒。 - 等待
50毫秒。
“变化因子 note 范围 notes”会从列表开头依次取出每个音符,直到整段旋律播放完毕。
回放后,notes 没有被清空,因此可以再次按 B 键重复播放。只有再次按下 A 键时,旧旋律才会被删除。
5. 动手试一试
- 修改
300毫秒,比较不同的演奏速度。 - 修改
50毫秒,听听音符之间的停顿有什么变化。 - 在回放时显示当前的 MIDI 编号。
- 想一想:如果希望回放时保留原来的快慢节奏,还需要记录什么数据?