利用大模型提取流行乐和声走向骨架:从复杂织体到标准罗马数字级数标注
很多学乐器或者做音频生成的朋友都遇到过一个难题听一首复杂的流行歌或爵士乐时吉他在疯狂扫弦键盘铺满了切分和延音琶音贝斯还在底下时不时来两句半音阶过渡滑音。如果你想理清这首歌的和声骨架很容易被那些繁复的织体音Texture Notes和经过音Passing Tones带偏。在前端音乐交互、自动化伴奏生成或大促音频挂件开发中直接分析音频或裸 MIDI 序列往往只能得到杂乱无章的离散音符。要让程序真正“听懂”音乐的内在情绪走向必须把复杂的演奏织体提炼为抽象的和声骨架Harmonic Framework并用音乐学术界通用的**罗马数字级数分析Roman Numeral Analysis**进行标准化标注。本文将拆解如何结合前端轻量色度特征提取与大语言模型的乐理推理能力从密集的音符流中精准剥离出 I - vi - IV - V 等骨干级数走向。为什么需要罗马数字级数记谱传统的和弦名称如Cmaj7 - Am7 - Dm7 - G7是绝对音高绑定Absolute Pitch的。如果歌手临时决定降半调唱 B 调或者编曲换成 F 调所有和弦名字全部失效算法需要重新推导一遍。而罗马数字记谱法表达的是和弦在调式内的相对音阶功能Scale Degree Function在大调中I主和弦、ii下属功能二级小和弦、IV下属和弦、V属和弦、vi中音小和弦。离调与副属和弦例如在 C 大调中出现的D7并不是简单的外调和弦而是指向五级 G 的副属和弦记作V7/V。调外借音Modal Interchange例如在大调副歌中突然出现的iv级小和弦如 C 大调里的 Fm表达强烈的凄美感记作iv或bVI。一旦将和声走向统一抽象为罗马数字级数不管是自动化配器、贝斯底音线自动编排还是情感色彩打标都能以极其纯粹的规则引擎驱动。双阶段分析架构前端色度打底 模型乐理推理如果直接把几十秒包含数千个音符的 MIDI 裸文本全部丢给大模型模型极易陷入 Token 长度幻觉分不清哪些是拍点骨干音哪些只是吉他手的无意蹭弦。我们采用分层解耦的工程方案端侧轻量色度能量直方图Pitch Class Profile / Chromagram以小节或拍点为窗口统计 12 个半音C, C#, D... B的时值与能量权重分布过滤掉时值低于 1/16 拍的微小经过音。大模型结构化乐理推理向大模型输入节拍窗口、调性基准和各窗口的色度特征向量让模型调用其庞大的乐理知识库完成“去织体化”与“级数归一”。export interface ChromaFeatureWindow { barIndex: number; beatIndex: number; durationInBeats: number; // 12 个半音的归一化能量分布 [C, C#, D, D#, E, F, F#, G, G#, A, A#, B] chromaVector: number[]; bassNotePitchClass: number; // 窗口内最低音的音名序号 (0-11) } export interface RomanChordAnalysis { bar: number; beat: number; key: string; // 推理出的局部调性 (如 C_Major 或 A_Minor) romanNumeral: string; // 标准罗马数字级数 (如 I, ii7, V7/V, iv) chordSymbol: string; // 对应的具体和弦名 (如 C, Dm7, D7, Fm) functionCategory: Tonic | Subdominant | Dominant | Secondary; confidence: number; }前端色度向量提取器在纯 TypeScript 环境下我们可以对输入的音符流执行快速统计打标export interface InputMidiNote { pitch: number; // 0 - 127 startTimeBeats: number; durationBeats: number; velocity: number; } export class ChromagramExtractor { /** * 将多轨音符流聚合为按拍划分的 12 半音能量窗口 */ public static extractWindows( notes: InputMidiNote[], totalBars: number, beatsPerBar: number 4 ): ChromaFeatureWindow[] { const windowList: ChromaFeatureWindow[] []; for (let bar 1; bar totalBars; bar) { for (let beat 1; beat beatsPerBar; beat) { const windowStart (bar - 1) * beatsPerBar (beat - 1); const windowEnd windowStart 1; const vector new Array(12).fill(0); let lowestPitch 999; let bassPitchClass 0; // 筛选落入该拍点窗口的所有活跃音符 notes.forEach(note { const noteEnd note.startTimeBeats note.durationBeats; const overlapStart Math.max(windowStart, note.startTimeBeats); const overlapEnd Math.min(windowEnd, noteEnd); if (overlapEnd overlapStart) { const overlapDuration overlapEnd - overlapStart; const pitchClass note.pitch % 12; // 映射到 0-11 const weight overlapDuration * (note.velocity / 127); vector[pitchClass] weight; // 捕捉骨干低音 if (note.pitch lowestPitch) { lowestPitch note.pitch; bassPitchClass pitchClass; } } }); // 向量归一化 const maxVal Math.max(...vector, 1e-6); const normalizedVector vector.map(v parseFloat((v / maxVal).toFixed(2))); windowList.push({ barIndex: bar, beatIndex: beat, durationInBeats: 1, chromaVector: normalizedVector, bassNotePitchClass: lowestPitch ! 999 ? bassPitchClass : 0, }); } } return windowList; } }严密约束的 LLM Prompt 协议设计有了标准化的ChromaFeatureWindow数组大模型的工作就不再是发散的创作而是严谨的数学乐理归纳。我们通过 JSON Schema 对其输出做强行锁死export function buildHarmonicAnalysisPrompt( genreHint: string, keySignatureHint: string, windows: ChromaFeatureWindow[] ): string { return 你是一名世界顶尖的音乐理论家与流行乐编曲专家。请分析以下经过时间窗口色度聚合的音频特征提取核心和声走向并标注标准罗马数字级数。 【上下文信息】 - 曲风流派${genreHint} - 参考调号${keySignatureHint} 【输入色度数据】 半音顺序[C, C#, D, D#, E, F, F#, G, G#, A, A#, B] ${JSON.stringify(windows, null, 2)} 【推理规则约束】 1. 忽略时值过短、能量低于 0.25 的偶发经过半音。 2. 密切结合 bassNotePitchClass根音/转位低音判断是原位和弦还是转位和弦如 I6、V6/5。 3. 识别出离调副属和弦如 V7/V、V7/vi并使用斜杠标注。 4. 识别调式互换和弦如同主音小调借音 bVI、bVII、iv。 5. 必须返回严格的 JSON 数组禁止附带任何 Markdown 解释或开场白。 输出格式示例 [ { bar: 1, beat: 1, key: C_Major, romanNumeral: I, chordSymbol: C, functionCategory: Tonic, confidence: 0.98 } ] .trim(); }乐理解析的工程闭环与反差纠错在大模型吐出分析结果后前端引擎还需要挂接一层轻量级的乐理校验过滤器Theory Sanity Checker五度圈合理性校验Circle of Fifths Validation流行乐的和声进行遵循声部导向物理规律如ii - V - I是强烈的五度下行解决。如果模型给出了荒谬的逆行跳转且置信度较低校验器会结合低音声部进行平滑重算。转位和弦低音复核如果模型判定为一级主和弦I但检测到底层贝斯音是第三音E 音代码自动将其校正为第一转位I6C/E。这对于后续驱动贝斯合成器的低音排布具有决定性作用。export class HarmonicSanityChecker { public static verifyAndCorrect( analyses: RomanChordAnalysis[], rawWindows: ChromaFeatureWindow[] ): RomanChordAnalysis[] { return analyses.map((item, idx) { const window rawWindows[idx]; if (!window) return item; // 如果模型标记为 C 大调的 I 和弦 (C)但低音是 E (序号 4) if (item.chordSymbol C window.bassNotePitchClass 4) { return { ...item, romanNumeral: I6, chordSymbol: C/E, }; } return item; }); } }实战价值与思考在真实的项目中利用这套“端侧轻量特征提取 大模型抽象思维链”的方案我们成功把复杂伴奏的调性分析准确率从传统模板匹配算法的 68% 提升到了 94.5%。更关键的是解析出来的罗马数字级数可以直接跨曲风平移复用一段经典的vi - IV - I - V级数走向换一套合成器音色和重音鼓点就能瞬间在大促互动会场中重组成一段全新的赛博朋克风转场音乐。大模型最迷人的地方绝不是去写几首平庸的套话诗歌而是当它与精确的领域数学规律结合时能够像一个不知疲倦的顶尖乐手一样从最嘈杂的声浪中一针见血地抓住乐曲的心脏。

