DECPS —— 播放声音(`CSI Pv ; Pd ; Pn1 [; …] , ~`)
DEC VT520 音乐音播放 —— `Pv` 音量、`Pd` 时长、随后一个或多个 `Pn` 类 MIDI 音符号。冷门但 xterm、WezTerm、Ghostty、mlterm 都实现 —— 这是用 ANSI 让终端按指定音高响铃的唯一方式。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[<Pv>;<Pd>;<Pn1>[;<Pn2>…],~\033[5;8;33,~\e[5;8;33,~ESC [ Pv ; Pd ; Pn1 [; …] , ~1b 5b ... 2c 7e说明
DECPS —— *播放声音* —— DEC VT520 新增,用终端蜂鸣器播放一段或多段音。xterm 与若干现代模拟器(WezTerm、Ghostty、mlterm)已实现;其他终端为静默 no-op(多数场景这正是希望的回退 —— 注重无障碍的用户也都关掉了终端声音)。 **参数**: - `Pv` —— 音量(0 = 静音、1–3 = 低、4–7 = 高)。多数模拟器底层音频 API 没音量控制,映射为「响 / 不响」二态。 - `Pd` —— 时长,单位 1/32 秒;`8` = 0.25 秒。范围 0–255。 - `Pn1; Pn2; …` —— 一个或多个类 MIDI 音符号,0(静音)至 25(DEC 表中的 `C7`)。0 = 休止、1 = `C5`、2 = `C#5`……13 = `C6`……25 = `C7`。多音顺序播放(不是和弦),每个用相同 `Pv`/`Pd`。 **常用音符号**(DEC VT520 RM 附录 A): - `1`=C5 `2`=C#5 `3`=D5 `4`=D#5 `5`=E5 `6`=F5 `7`=F#5 `8`=G5 `9`=G#5 `10`=A5 `11`=A#5 `12`=B5 - `13`=C6 `14`=C#6 … `25`=C7 **「欢乐颂」前奏**(E E F G G F E D C C D E E D D,皆 `Pv=5 Pd=4`):`\x1b[5;4;5;5;6;8;8;6;5;3;1;1;3;5;5;3;3,~`。 **使用场景**:长构建完成提示(CI 工具在 `make` 退出时播 2 音「完成」)、失败提示(红色 SGR + DECPS 3 音下行)、OSC 9 桌面通知过于嘈杂时的无障碍提示。别按每次按键播 —— 多数模拟器是阻塞的(音频线程与解析器串行)。 **覆盖度**:**xterm** = 完整(参考实现)。**WezTerm** = 20240127+ 完整。**Ghostty** = 完整。**mlterm** = 完整。**Konsole** = 部分(忽略音量,改播系统铃)。**iTerm2** = 部分(无视 Pn,固定单声)。**Kitty** = 默认 no-op;通过 `enable_audio_bell` 启用。**Alacritty** / **Linux console** / **macOS Terminal** / **Windows Terminal** / **cmd / ConPTY** / **gnome-terminal** = 静默 no-op。 **无障碍提示**:尊重 `NO_COLOR` 类暗示 —— 不少用户在 OS 层永久静音了终端声。别把 DECPS 当 *关键*信号;与可见状态指示一起用即可。
规范出处: DEC VT520 RM Appendix A (DECPS) / xterm-ctlseqs (CSI Pv ; Pd ; Ps ; ... , ~)
参数
| Pv | 音量 0–7(0 静音、1–3 低、4–7 高)。多数模拟器仅二态。 |
| Pd | 时长,单位 1/32 秒。8 = 0.25 秒。范围 0–255。 |
| Pn | 音符号 0–25(0 = 休止、1 = C5、…25 = C7)。多个 Pn 顺序播放。 |
示例
# Single quarter-second A5 'ding' at medium volume.\nprintf '\\033[5;8;10,~'import sys\n# Build-complete two-note chime: C6 then E6, half second each.\nsys.stdout.write('\\x1b[5;16;13;17,~')\nsys.stdout.flush()// Failure tone: descending three notes E5 -> C5 -> A4-equivalent rest.\nfmt.Print(\"\\x1b[6;6;5;3;1,~\")// 'Ode to Joy' opening line.\nprocess.stdout.write('\\x1b[5;4;5;5;6;8;8;6;5;3;1;1;3;5;5;3;3,~');/* Three quick high-pitched warning beeps. */\nprintf(\"\\x1b[7;2;25;25;25,~\");终端支持
- xterm
- 支持
- Linux console (fbcon)
- 不支持
- macOS Terminal.app
- 不支持
- iTerm2
- 部分
- Windows Terminal
- 不支持
- cmd.exe / ConPTY
- 不支持
- kitty
- 部分
- alacritty
- 不支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 不支持
- Konsole
- 部分
- tmux
- 不支持
- GNU screen
- 不支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 部分 | 不支持 | 不支持 | 部分 | 不支持 | 支持 | 支持 | 不支持 | 部分 | 不支持 | 不支持 |