和弦实验室:一个Web乐理引擎的功能导览

6/30/2026 前端乐理ReactTone.jsMIDI

# 和弦实验室:一个Web乐理引擎的功能导览

一个在浏览器中运行的和声探索工具,支持 15 种调式、34 种节奏型、5 种乐器模拟、完整的配置导入导出和 MIDI 支持。零外部 API 依赖,所有计算在浏览器本地完成。

和弦实验室主界面

# 快速上手

  1. 选择调式——伊奥尼亚、多利亚、弗里吉亚……到布鲁斯、琉球、都节等 15 种
  2. 选择和弦类型——三和弦 / 七和弦 / 挂留 / 延伸
  3. 点击「🎲 生成进行」

生成和弦进行后的界面

每次生成的主进行下方会自动推荐 4 条替代方案

核心参数

  • 随机度(0-100%)—— 每次生成的差异程度
  • 跳出度(0-100%)—— 调外和弦的出现频率
  • 和弦数量(3-9)—— 进行的长度

# 调式与和声

# 15 种调式

  • 教会调式:伊奥尼亚、多利亚、弗里吉亚、利底亚、混合利底亚、爱奥利亚、洛克里亚
  • 民族 / 特殊:大调五声音阶、小调五声音阶、全音阶、都节(日本)、琉球、布鲁斯
  • 扩展:和声小调、旋律小调、弗里吉亚属调、利底亚属调、拿波里小调

调式过滤:对五声 / 民族等非七声调式,自动过滤和弦中的调外音。C△7 在 C 大调五声音阶下自动变为 C(去掉 7 音),保留纯正民族色彩。

# 和弦派生 & 导入导出

  • 和弦派生:生成后可编辑任意和弦的根音、类型、转位,预览后替换原进行
  • 配置导入导出:所有可序列化状态打包为 JSON,换设备后导入即恢复,确定性模式下音频逐帧一致
  • MIDI 导入导出:生成标准 .mid 文件,也可导入外部 MIDI 分析和声

转位信息经过 7 个数据流节点(ProgressionStep → updateDerivedChord → 播放 → 导出 MIDI → 配置导入导出),确保全链路一致。


# 节奏系统

节奏与乐器控制面板

# 34 种节奏型

覆盖 4/4、3/4、6/8、2/4、5/8 五种拍号:

  • 基础:柱式、扫弦、分解和弦、切分、阿尔贝蒂低音、波尔卡、探戈、摇摆、雷鬼、摇滚等 12 种
  • 复合拍子:维也纳华尔兹、马祖卡、船歌、塔兰泰拉、进行曲、加洛普、五拍节奏、西西里舞曲、吉格舞曲等 12 种
  • 混合:上下行琶音、扫弦·柱式、分解·柱式、华尔兹·柱式、切分·柱式等 10 种

# 4 种演化模式

  • 固定:全程一种节奏
  • 密度渐变:从稀疏到密集均匀过渡
  • 拍号游走:每步切换到不同拍号的节奏
  • 目标收束:所有节奏朝目标收敛
  • 交替融合:前后各选一个代表性节奏,中间融合过渡

# 8 种句式

34 种节奏被归类到四种原型(开 / 流 / 峰 / 合),原型序列构成句式:

问答、起承转合、波浪、收束、AABA、踏步、发散、圆舞

句式是抽象的——系统自动从同拍号节奏池中匹配最适合的节奏。同一套句式在不同拍号下听起来完全不同。


# 表现力控制

表现力控制面板

# 5 种乐器(ADSR 包络模拟)

  • 钢琴:三角波 + 快速衰减
  • 吉他:超快拨弦衰减,低八度
  • 小提琴:锯齿波 + 长 sustain
  • 贝斯:正弦波 + 厚重低音,低八度
  • 铜管:锯齿波 + 明亮音头

# 双轴弧线

力度弧线和旋律弧线各 10 种,可同时应用:

拱形、上行、下行、山谷、回归、波纹、S 曲线、脉动、阶梯上行 / 下行

例如一个进行中力度从弱到强(上行弧线),同时音区从高到低(下行弧线),形成双轴叙事。


# 技术实现

技术栈与架构
  • 前端:React 18 + TypeScript + Vite
  • 音频:Tone.js(Web Audio)
  • 渲染:PixiJS v8(钢琴键盘)
  • 零后端:所有算法在浏览器本地运行,无外部 API

架构哲学:用正交维度相乘代替固定预设。乐器 × 速度 × 力度弧线 × 旋律弧线 × 节奏演化 × 句式 = 近乎无限可能,而非 N 个"风格预设"。

音频引擎的 4 个常见陷阱
  1. 构造函数必须传参PolySynth 构造时内部 voice 已初始化,事后 set() 不一定穿透。表现为声音突然消失。
  2. stop() 不 cancel 未来事件releaseAll() 只停当前音符。最终方案:dispose() 彻底销毁合成器清空调度队列,再用当前配置重建。
  3. AudioContext 幽灵状态:浏览器切到后台再回来,AudioContext 挂起但初始化标记仍为 true。每次 initAudio() 检查 context.state
  4. 竞态条件:快速停止→播放导致新旧循环叠加。使用 generation 计数器解决——每次播放递增器值,循环每步检查。
迭代历程(从 v1 到 v4)
  • v1(Python + Mido):命令行生成 .mid 文件的概念验证
  • v2(Tone.js + CSS 钢琴):在浏览器中播放,但架构脆弱、状态混乱
  • v3(当前):从零重写,7 个核心文件增长到 40+ 源文件

关键转折:

  • 调外和弦 → 跳出度滑杆
  • 每次结果不同 → 随机度 + 推荐面板
  • 混合节奏 → 拍号系统 → 演化算法 → 句式系统
  • 乐器 ADSR → 双轴弧线
  • 转位 Bug 修复 → 7 节点数据流打通
  • GLM-5.2 深度审查 → 6 个关键风险修复

# 在线体验

https://kelmory.xyz/chord-lab/dev/ (opens new window)

无需注册,打开即用。