【问题标题】:Android: How to synthesize piano sounds?Android:如何合成钢琴音色?
【发布时间】:2012-10-29 17:18:18
【问题描述】:

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

【问题讨论】:

    标签: android audio synthesize piano


    【解决方案1】:

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

    shift = ( float ) i / 12f;
    

    你应该使用:

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

    或类似的东西。

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      • javax.sound.midi 在 Android 中不存在。
      • 但是Android可以播放Midi文件。如果你在普通java中生成所有midi文件,你可以在Android中播放:)
      • 在某些设备上,但总是添加(或未添加)第 3 方库。我只是说 Android 没有对 MIDI 的原生支持。
      • 每个安卓设备都可以播放midi文件。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-23
        • 2011-10-20
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 2012-05-28
        • 1970-01-01
        • 2013-08-22
        相关资源
        最近更新 更多