Android 安卓:如何合成钢琴声音?

Android 安卓:如何合成钢琴声音?,android,audio,synthesize,piano,Android,Audio,Synthesize,Piano,我试着用声音池中的弹奏速度来合成钢琴的声音。我听到声音,但听起来。。。太难看了。它听起来接近正确的声音频率,但不完全正确。它听起来有时比我需要的高(只是一点点),有时低——但听起来很奇怪:) 浮动移位; 对于(int i=0;i

我试着用声音池中的弹奏速度来合成钢琴的声音。我听到声音,但听起来。。。太难看了。它听起来接近正确的声音频率,但不完全正确。它听起来有时比我需要的高(只是一点点),有时低——但听起来很奇怪:)

浮动移位;
对于(int i=0;i<13;i++){
移位=(浮动)i/12f;
声音池。播放(声音ID,1,1,0,(浮动)1f+shift);
试一试{
睡眠(1500);
}捕捉(中断异常e){
e、 printStackTrace();
}   
}
其中:soundID-是加载的钢琴C4音符


也许有人能告诉我如何在安卓系统中合成钢琴声音?

你可以使用MIDI来实现这一点


您的主要问题是在改变音高时使用了错误的数学,而不是:

shift = ( float ) i / 12f;
你应使用:

shift = pow( pow(2.0, 1/12.0), (float) i )
或者类似的


你的另一个问题是实时转换的质量通常很差,我建议预先设定12个关键音调,然后改变音高2x、3x等等,这可以通过简单地删除每个第n个样本来完成。此外,如果我是你,我会对整个键盘进行预采样(由于屏幕空间有限等原因,你的应用程序几乎不需要超过20-25个键),并将所有这些声音加载到
声音池中,随时可以播放。

我找到了一个有用的链接。然而,这与lenik已经发布的公式相同,只是它有额外的信息。同样。

javax.sound.midi在Android中不存在。但是Android可以播放midi文件。如果您使用普通java生成所有midi文件,则可以在某些设备上使用Android:)播放,但始终会添加(或未添加)第三方库。我只是说Android没有对MIDI的原生支持。每个Android设备都能够播放MIDI文件。
shift = pow( pow(2.0, 1/12.0), (float) i )