音符音高条的显示方法及计算机可读存储介质

申请号 CN202310833354.3 申请日 2023-07-07 公开(公告)号 CN116863790A 公开(公告)日 2023-10-10
申请人 福建星网视易信息系统有限公司; 发明人 陈勇; 王艺伟; 苏财德; 蔡智力; 邹应双;
摘要 本 发明 公开了一种音符音高条的显示方法及计算机可读存储介质,获取曲谱文件,并获取各行曲谱的曲谱信息;遍历各行曲谱,依序获取一行曲谱作为当前行曲谱;在画布中绘制当前行曲谱的曲谱图形,并获取曲谱图形中各小节的横向起止 位置 ;根据当前行曲谱的曲谱信息,确定当前行曲谱中各音符的起止时间以及各小节的起止时间;分别根据当前行曲谱中各音符的起止时间及其所属小节的起止时间和横向起止位置,计算当前行曲谱中各音符对应的音高条的横向起止位置;分别根据当前行曲谱中各音符对应的音高条的横向起止位置,在音高条区域中绘制对应的音高条图形。本发明可在保证曲谱结构不变的同时,使曲谱音符的音高条与曲谱音符对齐。
权利要求

1.一种音符音高条的显示方法,其特征在于,包括:
获取曲谱文件,并根据所述曲谱文件,获取各行曲谱的曲谱信息,所述曲谱信息包括音符信息、小节信息以及曲谱速度,所述音符信息包括音符的音高值和音符的拍数;
遍历所述曲谱文件中的各行曲谱,依序获取一行曲谱作为当前行曲谱;
根据当前行曲谱的曲谱信息,在画布中绘制当前行曲谱的曲谱图形,并获取所述曲谱图形中各小节的横向起止位置,所述横向起止位置包括横向开始位置和横向结束位置;
根据当前行曲谱的曲谱信息,确定当前行曲谱中各音符的起止时间以及各小节的起止时间,所述起止时间包括开始时间和结束时间;
分别根据当前行曲谱中各音符的起止时间及其所属小节的起止时间和横向起止位置,计算当前行曲谱中各音符对应的音高条的横向起止位置;
分别根据当前行曲谱中各音符对应的音高条的横向起止位置,在当前行曲谱对应的音高条区域中绘制当前行曲谱中各音符对应的音高条图形。
2.根据权利要求1所述的音符音高条的显示方法,其特征在于,所述根据当前行曲谱的曲谱信息,在画布中绘制当前行曲谱的曲谱图形之前,进一步包括:
创建画布,并以所述画布的左上为原点,向右方向为X轴正方向,向下方向为Y轴正方向,构建二维坐标系
3.根据权利要求2所述的音符音高条的显示方法,其特征在于,所述根据当前行曲谱的曲谱信息,在画布中绘制当前行曲谱的曲谱图形,并获取所述曲谱图形中各小节的横向起止位置之后,进一步包括:
获取所述曲谱图形的纵向底部位置;
根据当前行曲谱中各音符的音高值,确定当前行曲谱的最大音高值和最小音高值;
根据当前行曲谱的最大音高值和最小音高值以及预设的映射系数和上下留白值,计算当前行曲谱对应的音高条区域的高度;
根据当前行曲谱中各音符的音高值、当前行曲谱的最小音高值、曲谱图形的纵向底部位置、音高条区域的高度以及预设的映射系数和上下留白值,分别计算当前行曲谱中各音符对应的音高条的纵向位置。
4.根据权利要求3所述的音符音高条的显示方法,其特征在于,所述根据当前行曲谱的最大音高值和最小音高值以及预设的映射系数和上下留白值,计算当前行曲谱对应的音高条区域的高度之后,进一步包括:
根据当前行曲谱中第一个小节的横向开始位置、最后一个小节的横向结束位置、曲谱图形的纵向底部位置以及所述对应的音高条区域的高度,在当前行曲谱的曲谱图形的下方确定当前行曲谱对应的音高条区域。
5.根据权利要求4所述的音符音高条的显示方法,其特征在于,所述根据当前行曲谱中第一个小节的横向开始位置、最后一个小节的横向结束位置、曲谱图片的纵向底部位置以及所述对应的音高条区域的高度,在当前行曲谱的曲谱图形的下方确定当前行曲谱对应的音高条区域,之后,进一步包括:
根据当前行曲谱中各小节的横向结束位置,在当前行曲谱对应的音高条区域中绘制竖线。
6.根据权利要求3所述的音符音高条的显示方法,其特征在于,所述根据当前行曲谱的最大音高值和最小音高值以及预设的映射系数和上下留白值,计算当前行曲谱对应的音高条区域的高度,具体为:
根据高度计算公式,计算当前行曲谱对应的音高条区域的高度,所述高度计算公式为Hi=a×(MaxPitchi‑MinPitchi)+2×b,其中,Hi为当前行曲谱对应的音高条区域的高度,MaxPitchi和MinPitchi分别为当前行曲谱的最大音高值和最小音高值,a为预设的映射系数,b为预设的上下留白值。
7.根据权利要求3所述的音符音高条的显示方法,其特征在于,所述根据当前行曲谱中各音符的音高值、当前行曲谱的最小音高值、曲谱图形的纵向底部位置、音高条区域的高度以及预设的映射系数和上下留白值,分别计算当前行曲谱中各音符对应的音高条的纵向位置,具体为:
根据音符纵向位置计算公式,分别计算当前行曲谱中各音符的纵向位置,所述音符纵向位置计算公式为
yij=YMeasurei+Hi‑[a×(Pitchij‑MinPitchi)+b];
其中,yij为当前行曲谱中第j个音符对应的音高条的纵向位置,YMeasurei为当前行曲谱的曲谱图形的纵向底部位置,Hi为当前行曲谱对应的音高条区域的高度,Pitchij为当前行曲谱中第j个音符的音高值,MinPitchi为当前行曲谱的最小音高值,a为预设的映射系数,b为预设的上下留白值。
8.根据权利要求3所述的音符音高条的显示方法,其特征在于,所述分别根据当前行曲谱中各音符对应的音高条的横向起止位置,在当前行曲谱对应的音高条区域中绘制当前行曲谱中各音符对应的音高条图形,具体为:
分别根据当前行曲谱中各音符对应的音高条的横向起止位置、纵向位置以及预设的音高条高度、音高条图形样式和音高条颜色,在当前行曲谱对应的音高条区域中绘制当前行曲谱中各音符对应的音高条图形。
9.根据权利要求2所述的音符音高条的显示方法,其特征在于,所述分别根据当前行曲谱中各音符的起止时间及其所属小节的起止时间和横向起止位置,计算当前行曲谱中各音符对应的音高条的横向起止位置,具体为:
分别根据当前行曲谱中各小节的横向起止位置,计算各小节的横向宽度,并分别根据当前行曲谱中各小节的起止时间,计算各小节的持续时间;
根据横向开始位置计算公式,分别计算当前行曲谱中各音符对应的音高条的横向开始位置,所述横向开始位置计算公式为
xStartij=(PitchStartTimeij‑MeasureStartTimeij)/MeasureDurationij×MeasureWij+XMeasureStartij;
根据横向结束位置计算公式,分别计算当前行曲谱中各音符对应的音高条的横向结束位置,所述横向结束位置计算公式为
xEndij=(PitchEndTimeij‑MeasureStartTimeij)/MeasureDurationij×MeasureWij+XMeasureStartij;
其中,xStartij和xEndij分别为当前行曲谱中第j个音符对应的音高条的横向开始位置和横向结束位置,PitchStartTimeij和PitchEndTimeij分别为当前行曲谱中第j个音符的开始时间和结束时间;
MeasureDurationij为当前行曲谱中第j个音符所属小节的持续时间,
MeasureDurationij=MeasureEndTimeij‑MeasureStartTimeij,MeasureStartTimeij和MeasureEndTimeij分别为当前行曲谱中第j个音符所属小节的开始时间和结束时间;
MeasureWij为当前行曲谱中第j个音符所属小节的横向宽度,MeasureWij=XMeasureEndij‑XMeasureStartij,XMeasureStartij和XMeasureEndij分别为当前行曲谱中第j个音符所属小节的横向开始位置和横向结束位置。
10.根据权利要求1所述的音符音高条的显示方法,其特征在于,所述根据当前行曲谱的曲谱信息,确定当前行曲谱中各音符的起止时间以及各小节的起止时间之后,进一步包括:
分别对当前行曲谱中各音符的起止时间进行修正。
11.根据权利要求10所述的音符音高条的显示方法,其特征在于,所述分别对当前行曲谱中各音符的起止时间进行修正,具体为:
根据修正公式,分别对当前行曲谱中各音符的起止时间进行修正,所述修正公式为:
FixedPitchStartTimeij=PitchStartTimeij+PitchDurationij×c,
FixedPitchEndTimeij=PitchEndTimeij‑PitchDurationij×d;
其中,FixedPitchStartTimeij和FixedPitchEndTimeij分别为当前行曲谱中第j个音符修改后的开始时间和结束时间,PitchDurationij为当前行曲谱中第j个音符的持续时间,PitchDurationij=PitchEndTimeij‑PitchStartTimeij,PitchStartTimeij和PitchEndTimeij分别为当前行曲谱中第j个音符的开始时间和结束时间;c为预设的第一修正系数,d为预设的第二修正系数。
12.根据权利要求11所述的音符音高条的显示方法,其特征在于,若当前行曲谱中第j个音符为长音,则d>c,否则d=c。
13.根据权利要求12所述的音符音高条的显示方法,其特征在于,若一音符的音符时值大于预设时值或一音符带有呼吸记号,则判定所述一音符为长音。
14.根据权利要求1所述的音符音高条的显示方法,其特征在于,所述根据当前行曲谱的曲谱信息,确定当前行曲谱中各音符的起止时间以及各小节的起止时间,具体为:
根据当前行曲谱的音符信息和曲谱速度,计算当前行曲谱中各音符的持续时间;
将一音符之前的所有音符的持续时间之和作为所述一音符的开始时间,将一音符及其之前的所有音符的持续时间之和作为所述一音符的结束时间;
将一小节内的第一个音符的开始时间作为所述一小节的开始时间,将一小节内的最后一个音符的结束时间作为所述一小节的结束时间。
15.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1‑14任一项所述的方法。

