1

我尝试使用 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 中合成钢琴声音?

4

3 回答 3

2

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

shift = ( float ) i / 12f;

你应该使用:

shift = pow( pow(2.0, 1/12.0), (float) i )

或类似的东西。

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

于 2012-10-29T18:26:11.477 回答
-1

您可以使用 MIDI 来执行此操作。

http://docs.oracle.com/javase/1.4.2/docs/api/javax/sound/midi/package-summary.html

于 2012-10-29T17:21:14.087 回答
-2

我在这里找到了一个有用的链接。但是,它建议的公式与 lenik 已经发布的公式相同,只是它有额外的信息。也。

于 2018-05-04T15:14:17.877 回答