Audiveris 乐谱检查指南:用粉色小节、Jumbo 模式与时间槽定位 OMR 识别异常
Audiveris 乐谱检查指南:用粉色小节、Jumbo 模式与时间槽定位 OMR 识别异常
在一份完全正确转译(transcribed)的乐谱中,所有对象都应被正确识别:每个声部(voice)中的每个和弦(chord)、每个小节(measure)里的每个声部,都应在正确的时刻开始并持续正确的时长。然而,这套精密的识别机制可能因为大大小小的原因“卡壳”,产生异常结果。本篇指南基于 Audiveris 官方手册的 Inspection 章节,系统讲解 Audiveris 提供的一系列检查手段——粉色小节背景、彩色声部、Jumbo 模式、和弦 ID、小节条带输出与时间槽(time slot)分析,帮助你快速发现异常结果并定位其根本原因(root cause)。
读完本文,你将掌握:如何用快捷键与菜单开关各类检查视图、如何解读“条带”(strip)与槽转储(slot dump)输出、以及如何结合源码理解 Audiveris 判定“异常小节”和“时间槽”的底层逻辑,从而在人工校对环节高效修复 OMR 引擎遗留的错误。
为什么需要一套“检查”手段
OMR(光学乐谱识别)引擎的输出并非总是完美。Audiveris 官方文档明确指出:即使引擎没有把某个小节标记为“异常”,该小节仍可能携带引擎无法可靠检测的错误,这些错误目前只有人类读者能够发现并修复。
因此,Audiveris 提供了多层次的检查视图,从整体到局部逐层深入:
| 检查手段 | 关注层级 | 主要用途 |
|---|---|---|
| 粉色小节背景 | 小节 / 声部 | 快速定位引擎明确判定的节奏异常 |
| 彩色声部(Voice colors) | 声部 | 目视核对每个声部的内容是否合理 |
| Jumbo 模式 | 音符元素(增时线点) | 放大显示易被误认的小符号 |
| 和弦 ID(Chord IDs) | 和弦 | 在谱面与条带输出之间建立映射 |
| 小节条带(Measure strip) | 小节 / 声部 / 和弦 | 以文本形式转储声部与和弦的时序关系 |
| 时间槽(Time slots) | 时间槽 / 和弦 | 核对和弦与时间刻度的对齐关系 |
这些手段都围绕 Audiveris 的节奏模型展开:时间槽、和弦、声部、小节与小节堆(measure stack)。下文将逐一展开。
粉色小节背景:最直观的异常信号
什么是粉色小节
在 Audiveris 的页面视图中,粉色背景的小节是最显眼的异常提示。官方文档以一张页面截图为例:其中第 5 小节(#5P1)与第 10 小节(#10P2)以粉色背景显示,其余小节为标准白色背景(见 pink_measures.png)。
Audiveris 页面视图中以粉色背景突出显示的异常小节
该功能可以通过 View → Show score errors(F9) 菜单项或对应工具栏图标关闭(菜单参考)。
粉色背景的显示范围与判定规则
关于粉色背景的显示,有两点关键细节:
- 定义层级与显示层级分离:节奏(rhythm)实际定义在小节堆(measure stack) 层级——即同一系统(system)内垂直对齐的一组小节,对应图中的 system 高红色矩形;但异常节奏会下沉显示到小节(measure)层级——即 part 级高矩形(粉色背景)。
- 背景几何:水平方向由小节左右边界限定,垂直方向为所有参与小节节奏的谱表(staves)与和弦的包围盒(bounding box)。
一个小节被判定为**异常(abnormal)**并显示粉色背景,只需满足以下任一条件(针对其至少一个声部):
- 该声部的起始时间无法确定;
- 该声部的结束时间超过小节预期时长(预期时长由当前拍号(time signature)定义)。
从源码看,这一“异常”状态由 MeasureStack.java 中的 abnormal 属性承载(@XmlAttribute(name = "abnormal")),并提供 isAbnormal() / setAbnormal() 访问方法,且该状态会随 OMR 工程持久化保存(MeasureStack.java#L1517-L1526)。文档注释显示:该属性原是堆级(deprecated 为“stack”级),如今可逐小节标记异常(MeasureStack.java#L182-L187)。
反向提示:白色也可能藏错
务必注意文档给出的反向结论:一个小节未被标记为异常(显示标准白色背景),并不代表它没有问题——它可能只是引擎恰好能算出所有声部、且声部都能在小节时长内完成,但内部时序依然错误。后文的小节条带与时间槽检查,正是为这类“漏网之鱼”准备的。
彩色声部:按声部着色目视核对
选择启用声部着色(Voice colors)的意义,在于可以目视检查每个声部的内容。官方文档给出的示例图(voice_color_check.png)中,位于小节右下角的 voice 6 看起来十分可疑——尽管该小节并未被标记为“异常”。
按声部着色后,可疑的声部内容一目了然
这正好呼应上一节的结论:“异常”标记只能覆盖引擎能明确判定的情况,目视检查才是发现隐性错误的终极手段。 声部着色功能对应菜单 View → Show score voices(F8),仅在输出层(output)与混合层(mixed)视图下生效(菜单参考)。
从源码看,声部着色由 ViewParameters.java 中的 VOICE_PAINTING 开关控制;每个声部拥有独立颜色(voiceColors),音符与歌词按所属声部着色,便于区分多声部织体(ViewParameters.java#L88-L89)。
Jumbo 模式:放大可疑的小符号(F7)
为什么需要 Jumbo 模式
位于音符符头附近、非常小的字形(glyph)很容易被 OMR 引擎误认为增时线点(augmentation dot),从而导致错误的时值和异常小节。这类小字形往往是分割(segmentation)不佳的产物,肉眼难以察觉。
功能与用法
自 5.4 版本起,Audiveris 提供了名为 “Jumbo” 的视图选项,通过 View → Show jumbo inters(F7) 菜单项或 F7 功能键启用(菜单参考)。
启用后,当前乐谱(sheet)中所有增时线点都会以大号红点显示,从而真正“脱颖而出”,例如 sheet4_m9_jumbo.png 所示:
Jumbo 模式下增时线点以醒目的大红点显示,便于与误识别的噪声区分
源码实现
Jumbo 模式在 ViewParameters.java 中由 JUMBO_PAINTING 开关(jumboPainting 字段)控制,且特意设计为不持久化——即每次启动默认关闭,需要时手动开启(ViewParameters.java#L85-L86、#L135-L136),其 toggleJumbos(ActionEvent) 动作负责切换显示状态(ViewParameters.java#L669-L677)。
Jumbo 显示使用的颜色定义在 Colors.java:
/** Inter in jumbo display. */
public static final Color INTER_JUMBO = Color.RED;
(Colors.java#L107-L108)——这正是“大号红点”颜色来源。菜单描述也称其会将某些形状(默认是点)以双倍尺寸绘制以方便目视检查(view.md)。
和弦 ID 显示:在谱面与条带之间建立映射
默认情况下,和弦 ID 不会显示在谱面视图中,因为会显得过于“侵入”。需要时通过下拉菜单 View → Show chord IDs 开启(菜单参考)。
开启后的效果可参考 voice_color_check_ids.png:图中可以清晰看出,和弦 3963 与和弦 3964 完全可以合并为单个和弦。
开启和弦 ID 显示后,可直观判断哪些和弦可以合并
菜单文档明确指出该功能的用途:便于在“小节条带”输出与谱面视图之间目视映射和弦(view.md)。也就是说,和弦 ID 是连接“文本诊断输出”与“图形化谱面”的桥梁。源码侧对应 ViewParameters.java 的 CHORD_IDS_PAINTING 开关(chordIdsPainting 字段)(ViewParameters.java#L67-L68)。
小节条带输出:以文本转储声部时序
两种条带命令
在任意小节 N 内右键单击,会弹出小节上下文菜单,其中提供两个转储(dump)命令(弹窗菜单参考):
≡ Measure #N | Dump stack voices:转储整个 system 级小节堆的条带(涉及所有 part);≡ Measure #N | Dump measure voices:转储仅当前 part 级小节的条带。
后者的设计意图是:在管弦乐总谱(orchestra scores)中,一个 system 内包含大量 part,限制在单个 part 可以让你一次只聚焦一个声部群。
条带图例(Legend)
以官方示例 chord_id_check.png 所示小节为对象,得到的堆级条带(含 P1、P2 两个 part)如 strip_check.png 所示:
被转储的小节:谱面上看似正常,条带输出却暴露了时序问题
小节堆级条带输出:每个声部一行,与时间槽对齐
条带的阅读规则如下:
- 条带顶行显示小节内每个时间槽(slot)的时间偏移量(time offset);
- 随后按 part 依次排列,每个 part 内每个声部一行;
- 每个声部行给出声部 ID,然后是与起始时间槽垂直对齐的各个和弦 ID;
- 段
====表示该声部处于活跃状态,段....表示声部处于不活跃状态; - 声部行末尾可能带有
(ts:Num/Den)字符串,提示该声部看起来像某个分子/分母拍号下的典型小节(该特性原本可用于推断实际拍号,目前已被禁用)。
实例分析:条带如何暴露隐藏错误
官方文档对比“谱面图像”与“条带输出”,指出条带暴露出两处异常:
- 声部 P1/V1 在偏移 3/4 处结束,而谱面显示该声部应在偏移 1 处结束;同时 Ch#3979 在偏移 1/2 处开始,谱面上它实际起始于 3/4。(显而易见:引擎漏掉了 Ch#3970 上的点——这正是增时线点被漏识的典型场景。)
- 声部 P2/V2 也在偏移 3/4 处结束,与谱面一致:在和弦 3997 正下方存在一个未被检测到的和弦。
关键结论再次强调:从 OMR 引擎的角度看,没有任何理由把该小节标记为异常——所有声部都能被计算出来,且都在小节时限内完成。这类错误只能靠条带这类人工检查手段发现。
源码视角:条带是如何生成的
条带的生成链路清晰可循:
- 右键菜单动作定义在 EditorMenu.java:
DumpMeasureAction(名称 “Dump measure voices”)调用stack.printVoices("\n", measure)(EditorMenu.java#L279-L293);DumpStackAction(名称 “Dump stack voices”)调用stack.printVoices("\n", null),仅当堆内小节数大于 1 时可用(EditorMenu.java#L298-L317)。
printVoices(title, selectedMeasure)实现在 MeasureStack.java#L1684-L1728:先输出标题与小节堆,再输出槽头(各槽的时间偏移与总时长),然后对每个小节(或选中的单个小节)按Voices.byId排序输出每个声部的voice.toStrip()。- 单声部条带由 Voice.java#L1001-L1046 的
toStrip()生成:以V%2d输出声部 ID,逐槽遍历SlotVoice状态——ChordStatus.BEGIN输出|Ch#xxxx,CONTINUE输出=========,无活跃和弦输出|........,最后输出声部累计时值。
MeasureStack#2
|0 |1/16 |3/16 |1/4 |3/8 |7/16 |1/2
--- P1
V 1 |Ch#2325 ==================|Ch#2326 |Ch#2828 |Ch#2327 |1/2
V 5 |Ch#2347 |Ch#2348 |Ch#2349 |Ch#2350 |Ch#2351 =========|1/2
(示例见 popup.md)
时间槽检查:核对和弦与时间刻度的对齐
显示条件与形态
时间槽在 physical 模式下不可见,仅在 combined 模式与 logical 模式下显示——前提是 View → Show annotations 标志已开启(菜单参考)。
一个时间槽显示为一条细垂直线(灰色),顶部标注其时间偏移量。官方示例展示了偏移量分别为 0、1/4、1/2、3/4 的 4 个槽(见 slot_check.png):
| 槽 ID | slot#1 | slot#2 | slot#3 | slot#4 |
|---|---|---|---|---|
| 时间偏移量 | 0 | 1/4 | 1/2 | 3/4 |
combined 模式下显示的时间槽:细灰线 + 顶部偏移量
在该图中可以注意到:偏移 1/2 处的 slot #3 看起来很奇怪——没有任何和弦与之对齐;而底部中央的 和弦 4010 也没有对齐任何槽。
从源码看,时间槽的显示由 SLOT_PAINTING 开关控制,而 Slot.java 的类注释明确指出:槽(Slot)表示小节堆内一个大致定义的时间片,用于收集所有在同一时刻开始的和弦;系统槽(system slot)跨越系统内所有谱表,而小节槽(measure slot)只跨越所在 part 内的谱表(Slot.java#L52-L60)。
右键转储:Dump chords 与 Dump voices
要精确调查每个时间槽的内容,可在槽上右键单击(弹窗菜单参考):
≡ Slot #3 | Dump chords给出(示例):
slot#3 start= 1/2 [HeadChordInter{#3979(0.794/0.794) stf:7 slot#3 off:1/2 dur:1/4},HeadChordInter{#4010(0.815/0.815) stf:9 slot#3 off:1/2 dur:1/2}]
≡ Slot #3 | Dump voices给出(示例):
slot#3 start= 1/2 [V1 Ch#3979 s:7 Dur= 1/4, V5 Ch#4010 s:9 Dur= 1/2]
这些输出可读性一般,但足以说明该槽包含和弦 3979 与 4010——这看起来很奇怪(一个槽内同时容纳两个本应不同时开始的和弦)。
源码视角:两种转储格式的差异
上述两种输出分别由 Slot.java 的两个方法生成:
toChordString()(Slot.java#L482-L507):输出slot#N start=偏移量,随后罗列该槽的所有起始和弦(getChords()),每个和弦以其完整字符串形式呈现(含 grade、stf 谱表、槽、偏移量、时值等信息)。toVoiceString()(Slot.java#L551-L593):以声部 ID 为键(TreeMap排序)整理槽内和弦,输出V# Ch#NN s:谱表 Dur=时值的精简格式。
两者分别对应弹窗菜单中的 Dump chords 与 Dump voices,也对应 popup.md 的描述:“Dump chords:列出在该槽上起始的所有和弦;Dump voices:列出在该槽上有和弦起始的所有声部”。
更直观的检查:悬停高亮(仅 combined 模式)
在 combined 模式下有一种更易读的检查方式:按下鼠标右键并靠近某个时间槽移动(保持在 part 谱表垂直范围内),即可同时高亮该槽及其相关和弦,如 slot_content_check.png(正确的 slot#1,偏移 0)与 slot_content_error.png(异常的 slot#3,偏移 1/2)所示:
| 正确的 slot#1(偏移 0) | 异常的 slot#3(偏移 1/2) |
|---|---|
![]() |
![]() |
悬停高亮时间槽:左右对比可立即发现槽内和弦归属错误
图中可以立即看出:偏移 1/2 的槽错误地包含了和弦 4010 与 3979。
根因追踪:一例完整诊断
官方文档给出了一个完整的根因诊断范例:仔细观察小节左上角 slot#1(时间偏移 0)中和弦 3978 附近,可以发现其音符符头右侧有一个未被识别的增时线点——这正是前述所有时间槽问题的真正根因:
一个增时线点被漏识 → 和弦时值被算错 → 声部起始/结束偏移量错位 → 后续和弦被错误地归入相邻时间槽 → 表现为槽对齐异常与条带时序异常。
这说明:时间槽检查不仅是发现问题的手段,更是回溯根因的入口。当你看到槽与和弦“错位”时,应沿着该和弦的时值链条向上游追溯,往往能在更早的符号(如增时线点、符头附近的小字形)处找到源头——此时可结合前文提到的 Jumbo 模式放大验证。
总结:一条完整的异常排查工作流
将本文介绍的手段组合起来,可以得到一条针对 Audiveris 转译结果的高效排查路径:
- 全局扫描:开启 View → Show score errors(F9),观察所有粉色背景小节,优先处理引擎明确判定的异常;
- 局部目视:对可疑小节开启 Show score voices(F8) 声部着色,核对各声部内容是否符合谱面;
- 放大验证:开启 Show jumbo inters(F7),确认符头附近是否存在被误识/漏识的增时线点等小符号;
- 文本转储:在小节上右键执行 Dump stack voices / Dump measure voices,对比条带与谱面,找出“引擎认为正常但实际错误”的时序问题;
- 槽级定位:在 combined 模式开启 Show annotations 与 Show chord IDs,右键转储或悬停高亮时间槽,定位和弦与时间刻度的错位;
- 根因修复:沿错位和弦向上游追溯(漏识的增时线点、缺失的和弦、误并/漏并的和弦等),在谱面视图完成人工修正。
所有检查开关都集中在 View 菜单(view.md),全部转储动作集中在右键弹窗菜单(popup.md);其底层状态由 ViewParameters.java 统一管理(errorPainting、voicePainting、jumboPainting、chordIdsPainting、annotationPainting、slotPainting 等开关),颜色约定集中在 Colors.java(INTER_ABNORMAL、INTER_JUMBO、SHEET_INVALID 等)。掌握这套“视图开关 + 右键转储 + 源码印证”的组合拳,你就能在 Audiveris 的人工校对环节中系统性地发现并修复 OMR 引擎的隐性错误,得到真正高质量的转译乐谱。
相关文档与源码索引
- 本文主体:Inspection(UI 基础章节)
- 视图菜单:view.md
- 右键弹窗菜单:popup.md
- 声部着色:voice_colors.md
- 显示模式:display_modes.md
- 和弦编辑:chords.md
- 视图参数开关:ViewParameters.java
- 颜色约定:Colors.java
- 异常标记与条带打印:MeasureStack.java
- 声部条带生成:Voice.java
- 时间槽模型与转储:Slot.java
- 右键菜单动作实现:EditorMenu.java








