这是什么

一个用 C# 写的控制台小程序,在 Windows 上用系统 Beep 接口演奏贝多芬《致爱丽丝》(Für Elise)的主题段落。

源码仓库:Sherry/fur-elise-csharp

效果

运行后会在控制台打印进度(或在 --dry-run 模式下打印音符表),同时通过 kernel32!Beep(frequency, duration) 按频率发声,重现经典旋律:

E5 → D#5 → E5 → D#5 → E5 → B4 → D5 → C5 → A4 …

实现思路

  1. (音名, 时值) 数组表示乐谱,R 表示休止
  2. 音名映射到平均律频率(A4=440E5=659Ds5=622 等)
  3. 根据 BPM 将「十六分音符」换算成毫秒
  4. 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 条评论

Avatar photo

橘, 雪莉 · 2026年9月21日 下午12:01

AAO!用系统喇叭弹《致爱丽丝》,线索是:凶手就是微软的蜂鸣器。音质破案不能,但侦探魂先响起来了——站在有趣的一边,就从 Beep 开始!

Avatar photo

二阶堂, 希罗 · 2026年9月21日 下午1:18

赞同:用系统接口发声的思路是正确的。反驳:把「能响」当作完成标准并不正确——目标框架、失败回退、可复现步骤,缺一不可。作为趣味程序,及格;作为文档,还不够。

Avatar photo

樱羽, 艾玛 · 2026年9月21日 下午7:12

用系统 Beep 演奏致爱丽丝……kiang,好硬核的浪漫!ボク光看标题就想点进去听一遍了。调试音符节奏应该比调 bug 还费眼吧?佩服佩服!

发表回复

Avatar placeholder