开篇:润墨网以专业的文秘视角,为您筛选了一篇情感音色模型测试实验平台的搭建范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
【摘要】以C#语言在.NET框架下编写代码为基础,搭建情感音色模型实验平台,能够为通过计算机建立的虚拟音乐情感音色建模提供较为理想的测试手段和途径,从而有效解决音乐录制的灵活及成本问题。
【关键词】情感音色测试实验 C#语言
以C#语言在.NET框架下编写代码是情感音色模型测试的理想实验平台。C#拥有Visual Basic简易使用的特性和C/C++的强大功能,它是第一个组件导向(Component-oriented)的程序语言,并且和C++与Java一样亦为对象导向(object-oriented)程序语言。系统平台主要包括以下几个功能:1、音符的基音选择;2、音符的泛音设定;3、音符的包络设定;4、输入音符;5、音符输入完毕并输出。
平台的架构过程主要如下:
一、主要参数的设定
搭建系统平台架构开始之前,主要参数含义的设定尤其重要, 参数主要有采样频率所决定的采样时间间隔,采样时间的音符间隔,采样音符时间间隔,主要包括采样频率所决定的采样时间间隔,每个音符的采样时间,音符的系数等等,它们的核心算法如下:
public const double PI = 3.14159265;
public double timeSpace=1/(double)(44100);
public int everyNoteSampleTimes = 26460;
public int everyNoteTimeSpace = 0; //音符之间间隔
public List finalList=new List(); //构建泛型集合,存储编译为wav的数据
public const int keynoteModulus = 3350; //基音系数
二、音符的基音选择
为了给这个音符选择它的基音。系统平台可以通过先设定音符在简谱中的符号,再选择此音符的音高分组以及是否存在升调来定位音符基音。
三、音符的泛音设定
音符的泛音设定主要采用以下两种形式:
1.只选择存在泛音,而不做具体的精确设定,系统为其分配默认的泛音,具体大小由基音系数除以泛音阶数决定。
2.选择存在泛音之后,再精确定义各个泛音参数的大小。这种形式主要可以通过一个可视化的界面来进行设定,设定界面下图3-1所示:
图3-1 泛音的设定方法
四、音符的包络设定
由于包络函数一般情况下都是比较复杂的,为了方便,这时我们可以通过一个专门的方法来对其进行设定,只有主方法在用到它时再进行方法的调用就可以了。核心算法举例如下:
private double require_coefficient(double time) //获得包络系数
{
if (time < 0.025)
{
return ((-10) * time + 1);
}
else if (time < 0.13)
{
return ((2.38) * time + 0.69);
}
else if (time < 0.25)
{
return (0.125 * Math.Sin(52.36 * time + 1.4408) + 0.875);
}
else if (time < 0.40)
{
return 0.125 * Math.Sin(48.888 * time + 1.3208) + 0.875;
}
else if (time < 0.53)
{
return (0.125 * Math.Sin(48.3323 * time + 1.1708) + 0.875);
}
else
{
return ((-14.29) * time + 8.57);
}
}
五、输入音符
确定了音符的各个参数后,我们就可以对建立好的模型进行基本信息的输入并转化到计算机内存中。
private void button2_Click(object sender, EventArgs e)
{
string note = AcquireNote(); //获取音符
bool aaa = data.yingaoduizhao.Any(c => c.yinfu == note);
if (aaa == false)
{
MessageBox.Show("请合法选择\"#\"");
IniControl();
return;
}
require_Text(); //获取泛音的设定
float frequency;
frequency = getFrequency(note); //获取频率
double time = 0;
for (int i = 0; i < everyNoteSampleTimes; i++)
{
short st = Convert.ToInt16(keynoteModulus * Math.Sin(2 * PI * frequency * time) + 0.5);
st += addOvertone(time, frequency);
st = Convert.ToInt16(st * require_coefficient(time)
time += timeSpace;
byte[] k = new byte[2];
k = BitConverter.GetBytes(st);
finalList.Add(k[0]);
finalList.Add(k[1]);
}
double time1 = 0;
for (int i = 0; i < everyNoteTimeSpace; i++) //插入各音符之间间隔
{
short sy = 0;
time1 += timeSpace;
byte[] k = new byte[2];
k = BitConverter.GetBytes(sy);
finalList.Add(k[0]);
finalList.Add(k[1]);
}
}
六音符输入后输入结果
核心算法如下所示:
private void hold()
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string document = saveFileDialog1.FileName;
try
{
FileStream aFile = new FileStream(document, FileMode.OpenOrCreate);
BinaryWriter sw = new BinaryWriter(aFile);
byte[] finalArray = new byte[finalList.Count];
finalList.CopyTo(finalArray);
byte[] dataLength = new byte[4];
dataLength = BitConverter.GetBytes((finalArray.Length - 44));
finalArray[40] = dataLength[0];
finalArray[41] = dataLength[1];
finalArray[42] = dataLength[2];
finalArray[43] = dataLength[3];
byte[] totalLength = new byte[4]; //修正总的长度
totalLength = BitConverter.GetBytes((finalArray.Length - 8));
finalArray[4] = totalLength[0];
finalArray[5] = totalLength[1];
finalArray[6] = totalLength[2];
finalArray[7] = totalLength[3];
sw.Write(finalArray);
sw.Flush();
sw.Close();
MessageBox.Show("保存成功");
IniControl();
IniFinalList();
label5.Text = "尚未录入";
checkBox2.Checked = false;
label6.Visible = false;
numericUpDown1.Visible = false;
checkBox3.Checked = false;
return;
}
catch (IOException q)
{
MessageBox.Show(q.Message);
}
}
}
系统平台建立完成,其运行效果如下图3-2所示:
图3-1 系统平台效果图
参考文献:
[1]石立新,张俊星.基于音色模型的多基频估计方法[J].计算机工程与设计,2010,(7).
[2]曹西征,张聪品,冯乃勤.计算机乐器的梯形波音色模型分析[J].计算机工程与应用,2009,(2).