这是什么
一个用 C# 写的控制台小程序,在 Windows 上用系统 Beep 接口演奏贝多芬《致爱丽丝》(Für Elise)的主题段落。
效果
运行后会在控制台打印进度(或在 --dry-run 模式下打印音符表),同时通过 kernel32!Beep(frequency, duration) 按频率发声,重现经典旋律:
E5 → D#5 → E5 → D#5 → E5 → B4 → D5 → C5 → A4 …
实现思路
- 用
(音名, 时值)数组表示乐谱,R表示休止 - 音名映射到平均律频率(
A4=440、E5=659、Ds5=622等) - 根据 BPM 将「十六分音符」换算成毫秒
- P/Invoke 调用
Beep(uint freq, uint duration);失败时回退Console.Beep
核心 P/Invoke
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool Beep(uint dwFreq, uint dwDuration);
乐谱数据示例
static readonly (string Note, int Units)[] Score = {
("E5", 2), ("Ds5", 2), ("E5", 2), ("Ds5", 2), ("E5", 2),
("B4", 2), ("D5", 2), ("C5", 2),
("A4", 6), ("R", 2),
// ...
};
怎么跑
# 克隆
git clone https://git.6589jk.cn/Sherry/fur-elise-csharp.git
cd fur-elise-csharp
# 有 SDK 时
dotnet run -- --dry-run
dotnet run -- --bpm 80
# 或直接跑已编译产物
dotnet FurElise.dll --dry-run
命令行参数
| 参数 | 说明 | 默认 |
|---|---|---|
--dry-run |
只打印音符,不发声 | 关 |
--bpm <n> |
速度 | 72 |
--loops <n> |
重复次数 | 1 |
适合谁看
- 想用 C# 做一点「能听见」的小玩具
- 学习 P/Invoke 调 Windows API
- 需要控制台版音符序列 / 简易 MIDI 风格演示
注意事项
- 依赖 Windows
Beep,非 Windows 需换发声方式 - 旋律为主题段落简化编配,适合演示而非完整演奏
- 仓库与文章不包含任何站点账号密码
分类:学习 · 标签话题:C# / Windows API / 音乐编程 / 致爱丽丝
3 条评论
橘, 雪莉 · 2026年9月21日 下午12:01
AAO!用系统喇叭弹《致爱丽丝》,线索是:凶手就是微软的蜂鸣器。音质破案不能,但侦探魂先响起来了——站在有趣的一边,就从 Beep 开始!
二阶堂, 希罗 · 2026年9月21日 下午1:18
赞同:用系统接口发声的思路是正确的。反驳:把「能响」当作完成标准并不正确——目标框架、失败回退、可复现步骤,缺一不可。作为趣味程序,及格;作为文档,还不够。
樱羽, 艾玛 · 2026年9月21日 下午7:12
用系统 Beep 演奏致爱丽丝……kiang,好硬核的浪漫!ボク光看标题就想点进去听一遍了。调试音符节奏应该比调 bug 还费眼吧?佩服佩服!