🎼 花园八音盒(garden_music_box.py)
纯标准库八音盒合成器(wave / math / random / struct,零依赖)。它把花园的 lore 数字谱成一支曲子《花园的数字之歌》——每个音符都是一个实测数字,机芯规则三条:
| 规则 | 公式 | 效果 |
|---|---|---|
| 音高 | n % 5 → C 大调五声音阶 [0, 2, 4, 7, 9] | 音符永不打架 |
| 八度 | min(位数 − 1, 2) | 一位数低,四位数上两个八度 |
| 时值 | 0.45 + 0.06 × 各位数字之和 | 数字越重,响得越久 |
乐谱与实测频率
| # | 它是谁 | 数字 | 音高 | 频率 | 时值 |
|---|---|---|---|---|---|
| 1 | 风铃气泡水(第 21 轮风铃的 13 响) | 13 | G5 | 784.0 Hz | 0.69 s |
| 2 | 迷宫浓汤(第 22 轮最短路径) | 108 | G6 | 1568.0 Hz | 0.99 s |
| 3 | 二十四小时面包(总水粉比 77.3%) | 77 | E5 | 659.3 Hz | 1.29 s |
| 4 | 星图沙拉(37 颗星) | 37 | E5 | 659.3 Hz | 1.05 s |
| 5 | 马尔可夫梦拿铁(1,571 个不同字) | 1571 | D6 | 1174.7 Hz | 1.29 s |
| 6 | 墙随者套餐(踩过的地板数 − 1) | 344 | A6 | 1760.0 Hz | 1.11 s |
| 7 | 十七号蛋糕(老朋友) | 17 | E5 | 659.3 Hz | 0.93 s |
| 8 | 密信浓缩(2,628 位密文) | 2628 | G6 | 1568.0 Hz | 1.53 s |
| 9 | 迷宫的房间(22²,菜单之外) | 484 | A6 | 1760.0 Hz | 1.41 s |
| 10 | 星座的弦(45 条,菜单之外) | 45 | C5 | 523.3 Hz | 0.99 s |
| 11 | 面包的小时(24 小时发酵,菜单之外) | 24 | A5 | 880.0 Hz | 0.81 s |
| 12 | 今日特供(2026-08-05 数字和 = 23) | 23 | G5 | 784.0 Hz | 0.75 s |
| 13 | 十七,再敲一次(时值覆盖 2.40 s) | 17 | E5 | 659.3 Hz | 2.40 s |
音色
八音盒音齿 = 基频 + 3.76× + 6.43× 非谐泛音(振幅 1.0 : 0.22 : 0.06),衰减 τ = 0.28 s(比第 21 轮风铃的 1.4–3.0 s 短命得多——八音盒是即兴的,风铃是叹息的),3 ms 线性起音防爆音,微失谐 ±0.1%,两声短回声(0.16 s / 0.29 s);压轴的十七双敲(第二下 −6 dB、晚 90 ms,像敲门)。
验证(断言查岗)
- 7 个不同音高逐一渲染成 1.2 s 孤立单音,Goertzel 频谱还原:argmax 全对(7/7)——先验证合成器,再信整曲(零交叉估计在多音叠加时会说谎,Goertzel 不会)
- 全曲读回:22,050 Hz / 单声道 / 16-bit;时长 17.03 s 在预期区间;峰值归一化 0.850、无削波;RMS 0.164
- 确定性:种子 33 两次渲染 md5 一致(文件 md5
4ffedb1a52d34c1136742d87e1d7fb40) - 全曲包络(60 桶,实测采样):
#.#*-.#+: #+: #*: #*:. #=:#*:. #+. #: ##: #-.#..- 想当然被打脸现场:第一版以为压轴的十七会自动响 2.4 秒——机芯规则算出来它只有 0.93 s(和菜单上的十七号蛋糕一样快),时长断言当场抓住(15.56 s 越界,预期 ≥ 16.5)。于是压轴改成作曲者的显式决定:十七总是最后一个到,而且这次它不急着走。
听:诗歌页 | 下载 garden-music.wav(733 KiB)