你好呀,我是吴老师。
上一课板子学会了听:把声音变成一串数字,存了起来。
今天要教它反过来做 —— 把数字变回声音。
这一课有个好处:你一按就能听见结果,不用盯着屏幕猜。
读完之后,你应该能:说出喇叭和话筒是什么关系;让板子发出指定的音;说清"按住响、松开停"为什么必须用
tone_on;分清"板子自己发声"和"放音乐文件"是两回事。用时:约 45 分钟。准备:板子、数据线。
一、喇叭做的事,正好和话筒相反
上一课那个"真相",今天要反过来用:
板子自己不会发出声音,它只会让喇叭抖。
抖得快 → 声音高;抖得慢 → 声音低。
所以那串数字是这么走的:
一条路,两个方向。
💡 这也解释了为什么喇叭和话筒长得有点像 —— 它们其实是同一种零件的两种用法。
二、发一个音
给它一个数 + 一个时长,它就出声了:
| 你要给它 | 是什么 | 例子 |
|---|---|---|
| 第一个 | 频率 —— 每秒抖多少下 | 440 |
| 第二个 | 响多久(毫秒) | 500 = 半秒 |
第二个可以不写,默认 200 毫秒。
⭐ 就这么两个数。 这一课后面讲的全是"第一个数该填几"。
三、音高,就是一个数
这里没有"do re mi",只有数字。而且规矩特别简单:
数字越大,音越高。
课本上那七个音,对应的数就这几个 —— 看波形,越往右抖得越快:
⭐ 把这一串念一遍,记住它。
记住之后,你就能让板子唱任何歌 —— 只要把简谱上的数字,换成这几个数。 简谱里的
1就是262,2就是294,依次往下。
连着弹下来,就是一个音阶。
💡 它凭什么唱歌? 因为"曲子"说到底就是一串数字的先后顺序。 你只要按顺序把这些数喂给它,它就能唱出来 —— 不用懂什么叫音乐。
四、⚠️ 有一件事要先分清
板子会自己发声,但它不会放音乐文件。
| 板子行不行 | |
|---|---|
| 发出一个指定高低的音 | ✅ 行(就是这一课要做的) |
| 放一首存在板子里的歌 | ❌ 不行 |
💡 为什么不行?
因为它做的是自己抖出一串纯净的音,不是"把录好的声音原样播出来"。 这两件事听起来像,其实是完全不同的活儿。
**想听真正的音乐,得联网。**那是后面第 16 课的事,先记着。
五、钢琴的秘密:按住响,松开停
先用上面那个 play_tone 做个钢琴试试 —— 你会发现做不出来。
因为它有个毛病:
假设让它响 2 秒 —— 这 2 秒里,程序就"停在那儿等"。
于是这 2 秒里你抬手,它也读不到 —— 程序正忙着放音呢。
所以用"放一个音"的做法做钢琴,只能做成"点一下、响一声",按住没用。
要"按住多久响多久",得换另一对做法:
⭐ 区别就一句话:
做法 意思 放一个音 "把这个音放完" —— 程序得等着 开始响 / 停 "开始响",什么时候停 —— 你说了算
| 你要做的东西 | 该用哪种 |
|---|---|
| 放一小段旋律 | 放一个音(放完才轮到下一个,正好当节拍) |
| 钢琴那种按住发声 | 开始响 / 停(不卡住程序) |
⚠️⚠️
tone_on会一直响下去,千万别忘了关。应用退出前必须调一次
tone_off()—— 不然回到桌面之后那个音还在响, 听上去就像板子坏了。
六、动手做
任务一:音阶
请帮我做一个最简单的发声应用:
1. 屏幕上画 7 个按钮,从左到右排成一排
2. 每个按钮写一个音名:do re mi fa sol la si
3. 点哪个按钮,就发出那个音,响 ___ 毫秒
4. 用中文注释
💡 第 3 条那个数字你自己定。改完记得听听区别 —— 太短会听不清,太长会拖泥带水。
参考值(不是标准答案)
200 毫秒左右比较顺耳。
demo01_tones用的是 200。
做好之后屏幕上就是这样 —— ⭐ 注意每个键底下还画着它的频率数字: 这一排数字就是这一课的全部内容。

做完试着从右往左点一遍 —— 听起来和刚才有什么不一样?
任务二:玩一台现成的钢琴
板子上已经有一台做好的钢琴了 —— 不用你从零做。
先去把它装上:打开 aiesp32.ai-scratch.cn/apps/install, 在示例应用里找到**「钢琴」**,装到板子上(和你第 3 课学的一样)。
装好之后屏幕上就是这样 —— 白键黑键都在,按住的那个键会变蓝:

装上之后,请你亲手试这三件事:
| 试什么 | 看什么 |
|---|---|
| 按住一个键 3 秒不放 | 它是响 3 秒,还是响一下就停? |
| 按住一个键,手指滑到旁边的键 | 音变了没有? |
| 点「弹一首」 | 听听它弹的是什么歌? |
然后想一个问题:它为什么做得到?
因为用的是
tone_on/tone_off,不是play_tone。
tone_on不卡住程序,所以每帧都能重新看一眼"手指现在在哪"—— 滑过去换音这件事,代码反而变得很短。
⭐ 给你留一个问题: 如果这台钢琴用的是
play_tone,上面第一件和第二件事还做得到吗?先自己想,再翻回第五节看看答案。
💡 想看它是怎么写的? 直接问 AI: "把板子上那台钢琴的代码找出来,用我能听懂的话讲讲它怎么知道手指在哪个键上。"
任务三:游戏音效
做好之后屏幕上就是四个按钮 —— 每个按钮背后是"一串音",不是"一个音":

请帮我做一套游戏音效:
1. 屏幕上 4 个按钮:得分 / 失败 / 过关 / 开始
2. 每个按钮响一个不同的音,长度也不一样
3. 得分要往上走的感觉,失败要往下掉的感觉
4. 用中文注释
⭐ 注意"一串音"这件事。
得分不是"响一声",是
262 → 330 → 392连着往上跳三个音。 失败也不是"响一声",是392 → 330 → 262连着往下掉。音效好不好听,靠的是"排列",不是单个音。 得分:262 → 330 → 392;失败:392 → 262。
七、只改一个条件
挑一个来改,先说出你的预测,再动手:
| 我改的条件 | 我预测会怎样 | 实际怎样 |
|---|---|---|
把 262 改成 524 | ||
把 262 改成 131 | ||
| 把自己做的音阶改成"按住才响、松开就停" | ||
退出前忘了 tone_off() |
💡 前两个是翻倍和减半 —— 听听像不像"同一个音,高一些 / 低一些"。 最后一个是"回到了桌面还在响",听上去很吓人,但改回来就好了。
八、自检小测
九、还想玩点什么
| 想做什么 | 可以这样描述给 AI |
|---|---|
| 电子琴 | 加上黑键,能弹半音,还能换八度 |
| 音乐盒子 | 把《小星星》存进去,点一下就自动弹完 |
| 会唱歌的闹钟 | 到点弹一小段旋律叫你起床 |
| 声控小游戏 | 用不同的音表示得分、失败、过关 |
| 两个人合奏 | 一个人按前面的键、一个人按后面的键 |
⭐ 下一节课,我们要让板子连上网。
为什么现在才教联网?因为前面这些课都不需要它 —— 存东西、画图、录音、发声,板子自己就能干。
但从下一课开始,事情要变样了:板子要开始跟外面说话。 而那扇门,第一道就是 WiFi。