--- name: mc-case-studies description: The corpus layer (语料层) - how real recordings are made to testify for or against the textbook rules. Covers the reverse ARR-SPEC as the unit of the corpus, the corroboration table that turns rules times corpus into hit rates and tiers them as strong rule / tendency / not a rule, the two honesty constraints that keep the table from being circular, why naturally sampled corpora beat curated ones, what this corpus can and cannot measure, and how to look up a worked example. Use when checking whether a rule actually holds in real music, when adding a rule, when a rule and the data disagree, when annotating a track, or when you need a real-world example of a technique. 语料、佐证、命中率、实测 ARR-SPEC、反向规格、案例拆解、规则验证。 --- # 语料层(Case Studies & Corroboration) **这一层回答一个问题:** > **教材说的,真实作品到底做不做?** 本库的规则不是抄来的,是**抄来之后拿 62 首真实多轨验过的**。 验过的结果分三档,**只有强规则才进 20 条自查表**。 ## 按任务读哪几节 | 任务 | 读 | |---|---| | 想知道某条规则靠不靠谱 | §4 佐证表 + 仓库规则表 | | 要加一条新规则 | §4.3 流程 | | 规则和数据打架了 | ★ §5 | | 要找一个真实例子 | §6 | | 要标注一首曲子 | §3.3 | | 想知道这套语料能测什么 | §2.2 | ## 边界 | 不归这里 | 归哪 | |---|---| | 规则本身的内容 | L1/L2 各 skill | | 生成结果的验收 | `mc-ai-tell-audit` | | 规格写完的检查 | `mc-workflow` §3.0 | | 某个风格的语汇 | `mc-style-*`(L3) | | 具体曲目的逐段拆解 | [reference.md](reference.md) | --- ## 1. 语料的三条原则 ### 1.1 ★ 只存结构与参数,不存作品 > **语料条目里没有音频、没有谱面、没有歌词——只有测出来的数值。** 这既是版权上的必需,也是方法上的正确: **我们要的是"真实作品的参数分布",不是作品本身。** ### 1.2 ★ 自然抽样胜过策展 **语料不精选,用自然抽样。** > **策展会把语料偏向"规则成立"的那一侧**—— > 你挑的是你认为的好例子,而你认为的好例子就是符合你已有理论的例子。 > > **自然抽样自动供给反例。** 所以最终用的是 **Cambridge-MT 的 60+ 首自然样本**,不筛选。 这也顺带取消了另找 MIDI/分轨语料的必要(它原本的唯一用途是给分轨工具做标定, 而真分轨直接消除了这个需求)。 ### 1.3 语料的单元是"反向 ARR-SPEC" **不是音频文件,是从音频反推测出来的一份 ARR-SPEC。** 选这个单元是因为它和我们的产出**用同一套字段**:结构、编制进退场、能量曲线都记在同样的位置, 所以佐证表能直接拿语料条目和规则判据对齐,不用先做一层格式转换。 字段长什么样、哪些标记是诚实留白而非漏填,见 §2.1。 --- ## 2. 反向 ARR-SPEC ### 2.1 长什么样 仓库实测语料,**63 条**。每条头部就写明了性质: ```yaml # 实测 ARR-SPEC(语料条目)—— 由 仓库的反推工具 自动生成 # ★ 只存结构与参数,不存谱面与歌词。intent / hooks 等 TODO 项需人工填。 ``` ★ **注意那些 `# TODO` 和 `# 估算,非实测` 的注释**—— 它们是**诚实标注**,不是没做完。 `intent.one_thing` 这类东西**机器测不出来**,硬填就是造假。 ### 2.2 ★ 这套语料能测什么、不能测什么 **Cambridge-MT 是未混的原始多轨,不是母带成品。** 所以: | 能测 | 不能测 | |---|---| | 段落边界、小节数 | **DR / 响度**(未混) | | 拍速 | **立体声宽度**(未混) | | 能量曲线、减法事件 | **频谱质心的绝对值**(未混 + 无母带) | | 编制进退场(有真分轨!) | 制作质感 | | onset 相对网格偏移 | | | 和弦(chroma 匹配) | | ★ **测不了的规则要标出来,不许硬跑。** `rules.yaml` 里这类规则标 `evidence: unusable_here`, 仓库的佐证工具 **跳过而不是给一个假数字**。 **本库的语料是多轨分轨,不含成品混音,所以这类规则目前没有数字。** --- ## 3. 真值与标注 ### 3.1 为什么需要人工真值 算法测出来的段落边界**本身可信度存疑**(`rules.yaml` 里标 `no_truth`)。 没有一份独立的真值,就没法判断一个异常的命中率到底是规则不成立,还是算法本身测错了—— §5.2 那次"硬编码阈值把命中率压到 16%"就是靠人工真值才翻案的实例。 所以做了一批人工标注当真值,校准结果见 §3.2。 ### 3.2 ★ 一个被验证过的担心 用户担心"我不是专家,标的边界不准"。**实测结果推翻了这个担心:** > **人工标记与算法的偏差中位数 = 0.0 秒。** ★ **结论**:**段落边界是感知判断,不是品味判断。** 非专家标出来的边界和算法一致——这说明这件事本来就不需要专家。 (**能标的和不能标的要分清**:边界能标,"这段好不好听"不能标。) **校准结果**:7 首人工标注,算法命中 **72%**,偏差中位 **0.0 s**。 ### 3.3 怎么标注 标注工具与 7 份标注文件在仓库里,不随包发布。 **已标注的 7 首**: AMContra_HeartPeripheral、APZX_CyberMower、DigitalHumans_Electrvm、 Forkupines_Semantics、MERCMusic_Knockout、MR1103_Flags、SimonLyn_Copper --- ## 4. ★ 佐证表:规则 × 语料 → 命中率 → 分档 ### 4.1 两条诚实约束 **违反了,佐证表就是自欺:** | # | 约束 | |---|---| | **1** | ★ **判据不能复用生成器的定义。** 反向 ARR-SPEC 里的 `subtraction_events` 是 反推工具 按"较前段降 >1 dB"自动填的;拿它去验"真编曲有没有减法"是**循环论证**。所以涉及减法的判据一律**直接从 `energy_curve` 重算**,用一个有音乐意义的阈值(≥3 dB),**不读 `subtraction_events` 字段** | | **2** | ★ **语料测不了的规则要标出来,不许硬跑**(见 §2.2) | `evidence` 的三个取值: | 值 | 含义 | |---|---| | `ok` | 本语料能验 | | `unusable_here` | 本语料性质不对,需要成品混音语料 | | `no_truth` | 缺真值(如段落边界),判据本身可信度存疑 | ### 4.2 第一轮结果 | 规则 | 命中 | 档 | |---|---|---| | 能量曲线必须有下降 | **62/62** | **强规则** | | 编制必须有乐器中途进场 | **59/59** | **强规则** | | 至少一件乐器提前退场 | **59/59** | **强规则** | | 不该全声部严格对齐网格 | **62/62** | **强规则** | | 开场不该把乐器一次铺满 | **54/59** | **强规则** | | 全曲至少一处明显减法 | 36/62 = **70%** | **倾向** | | 最高潮前应有能量回落 | 全量 22% / 人工真值 5/7 | ★ **矛盾,只当手法** | | 编制在最高潮最密 | 25/59 = 42% | **挂起** | ### 4.3 分档决定什么 | 档 | 在 skill 里怎么写 | 进 lint 吗 | |---|---|---| | **强规则** | "必须" | ✅ 硬检查 | | **倾向** | "通常应该" | ❌,进"写完后必过"清单 | | **手法** | "可以这么做" | ❌,只在诊断路径里出现 | | **挂起** | **不写进 skill** | ❌,留在实验记录里等更多数据 | ### 4.4 加一条规则的流程 1. 在 仓库规则表 里写:规则 + **可跑的判据** + `evidence` 2. 检查是否违反 §4.1 的两条约束 3. 用仓库的 corroborate 工具跨语料跑判据(维护者步骤,不随包发布) 4. 按命中率分档(§4.3) 5. ★ **把结果写进 仓库实验记录**,然后才改 skill > **规则集是有版本的**。 > 改了规则集就要重跑,否则前后轮不可比。 --- ## 5. ★ 规则和数据打架时怎么办 **这是本 skill 最重要的一节。** ### 5.1 先问:指标测的是不是那回事 **不要拿指标去推翻教科书。** **实例**:「最高潮前应有能量回落」在全量 62 首里只有 **22%**, 但在 7 首人工标注真值里是 **5/7**。 **差距的来源**:算法用**能量峰值**定位"最高潮",而**人耳不是**。 所以 22% 那个数**测的不是这条规则**,测的是"能量峰值前有没有回落"。 ★ **结论**:这条不降级为伪规则,也不升为强规则——**列为手法**。 ### 5.2 另一个实例:硬编码阈值造成的假低命中率 仓库的佐证工具 里曾**硬编码"12 dB 动态范围"**, 把规则 ARR-R-012 的命中率压到 **16%**,差点被报成"教科书是错的"。 **证伪方法**:拿 7 首人工标注真值测 → **5/7 = 71%**。 **修法**:改成在归一化的 0–10 单位上打分,**不假装能还原 dB**。 ★ **通用教训**:**一个异常低的命中率,先怀疑判据,再怀疑规则。** ### 5.3 佐证表与 lint 问的不是同一个问题 | | 问什么 | |---|---| | **佐证表** | **人类一般会不会这么做** | | **20 条自查** | **不这么做会不会听起来像 AI** | ★ **所以 70% 的命中率不会机械地把一条 lint 检查降级。** 一件事可能只有 70% 的人做,但**不做的那 30% 恰好都听起来像机器**。 --- ## 6. 找一个真实例子 | 你要 | 去哪 | |---|---| | 某个技法的真实用例 | [reference.md](reference.md) 的逐段拆解 | | 某个和弦进行用在哪首歌 | `mc-progressions` [reference.md](../mc-progressions/reference.md) §7 名曲索引 | | 一首曲子的完整实测参数 | 仓库实测语料(63 条) | | 段落边界的人工真值 | 仓库标注数据(7 条) | | 配器/混合音色的谱例 | `mc-orchestration` [reference.md](../mc-orchestration/reference.md) §4 | | 对位的谱例 | `mc-counterpoint` [reference.md](../mc-counterpoint/reference.md) | ### 6.1 逐段拆解的格式 **四者对齐**:时间码 / 段落 / 编制事件 / 和声。 格式与反向 ARR-SPEC 一致,人工补上机器测不出的部分(intent、hooks、为什么)。 --- ## 7. 与其他层的接口 | 方向 | 内容 | |---|---| | **→ L1/L2 各 skill** | 提供"实测:62/62,强规则"这样的证据等级标注 | | **→ 20 条自查** | 只有**强规则**才能进自查表 | | **→ `mc-ai-tell-audit`** | 零点校准(不相关成品得 63–66)就是在这套语料上测的 | | **← 仓库的反推工具** | 语料条目的生成器 | | **← 成品混音语料**(★ **缺**) | §2.2 那些 `unusable_here` 的规则需要它 | --- ## 8. 用完必过 - [ ] 引用规则时**带了证据等级**(强规则/倾向/手法),不是光说"教材说" - [ ] 新加的判据**没有复用生成器的定义**(§4.1 约束 1) - [ ] 语料测不了的规则**标了 `unusable_here`**,没有硬跑出假数字 - [ ] 命中率异常低时,**先怀疑了判据**(§5.2) - [ ] 没有拿佐证表的命中率**机械地**给 lint 检查降级(§5.3) - [ ] 改了规则集就**重跑并记进 仓库实验记录** --- ## 附:现状 **已有**: - 仓库实测语料 —— **63 条**实测 ARR-SPEC(Cambridge-MT) - 仓库规则表(规则集带版本号) - 仓库标注数据 —— 标注工具 + **7 条**人工真值 - `_corpus/multitracks/` —— 11 项(含 `_index.json`、`_parts.json`) - 仓库实验记录:度量标定 / 拍速校准 / 规则佐证第一轮 - 拍速校准:**56 首真值**