🔔 编钟模拟器

Bianzhong Simulator - Game Design Document

v1.5.1 | 2026.03.12

📋项目概述

"编钟模拟器是一款基于 Web Audio API 开发的交互式音乐体验应用,旨在还原中国古代曾侯乙编钟的独特音色与演奏方式,让用户能够在浏览器中体验这一世界级文化遗产的魅力。"

核心定位

编钟模拟器不是传统意义上的"游戏",而是一个文化体验型音乐应用。核心价值在于:

  • 文化传承 - 让现代人以互动方式接触和理解编钟这一古老乐器
  • 音乐创作 - 提供录制和分享功能,鼓励用户创作原创音乐
  • 教育科普 - 展示一钟双音的物理原理和音乐理论知识

灵感来源

设计参考对象:曾侯乙编钟(战国早期,1978年湖北随县出土)

参考维度 实现方式
音阶结构 采用五声音阶 (C-D-E-G-A) 对应宫商角徵羽
三排布局 上层小编钟(高音)、中层中编钟(中音)、下层大编钟(低音)
一钟双音 每口钟可发出正鼓音和侧鼓音两个不同音高
铜器音色 使用 Web Audio API 合成带有金属谐波的钟声
🎯 设计目标
  1. 在移动端浏览器实现接近原生 App 的触控体验
  2. 准确还原编钟"一钟双音"的声学特性
  3. 提供完整的录制-回放-分享创作闭环
  4. 保持界面简洁优雅,突出编钟本身的美学

⚙️核心机制

一钟双音系统

这是编钟模拟器最核心的设计特色,也是曾侯乙编钟最神奇的声学特性。

🔵 正敲 (正鼓音)

敲击钟的正鼓部

C4
261.63 Hz

音高较低,音色浑厚

+3°

🔴 侧敲 (侧鼓音)

敲击钟的侧鼓部

E4
329.63 Hz

音高较高,音色清亮

每口编钟的两个音高相差大三度(约4个半音),这一特性使得仅15口钟就能覆盖30个不同音高,极大地扩展了音域。

音区架构

编钟按大小分为三排,对应高中低三个音区:

排层 钟大小 音区范围 数量 视觉设计
上层 小编钟 C5 - A5 5口 尺寸最小,位置最高
中层 中编钟 C4 - A4 5口 中等尺寸,中间位置
下层 大编钟 C3 - A3 5口 尺寸最大,位置最低

总计:15口编钟 × 2音/钟 = 30个可用音高

音色合成原理

使用 Web Audio API 的振荡器节点合成编钟音色,包含三个层次:

🔊 音频架构
  1. 基频层 - 正弦波,基频 f,音量 0.6,3秒衰减
  2. 二次谐波 - 正弦波,频率 2f,音量 0.3,2.4秒衰减
  3. 三次谐波 - 三角波,频率 3f,音量 0.15,1.5秒衰减(提供金属感)

包络设计:Attack 20ms(快速起音)→ Decay 3s(长衰减)
这一设计模拟了铜钟被敲击后持续振动的物理特性

🎵音频系统

音频配置表

层级 音名 正敲频率 侧敲频率 波形类型
上层 (高音) C5 523.25 Hz 659.25 Hz Sine + Triangle
D5 587.33 Hz 698.46 Hz Sine + Triangle
E5 659.25 Hz 783.99 Hz Sine + Triangle
G5 783.99 Hz 987.77 Hz Sine + Triangle
A5 880.00 Hz 1046.50 Hz Sine + Triangle
中层 (中音) C4 261.63 Hz 329.63 Hz Sine + Triangle
D4 293.66 Hz 349.23 Hz Sine + Triangle
E4 329.63 Hz 392.00 Hz Sine + Triangle
G4 392.00 Hz 493.88 Hz Sine + Triangle
A4 440.00 Hz 523.25 Hz Sine + Triangle
下层 (低音) C3 130.81 Hz 164.81 Hz Sine + Triangle
D3 146.83 Hz 174.61 Hz Sine + Triangle
E3 164.81 Hz 196.00 Hz Sine + Triangle
G3 196.00 Hz 246.94 Hz Sine + Triangle
A3 220.00 Hz 261.63 Hz Sine + Triangle

音频路由图

音频信号流
振荡器层
基频+谐波
→
增益节点
ADSR包络
→
主增益
Volume: 0.8
→
音频输出
destination

🎹专业模式与经典曲目

专业模式(琶音器)

专业模式提供自动琶音功能,用户可以选择和弦级数,系统自动按节奏分解演奏。

🎵 琶音结构:1513

采用 1513 结构,共4个8分音符,占2拍,最后延音踏板空2拍,总时长4拍:

  1. 第1个音:根音(1)- 8分音符
  2. 第2个音:五度音(5)- 8分音符
  3. 第3个音:高八度根音(1)- 8分音符
  4. 第4个音:固定为 C3(130.81Hz)- 延音两拍

