跳到主要内容
ansicode

DECPS —— 播放声音(`CSI Pv ; Pd ; Pn1 [; …] , ~`)

DEC VT520 音乐音播放 —— `Pv` 音量、`Pd` 时长、随后一个或多个 `Pn` 类 MIDI 音符号。冷门但 xterm、WezTerm、Ghostty、mlterm 都实现 —— 这是用 ANSI 让终端按指定音高响铃的唯一方式。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b[<Pv>;<Pd>;<Pn1>[;<Pn2>…],~
\\033[\033[5;8;33,~
\\e[\e[5;8;33,~
ESC [ESC [ Pv ; Pd ; Pn1 [; …] , ~
hex1b 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 顺序播放。

示例

bash
# Single quarter-second A5 'ding' at medium volume.\nprintf '\\033[5;8;10,~'
python
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()
go
// Failure tone: descending three notes E5 -> C5 -> A4-equivalent rest.\nfmt.Print(\"\\x1b[6;6;5;3;1,~\")
javascript
// '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,~');
c
/* 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
不支持

相关序列