基于神经网络的声乐演奏评价系统研究及其在钢(2)
相关提取模块是系统实现的基础,并在上文中给出了提取公式,本章重点分析匹配比较模块。该模块的功能是对表演信息与表演乐谱的比较,以判断表演者和乐谱的相似程度,找出二者间的差距。比较分为两部分,一部分为演奏特征和电子乐谱的定性比较,判断弹奏的准确性,另一部分为系统根据演奏结果与实际乐谱的定量对比并给出演奏分数。演奏准确性界面,如图7所示。
图7 准确性评价界面
界面中蓝线表示弹奏者弹奏的音节,一旦与乐谱出现差异部分,蓝线会变成红色,模块的部分代码如下。
提取模块关键代码:
//OnEventInput函数部分代码
//_noteMgr为标准音管理NoteManager类的实例,实例化时候从课程信息类里
//获得曲谱信息作为构造参数,并根据曲谱的小节、旋律、和弦信息对标准音归类。
//Note类存储标准音的信息,包括音高、大小、开始、结束等音的属性。
Note curNote=NULL;
if (=90H)//当Midi消息为按下键时
curNote_(true);//curNode为当前时间段内标准音(开始发音)
else if (==80H)//当Midi消息为释放键时
//curNode为当前时间段内标准音(结束发音)
curNote_(false);
//由系统时间和弹奏开始的时间换算得出当前的绝对时间
LONG curtime=getCurrentTime();
if (curNote!=NULL && abs()
//limit time为判断错音的限制时间
//确定当前Midi消息的绝对时间
=curtime;
//当前Midi消息与标准音对应,当对应数超过两个则进行和弦判断
(evt);
//如果Midi信号超过限制时间,则认为这个键弹错,即最坏的结果。
得到每个标准音Note对应的信息后,就可以根据小节、旋律的归类计算神经网络模型的输
//得到以记为标号的小节的节奏特性
float getSegmentRhythmValue (int id)
{
int noteNum=noteMgr->getSegmentNum(id);//小节的单符数量
value=0;
for(int i=0;i
{
//按照小节编号获得音
Note*note=_noteMgr->getSegmentNote(id,i);
//计算标准音和Midi信号时长的差值
value+=note->CalculateRhythm();
}
//startMidiEvent和endMidiEvent是Midi信号实例,如果在弹奏的时候没有加入,则以默认的
float Note::ClculateRhythm()
{
return abs(_)
+abs();
系统中定量对比是调式调性、触键、时值音高和速度的综合结果。其中调式调性占评判总分的30%,触键占评判总分的20%,时值音高占评判总分的30%,速度占评判总分的20%。模块的关键代码如下,模块界面如图8所示。
图8 演奏评分界面
定量评价模块关键代码:
//-segmentMgr
for(int i=0;i<_segmentMgr->getSegmentNum;i++)//循环次数为小节数量
{
//rhythmInput为输入节奏数据数组,类型为float
rhythmInput[i]=_(i);
//}itchInput为音高数据数组,实际上表示小节内的错音数
}itchInput[i]=_(i);
//_metronomeInput为节拍数据数组
metronomeInput[i]=_(i);
}
//同样的方法可以获得和弦和旋律输入数据,然后进行数据归一化处理
for(i=0;i<_segmentMge->getSegmentNum;}i++)//输入小节神经网络数据
{
(i*3+0,rhythmInput[i])://节奏
(i*3+1,}itchInput[i]);//音高
(i*3+2,metronomeInput[i]);//节拍
}
//同样的方法可以输入神经网络和弦和旋律数据
();//向前计算评价值
GetOutput();//获得评价输出值
3.2 系统应用分析
系统完成后对其应用效果进行了试验验证。对于同一首乐谱分别选取了三位演奏者进行表演,其中一位是钢琴教师,学生1为钢琴8级别,学生2为钢琴7级,三位演奏者演奏完成后分数,如表1所示。
表1 三名演奏者分数组别演奏得分1演奏得分2演奏得分3演奏得分4演奏得分5平均分教师学生学生
文章来源:《电站系统工程》 网址: http://www.dzxtgczz.cn/qikandaodu/2021/0728/564.html