BPM:50,每拍1200ms,8分音符600ms

级数 和弦 类型 根音频率
1 C 大三 65.41 Hz (C2)
2 Dm 小三 73.42 Hz (D2)
3 Em 小三 82.41 Hz (E2)
4 F 大三 87.31 Hz (F2)
5 G 大三 98.00 Hz (G2)
6 Am 小三 110.00 Hz (A2)
b7 Bb 大三 116.54 Hz (Bb2)

调式:C大调,所有和弦根音从 C2 开始

经典曲目

内置曾侯乙编钟复原曲目,基于考古研究的音乐复原:

曲目 风格 时长 说明
楚商 庄重典雅 ~17秒 战国楚国商调式,庄重的宫廷音乐
钟鼓乐 钟鼓齐鸣 ~12秒 仪式音乐,展现编钟与鼓的配合
🎼 曲目特点
  • 基于考古复原的战国古乐
  • 使用五声音阶(宫商角徵羽)
  • 演奏时对应编钟有强化动画反馈
  • 可中途退出播放

播放状态栏

在播放回放或经典曲目时,顶部显示播放状态栏:

  • 显示当前播放的曲目名称
  • 【退出】按钮可立即停止播放
  • 播放图标带动画效果

🎨UI/UE 设计

设计原则

  • 沉浸优先 - 深色背景减少视觉干扰,突出金色编钟
  • 横屏体验 - 强制横屏模式,模拟真实编钟的宽展布局
  • 直观操作 - 无需教程,点击/触控即可发声
  • 即时反馈 - 每次敲击都有视觉和听觉双重反馈

界面布局

📸 截图更新需求

当前界面已更新以下功能,需要重新截图:

  • ✅ 版本号显示(v1.5.1)
  • ✅ 【经典曲目】按钮
  • ✅ 播放状态栏(播放时显示)
  • ✅ 【专业模式】按钮(替代原试听按钮)
  • ✅ 专业模式面板(和弦级数选择)

截图要求:

  • 横屏模式,1920×1080 或类似比例
  • 清晰展示顶部工具栏所有按钮
  • 展示专业模式面板展开状态
  • 展示播放状态栏(可播放经典曲目后截图)
实际界面截图
编钟模拟器界面截图

界面尺寸规范

元素 尺寸 说明
工具栏 高度 50px 固定顶部,背景 rgba(0,0,0,0.3)
工具栏按钮 padding 8px 15px 圆角 20px,字号 0.85rem
播放状态栏 高度 40px,顶部 50px 渐变背景(青色),z-index 1000
状态栏 高度 30px 背景 rgba(0,0,0,0.2)
编钟-上层 45×55px 小编钟,5口一排
编钟-中层 60×70px 中编钟,5口一排
编钟-下层 80×90px 大编钟,5口一排
控制面板 高度 60px 固定底部,背景 rgba(0,0,0,0.3)
专业模式面板 高度自适应,max 200px 底部 70px,默认隐藏,active 时显示

点击交互规范

元素 点击区域 左半区 右半区 视觉反馈
编钟-上层 45×55px 侧敲(高音) 正敲(低音) 摇摆+发光+涟漪
编钟-中层 60×70px 侧敲(高音) 正敲(低音) 摇摆+发光+涟漪
编钟-下层 80×90px 侧敲(高音) 正敲(低音) 摇摆+发光+涟漪
工具栏按钮 完整按钮 - - 背景高亮+文字变化
和弦按钮 50×50px - - 边框发光+缩放

动画效果详细定义

🎬 钟体摇摆动画(bell-swing-strong)
@keyframes swingStrong {
    0%  { transform: rotate(0deg) scale(1); }
    20% { transform: rotate(-8deg) scale(1.02); }
    40% { transform: rotate(6deg) scale(1.02); }
    60% { transform: rotate(-4deg) scale(1.01); }
    80% { transform: rotate(2deg) scale(1); }
    100%{ transform: rotate(0deg) scale(1); }
}
持续时间:0.6s
缓动函数:cubic-bezier(0.36, 0, 0.66, -0.56)
✨ 发光动画(bell-glow)
@keyframes bellGlow {
    0%   { filter: brightness(1) drop-shadow(0 0 0 rgba(255,215,0,0)); }
    30%  { filter: brightness(1.5) drop-shadow(0 0 20px rgba(255,215,0,0.8)); }
    60%  { filter: brightness(1.3) drop-shadow(0 0 15px rgba(255,215,0,0.5)); }
    100% { filter: brightness(1) drop-shadow(0 0 0 rgba(255,215,0,0)); }
}
持续时间:0.6s
缓动函数:ease-out
〰️ 涟漪动画(bell-playing)
伪元素 ::after 实现
边框:2px solid rgba(255, 215, 0, 0.8)
动画:从 100%×100% 扩散到 200%×200%
透明度:1 → 0
持续时间:0.6s
🔨 击槌动画(mallet-hit)
@keyframes hit {
    0%   { opacity: 1; transform: translateX(-50%) translateY(0); }
    100% { opacity: 0; transform: translateX(-50%) translateY(-10px); }
}
持续时间:0.2s
位置:钟体上方 -20px

