よなかのすうがく

Audio signal processing and Electronic kit, and hobby.

Audio Units開発準備

ふと、エフェクタプラグインを開発して自身の環境(GarageBand)内で使用できたらと思い立ち、大学在学中にこの開発に着手したいと情報を集めた。

最初はSteinbergが提供するVST(Virtual Studio Technology)で開発を考えていたが、Mac上で動かすのならAppleが出しているAU(Audio Units)がいいのかなという結論に。
AUというのは、 Core Audio においてもっとも低レベル(ハードウェアより)に位置するフレームワークで、低レイテンシを要求されるオーディオ処理機能が可能。言語は主にC++

そして調べてて分かったのがめちゃくちゃ情報が少なく、更に古いものが多いということ。結構な人が同じような愚痴言ってる気がするし、やっぱりiOS系の情報の方がOS Xよりも多い気もする。中身はあんまり変わらないらしいけど。

とりあえず開発が開始できるところまでの準備を忘れないように備忘録に書き留めとく。




追記(15/05/26):
Xcodeのプロジェクト名を変えると勝手に落ちるバグの対処法があったので追記しておきます。


開発環境 : Yosemite(10.10.3), Xcode 6.3.2

・開発環境整備

まずは、Mac Developer Libraryでサンプルコードを入手。見辛いが上部のDownload Sample Codeがダウンロードリンク。
それとは別に実行環境としてAU LabというAppleが無償で提供してくれるデジタルオーディオミキシングアプリケーションもダウンロード。これを用いてデバッグを行っていく。

そしてダウンロードした中には複数個のサンプルコードが存在するので、その中でもAudioUnitGeneratorExampleの中身を拝見。ソースコードの名前から分かる通り、PinkNoiseを生成するプラグインである。

次に中の.xcodeprojを開けてビルドをすると、問題なく成功しビルド結果として.componentができる筈。これがAUPinkNoiseの本体。しかしこれだけではAU Labで認識されないので、~/Library/Audio/Plug-Ins/Componentsにコピーする必要がある。この手間を省くために、Xcodeでビルドする度に自動でコピーするように設定する。

まずはTargetを選択し、Build Phasesをクリック。

f:id:tl_muk99:20150404201543p:plain

ここにあるCopy Filesを選択する。(なければ+でNew Copy Files Phaseで追加すればよい)

f:id:tl_muk99:20150404201549p:plain

DestinationAbsolute Path(絶対パス), PathをComponentsまでのPath(/Users/[ユーザ名]/Library/Audio/Plug-Ins/Components)を入力し、Nameに+で.componentを選択して追加。この設定でビルドを行うと設定したロケーションに勝手にコピーをしてくれる。ただ設定した最初の方は何故かPermission DeniedでBuild Failedが出たが、ちょっと時間を置いたら上手くいった。原因は不明だけど、とりあえずよしとしよう。

最後に確認として、Terminalを立ち上げてauval(AU Validation Tool)を使用する。Terminalでauval -aを入力すると、インストール済みのAudio Unitのリストが表示されるので、AUPinkNoiseを探す。

augn PINK DEMO  -  Apple Sample Code: PinkNoise (Generator AU)

上記がリストに存在すれば、正しくインストールされた事が確認できる。見方は以下の通りである。

TYPE (カテゴリー) : augn
SUBTYPE (Audio Unitの名前) : PINK
MANUFACTURE(デベロッパー名) : DEMO

試しにAU Labを起動して「Edit > Add Audio Unit Generator」のGeneratorに「Apple Sample Code > PinkNoise (Generator AU)」がある。追加するとPinkNoiseが生成されるが音量注意。意外と大きくてビビる。

・Audio Unit情報変更

まあAudio Unitを自作するとなると肝心なのが名前。色々な所を調べて回ったが中々上手くいく情報が見つからない。.rに書き込むという情報が見つかったがそもそも.rがサンプルコードに存在しないという問題にぶち当たり試行錯誤をし続けた結果、ようやくそれらしきものを発見。
Xcodeの画面で言うと、Project Navigator内の「Resources > Info.plist」である。Xcodeでぱっと見だと分からなかったがテキストエディタで開けるとすぐに分かる。

<key>description</key>
<string>Pink Noise Generator Audio Unit</string>
<key>factoryFunction</key>
<string>AUPinkNoiseFactory</string>
<key>manufacturer</key>
<string>DEMO</string>
<key>name</key>
<string>Apple Sample Code: PinkNoise (Generator AU)</string>
<key>subtype</key>
<string>PINK</string>
<key>type</key>
<string>augn</string>

auvalで見覚えのある文字列がズラリと並んでいます。これを変更すれば、書き換えられると見当を付けて変更していきます。
まぁ、実際変更するときはXcodeでも変更できるのでそちらでやってみる。

f:id:tl_muk99:20150404202139p:plain

初期状態がこちら。省略されているのに気づかなかった自分が情けない。

f:id:tl_muk99:20150404202142p:plain

変更後がこちら。これで一度、auval -aを再度試してみると以下のが確認できる。

augn PINK DEMO  -  Apple Sample Code: PinkNoise (Generator AU)
augn TEST TEST  -  Test : PinkNoise

変更前と変更後のAudio Unitがインストールされていることが分かる。次に、AU Labを確認してみると「Test > PinkNoise」の項目が出現し、追加すると全く同じのPinkNoiseが生成されたことを確認。

このことからInfo.plistのnameは、「(メーカー, ブランド名) : (プラグイン名)」と機能しているようだ。

・ファイル名変更

また新しくプロジェクトを作成する場合にソースやヘッダ名を変える必要性が出てくるが、cppなどは問題なく動くがexpファイルやpchファイルは名前を変更するとエラーを吐きだす。リンクが繋がらないやらなんやら。
解決法としては"Target > Build Setting > Linking > Exported Symbols File"を適切なexpファイル名に変更し、"Target > Build Setting > Linking > Apple LLVM 6.1 - Language > Prefix Header"をを適切なpchファイル名に変更すればよい。
また作成したcompornentの名前を変更するときは"Target > Build Setting > Packaging > Product Name"を変更するだけ。
下のはPinkNoiseではなくFilterDemoの奴だが、基本的には一緒だと思う。

f:id:tl_muk99:20150428132258p:plain



追記(15/05/26):

ただ何故かプロジェクト名を変えると一気にXcodeが落ちるという謎のバグ。面倒臭いので放置。

バグはまだあるっぽいけど、対処法を見つけたので追記。

抜け穴というほどでもないけど、xcodeprojファイルのファイル名自体を書き換えるというちょっと荒技を用いて名前を変更するとプロジェクト名が変更されたもので開かれます。
ただし、そのままではBuildが上手く働いてないはず。もし動いていたら万々歳だけど、動いていない場合はメニューバーから「Product > Scheme > Edit Scheme」を開きましょう。
その中で、Buildを選択するとTargetのところがMissingと赤文字になっているので、一旦削除して同じものを追加しよう。

そしたら無事にBuildが通るはず。やったね。
これでようやくAuduoUnitの実装に入れるわけですよ……。


とりあえずここまで。