主要工作:基于前述的基本概念,研究并编程实现样板歌曲中各种乐汇关系(R(1)~ R(11))的判定算法。 要求如下:要用c#语言编写 1我要做的毕设内容就是R1到R11的乐汇关系的判别,现在先出来R1到R11的判别代码. 1. 诗句、乐汇、汉字分布与乐汇元结构:将现有歌曲的歌词书写成诗歌形式之后,每行的汉字串称为一个诗句;在歌曲中一个诗句所对应的旋律片段称为乐汇;在歌曲中乐汇下方诗句的汉字个数及每个汉字与其上方乐汇中音符的位置关系称为汉字分布;汉字分布、乐汇的节奏及乐汇相邻音符间的音程序列关系,统称为乐汇元结构,记作M(n),其中,n为诗句的汉字个数。2. 乐汇的关系与乐汇元结构的关系:在一个由现有歌曲组成的样板歌曲集合中,任取二个乐汇MA, MB,若它们满足表一所述的关系R(j),则称乐汇MA与乐汇MB存在关系R(j);显然,如果由二个乐汇元结构确定的某二个乐汇存在某个关系R(j),则由这二个乐汇元结构确定的其它任意二个乐汇也必存在这个关系R(j),于是,乐汇的关系亦可平移到乐汇元结构的关系。即,若二个乐汇元结构确定的某二个乐汇存在某个关系R(j),则称这二个乐汇元结构也存在关系R(j)且反之亦然。 表一: 乐汇的关系与乐汇元结构的关系 R(No) | 关系名 | 描述 | R(1) | 重复关系 | 1) MA=MB; 2)二者在歌曲中相应诗句的汉字数目相等; 3) 二个诗句具有相同的汉字分布 | R(2) | 节奏重复关系 | 1) MA的节奏=MB的节奏; 2)二者在歌曲中相应诗句的汉字数目相等; 3) 二个诗句具有相同的汉字分布 | R(3) | 自由模进关系 | 1) MA与MB满足自由模进关系; 2)二者在歌曲中相应诗句的汉字数目相等; 3) 二个诗句具有相同的汉字分布 | R(4) | 严格模进关系 | 1)MA与MB的旋律满足严格模进关系; 2)二者在歌曲中相应诗句的汉字数目相等; 3) 二个诗句具有相同的汉字分布 | R(5~8) | 对比关系A | MA可分解成mA1mA2;MB可分解成mB1mB2;且:1)mA1的总时值≥mA2的总时值;2)mB1的总时值≥mB2的总时值;3)mA1与mB1存在某一关系R(j),其中,1≤j≤4 | R(9-10) | 对比关系B | MA可分解成mA1mA2;MB可分解成mB1mB2;且:1)mA1的总时值<mA2的总时值;2)mB1的总时值<mB2的总时值;3)mA2与mB2存在某一关系R(j),其中,1≤j≤4 | R(11) | 其它对比关系 | 除关系R(1)~ R(10)以外的任意一首现有歌曲内的任意二个相邻乐汇的关系 | 2就是从这块内容开始写,因为这是系统中原来就带有的,可能还要稍稍改动一下。把这部分先注释掉,然后再在下面重新开始写 3 //创作手法识别,主要是论文定义中的各种重复关系 [C#] 纯文本查看 复制代码 private void GetRepetition(string Rhythm,string[] RhythmList, string[] PitchList, string[] RelativeScale, int[]H_State,int[]O_State, ref string[] MethodTag)
{
int BarDuration = GetBarDuration(Rhythm);
int Loca = 0;
double DurationAll = 0;
double DurationPre = 0;
double interval = 0;
double BarNumtemp = 0;
int BarNum = 0;
for (int i = 1; i <= int.Parse(RhythmList[0]); i++)//查找严格重复和节奏重复
{
double Duration1 = GetDuration(RhythmList, Rhythm);
DurationAll += Duration1;
DurationPre = DurationAll;
for (int j = i + 1; j < int.Parse(RhythmList[0]); j++)
{
double Duration2 = GetDuration(RhythmList[j], Rhythm);
DurationAll += Duration2;
if (RhythmList.Contains(RhythmList[j]) && RhythmList != RhythmList[j] && Duration2 >= BarDuration)//字串包含的情况
{
interval = DurationAll - DurationPre;
BarNumtemp = interval / BarDuration;
BarNum = (int)BarNumtemp;
if (BarNum <= 8)
MethodTag[Loca++] = O_State.ToString()+","+O_State[j].ToString()+"/"+"3," + H_State.ToString() + "," + H_State[j].ToString() +"/"+BarNum;
//int y =0;
}
else if (RhythmList[j].Contains(RhythmList) && RhythmList != RhythmList[j] && Duration1 >= BarDuration)
{
interval = DurationAll - DurationPre;
BarNumtemp = interval / BarDuration;
BarNum = (int)BarNumtemp;
if (BarNum <= 8)
MethodTag[Loca++] = O_State.ToString() + "," + O_State[j].ToString() + "/" + "3," + H_State.ToString() + "," + H_State[j].ToString() + "/" + BarNum;
// int y = 0;
}
if (RhythmList == RhythmList[j] && PitchList == PitchList[j])//严格重复
{
interval = DurationAll - DurationPre;
BarNumtemp = interval / BarDuration;
BarNum = (int)BarNumtemp;
if (BarNum <= 8)
MethodTag[Loca++] = O_State.ToString() + "," + O_State[j].ToString() + "/" + "1," + H_State.ToString() + "," + H_State[j].ToString() + "/" + BarNum;
//int y=0;
}
else
if (RhythmList == RhythmList[j])//节奏重复
{
interval = DurationAll - DurationPre;
BarNumtemp = interval / BarDuration;
BarNum = (int)BarNumtemp;
if(BarNum<=8)
MethodTag[Loca++] = O_State.ToString() + "," + O_State[j].ToString() + "/" + "2," + H_State.ToString() + "," + H_State[j].ToString() + "/" + BarNum;
//int y=0;
}
}
}
}
4在写自由模进和严格模进的代码是可以参照下面这部分内容。(因为这是我老师要求这样做的) 会编写判定二个数列的相邻元素差序列是一致的算法吗?
数列1:A(1),A(2),。。。,A(N)
数列2:B(1),B(2),。。。,B(N)
令dA(i)=A(i+1)-A(i);dB(i)=B(i+1)-B(i)
对i=1,。。。,N
若dA(i)=dB(i)
则称数列1与数列2的相邻元素差序列是一致的。
判断二个乐汇是否为严格模进,就是判定
1)这二个乐汇是否为节奏一致==2)若这二个乐汇是节奏一致的,则再判定二个乐汇所对应的音符的音高序列的音程序列是否一致。
你只要知道如何计算二个相邻音符的音高差的计算方法就可以了。音程就是音高差。
计算音高差就是对2个音高作12进制的减法运算。减法运算就是2个音高相差几个半音
|