📍 UI 布局解说:

  1. 顶部工具栏 — 左侧应用名称与版本号,右侧功能按钮(设计案、我的演奏、经典曲目、录制),采用悬浮透明背景避免遮挡主体
  2. 播放状态栏 — 播放回放或经典曲目时显示,展示"正在播放:XXX"和【退出】按钮
  3. 状态栏 — 实时显示系统状态和录制计时,录制时红色指示灯闪烁提供视觉反馈
  4. 编钟主体区 — 居中展示三排编钟,采用 Flexbox 垂直布局,钟架使用木质渐变增加层次感
  5. 底部控制栏 — 固定操作按钮(专业模式/清空/回放),采用圆角胶囊按钮符合移动端触控习惯
  6. 专业模式面板 — 点击专业模式按钮后从底部弹出,显示7个和弦级数按钮

🎨 UE 设计亮点:

  • 沉浸优先 — 深色渐变背景将视觉焦点完全引导至金色编钟,无多余装饰元素
  • 直觉交互 — 编钟点击区域覆盖整个钟体,左右半区分别对应侧敲/正敲,无需文字说明
  • 强化反馈 — 每次点击触发摇摆动画 + 金色发光 + 涟漪波纹 + Toast提示 + 音效,五重感官确认
  • 横屏强制 — 竖屏时显示旋转提示,确保编钟的宽展布局得到最佳展示
界面结构示意图(从上到下)
┌─────────────────────────────────────┐
│  🔧 工具栏                          │  ← 标题 + 功能按钮
│  [🔔 编钟模拟器] [📋 设计案]        │
│  [🎵 我的演奏] [🎼 经典曲目]       │
│  [🔴 录制]                          │
├─────────────────────────────────────┤
│  📊 播放状态栏(播放时显示)         │  ← "正在播放:XXX" + [退出]
├─────────────────────────────────────┤
│  📊 状态栏                          │  ← 状态提示 + 录制计时
│  ● 准备就绪          ⏱️ 00:00       │
├─────────────────────────────────────┤
│                                     │
│         🏛️ 编钟区域                  │  ← 核心交互区
│      ┌───────────────┐              │
│      │ ○ ○ ○ ○ ○   │  上层(高音)   │
│      │ ○  ○  ○  ○  ○ │  中层(中音)   │
│      │ ○   ○   ○   ○   ○ │  下层(低音)   │
│      └───────────────┘              │
│                                     │
├─────────────────────────────────────┤
│  🎮 控制面板                        │  ← 快捷操作
│  [🎹 专业模式] [🗑️ 清空] [▶️ 回放] │
├─────────────────────────────────────┤
│  🎹 专业模式面板(展开时显示)       │  ← 和弦选择按钮
└─────────────────────────────────────┘

色彩系统

元素 颜色 用途
背景 #1a1a2e → #16213e → #0f3460 深蓝色渐变,营造庄重氛围
编钟 #FFD700 → #DAA520 → #B8860B 金色渐变,青铜质感
钟架 #8B4513 → #654321 木质纹理
强调色 #f5af19 标题、按钮、高亮
录制中 #ff0000 闪烁动画表示录制状态

视觉反馈系统

操作 视觉反馈 动画效果
点击编钟 钟体摆动 + 发光 + 涟漪 0.6s 强化摇摆 (±8°) + 金色发光 + 波纹扩散
正敲/侧敲 击槌图标显示 锤击动画 + 位置提示
开始录制 录制按钮变红 + 脉冲动画 1s 闪烁周期
播放曲目 对应编钟依次亮起 与音符同步的强化动画
Toast 提示 底部弹出提示 滑入滑出,2s 显示

👆核心交互逻辑

敲击检测机制

编钟采用点击位置判断来确定正敲或侧敲:

点击区域划分
┌─────────────────────────┐
│       编钟钟体           │
│   ◄─────┼─────►         │
│   侧敲  │  正敲          │
│ (左侧)  │ (右侧)         │
│   E4    │   C4           │
│  高音   │  低音          │
└─────────────────────────┘

判定逻辑:
if (点击位置.x < 钟体宽度 / 2) → 侧敲 (侧鼓音)
else → 正敲 (正鼓音)

悬停提示:鼠标/手指悬停时显示"正"和"侧"字样,帮助用户理解交互方式。

手势支持