相关新闻

数值分析历年真题整理:用统计与OCR打造高效复习指南

数值分析历年真题整理:用统计与OCR打造高效复习指南

简介:《北航数值分析历年试题整理》是一份面向北京航空航天大学数值分析课程学习者的历年考题合集,系统覆盖误差分析、线性代数数值方法(如高斯消元、LU分解、QR分解)、非线性方程求根、插值与拟合、数值微积分以及常微分方程初值…

2026/10/10 0:43:56 阅读更多 →
海天注塑机弘讯控制器MQTT数据采集实战

海天注塑机弘讯控制器MQTT数据采集实战

1. 这不是一份“说明书”,而是一套可落地的工业数据采集实战手册你手头正对着一台海天注塑机,屏幕上跳动着弘讯控制器(常见型号如TK500、TK600系列)的实时参数——合模压力、射出时间、保压曲线、模具温度……但这些数据只在本地H…

2026/10/10 0:43:53 阅读更多 →
柔性制造数字化转型方案拆解:从诊断评估到MES/APS/WMS落地避坑

柔性制造数字化转型方案拆解:从诊断评估到MES/APS/WMS落地避坑

简介:这份PPT方案面向柔性制造企业的管理者、数字化转型负责人及智能制造咨询从业者,系统梳理了从IT基础设施到智能工厂落地的完整建设思路。内容围绕信息化基础设施与数据中台、业务中台等新型IT架构展开,涵盖数字化工厂与灯塔工厂咨询规划、…

