Page 12 - 《软件学报》2026年第5期
P. 12

黄恒焱 等: 融合音乐知识结构化表征的高精度符号音乐理解                                                    1891


                 性特征与旋律逻辑, 例如在        C  大调中, C  到  G  的频繁转移反映了主音到属音的偏好; NLTM           则依据音符时值的转
                 移规律建模节奏骨架与律动感, 例如            4  拍乐曲中  1/4  音符的接续频率揭示了稳定的节拍模式. 两者从统计角度构
                 建了音乐在旋律与节奏维度上的内在结构与倾向, 为模型理解乐曲的理论基础与构造逻辑提供了有力支持.
                    基于该思考, 为解决传统        Transformer 模型在音乐序列建模中忽略音乐多维结构特征的问题, 本文提出了互补
                 音乐特征提取模块. 该模块的设计基于以下两个观察: 一方面, 音乐知识特征                       (音高转移矩阵与音长转移矩阵) 具
                 备类似图像的二维空间结构, 包含丰富的局部空间关联模式, 蕴含乐曲中的旋律、节奏及风格等特征; 另一方面,
                 CNN  在提取局部空间结构和层级特征方面表现优异, 与                Transformer 擅长捕获全局序列依赖关系形成有效互补.
                 利用  CNN  从音乐知识特征中提取局部结构特征, 并配合              Transformer 编码器捕获序列全局语义信息, 可以构成一
                 种同时掌握音乐结构与音乐语义的完整理解框架.
                    构建音乐知识特征时, 首先将打击乐器             (如架子鼓) 轨道排除. 这是由于打击乐器的音高不具备明确的调性意
                 义, 其节奏模式通常独立于旋律与和声轨道, 因此排除打击乐轨道可以使模型准确地捕获旋律、和声与节奏的核
                 心结构特征. 音乐知识特征构建算法如算法              1  和算法  2  所示.

                 算法  1. PCTM  算法.
                 输入: MIDI  文件 I;

                 输出: 归一化音高类别转移矩阵          X, 尺寸 12×12.
                 1.  X ← zeros(12,12)   // 初始化  12×12  的全  0  矩阵
                 2. for instrument  ∈ I.instruments do
                 3.  if instrument.is_drum then // 跳过打击乐器
                 4.   continue
                 5.  end if
                 6.   C ← ∅ // 存放音高类别序列
                 7.  for note ∈ instrument.notes do
                 8.    c ← note.pitch mod 12 // 映射到音高类别
                 9.   append   c  to   C
                 10. end for
                 11. for  t = 1 to  |C|−1 do // 统计相邻音符对
                 12.    i ← C[t −1]
                 13.     j ← C[t]
                 14.    X[i, j] ← X[i, j]+1
                 15. end for
                 16. end for
                 17. for  i = 0 to  11 do // 行归一化
                         11 ∑
                 18.   s ←  X[i, j]
                         j=0
                 19.  if  s , 0 then
                 20.   for   j = 0 to  11 do
                 21.     X[i, j] ← X[i, j]/s
                 22.   end for
                 23.  end if
                 24. end for
                 25. return   X
   7   8   9   10   11   12   13   14   15   16   17