Audiveris 拍号(Time Signature)处理与编辑实战指南:整体拍、成对拍与自定义拍号的完整解析
桌面应用计算机视觉图像处理OCR【免费下载链接】audiverisLatest generation of Audiveris OMR engine项目地址https://gitcode.com/gh_mirrors/au/audiveris点击查看免费下载拍号Time Signature是乐谱头部信息staff header的关键要素之一直接决定后续小节划分与节奏推算的正确性。本文围绕 Audiveris OMR 引擎对拍号的整体识别、手动指派与自定义编辑机制展开结合 time.md 官方 UI 工具文档与org.audiveris.omr.sheet.time、org.audiveris.omr.sig.inter包下的源码实现讲解整体拍 vs 成对拍的识别模型、预定义拍号的选择方式、自 5.2 版本引入的自定义拍号custom用法以及拍号在谱表中的定位规则读完即可在 Audiveris 图形界面中高效完成拍号的识别修正与自定义录入。拍号的两种形态整体拍Whole与成对拍PairAudiveris 将乐谱中的拍号划分为两种处理形态源码中分别由 AbstractTimeInter 的子类承载整体拍对应TimeWholeInter单符号与TimeCustomInter自定义组合成对拍对应TimePairInter由两个独立的数字TimeNumberInter通过TimeTopBottomRelation关联。整体拍Whole time signature整体拍将拍号作为一个整体来处理包含三类单一音乐符号COMMON_TIMEC与CUT_TIME¢/。源码 ShapeSet.java 中以SingleWholeTimes枚举定义。预定义组合predefined combo截至当前版本共有 9 种——4/4、2/2、2/4、3/4、5/4、6/4、3/8、6/8、12/8对应 WholeTimes 枚举中的TIME_FOUR_FOUR、TIME_TWO_TWO、TIME_TWO_FOUR、TIME_THREE_FOUR、TIME_FIVE_FOUR、TIME_SIX_FOUR、TIME_THREE_EIGHT、TIME_SIX_EIGHT、TIME_TWELVE_EIGHT。自定义组合custom combo初始值为0/0仅供用户手动定义引擎不会自动识别。成对拍Pair time signature成对拍将拍号作为两个独立数字的集合来处理分子numerator与分母denominator各自是独立的TimeNumberInter。在 TimeBuilder.java 中分子与分母候选分别存放于nums与dens列表并通过TimeTopBottomRelation边edge建立上下配对关系。成对拍并非任意组合都能被识别——只有与上述预定义组合等价的形态才能被认可。这一约束在 filterCandidates() 中实现代码用AbstractTimeInter.isSupported(nd)判断分子/分母构成的TimeRational是否为受支持的组合支持则添加TimeTopBottomRelation否则插入Exclusion.ExclusionCause.INCOMPATIBLE排除关系。引擎自动识别的范围与择优机制OMR 引擎可以自动识别上述除 custom 组合外的所有整体拍与成对拍。以2/4为例引擎可能同时得到两种候选识别出独立的 2 与 4 字形组成成对拍识别出 2/4 复合字形组成整体拍组合。两种解释同时存在最终以**更高的评分grade**决定保留哪一种。值得一提的是文档明确指出具体选择哪种解释对 OMR 处理流程没有影响——因为无论以何种形式表达拍号最终都会归一化为分子/分母TimeRational参与后续节奏推算参见 AbstractTimeInter.getValue()。系统层面的列一致性校验拍号识别并非逐行谱独立进行。TimeColumn.java 的checkConsistency()揭示了更深层的处理原则一个 system 内、同一列的拍号必须完整且彼此一致。其算法为为每个谱表staff收集所有可能且受支持的AbstractTimeInter候选各自带评分对每个可能的拍号值TimeValue检查它在每个标准谱表中都存在对应候选并计算该值的全局评分各谱表候选评分的平均值选择全局评分最高的值作为该 system 列的拍号销毁所有不兼容的候选并清理不属于所选拍号的成员数字。这一列一致性机制与文档虽然理论上每个谱表都应有自己的拍号但 Audiveris 只需一个谱表带拍号即可工作的说明互为印证——拍号本质上是 system 级属性而非谱表级属性。拍号识别的底层流程与可调参数从源码结构看拍号识别的主入口是 TimeColumn.retrieveTime()其流程为为 system 内每个非 tablature 谱表分配一个TimeBuilder实例逐个谱表调用findCandidates()收集整体拍与分子/分母候选调用filterCandidates()过滤候选——若某谱表无任何可用候选则清理并返回失败调用purgeUnaligned()校验垂直对齐调用checkConsistency()做系统级一致性校验与择优调用discardNeighbors()清理与拍号重叠的低分邻居实体。TimeBuilder有两个子类处理谱表开头拍号的 HeaderTimeBuilder位于 staff header 中与处理谱表其余位置的BasicTimeBuilder。相应地TimeColumn也有HeaderTimeColumn与BasicTimeColumn两个子类。TimeBuilder内部还定义了一组尺度相关的常量见 TimeBuilder.java 的 Constants 内部类其中值得关注的包括常量默认值含义roiWidth4.0拍号感兴趣区域ROI的宽度minTimeWidth/maxTimeWidth1.0 / 2.0拍号允许的最小/最大宽度maxHalvesDx1.0分子与分母之间的最大横坐标偏移maxFirstSpaceWidth2.5拍号前允许的最大初始空白宽度maxInnerSpace0.5拍号内部允许的最大空隙minWholeTimeWeight/minHalfTimeWeight1.0 / 0.75整体拍/半拍的最小字形权重maxEvalRank3拍号评估中的最大可接受排名注意这些参数同时依赖整张乐谱的全局尺度sheet scale与谱表自身的行距staff specific interline——当乐谱中同时存在大、小两种谱表时参数会按谱表特异性行距重新换算见 Parameters 构造器。使用预定义拍号字形指派与拖放当引擎未检测到拍号或赋予了错误的值时可以通过两种方式手动修正为预定义拍号选中底层字形后指派选中拍号字形在形状面板shape palette中双击目标拍号形状或通过Glyphs...弹出菜单pop-up menu选择目标值。这种方式对整体拍与成对拍都有效——成对拍时可以分别对拍号的每个部分分子/分母独立指派。从形状面板拖放将选定的拍号从形状面板拖拽并放到乐谱中合适的位置。注意该方式仅适用于整体拍whole signature无法拖放成对拍的两个数字部分。同时文档特别提醒在上述两种情况下字形指派与拖放选择范围都局限于形状面板中预定义的形状。也就是说如果想要的拍号不在预定义列表中例如7/8、11/16等非常规拍号就必须使用下一节的自定义拍号custom方案。预定义形状与分子/分母的对应关系可以在 AbstractTimeInter.rationalOf(Shape) 中查到例如TIME_FOUR_FOUR与COMMON_TIME都解析为4/4CUT_TIME与TIME_TWO_TWO都解析为2/2TIME_TWELVE_EIGHT解析为12/8。受支持拍号的完整集合除了形状面板中的 9 个预定义组合引擎内部还维护了一张更宽的受支持拍号清单定义于 AbstractTimeInter 的 defaultTimes默认组合2/2、3/2、2/4、3/4、4/4、5/4、6/4、3/8、6/8、9/8、12/8可选组合通过常量optionalTimes配置默认值6/4, 7/86/4、7/8isSupported()即判断某个TimeRational是否属于默认 可选集合——这是成对拍能否被引擎认可的判断标准也解释了文档只有等价于预定义组合的成对拍才能被识别的技术缘由。自定义拍号Custom Time Signature自5.2 版本起时间形状面板time shape palette提供了custom拍号选项——一个完全可自定义的组合拍号。定义自定义拍号的操作步骤拖入 custom 组合最便捷的方式是将形状面板中的custom组合显示为0/0拖拽到目标位置确认初始值拖放完成后custom 组合显示其初始值0/0通过 inter board 输入数值使用inter board交互实体面板为自定义组合输入目标值输入格式为分子 / 分母numerator / denominator。输入操作封装在 TimeValueTask.java 中作为可撤销/重做的编辑任务内部调用TimeCustomInter.setNumerator()与setDenominator()完成数值写入。输入完成后拍号即以填入的数值显示在谱面上自定义拍号的限制自定义拍号的核心价值在于不再受限于预定义拍号值——任何非常规拍号都可以表达。唯一的硬性约束是分子与分母的取值都必须位于 [0..99] 区间内其中 0 仅作为临时值即初始的0/0状态最终导出前应填入实际数值。从源码 TimeCustomInter.java 看自定义拍号的分子、分母分别以独立的num、den属性持久化存储并通过getNumerator()/getDenominator()供下游读取。拍号的位置Location规则拍号在谱面上的定位遵循以下规则不可缩放拍号不能被缩放resize吸附于谱表拍号的位置被吸附snapped到其所在谱表containing staff上水平移动整体拍可以在其谱表范围内水平平移成对拍的情况下两个部分分子、分母各自可以轻微地水平微调。一个实用建议无需逐谱表重复录入文档用一个醒目的 highlight 说明了一条重要实践经验虽然理论上一个 system 中的每个谱表都应该有自己的拍号但 Audiveris 只需一个谱表带有拍号即可正常工作。因此我们不必在 system 的每一个谱表上重复输入相同的拍号。这一实践与前述 TimeColumn.checkConsistency() 的列一致性校验逻辑完全对应引擎会把系统级选中的拍号值TimeValue前向广播forward到该列的所有谱表非兼容候选会被自动销毁——这正是一个谱表带拍号即可覆盖整个 system的底层支撑。小结与实操建议总结 Audiveris 拍号处理的要点需求场景推荐操作引擎漏检或误检了标准拍号如 4/4、6/8选中字形 → 形状面板双击 /Glyphs...菜单指派需要把整体拍放到新位置从形状面板拖放整体拍到目标位置成对拍不可拖放需要非常规拍号如 7/8、11/16、2/3拖入custom组合 → inter board 输入分子/分母取值 0..99一个 system 多谱表只需在一个谱表上录入拍号引擎自动广播到整列若需进一步了解拍号相关的其他 UI 工具可参阅 UI 工具目录下的 key.md调号、measure.md小节等相邻文档拍号识别在整条处理管线中的位置可参见 pipeline 指南。赞分享桌面应用计算机视觉图像处理OCR【免费下载链接】audiverisLatest generation of Audiveris OMR engine项目地址https://gitcode.com/gh_mirrors/au/audiveris点击查看免费下载相关推荐eShop拍卖功能竞拍系统与出价管理eShop拍卖功能竞拍系统与出价管理 痛点传统电商的定价局限 在传统电商平台中商品价格往往是固定的缺乏动态定价机制。卖家难以根据市场需求调整价格买家也后端电商前端微服务3分钟上手React Native图像处理从拍照到编辑的完整指南3分钟上手React Native图像处理从拍照到编辑的完整指南 create react native app是一款快速构建React Native应用的工开发工具CLI移动开发Frigate 从零到上线三步跑起本地物体检测 NVRFrigate 从零到上线三步跑起本地物体检测 NVR Frigate 是一款开源的 NVR 系统特点是物体检测全部在本地实时完成它从 IP 摄像头拉取人工智能计算机视觉音视频上一篇JDK 源码剖析ThreadLocal 线程局部变量的底层实现原理与应用实战下一篇掌握LiteGraph.js锁定状态APIisLocked与setLocked的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考