5

トランジション ブレークのないアタック (サウンドの開始) / サステイン (ループ サウンド) / ディケイ (サウンドの終了) シーケンスの再生に関するリソースを見つけるのに問題があります。これを処理するための適切なライブラリはありますか、それとも AVAudioPlayer を使用して自分で作成する必要がありますか? AudioQueue は見やすい場所ですか? 以前は SoundEngine.cpp を使用していましたが、それは長い間使用されていません。CAF は今でも使用するのに最適な形式ですか?

ありがとう!

4

2 に答える 2

3

あなたの説明から、ソフトウェア シンセサイザーを作成しようとしているかのように聞こえます。このようなものに使用できる唯一の方法AVAudioPlayerは、ノート全体を 1 つの WAV ファイルとして構成し、AVAudioPlayer.

任意の長さのノート サウンドを作成するには、ユーザー アクション (ボタンをタップするなど) に応答して再生を開始し、2 番目のユーザー アクション (「停止」ボタンをタップする、最初のボタンから指を離すなど) まで再生を続けます。 ) は、ループされたリージョンのボリュームを 0 まで下げるプロセス (「リリース」部分) を開始します。( は、完全にメモリ内に構築されたオーディオを再生するために使用AudioQueueできAVAudioPlayerますが、再生を開始する前に再生全体を構築する必要があります。つまり、[再生を停止する以外] のユーザー アクションに応答して、再生中の内容を変更することはできません)。

の使用方法を簡単に示す別の質問/回答を次に示しますAudioQueueAudioQueue再生するデータをさらにロードする必要があるときはいつでもコールバック メソッドを呼び出します。元の WAV ファイル データをループしてエンベロープ ラップするすべてのコードを実装する必要があります。

于 2011-10-31T20:47:26.263 に答える
1

独自のエンベロープ ジェネレーターの作成は非常に簡単です。困難な部分は、信号を直接変更するために低レベルのオーディオ サービスを使用するようにプログラムを更新することです。

これを行うには、次のものが必要です。

  • オーディオ ファイルのサンプル
  • AudioQueueをセットアップします(これは1つのアプローチですが、OPで言及されており、ユーザーが提供するサンプルバッファの比較的高レベルのAPIであるため、私はそれを採用しています)
  • キューにシグナルを提供する
  • プログラムがリアルタイムまたは事前レンダリングのどちらで最適かを判断する

リアルタイム

  • ライブバリエーションを許可
  • ループポイントを管理する
  • レンダリング位置を管理する
  • 読み取っているサンプル位置範囲に基づいて、適用する振幅を決定できる

また

事前レンダリング済み

  • より多くのメモリが必要になる場合があります
  • 必要な CPU が少ない
  • サンプル バッファーのコピーにエンベロープを適用します。
  • レンダリング位置を管理する

また、低速/単純な遷移のみが必要であると想定しています。エイリアシングのないクレイジーで高速な LFO が必要な場合は、さらに多くの作業が必要になります。このアプローチでは、変更が急すぎる場合を除き、可聴エイリアシングは発生しません。

シンプルなエンベロープ ジェネレーター (EG) を作成するのは簡単です。その方向へのプッシュが必要な場合は、非常に基本的な EG について Apple の SinSynth をチェックしてください。

于 2011-10-27T06:00:09.467 に答える