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 )

またはそのようなもの。

もう1つの問題は、リアルタイム変換の品質が通常低いことです。12のキートーンを事前にスケーリングしてから、ピッチを2倍、3倍などに変更することをお勧めします。これは、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 に答える