老夫原本已经忘光光了,现在借着 AI 的强大力量捡回来。
Q:在 PC 时代早期,Turbo Basic 语言可以使用 play 语句驱动扬声器发出音乐,年头太久了,你能帮我把简谱转成程序的完整规则说一下吗?
A:Turbo Basic(以及早期的 QBASIC、GW-BASIC)确实可以通过 PLAY 语句驱动 PC 扬声器播放音乐。它的语法类似于一种简单的音乐标记语言,可以将简谱转换成代码。以下是完整的转换规则和示例:
1. PLAY 语句基础语法
|
1 |
PLAY "音乐字符串" |
- 音乐字符串由音符、音长、节奏控制符组成,不区分大小写。
2. 简谱 → PLAY 语句转换规则
(1) 音符(音高)
| 简谱符号 | PLAY 代码 | 说明 |
|---|---|---|
| 1 (Do) | C |
中央 C(默认八度) |
| 2 (Re) | D |
|
| 3 (Mi) | E |
|
| 4 (Fa) | F |
|
| 5 (Sol) | G |
|
| 6 (La) | A |
|
| 7 (Si) | B |
|
| 0 (休止) | P |
停顿 |
升降号处理:
#(升号):在音符后加+,如C+表示C#。b(降号):在音符后加-,如B-表示Bb。
(2) 音长(节拍)
| 简谱符号 | PLAY 代码 | 实际时长(以 4 分音符为基准) |
|---|---|---|
| 全音符 | L1 |
4 拍 |
| 2 分音符 | L2 |
2 拍 |
| 4 分音符 | L4 |
1 拍(默认值) |
| 8 分音符 | L8 |
0.5 拍 |
| 16 分音符 | L16 |
0.25 拍 |
附点音符:在音长代码后加 .,如 L4. = 附点 4 分音符(1.5 拍)。
(3) 八度控制
O<n>:设置当前八度(n> 范围 1~7,默认O4,中央 C 在O4)。>:升高一个八度。<:降低一个八度。
(4) 节奏(速度)
T<n>:设置每分钟拍数(BPM),如T120表示 120 BPM(默认T120)。
(5) 其他控制
| 代码 | 功能 |
|---|---|
MN |
标准音长(音符间短暂停顿) |
ML |
连奏(音符间无停顿) |
MF |
前台播放(等待播放完毕) |
MB |
后台播放(异步播放) |
3. 示例转换
示例 1:《欢乐颂》片段(简谱:3345 5432 1123 322)
|
1 |
PLAY "T120 O4 L4 E E F G G F E D C C D E D L2 D" |
O4:第 4 八度。L4:默认 4 分音符。- 最后一个
D是 2 分音符(L2)。
示例 2:《小星星》带附点(简谱:1155 665 4433 221)
|
1 |
PLAY "T100 O4 L4 C C G G A A L2 G. F F E E D D L2 C" |
4. 高级技巧
(1) 和弦(多音同时播放)
Turbo Basic 不支持真正的和弦,但可以通过 MB 后台播放模拟:
|
1 2 |
PLAY "MB O3 L4 C" ' 播放低音 C PLAY "O4 L4 E G" ' 叠加高音 E 和 G |
(2) 自定义音色(有限支持)
N<n>:直接指定频率值(n范围 0~84,0=休止)。- 例如
N60对应中央 C。
(3) 循环播放
|
1 2 3 |
DO PLAY "CDEFGAB>C" LOOP UNTIL INKEY$ <> "" |
5. 完整示例程序
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
' Turbo Basic 音乐播放示例 CLS PRINT "正在播放《欢乐颂》..." ' 设置节奏和八度 PLAY "T120 O4 ML" ' 主旋律 PLAY "L4 E E F G G F E D C C D E D L2 D" PLAY "E E F G G F E D C C D E D L2 C" ' 结束前等待 PLAY "MF" ' 确保播放完成 PRINT "播放结束!" END |
注意事项
- 硬件依赖:
PLAY语句依赖 PC 主板上的压电扬声器(蜂鸣器),现代电脑可能无此硬件。 - 音色限制:只能生成简单方波,无音色控制。
- 替代方案:现代编程语言(如 Python 的
winsound或pygame)可更灵活地播放音乐。
