Android:将从FFT获得的频率映射到音符

时间:2015-01-03 12:23:19

标签: android

开发一个应用程序,用于映射仪器上播放的音符。示例: - 如果在钢琴上播放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上设定,但是由于价值的变化而不能更改为其他一些。

是否有更好的映射方案可以遵循?

1 个答案:

答案 0 :(得分:2)

您应该寻找pitch detection algorithm

现实世界的声音不是静态的。每个泛音的相对强度可能随时间以不同的速率变化。在给定时刻声音的基频可以与FFT峰值幅度不同。

P.S。找到more comprehensive answer