5

AudioTrack クラスを使用して、合成音 (基本的には 2 つの正弦波とノイズ) を再生しようとしています。javax.sound.sampled の SourceDataLine と何の違いもないように見えますが、合成は本当に遅いです。ARM 標準の場合でも、Nexus 4 で 32768 サンプル (16 ビット、ステレオ、合計 65536) のレンダリングに 1 秒以上かかると考えるのは非現実的です (System.nanotime() で測定、AudioTrack への書き込みは除外)。合成部分はこのhttp://audioprograming.wordpress.com/2012/10/18/a-simple-synth-in-android-step-by-step-guide-using-the-Java-sdk/とほぼ同じです、唯一の違いは、ステレオ サウンドを再生することです (バイノーラル トーンなので、モノラルに減らすことはできません)。

何か案は?私に何ができる?

前もって感謝します

4

4 に答える 4

6

マルコの答えはとても良いようです。ただし、まだプロジェクトの実験的/調査段階にある場合は、Android ライブラリ/NDK ライブラリの組み合わせとして既に実装されており、多くのサウンドを合成してそれらを操作できるようにするPure Dataの使用を検討することをお勧めします。比較的簡単な方法で。

libpdディストリビューションは、Pure Data の Android 実装です。SoundOnSound のサイトこのサイトには、参考文献がいくつかあります。

補遺:このディスカッション リンクを通じて、Android Midi ドライバーの基本的かつ機能的な実装を見つけました。関連するコードはここにあります (github、billthefarmer によるプロジェクト、mididriverという名前)

私の Android アプリ ( imSynt リンクから Google Play に移動します)またはYouTubeで使用方法を確認できます。

于 2013-04-29T14:31:46.300 に答える
4

実際、ARM でのオーディオ合成のパフォーマンスは、NEON ユニットをうまく利用するネイティブ コードで非常に優れています。Dalvik の JIT コンパイラは、浮動小数点を多用するコードでこのレベルのパフォーマンスに近づくことはありません。
iOS 向けの膨大な数のソフト シンセ アプリを見てみると、ARM デバイスで同様のレベルのパフォーマンスを実現できることを示す十分な証拠が得られます。

しかし、あなたが報告しているパフォーマンスは、私が期待するものより数桁不足しています. 次のことを検討してください。

  1. 倍精度浮動小数点演算は、ARM Cortex Ax NEON ユニットで特にコストがかかりますが、単精度は非常に高速で高度に並列化可能です。 Math.sin()を返すためdouble、不必要に正確になり、遅くなる傾向があります。単精度浮動小数点値によって提供される 24 の仮数は、オーディオ サブシステムによって使用される 16 ビットの整数よりも大幅に大きくなります。
  2. 事前sin(x)に計算してから、レンダー ループでテーブル ルックアップを実行できます。
  3. この場合は時間の経過とともにパフォーマンスが低下する可能性が高いため、 Math.sin(x)Androidに関する SO に関する以前の投稿があります。x
  4. より高度なテーブルベースのシンセサイザーについては、DDS オシレーターの使用を検討してください。

最終的には、NDK を使用して合成にネイティブ コードを使用することを検討するかもしれません。

于 2013-04-29T13:41:36.907 に答える
1

フィルターとエンベロープを使用して複数のオシレーターをレンダリングできるはずですが、まだ CPU 時間が残っています。内部ループをチェックして、システム コールがないことを確認します。

あなたは非常に古い電話を使っていますか?ハードウェアや OS のバージョンについては触れていません。

JSyn を使用してみてください。これは、デスクトップ、Raspberry Pi、Android を含む任意の Java プラットフォームで動作する無料のモジュラー Java シンセサイザーです。

https://github.com/philburk/jsyn

于 2016-04-02T17:46:35.057 に答える