开发一个应用程序,用于映射仪器上播放的音符。示例: - 如果在钢琴上播放C,则应用程序显示C。
double [] notes={16.35,17.32,18.35,19.45,20.6,21.83,23.12,24.5,25.96,27.5,29.14,30.87};
char [] notations={'c','C','d','D','e','f','F','g','G','a','A','b'};
int index=0;
double minvalue=999999;
if(values[0]>16.34){
for (int i=0;i<=11;i++)
{
double result=values[0]%notes[i];
if(result==0)
{
index=i;
break;
}
double temp=notes[i]-result;
if(temp<minvalue)
{
minvalue=temp;
index=i;
}
}
TextView display2 = (TextView) findViewById(R.id.textView2);
display2.setText(String.valueOf(notations[index]));
音符数组由十二个不同音符的频率组成。 值[0]由获得的频率组成。 value [0]%notes [i]用于确定频率所属的最近音符。
问题:
价值变化很大! 因此,当C在钢琴上演奏时,它在C上设定,但是由于价值的变化而不能更改为其他一些。
是否有更好的映射方案可以遵循?
答案 0 :(得分:2)
您应该寻找pitch detection algorithm
现实世界的声音不是静态的。每个泛音的相对强度可能随时间以不同的速率变化。在给定时刻声音的基频可以与FFT峰值幅度不同。