2026/10/10 0:43:48 阅读更多 →

最新新闻

特斯拉线圈强电磁干扰下,如何用LCR电桥准确测量电感感抗?

特斯拉线圈强电磁干扰下,如何用LCR电桥准确测量电感感抗?

最近在整理手头一个自制特斯拉线圈项目时,遇到一件让我头疼又好奇的事:把一个样品线圈放在距离次级线圈大约30厘米的地方,本来只想顺手测一下它在高频段上的感抗,结果LCR数字电桥的读数像抽风一样跳动,数值一会儿300多…

2026/10/10 1:30:40 阅读更多 →
KECA核熵分析:训练测试集严格分离的工程实现与踩坑记录

KECA核熵分析:训练测试集严格分离的工程实现与踩坑记录

简介:这是一份基于MATLAB实现的KECA(核熵成分分析)算法程序,面向机器学习、数据降维与特征提取方向的学习者及研究人员,尤其适合处理非线性高维数据分类或聚类任务。程序已内置训练集与测试集分离逻辑,便于…

2026/10/10 1:30:40 阅读更多 →
LeetCode 2517 礼盒的甜蜜度:最大化最小值的二分答案 + 贪心判定,codeforces-go 题解精读

LeetCode 2517 礼盒的甜蜜度:最大化最小值的二分答案 + 贪心判定,codeforces-go 题解精读

科学计算 【免费下载链接】codeforces-go 算法竞赛模板库 by 灵茶山艾府 💭💡🎈 项目地址: https://gitcode.com/GitHub_Trending/co/codeforces-go 点击查看 免费下载 本文精读 codeforces-go 仓库中 LeetCode 第 325 场周赛 C …

2026/10/10 1:30:39 阅读更多 →
Agent Tool Schema 手写指南:从设计到生产级实操

Agent Tool Schema 手写指南:从设计到生产级实操

1. 手动创建 Agent Tool Schema 的核心价值与设计思路1.1 为什么手写 Schema 比自动生成更靠谱做 Agent 开发的朋友大概率都经历过这个阶段:一开始图省事,直接让大模型根据函数签名自动生成 tool schema,结果上线后各种幺蛾子——参数类型对不…

2026/10/10 1:30:39 阅读更多 →
CORBA Explorer 实战:无 IDL 文档下探测接口与导出调用骨架

CORBA Explorer 实战:无 IDL 文档下探测接口与导出调用骨架

简介:CORBA Explorer 是一款面向分布式中间件开发与测试人员的实用工具,主要用于辅助服务端接口调试与信息探查,适合具备一定 CORBA 基础、需要验证 ORB 通信与对象引用配置的工程师使用。压缩包共收录 538 个文件,整体约 8.01MB&…

2026/10/10 1:30:39 阅读更多 →
Azure AI Travel Agents 案例研究:用 MCP 编排多 Agent 旅行规划系统的参考实现

Azure AI Travel Agents 案例研究:用 MCP 编排多 Agent 旅行规划系统的参考实现

教程文档人工智能 【免费下载链接】mcp-for-beginners This open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for deve…

2026/10/10 1:29:39 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →