我尝试使用SoundPool中的播放速度合成钢琴音色。我听到了声音,但听起来......太丑了。它听起来接近正确的声音频率但不完全正确。它听起来有时比我需要的更高(只是一点点),有时更低 - 但听起来很奇怪:)。
float shift;
for ( int i = 0; i < 13; i++ ) {
shift = ( float ) i / 12f;
soundPool.play( soundID, 1, 1, 1, 0, ( float ) 1f + shift );
try {
Thread.sleep( 1500 );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
其中:soundID - 是加载的钢琴C4音符。
也许有人可以告诉我如何在Android中合成钢琴音色?
答案 0 :(得分:2)
你的主要问题是使用错误的数学来改变声音音调,而不是:
shift = ( float ) i / 12f;
你应该使用:
shift = pow( pow(2.0, 1/12.0), (float) i )
或类似的东西。
你的另一个问题是实时转换的质量通常很差,我建议预先调整12个关键音调,然后改变音调2x,3x等等,这可以通过简单地删除每个第n个样本来完成。而且,如果我是你,我会对整个键盘进行预采样(你的应用程序几乎不需要超过20-25个键,因为屏幕空间有限等),并且所有这些声音都加载在SoundPool
和随时准备好玩。
答案 1 :(得分:-1)
答案 2 :(得分:-2)
我找到了一个有用的链接here。但是,建议采用与lenik发布的公式相同的公式,除了它有额外的信息。太