6

SoundPool の Android ドキュメントには、「アプリケーションは、ドップラー効果または合成効果の再生速度をリアルタイムで調整することで、ピッチを変更することもできます」と記載されています。そこで、setRate メソッドを使用して 1 つの音から別の音へとスムーズに変化させようとしましたが、結果はひどいものでした。サウンドの変化は非常に不規則です。これが私が試したコードです。良い方法があれば教えてください。

int streamId = soundPool.play (soundId, 1, 1, 1, 0, 1.0f);
for (float x = 0; x < 1; x += 0.005) {
  SystemClock.sleep (10);
  soundPool.setRate (streamId, 1 + x);
}
4

2 に答える 2

13

Androidのドキュメントでは、 を使用setRate()してドップラー効果を生成できることが示唆されていますが、すべての Android デバイスでの高速または十分な実装に依存することはありません。

手頃な価格のオーディオ IC では、44kHz または 48kHz の固定サンプル レートが必要です。したがって、サンプル レートの変換 (つまり、ピッチの変更) はソフトウェアで行う必要があります。これには低レベルの数値処理が含まれているため、これは Google ではなくデバイス メーカーによって実装されていると確信しています。多種多様な Android デバイス メーカーと、多くの場合低コストのハードウェアが使用されていることを考えると、確かに多くのサンプル レート変換の実装が存在します。より速いものもあれば、より遅いものもあります。滑らかなものもあれば、ぼろぼろのものもあります。

再生中に変換レートを変更するとどうなりますか? アルゴリズムが断片を正確に一致させない場合、オーディオの再生に短い亀裂が生じる可能性があります。コンバージョン率を 10 ミリ秒ごとに変更します。10msごとにクラックがあれば、それは音そのものである100Hzの周波数に相当します。これは、「ぼろぼろ」と聞こえる可能性があります。

全体として、高度な Android API を使用して、さまざまな Android デバイスで楽器をリアルタイムでエミュレートすることはできないと思います。ただし、ネイティブ アプリケーションは十分に高速な場合があります。

于 2011-11-18T13:40:11.750 に答える
0

すべてを試した後、SoundPoolを使用してピッチを変更することにしました。再生レートが2.0の場合、サウンドは元の2倍の周波数で再生され、再生レートが0.5の場合、元の周波数の半分で再生されます。再生速度の範囲は0.5〜2.0です。しかし、それは0.5と2.0より低いと高い周波数で動作しました。

作業コードを投稿しています、

ただし、デモの目的であるため、アプリケーションをインストールするたびに、「再生速度」を手動で変更する必要があります。たとえば、「sp.play(explosion、1,1,0,0,1.5f)」ここでは「1.5」 f"は再生速度です。EditView、または実行時に再生レートの値を設定するのと同様のものを簡単に作成できます。

このアプリでは、アプリの画面をタップするだけで、設定した再生速度で音楽を再生できます。

import java.io.IOException;

import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class SoundPoolActivity extends Activity implements OnClickListener {

    SoundPool sp;
    int explosion = 0;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

       View v = new View(this);
       v.setOnClickListener(this);
       setContentView(v);
       sp = new SoundPool(1,AudioManager.STREAM_MUSIC,0);
       //explosion = sp.load(this, R.raw.hh,0);
       explosion = sp.load("/sdcard/hh.m4a",0);


    }


    public void onClick(View v){
         if (explosion!=0){

             sp.play(explosion, 1,1,0,0,2.3f);
         }

    }
}
于 2012-05-20T19:51:15.573 に答える