こんどはカスタム UI の中身をどう実装するかですわ。
ひとまず、プルダウンメニューとかどうすりゃいいんだ・・・。
しかるべきところで AudioUnit 本体の getParameterStrings( ... ) を呼んで、その内容を NSPopUpButton に流し込めばいいんだろうけど、それをどこに書いたらいいんだ?
ていうか、NSPopUpButton の扱い方忘れた・・・。
こりゃまた一悩みですな;
プログラミングのことを書くぞ。I'm gonna write programming-related topics here.
こんどはカスタム UI の中身をどう実装するかですわ。
ひとまず、プルダウンメニューとかどうすりゃいいんだ・・・。
しかるべきところで AudioUnit 本体の getParameterStrings( ... ) を呼んで、その内容を NSPopUpButton に流し込めばいいんだろうけど、それをどこに書いたらいいんだ?
ていうか、NSPopUpButton の扱い方忘れた・・・。
こりゃまた一悩みですな;
なんだかやたら面倒だったぞ!!
あまりに複雑だったので、とりあえず自分用にメモ。
今扱ってるプロジェクト名を MyGreatPlugin.xcodeproj と仮定します。
(1)仮プロジェクトを作る
仮プロジェクトとして、新規で Audio Unit Effect with Cocoa View プロジェクトを作る。ここから目ぼしいものをコピーして使う。
※プロジェクト名は、目的AUとかぶる部分が無いようにする。
(あとで一括置換をかけるから。たとえば対象の名前が MyGreatPlugin のときに、この仮プロジェクト名を Plugin とかにするとハマる)
ここでは仮に CocoaViewTemp.xcodeproj としておこう。
(2)仮プロジェクトから必要なものをコピー
CocoaViewTemp.xcodeproj の「グループとファイル」から、cocoaUIグループをまるごとコピー。ファイル名に CocoaViewTemp とついてる部分を全部 MyGreatPlugin に置き換える。
同じく、resources にある .xib と .plist もコピーして名前を置き換える。
(3)ソースコードに AU プロパティ関係のメソッドを追加
仮プロジェクト内の CocoaViewTemp.cpp から
virtual OSStatus getPropertyInfo( ... )
virtual OSStatus getProperty( ... )
の2つをコピーして、MyGreatPlugin.cpp の対応する位置にペースト。
CocoaViewTemp.h にこれのプロトタイプ宣言もあるので、それも MyGreatPlugin.h にコピー。
(4)仮プロジェクト由来の名前を一括置換
プロジェクト検索で CocoaViewTemp を MyGreatPlugin に一括置換。plist の中身が置換にかからないこともあるかもしれないので確認。
あと、これによって MyGreatPlugin.cpp 内の getProperty( ... ) にある
CFBundleRef bundle = CFBundleGetBundleWithIdentifier( ... )
内に書かれている識別子が正しいか確認する。
(ターゲットのプロパティの「識別子」( com.GreatCompany.MyGreatPlugin みたいなやつ)と一致していれば良い)
(5).xibファイル内の各種名前変更
MyGreatPlugin_cocoaView.xib を Interface Builder で開き、
File's Ownerのクラス名を MyGreatPlugin_CocoaViewFactoryに、ビューのクラス名を MyGreatPlugin_CocoaView 変更する
(6)バンドルのビルド設定
MyGreatPlugin.xcodeproj の「グループとファイル」にある「ターゲット」から右クリックで新規ターゲット→Loadable Bundleを選択して新しくバンドル用ターゲットを作成。
名前はとりあえず CocoaUI としておく。
ターゲットのプロパティを開いて、プロダクト名を
MyGreatPlugin_CocoaViewFactory
に変更する。
このターゲットに、ドラッグ&ドロップとかいろいろやって
▼ヘッダをコピー(2)
MyGreatPlugin_CocoaViewFactory.h
MyGreatPlugin_CocoaView.h
▼バンドルリソースをコピー(2)
MyGreatPlugin_CocoaViewFactory.plist
MyGreatPlugin_CocoaView.xib
▼ソースをコンパイル(2)
MyGreatPlugin_CocoaViewFactory.m
MyGreatPlugin_CocoaView.m
▼バイナリをライブラリにリンク(3)
AudioToolbox.framework
AudioUnit.framework
Cocoa.framework
となるようにする。
(7)メインターゲットにバンドルを加える
メインターゲット(ここでは「ターゲット」の下の MyGreatPlugin)の下にさっき作ったターゲット "CocoaUI" をドラッグして加える。
さらに、メインターゲットに「新規コピーファイル」を追加。(デスティネーションは「リソース」のまま。)これで出来た「ファイルをコピー」の下に Productsの下にある MyGreatPlugin_CocoaViewFactory.bundle をドラッグして追加する。
たぶん以上の手順でひとまずは通る・・・かも。
書き忘れ・書き間違いが多々あると思うので。
あと、書いてる途中で思ったが、仮プロジェクトの名前を対象プロジェクトと同じにするという手もあったな・・・。
別のフォルダに作ればいいだけだもんね。その場合コピー元とコピー先を間違えないように注意だな。
やっぱり C++ わからん!!!!
なんで AudioUnit は C++ なんだよ〜
たまりかねて Amazon でロベールの C++入門ポチッとしてきました・・。
XCodeのあるバージョンから AU Synth のテンプレートが追加されたのはいいのだけど、このテンプレートが微妙にイマイチなんだよなあ。
一番アレだなあと思ったのが、発音タイミングがフレーム単位じゃなくてスライス単位で制御するようになっていて、それを改造するのにけっこう知識も手間も必要だったり。
ピッチベンドの制御もそんな塩梅になってる。
あとポリフォニック仕様にガッチリ組まれてるから、モノフォニックシンセを作ろうと思うとかなり大がかりな組み直しをしないといかんのよねえ。
この環境で動かないあの環境だと変になるとかいうメールが届かなくなったので
ver0.3は各種環境でうまく動いているのでしょうな。
ライブ専用にMagica8bitPlugをちょっとカスタマイズしようと
思ったのだけど、ライブ用のノートの方が PowerPC なもんだから
PPC専用の旧バージョンの方が不便が少ない・・・てことで
かなり久しぶりに旧バージョンのプロジェクトを開く。
イベントのキュー処理とか波形生成以前の基礎の部分とかまで
けっこうがんばって書いたんだよな〜
ちょっと懐かしくすらある。
最近曲作りの方ばっかりでプログラミングからは離れてました;
Magical8bitPlugでシーケンサーのテンポと同期してナントカカントカできると
さらに幅が広がるよなあ、とか思って方法を調べ始めたけど
相変わらず情報の少ないことで・・・
その前にちゃんとLFOとかサステインペダル処理とか基本機能を
充実させないといかんのだが・・・