iOS 5 以降、OpenAL でリバーブ効果がサポートされていますが、この機能を使用する良い例が見つかりませんでした。ObjectAL のソース コードへのリンクがいくつか見つかりましたが、複雑すぎてリバーブ エフェクトの使用法を理解できません。では、OpenAL を使用して iOS アプリにリバーブ効果を追加するにはどうすればよいでしょうか。
1 に答える
ObjectAL のコードベースはかなり複雑になっていますが、OpenAL 側では、ほとんどの場合、実際には C API の 1 つの大きなラッパーにすぎません。リバーブの主要な Objective-C API エントリ ポイントは次のとおりです。
自分で実装したい場合は、最初に +[ALWrapper initialize] で行うように拡張機能をバインドする必要があります: https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ ObjectAL/OpenAL/ALWrapper.m#L1363
コアでは、すべてのリバーブ機能は、alcASASetListener() および alcASASetSource() への呼び出しを使用して実行されます。これらの関数を ALWrapper で検索すると、Objective-C で呼び出しがラップされているだけで (さらにいくつかのエラー処理も)、ALSource と ALListener がそれをラップしていることがわかります。最低レベルでは、これらの種類の呼び出しの集まりです。
alcASASetSource(ALC_ASA_REVERB_SEND_LEVEL, sourceID, &value, sizeof(value));
したがって、コードは常に次の 2 つのパスのいずれかに従います。
- ALSource -> ALWrapper -> alcASASetSource() への生の C 呼び出し
- ALListener -> ALWrapper -> alcASASetListener() への生の C 呼び出し
グローバル コントロール (リスナーを介して制御) は次のとおりです。
- リバーブのオン/オフ (グローバル)
- グローバル リバーブ レベル (リバーブ効果の大きさ)
- ルームタイプ(ALC_ASA_REVERB_ROOM_TYPE_Cathedralなど各種プリセットあり)
- EQ ゲイン、帯域幅、周波数 (基本的なフィルタリング、物理的なイコライザーを使用するのと同じ方法で使用 - 使用したとしても、これほど多くは使用しないでしょう)
ローカル コントロール (ソース経由で制御) は次のとおりです。
- リバーブ センド レベル (このソースに影響するリバーブの量)
- リバーブ オクルージョン (ドアや薄い壁など、音が部分的に通過できる、リスナーとソースの間の物理オブジェクトをシミュレートします)
- リバーブの障害物 (リスナーとソースの間の音を伝えない物理的なオブジェクトをシミュレートし、コンクリートの柱のように周囲を回る音だけが聞こえるようにします)
ここにも小さなデモを書きました: https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectALDemo/Demos/ReverbDemo.m
私が知る限り、Apple は多くのドキュメントを公開していません。そのため、レポを複製し、デモをビルドし、すべてがどのように連携するかを感じるまで API をいじってみるのが最善の策です。次に、ObjectAL を使用して行った内容を実際の alcASASetListener() およびその仲間への呼び出しに変換する必要がありますが、最終的には単なるラッパー コードであるため、これらはかなり直接的な変換になるはずです。