私は CoreAudio を初めて使用し、CA を使用してスピーカーから特定の周波数と振幅の単純な正弦波と方形波を出力したいと考えています。音を合成したいので、音ファイルは使いたくない。
これを行うには何が必要ですか? 例やチュートリアルを教えてください。ありがとう。
私は CoreAudio を初めて使用し、CA を使用してスピーカーから特定の周波数と振幅の単純な正弦波と方形波を出力したいと考えています。音を合成したいので、音ファイルは使いたくない。
これを行うには何が必要ですか? 例やチュートリアルを教えてください。ありがとう。
前の回答にはいくつかの誤りがあります。伝説の私:-) James Harkins ではなく、James McCartney が sinewavedemo を書きました。私は現在、Apple で CoreAudio の仕事もしています。sinewavedemo は、サウンドを再生する方法として CoreAudio.framework の AudioHardware.h を使用するため、CoreAudio を使用します。
sinewavedemo は使用しないでください。これは非常に古いコードであり、オーディオ ハードウェアのバッファ レイアウトに関して危険な想定をしています。現在生成しているサウンドを再生する最も簡単な方法は、AudioQueue を使用するか、レンダー コールバックが設定された出力オーディオ ユニットを使用することです。
ファイルなしでこれを行う最も簡単な方法は、ウェーブの 1 サイクルを含む単一のサイクル バッファーを準備することです (これは技術的にはウェーブテーブルと呼ばれます)。
CoreAudio スレッドによって呼び出される再生関数で、ウェーブ バッファーから読み取ったサンプルで出力バッファーを埋めます。
ただし、すぐに次の 2 つの問題に直面することに注意してください。 - 正弦波の場合、再生周波数が目的の正弦波周波数の整数倍でない場合、高品質を維持するには補間器を実装する必要があります。整数ポインターのみを使用すると、かなりのレベルの高調波ノイズが発生します。
信号生成のための優れたアルゴリズムを入手するには、musicdsp.org を参照してください。これは、おそらくそのための最良のリソースの 1 つです
これをリアルタイムで実行していない場合は、sin()
from関数を使用することmath.h
は悪い考えではありません。再生するときは、必要な数のサンプルを事前にsin()で埋めて、オーディオバッファに送信してください。これをリアルタイムで実行している場合、sin()の呼び出しはサンプルごとに非常に遅くなる可能性があります。補間されたウェーブテーブルルックアップメソッドを使用すると、はるかに高速になりますが、結果のサウンドはスペクトル的に純粋ではありません。
一般的にオーディオプログラミングは初めてですか?出発点として、私はチェックアウトします
http://www.audiosynth.com/sinewavedemo.html
これは、伝説的なJames Harkinsによる最小限の osx 正弦波実装です。CoreAudio をまったく使用しないことに注意してください。
特に正弦波に CoreAudio を使用したい場合は、出力ユニット (iphone では RemoteIO、osx では AUHAL) を作成し、上記の例のコードをほとんど使用できる入力コールバックを提供する必要があります。チェックアウト
http://developer.apple.com/mac/library/technotes/tn2002/tn2091.html
CoreAudio の利点は、主に、正弦波で他のエフェクトを連鎖させること、Logic などのホスト用のプラグインを作成してそれらのインターフェイスを提供すること、一緒に連鎖できるプラグイン用のホスト (Logic など) を作成することです。
プラグインを作成したり、プラグインをホストしたりしない場合は、CoreAudio は実際には適していない可能性があります。しかし、CoreAudio を使用することの最も優れた点の 1 つは、正弦波コールバックが機能するようになると、効果を追加したり、複数の正弦波を組み合わせたりするのが簡単になることです。
これを行うには、出力ユニットをグラフに配置する必要があります。これには、エフェクト、ミキサーなどが使用できます。
グラフの設定に関するヘルプは次のとおりですhttp://timbolstad.com/2010/03/16/core-audio-getting-started-pt2/
見た目ほど難しくありません。Apple は多くのこと (/Developer/Examples/CoreAudio/PublicUtility) 用の C++ ヘルパー クラスを提供しており、C++ を使用したくない場合でも (使用する必要はありません!)、CoreAudio API のガイドとして役立ちます。