2011-07-21 22 views
2

周波数と振幅の配列(長さが変化する)が与えられている場合、サンプルごとに単一のオーディオバッファを生成できます。アレイ?そうでない場合、単一のオーディオユニットに複数のトーンを生成する最良の方法は何ですか?それぞれのノートで独自のバッファを生成し、それらを出力バッファに合計しますか?一度にすべてを行うのと同じことではないでしょうか?複数の正弦波をオーディオユニット(iOS)のサンプルバッファに同時に生成

STKを使用することを考慮してノートから音符を生成するiOSアプリで作業していますが、ノートオフメッセージを送信したくない場合は、配列で保持しているノートの正弦波トーンを生成するだけです。各音符は実際には周波数と振幅が変化する2つの正弦波を生成する必要があります。 1つの音符が異なる音符と同じ周波数を演奏している可能性があるため、その周波数の音符オフメッセージが問題を引き起こす可能性があります。最終的には、オーディオユニットの外にある各ノートの振幅(adsr)エンベロープを管理したいと思います。私はできるだけ早く応答時間を望んでいますので、できる限り低レベルでオーディオを維持するために余分な仕事/学習をしていきたいと思います。

私は正弦波のシングルトーンジェネレータの例で作業しています。 Iは、(サンプルレートを超える周波数1 /周波数2によってtheta1/theta2をインクリメント

バッファー[フレーム] =(SIN(theta1)+ SIN(theta2))/ 2

:本質的にこれらのいずれかのようなものを倍増しようとしましたこれが最も効率的な呼び出しsin()ではないことを認識しますが、エイリアシングの影響を受けます。私はまだファイルからオーディオを読む以外の複数の周波数やデータソースを持つサンプルを見つけていません。

どのようなご提案ですか?私はもともと各音符に独自のオーディオユニットを生成させていましたが、それはタッチからノート音までの遅延が大きすぎます(非効率的です)。私は一般的なデジタルオーディオよりもプログラミングのレベルが新しいので、明白なものがないと穏やかにしてください。

答えて

2

もちろん、レンダリングコールバックの中で好きなことをすることができます。この呼び出しを再設定すると、オブジェクトへのポインタを渡すことができます。

このオブジェクトは、各トーンのオンオフ状態を含むことができます。実際には、オブジェクトにはバッファを埋めるためのメソッドが含まれている可能性があります。 (それがプロパティの場合、オブジェクトが非原子的であることを確認してください。そうしないと、ロックの問題によるアーティファクトが発生します)

正確に達成しようとしているのは何ですか?オンザフライで実際に生成する必要がありますか?

もしそうなら、あなたはあなたの

をグリッチや工芸品を与えるremoteIOオーディオユニットのレンダリングコールバックを、過負荷にするリスクを実行しますが、シミュレータ上でそれを離れて取得し、デバイスにそれを上に移動して見つけるかもしれませんそれは不思議なことは、次のものは、私が作った

言った、あなたはたくさん

で逃げることができますが到着する前に、あなたは50倍以下のプロセッサ上で実行されている、と1つのコールバックされるため、完了できない、それ以上に動作していません任意の数の個々のトーンを同時に再生できる12トーンプレーヤー

私はすべてのトーンのリングバッファーを持っています(これは非常に複雑な波形を使用していますので、これは時間がかかります。実際にはアプリケーションを実行してからファイルからロードします)、各リングに対して読み取りヘッドおよび使用可能フラグを維持する。

次に、レンダリングコールバックにすべてを追加します。これは、12個すべてが一緒に再生されていても、デバイス上で正常に処理されます。私はドキュメントがあなたにこれをしないように指示していることを知っている、別のバッファから一つのバッファを満たすためにこのコールバックを使うことを推奨しているが、多くを取り除くことができ、ある種のバッファリングシステムをコードするPITA別のスレッドで。

関連する問題