说明书全文

音符音高条的显示方法及计算机可读存储介质

技术领域

[0001] 本发明涉及多媒体技术领域,尤其涉及一种音符音高条的显示方法及计算机可读存储介质。

背景技术

[0002] 在曲谱教学中,一般需要用标准音高条与用户演唱音高条对照的方式,来表示用户演唱过程的音准、节奏的正确情况,以达到纠错目的。
[0003] 在现有技术中,一般采用曲谱与标准音高条不对齐的方式进行显示,其中一种方式为:用一个单独的区域显示曲谱,另一个单独区域显示音高条。采用这种方式,曲谱与标准音高条两者之间不存在对照关系,更不存在对齐关系。
[0004] 另一种方式为:首先将曲谱显示为一整个长行;在该长行下方再显示标准音高条,也是显示为一个长行。这种方式中,曲谱和音高条这两个长行独立绘制,没有对齐关系。演唱过程中,这两个长行分别滚动到当前时刻。该呈现方式因缺乏曲谱音符与音高条的一一对照关系,演唱过程很难及时看到哪个音符演唱出错。

发明内容

[0005] 本发明所要解决的技术问题是:提供一种音符音高条的显示方法及计算机可读存储介质,可在保证曲谱结构不变的同时,使曲谱音符的音高条与曲谱音符对齐。
[0006] 为了解决上述技术问题,本发明采用的技术方案为:一种音符音高条的显示方法,包括:
[0007] 获取曲谱文件,并根据所述曲谱文件,获取各行曲谱的曲谱信息,所述曲谱信息包括音符信息、小节信息以及曲谱速度,所述音符信息包括音符的音高值和音符的拍数;
[0008] 遍历所述曲谱文件中的各行曲谱,依序获取一行曲谱作为当前行曲谱;
[0009] 根据当前行曲谱的曲谱信息,在画布中绘制当前行曲谱的曲谱图形,并获取所述曲谱图形中各小节的横向起止位置,所述横向起止位置包括横向开始位置和横向结束位置;
[0010] 根据当前行曲谱的曲谱信息,确定当前行曲谱中各音符的起止时间以及各小节的起止时间,所述起止时间包括开始时间和结束时间;
[0011] 分别根据当前行曲谱中各音符的起止时间及其所属小节的起止时间和横向起止位置,计算当前行曲谱中各音符对应的音高条的横向起止位置;
[0012] 分别根据当前行曲谱中各音符对应的音高条的横向起止位置,在当前行曲谱对应的音高条区域中绘制当前行曲谱中各音符对应的音高条图形。
[0013] 本发明还提出一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现如上所述的方法。
[0014] 本发明的有益效果在于:通过对曲谱文件中的各行曲谱逐行进行处理、绘制,可保证曲谱结构不变,即最终显示的曲谱排版与曲谱文件一致;通过根据音符的起止时间及其所属小节的起止时间和横向起止位置,来确定音符对应的音高条的横向起止位置,可保证音符及其音高条的对齐,从而可让用户在演唱过程中实时直观地观察到各音符对应的音高条。本发明可在保证曲谱结构不变的前提下,让音高条与音符对齐。附图说明
[0015] 图1为本发明的一种音符音高条的显示方法的流程图
[0016] 图2为本发明实施例一的方法流程图;
[0017] 图3为本发明实施例一的显示效果示意图;
[0018] 图4为本发明实施例二的音高条的显示效果示意图一;
[0019] 图5为本发明实施例二的音高条的显示效果示意图二。