手势 对应操作 触发方式
点击 / 触摸 敲击编钟 click / touchstart
横滑 快速连续敲击 多点触控支持

注意:为防止误触,-webkit-tap-highlight-color 设置为透明,消除移动端点击高亮。

屏幕方向处理

📱 横屏强制

编钟的布局天生适合横屏展示。当检测到竖屏时:

  1. 显示旋转提示:"请横屏使用编钟模拟器"
  2. 隐藏主应用界面
  3. 提供视觉引导动画(手机旋转图标)

实现:@media screen and (orientation: portrait) CSS 媒体查询

⏺️录制与回放系统

数据结构设计

Recording 对象结构
{
    id: 1709999999999,           // 时间戳作为唯一ID
    name: "演奏 1",              // 用户可编辑名称
    date: "2026/3/11 10:30:00",  // 录制日期时间
    duration: "45.2",            // 演奏时长(秒)
    notes: [                     // 音符数组
        {
            note: "C4",          // 音名
            freq: 261.63,        // 频率
            isSide: false,       // 是否侧敲
            time: 0              // 相对开始的时间戳(ms)
        },
        {
            note: "E4",
            freq: 329.63,
            isSide: true,
            time: 850
        },
        // ...
    ]
}

录制流程

点击录制
→
初始化音频
→
开始计时
→
记录每次敲击
时间+音高+方式
→
停止录制
→
保存到 LocalStorage

回放机制

回放使用 setTimeout 按照录制时的时间戳精确触发每个音符:

recording.notes.forEach((noteData) => {
    setTimeout(() => {
        playBellSound(noteData.freq);
    }, noteData.time);
});

特点:

  • 非音频文件录制,数据体积极小
  • 可精确还原演奏时机
  • 支持任意速度回放(可扩展变速功能)

分享功能

分享方式 实现方式 数据格式
链接分享 Base64 编码 + URL 参数 ?share=eyJuYW1lIjo...
图片卡片 Canvas 绘制 + 下载 PNG 图片
数据导出 Blob + 文件下载 JSON 文件

存储方案

💾 LocalStorage 持久化
  • 键名: bianzhong_recordings
  • 格式: JSON 字符串
  • 容量: 浏览器限制约 5-10MB
  • 数据量估算: 一首30秒的演奏约 500 个音符 ≈ 10KB
  • 理论容量: 约 500-1000 首演奏

💻技术实现

技术栈

类别 技术 版本/说明
核心 API Web Audio API 原生浏览器支持
存储 localStorage 录制数据持久化
绘图 Canvas API 分享卡片生成
样式 CSS3 Flexbox + 渐变 + 动画
框架 无 纯原生实现

浏览器兼容性

浏览器 支持情况 备注
Chrome / Edge 完全支持 推荐
Firefox 完全支持 -
Safari 完全支持 iOS 需用户交互激活音频
微信内置浏览器 部分支持 可能有自动播放限制

音频自动播放策略

现代浏览器对自动播放有严格限制,采用以下策略处理:

function initAudio() {
    if (!audioContext) {
        audioContext = new (window.AudioContext || window.webkitAudioContext)();
        masterGain = audioContext.createGain();
        masterGain.gain.value = 0.8;
        masterGain.connect(audioContext.destination);
    }
    // 处理暂停状态(iOS Safari 需要)
    if (audioContext.state === 'suspended') {
        audioContext.resume();
    }
}

// 在用户首次点击/触摸时初始化
bell.addEventListener('click', () => {
    initAudio();  // 确保音频上下文已激活
    playBellSound(freq);
});

🗺️开发路线图

已实现功能 已完成

  • 核心 一钟双音系统(正敲/侧敲)
  • 核心 三排15口编钟音阶布局
  • 核心 Web Audio API 音色合成
  • UI 响应式横屏布局
  • UI 强化动画效果(摇摆+发光+涟漪)
  • UI 播放状态栏与退出功能
  • 技术 录制与回放系统
  • 技术 LocalStorage 持久化存储
  • 技术 分享链接生成
  • 技术 分享卡片生成(Canvas)
  • 技术 数据导出为 JSON
  • 专业 琶音器模式(1513结构)
  • 专业 经典曲目(曾侯乙复原)

未来可扩展功能

功能 优先级 说明
更多编钟数量 P1 增加至 21 口或 25 口,扩展音域
节拍器 P1 辅助演奏者保持节奏
录音重命名 P2 支持自定义演奏名称
变速回放 P2 0.5x - 2x 速度调节
音轨叠加 P2 多轨录制,类似 Overdub
教程模式 P3 引导新手学习演奏简单曲目
云端存储 P3 用户账号系统,跨设备同步

📎附录

参考资源

  • 曾侯乙编钟 - 湖北省博物馆
  • Web Audio API 规范 - W3C
  • 《中国古代音乐史稿》杨荫浏

相关链接