具体实施方式

[0020] 为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图详予说明。
[0021] 请参阅图1,一种音符音高条的显示方法,包括:
[0022] 获取曲谱文件,并根据所述曲谱文件,获取各行曲谱的曲谱信息,所述曲谱信息包括音符信息、小节信息以及曲谱速度,所述音符信息包括音符的音高值和音符的拍数;
[0023] 遍历所述曲谱文件中的各行曲谱,依序获取一行曲谱作为当前行曲谱;
[0024] 根据当前行曲谱的曲谱信息,在画布中绘制当前行曲谱的曲谱图形,并获取所述曲谱图形中各小节的横向起止位置,所述横向起止位置包括横向开始位置和横向结束位置;
[0025] 根据当前行曲谱的曲谱信息,确定当前行曲谱中各音符的起止时间以及各小节的起止时间,所述起止时间包括开始时间和结束时间;
[0026] 分别根据当前行曲谱中各音符的起止时间及其所属小节的起止时间和横向起止位置,计算当前行曲谱中各音符对应的音高条的横向起止位置;
[0027] 分别根据当前行曲谱中各音符对应的音高条的横向起止位置,在当前行曲谱对应的音高条区域中绘制当前行曲谱中各音符对应的音高条图形。
[0028] 从上述描述可知,本发明的有益效果在于:可在保证曲谱结构不变的前提下,让音高条与音符对齐,让用户在演唱过程中,可以较轻松地、实时地观察到各音符的音长情况。
[0029] 在一个可选的实施例中,所述根据当前行曲谱的曲谱信息,在画布中绘制当前行曲谱的曲谱图形之前,进一步包括:
[0030] 创建画布,并以所述画布的左上为原点,向右方向为X轴正方向,向下方向为Y轴正方向,构建二维坐标系
[0031] 在一个可选的实施例中,所述根据当前行曲谱的曲谱信息,在画布中绘制当前行曲谱的曲谱图形,并获取所述曲谱图形中各小节的横向起止位置之后,进一步包括:
[0032] 获取所述曲谱图形的纵向底部位置;
[0033] 根据当前行曲谱中各音符的音高值,确定当前行曲谱的最大音高值和最小音高值;
[0034] 根据当前行曲谱的最大音高值和最小音高值以及预设的映射系数和上下留白值,计算当前行曲谱对应的音高条区域的高度;
[0035] 根据当前行曲谱中各音符的音高值、当前行曲谱的最小音高值、曲谱图形的纵向底部位置、音高条区域的高度以及预设的映射系数和上下留白值,分别计算当前行曲谱中各音符对应的音高条的纵向位置。
[0036] 由上述描述可知,通过根据每行曲谱中的最大音高值和最小音高值来确定对应的音高区域的高度,使得音高区域高度与各行曲谱的音高差值动态适配,相比固定的音高区域高度,可在保证音符音高条有合理的显示空间的同时,保证整体布局的紧凑性;通过根据音符的音高值来确定音符音高条的纵向位置,可直观地体现出不同音高条之间的音高关系。
[0037] 在一个可选的实施例中,所述根据当前行曲谱的最大音高值和最小音高值以及预设的映射系数和上下留白值,计算当前行曲谱对应的音高条区域的高度之后,进一步包括:
[0038] 根据当前行曲谱中第一个小节的横向开始位置、最后一个小节的横向结束位置、曲谱图形的纵向底部位置以及所述对应的音高条区域的高度,在当前行曲谱的曲谱图形的下方确定当前行曲谱对应的音高条区域。
[0039] 由上述描述可知,可保证曲谱与音高条区域的严格对齐。
[0040] 在一个可选的实施例中,所述根据当前行曲谱中第一个小节的横向开始位置、最后一个小节的横向结束位置、曲谱图片的纵向底部位置以及所述对应的音高条区域的高度,在当前行曲谱的曲谱图形的下方确定当前行曲谱对应的音高条区域之后,进一步包括:
[0041] 根据当前行曲谱中各小节的横向结束位置,在当前行曲谱对应的音高条区域中绘制竖线。
[0042] 由上述描述可知,可在音高条区域内绘制出小节分隔线,分隔各小节的音高条,从而更清楚地看到各音高条所属小节。
[0043] 在一个可选的实施例中,所述根据当前行曲谱的最大音高值和最小音高值以及预设的映射系数和上下留白值,计算当前行曲谱对应的音高条区域的高度,具体为:
[0044] 根据高度计算公式,计算当前行曲谱对应的音高条区域的高度,所述高度计算公式为Hi=a×(MaxPitchi‑MinPitchi)+2×b,其中,Hi为当前行曲谱对应的音高条区域的高度,MaxPitchi和MinPitchi分别为当前行曲谱的最大音高值和最小音高值,a为预设的映射系数,b为预设的上下留白值。
[0045] 由上述描述可知,使得音高区域高度与各行曲谱的音高差值动态适配。
[0046] 在一个可选的实施例中,所述根据当前行曲谱中各音符的音高值、当前行曲谱的最小音高值、曲谱图形的纵向底部位置、音高条区域的高度以及预设的映射系数和上下留白值,分别计算当前行曲谱中各音符对应的音高条的纵向位置,具体为:
[0047] 根据音符纵向位置计算公式,分别计算当前行曲谱中各音符的纵向位置,所述音符纵向位置计算公式为
[0048] yij=YMeasurei+Hi‑[a×(Pitchij‑MinPitchi)+b];
[0049] 其中,yij为当前行曲谱中第j个音符对应的音高条的纵向位置,YMeasurei为当前行曲谱的曲谱图形的纵向底部位置,Hi为当前行曲谱对应的音高条区域的高度,Pitchij为当前行曲谱中第j个音符的音高值,MinPitchi为当前行曲谱的最小音高值,a为预设的映射系数,b为预设的上下留白值。
[0050] 由上述描述可知,通过根据音符的音高值来确定音符音高条的纵向位置,可直观地体现出不同音高条之间的音高关系。
[0051] 在一个可选的实施例中,所述分别根据当前行曲谱中各音符对应的音高条的横向起止位置,在当前行曲谱对应的音高条区域中绘制当前行曲谱中各音符对应的音高条图形,具体为:
[0052] 分别根据当前行曲谱中各音符对应的音高条的横向起止位置、纵向位置以及预设的音高条高度、音高条图形样式和音高条颜色,在当前行曲谱对应的音高条区域中绘制当前行曲谱中各音符对应的音高条图形。
[0053] 在一个可选的实施例中,所述分别根据当前行曲谱中各音符的起止时间及其所属小节的起止时间和横向起止位置,计算当前行曲谱中各音符对应的音高条的横向起止位置,具体为:
[0054] 分别根据当前行曲谱中各小节的横向起止位置,计算各小节的横向宽度,并分别根据当前行曲谱中各小节的起止时间,计算各小节的持续时间;
[0055] 根据横向开始位置计算公式,分别计算当前行曲谱中各音符对应的音高条的横向开始位置,所述横向开始位置计算公式为
[0056] xStartij=(PitchStartTimeij‑MeasureStartTimeij)/MeasureDurationij×MeasureWij
[0057] +XMeasureStartij;
[0058] 根据横向结束位置计算公式,分别计算当前行曲谱中各音符对应的音高条的横向结束位置,所述横向结束位置计算公式为
[0059] xEndij=(PitchEndTimeij‑MeasureStartTimeij)/MeasureDurationij×MeasureWij
[0060] +XMeasureStartij;
[0061] 其中,xStartij和xEndij分别为当前行曲谱中第j个音符对应的音高条的横向开始位置和横向结束位置,PitchStartTimeij和PitchEndTimeij分别为当前行曲谱中第j个音符的开始时间和结束时间;
[0062] MeasureDurationij为当前行曲谱中第j个音符所属小节的持续时间,MeasureDurationij=MeasureEndTimeij‑MeasureStartTimeij,MeasureStartTimeij和MeasureEndTimeij分别为当前行曲谱中第j个音符所属小节的开始时间和结束时间;
[0063] MeasureWij为当前行曲谱中第j个音符所属小节的横向宽度,MeasureWij=XMeasureEndij‑XMeasureStartij,XMeasureStartij和XMeasureEndij分别为当前行曲谱中第j个音符所属小节的横向开始位置和横向结束位置。
[0064] 由上述描述可知,根据音符在小节内的时间比例关系,确定其对应的音高条在小节内的横向起止位置,以保证各小节音符与音高条对齐。
[0065] 在一个可选的实施例中,所述根据当前行曲谱的曲谱信息,确定当前行曲谱中各音符的起止时间以及各小节的起止时间之后,进一步包括:
[0066] 分别对当前行曲谱中各音符的起止时间进行修正。
[0067] 在一个可选的实施例中,所述分别对当前行曲谱中各音符的起止时间进行修正,具体为:
[0068] 根据修正公式,分别对当前行曲谱中各音符的起止时间进行修正,所述修正公式为:FixedPitchStartTimeij=PitchStartTimeij+PitchDurationij×c,FixedPitchEndTimeij=PitchEndTimeij‑PitchDurationij×d;
[0069] 其中,FixedPitchStartTimeij和FixedPitchEndTimeij分别为当前行曲谱中第j个音符修改后的开始时间和结束时间,PitchDurationij为当前行曲谱中第j个音符的持续时间,PitchDurationij=PitchEndTimeij‑PitchStartTimeij,PitchStartTimeij和PitchEndTimeij分别为当前行曲谱中第j个音符的开始时间和结束时间;c为预设的第一修正系数,d为预设的第二修正系数。
[0070] 由上述描述可知,通过修正音符的起止时间,从而修正对应的音高条的横向起止位置,使得用户在演唱的时候,可以按更自然的方式跟随音符音高条演唱。
[0071] 在一个可选的实施例中,若当前行曲谱中第j个音符为长音,则d>c,否则d=c。
[0072] 由上述描述可知,若音符为长音,则对其时长进行进一步缩减。
[0073] 在一个可选的实施例中,若一音符的音符时值大于预设时值或一音符带有呼吸记号,则判定所述一音符为长音。
[0074] 在一个可选的实施例中,所述根据当前行曲谱的曲谱信息,确定当前行曲谱中各音符的起止时间以及各小节的起止时间,具体为:
[0075] 根据当前行曲谱的音符信息和曲谱速度,计算当前行曲谱中各音符的持续时间;
[0076] 将一音符之前的所有音符的持续时间之和作为所述一音符的开始时间,将一音符及其之前的所有音符的持续时间之和作为所述一音符的结束时间;
[0077] 将一小节内的第一个音符的开始时间作为所述一小节的开始时间,将一小节内的最后一个音符的结束时间作为所述一小节的结束时间。
[0078] 本发明还提出一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现如上所述的方法。
[0079] 实施例一
[0080] 请参照图2‑3,本发明的实施例一为:一种音符音高条的显示方法,可应用于曲谱教学,如图2所示,包括如下步骤:
[0081] S1:获取曲谱文件,即加载自定义格式的曲谱文件,并根据所述曲谱文件,获取各行曲谱的曲谱信息,其中,曲谱文件指记录曲谱信息的数据流,可以是本地文件,数据库中的记录,或者是内嵌在应用中的资源等,其内部格式可以是musicxml,abc记谱法,或自定义的曲谱信息组织形式。曲谱信息包括音符信息、小节信息以及曲谱速度(以单位拍计,一分钟演唱多少拍),音符信息包括音符的MIDI值和音符的拍数(以单位拍计,共多少拍),根据MIDI值可得到音符的音高值。
[0082] S2:创建画布,并通过H5 canvas技术在画布上渲染曲谱头,包括标题、大调、拍号、作者等信息。
[0083] 进一步地,本实施例中,以画布的左上角为原点,向右方向为X轴正方向,向下方向为Y轴正方向,构建二维坐标系。
[0084] S3:遍历所述曲谱文件中的各行曲谱,依序获取一行曲谱作为当前行曲谱,即获取第i行曲谱作为当前行曲谱,i的初始值为1。
[0085] S4:根据当前行曲谱的曲谱信息,在画布中绘制当前行曲谱的曲谱图形,并获取所述曲谱图形中各小节的横向起止位置以及所述曲谱图形的纵向底部位置,所述横向起止位置包括横向开始位置和横向结束位置。本实施例中,曲谱图形可为由简谱组成的图形。
[0086] S5:根据当前行曲谱的曲谱信息,确定当前行曲谱中各音符的起止时间、各小节的起止时间以及最大音高值和最小音高值,其中,起止时间包括开始时间和结束时间。
[0087] 具体地,根据当前行曲谱的音符信息和曲谱速度,计算当前行曲谱中各音符的持续时间,即音符的持续时间PitchDuration=音符的拍数×(60×1000/曲谱速度),单位为毫秒。
[0088] 对于音符的起止时间,将一音符之前的所有音符的持续时间之和作为所述一音符的开始时间,将一音符及其之前的所有音符的持续时间之和作为所述一音符的结束时间;即第n个音符的开始时间=第1个音符至第n‑1个音符的持续时间累加和,第n个音符的结束时间=第1个音符至第n个音符的持续时间累加和。
[0089] 对于小节的起止时间,将一小节内的第一个音符的开始时间作为所述一小节的开始时间,将一小节内的最后一个音符的结束时间作为所述一小节的结束时间;即小节开始时间MeasureStartTime=小节内第1个音符的开始时间,小节结束时间MeasureEndTime=小节内第1个音符的结束时间。
[0090] 最后,根据当前行曲谱中各音符的音高值,确定当前行曲谱的最大音高值和最小音高值。
[0091] S6:根据当前行曲谱的最大音高值和最小音高值以及预设的映射系数和上下留白值,计算当前行曲谱对应的音高条区域的高度。
[0092] 具体地,根据高度计算公式Hi=a×(MaxPitchi‑MinPitchi)+2×b,计算当前行曲谱对应的音高条区域的高度Hi,其中,MaxPitchi和MinPitchi分别为当前行曲谱的最大音高值和最小音高值,a为预设的映射系数,b为预设的上下留白值。
[0093] 本实施例中,a=5,b=15。
[0094] S7:根据当前行曲谱中第一个小节的横向开始位置、最后一个小节的横向结束位置、曲谱图形的纵向底部位置以及所述对应的音高条区域的高度,在当前行曲谱的曲谱图形的下方确定当前行曲谱对应的音高条区域,并在音高条区域内绘制小节分隔线。
[0095] 例如,假设当前行曲谱的曲谱图形的纵向底部位置为YMeasurei,则当前行曲谱对应的音高条区域为左上顶点(XMeasureStart[0],YMeasurei),右下顶点(XMeasureEnd[‑1],YMeasurei+H)的矩形区域,其中,XMeasureStart[0]为当前行曲谱中第一个小节的横向开始位置,XMeasureEnd[‑1]为当前行曲谱中最后一个小节的横向结束位置。
[0096] 进一步地,确定音高条区域后,在所述音高条区域内填充预设的背景色,该背景色区别于曲谱图形的底色,本实施例中为淡黄色。
[0097] 然后,根据当前行曲谱中各小节的横向结束位置(即曲谱中的小节线的横向位置),在当前行曲谱对应的音高条区域中绘制竖线,作为小节分隔线。本实施例中,小节分隔线的长度与当前行曲谱对应的音高条区域的高度一致,即在音高条区域绘制从YMeasure到YMeasure+H的竖直线条。
[0098] S8:根据当前行曲谱中各音符的音高值、当前行曲谱的最小音高值、曲谱图形的纵向底部位置、音高条区域的高度以及预设的映射系数和上下留白值,分别计算当前行曲谱中各音符对应的音高条的纵向位置。
[0099] 具体地,根据音符纵向位置计算公式,分别计算当前行曲谱中各音符的纵向位置,所述音符纵向位置计算公式为:
[0100] yij=YMeasurei+Hi‑yij’,yij’=a×(Pitchij‑MinPitchi)+b;
[0101] 其中,yij为当前行曲谱中第j个音符对应的音高条的纵向位置,YMeasurei为当前行曲谱的曲谱图形的纵向底部位置,Hi为当前行曲谱对应的音高条区域的高度,Pitchij为当前行曲谱中第j个音符的音高值,MinPitchi为当前行曲谱的最小音高值。
[0102] 在一个可选的实施例中,也可以将当前行曲谱对应的音高条区域绘制在当前行曲谱的曲谱图形的上方,在该种情况下,步骤S4中获取曲谱图形的纵向顶部位置,步骤S7中根据曲谱图形的纵向顶部位置,在当前行曲谱的曲谱图形的上方确定当前行曲谱对应的音高条区域。在本步骤中,音符的纵向位置即曲谱图形的纵向顶部位置减去yij’。
[0103] S9:分别根据当前行曲谱中各音符的起止时间及其所属小节的起止时间和横向起止位置,计算当前行曲谱中各音符对应的音高条的横向起止位置。
[0104] 具体地,首先,分别根据当前行曲谱中各小节的横向起止位置,计算各小节的横向宽度,即小节的横向宽度MeasureW=小节的横向结束位置XMeasureEnd‑小节的横向开始位置XMeasureStart;并分别根据当前行曲谱中各小节的起止时间,计算各小节的持续时间,即小节的持续时间MeasureDuration=小节的结束时间MeasureEndTime‑小节的开始时间MeasureStartTime。
[0105] 然后,根据横向开始位置计算公式和横向结束位置计算公式,分别计算当前行曲谱中各音符对应的音高条的横向开始位置和横向结束位置。
[0106] 所述横向开始位置计算公式为:
[0107] xStartij=(PitchStartTimeij‑MeasureStartTimeij)/MeasureDurationij×MeasureWij
[0108] +XMeasureStartij;
[0109] 所述横向结束位置计算公式为:
[0110] xEndij=(PitchEndTimeij‑MeasureStartTimeij)/MeasureDurationij×MeasureWij
[0111] +XMeasureStartij;
[0112] 其中,xStartij和xEndij分别为当前行曲谱中第j个音符对应的音高条的横向开始位置和横向结束位置,PitchStartTimeij和PitchEndTimeij分别为当前行曲谱中第j个音符的开始时间和结束时间;
[0113] MeasureDurationij为当前行曲谱中第j个音符所属小节的持续时间,MeasureDurationij=MeasureEndTimeij‑MeasureStartTimeij,MeasureStartTimeij和MeasureEndTimeij分别为当前行曲谱中第j个音符所属小节的开始时间和结束时间;MeasureWij为当前行曲谱中第j个音符所属小节的横向宽度,MeasureWij=XMeasureEndij‑XMeasureStartij,XMeasureStartij和XMeasureEndij分别为当前行曲谱中第j个音符所属小节的横向开始位置和横向结束位置。
[0114] 根据音符在小节内的时间比例关系,确定其对应的音高条在小节内的横向起止位置,以保证各小节音符与音高条对齐。也就是说,相同时长的音高条,在不同小节,可能宽度不同,从而达到均衡对齐的效果。
[0115] S10:分别根据当前行曲谱中各音符对应的音高条的横向起止位置、纵向位置以及预设的音高条高度、音高条图形样式和音高条颜色,在当前行曲谱对应的音高条区域中绘制当前行曲谱中各音符对应的音高条图形。
[0116] 本实施例中,音高条图形样式为矩形,音高条颜色为绿色(边框色为绿色,填充色无),音高条高度为5,以音高条的横向开始位置为xStart为矩形左侧,以横向结束位置xEnd为矩形右侧,在当前行曲谱对应的音高条区域中绘制空心矩形,即为音符对应的音高条。
[0117] S11:判断是否遍历完曲谱文件中的各行曲谱,若是,即完成绘制,最终得到的效果图如图3所示;若否,则执行步骤S12。
[0118] S12:继续获取下一行曲谱作为当前行曲谱,即令i=i+1,然后返回执行步骤S3。
[0119] 其中,步骤S9与步骤S6‑S8可不分先后执行,步骤S7中绘制小节分隔线的步骤也可以在步骤S10之后执行。
[0120] 本实施例通过对曲谱文件中的各行曲谱逐行进行处理、绘制,可保证曲谱结构不变,即最终显示的曲谱排版与曲谱文件一致;通过根据每行曲谱中的最大音高值和最小音高值来确定对应的音高区域的高度,使得音高区域高度与各行曲谱的音高差值动态适配,相比固定的音高区域高度,可在保证音符音高条有合理的显示空间的同时,保证整体布局的紧凑性;通过根据音符的音高值来确定音符音高条的纵向位置,可直观地体现出不同音高条之间的音高关系;通过根据音符的起止时间及其所属小节的起止时间和横向起止位置,来确定音符对应的音高条的横向起止位置,可保证音符及其音高条的对齐,从而可让用户在演唱过程中实时直观地观察到各音符对应的音高条。
[0121] 实施例二
[0122] 请参照图4‑5,本实施例是实施例一的进一步拓展。
[0123] 由于曲谱中每个音符的起止时间是紧密排列的,上一个音符的结束时间就是下一个音符的开始时间,所以对应的每个音高条的演唱时刻也是紧密排列。然而,实际演唱时人声音高存在过渡与换气的影响,不可能按照这样严格的方式唱。因此,本实施例中,在进行音高条的绘制和评分时,采用“头尾缩减算法”对音符的音高条的横向起止位置进行修正。
[0124] 具体地,步骤S5之后,还包括:分别对当前行曲谱中各音符的起止时间进行修正。在步骤S9中,用修正后的各音符的起止时间,计算对应的音高条的横向起止位置。
[0125] 具体地,根据修正公式,分别对当前行曲谱中各音符的起止时间进行修正,所述修正公式为:
[0126] FixedPitchStartTimeij=PitchStartTimeij+PitchDurationij×c,[0127] FixedPitchEndTimeij=PitchEndTimeij‑PitchDurationij×d;
[0128] 其中,PitchDurationij为当前行曲谱中第j个音符的持续时间,PitchDurationij=PitchEndTimeij‑PitchStartTimeij,PitchStartTimeij和PitchEndTimeij分别为当前行曲谱中第j个音符的开始时间和结束时间,FixedPitchStartTimeij和FixedPitchEndTimeij分别为当前行曲谱中第j个音符修改后的开始时间和结束时间;c为预设的第一修正系数,d为预设的第二修正系数。
[0129] 或者,直接将各音符的时长缩减一个定值实现对起止时间的修正,例如,FixedPitchStartTimeij=PitchStartTimeij+C,FixedPitchEndTimeij=PitchEndTimeij‑D,其中,C为预设的第一修正时间,D为预设的第二修正时间。
[0130] 在一个可选的实施例中,c=d=0.1。后续绘制的音高条如图4所示。
[0131] 在另一个可选的实施例中,对长音进行进一步地缩减,具体地,若当前行曲谱中第j个音符为长音,则d>c,否则d=c。例如,c=0.1,d=0.2,此时即该音符的时长总共减去PitchDurationij×0.3。后续绘制的音高条如图5所示。
[0132] 对于长音的判定,可以打谱时人工设定标志,也可以程序判定。例如,一种判定规则为,将符合下述条件之一的音符判定为长音:
[0133] (1)音符时值大于预设时值,例如:音符时值大于或等于二分音符,如二分音符、全音符;或者获取曲谱文件中所有音符的音符时值,将音符时值较大的10%的音符判定为长音。
[0134] (2)带有呼吸记号的音符。曲谱中的呼吸记号一般用“V”表示,用于给演奏者或演唱者进行提示,遇到符号Ⅴ,表示旋律进行到这里,一个乐句已经结束,需要抬手或换气。
[0135] 进一步地,在具体应用时,在进行音高条的绘制时,可使用普通的头尾缩减算法(即c=d)对音符的起止时间进行修正,从而对音高条的横向起止位置进行修正。而在系统内部进行评分时,可使用长音的缩减算法(即d>c)对音符的起止时间进行修正。
[0136] 本实施例通过将音高条进行适当地头尾缩减,将有效评分时间集中在音符的中间部分,也就是集中在人声更稳定的部分,在用户演唱的时候,可以让用户按更自然的方式跟随音符的音高条演唱。
[0137] 实施例三
[0138] 本实施例是对应上述实施例的一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现如上述实施例中一种音符音高条的显示方法的各个步骤,且能达到相同的技术效果,此处不再累述。
[0139] 综上所述,本发明提供的一种音符音高条的显示方法及计算机可读存储介质,通过对曲谱文件中的各行曲谱逐行进行处理、绘制,可保证曲谱结构不变,即最终显示的曲谱排版与曲谱文件一致;通过根据每行曲谱中的最大音高值和最小音高值来确定对应的音高区域的高度,使得音高区域高度与各行曲谱的音高差值动态适配,相比固定的音高区域高度,可在保证音符音高条有合理的显示空间的同时,保证整体布局的紧凑性;通过根据音符的音高值来确定音符音高条的纵向位置,可直观地体现出不同音高条之间的音高关系;通过根据音符的起止时间及其所属小节的起止时间和横向起止位置,来确定音符对应的音高条的横向起止位置,可保证音符及其音高条的对齐,从而可让用户在演唱过程中实时直观地观察到各音符对应的音高条;通过将音高条进行适当地头尾缩减,将有效评分时间集中在音符的中间部分,也就是集中在人声更稳定的部分,在用户演唱的时候,可以让用户按更自然的方式跟随音符的音高条演唱。
[0140] 以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。
QQ群二维码
意见反馈