記事一覧

Gave up (XCode - Logic7)

とりあえず Logic7 を XCode から立ち上げるのはあきらめました;
AULab と Garageband はちゃんと立ち上がるのを確認できたので、ひとまずデバッグはそれで行って、最終的な確認に Logic を使おう、という感じです。

I gave up fighting the problem in launching Logic7 from XCode...
I've made sure that AULab and Garageband can be launched without problems, so I'm gonna do most of the debug operation with them, and use Logic only for final verification.

Cannot run Logic7 from XCode

プロジェクトを新しいものに移し替えたらコンパイルは通ったんですが、じゃあチェックしてみようということ XCode上でカスタム実行ファイルを設定して Logic を立ち上げようとしてみると「Logicはステータス45で終了しました」と言うばかりで立ち上がってくれない。
別途手動で Logic を立ち上げてプラグインを挿してみるとちゃんと動くのだが、これではコンソールを使ったデバッグとか一切できない。どうにかならんのか・・・。

I've transplanted my project to the new one and it compiled successfully.
Then I tried to launch Logic7 by setting the custom executable for the project but it fails to launch with error message "Logic exited with status 45".
When launching Logic directly by hand they(Logic and my plugin) work well, but I cannot use debug console etc. with this method.
Are there any good solution...?

XCode2 based AudioUnit project no longer compiles on XCode3

これまで Magical8bitPlug の開発を XCode2.x ベースで進めてきたんですが、iPhone アプリ制作に絡んで XCode3.2 へのアップグレードを余儀なくされました。
で、アプリの件が終わって Magical8bitPlug の方に戻って見るとなぜかコンパイルが通らなくなっている。
エラーログを見てみると、AudioUnit 関係のヘッダやら何やらが別の場所に移されている模様。しかも、ディレクトリ構造も少し変わっているっぽい。
最初はなんとか直そうと思っていたのだけど、かなり面倒っぽくなってきたので新しいプロジェクトを起こしてそこにソースをコピーした方がいい気がしてきた・・・。

I was developing my Magical8bitPlug on XCode2.x but
by the requirement in developing iPhone App I was forced to upgrade XCode to ver.3.2.
When I've got my iPhone App things finished and back to my Magical8bitPlug's work again, I noticed that it's never compiled again.
Reading the error log to have found most of the AU-related files are moved to different locations.
Not only they're moved but the directory structure have been changed, too.
I tried to fix it at first, but now I'm feeling it may be better to make a new project and move my source codes into it...

User Presets

オーディオユニットはデフォルトでユーザープリセットをしかるべきディレクトリから探してメニューに表示する機能があったんですねえ。Logic 7 だと Save Preset As のときに指定ディレクトリに飛んでくれないので気づきませんでした。

I've just found that the default AudioUnit has the function to search the user presets in certain directories and show them in the preset menu.
I didn't notice that because on my main environment (Logic 7) it doesn't show the proper directory to save presets by default.

Adding subview to NSImageView

NSImageViewにサブビューを追加する

※今回から英語も併記することにしました(余裕があるときだけ;)

Interface Builder で UI を作ってるんですが、背景画像の上に各種部品を配置しようと思ったら、背景画像がすべてを覆い隠してしまって全くダメダメに。
なんでや!?と思って調べたら、同列の subview 同士の重ね順の概念自体が無く、Interface Builder 上で指定した重ね順というのは単なる編集上の便利機能にすぎない。
Subview 同士を重ねてしまった場合の挙動は定義されていないのでどう重ね順がどうなるかはその時々で変わってしまう、とのこと。

で、解決策のヒントになったのがこれ。
http://stackoverflow.com/questions/2415561/apple-interface-builder-adding-subview-to-uiimageview
あくまで iPhone OS の方ですが、同じようにやってみたら成功しました。

(1)まず背景用として NSImageView じゃなくて NSView を配置
(2)オブジェクトビュー画面で各種部品を NSView の傘下に入れる
(3)インスペクタで NSView のクラスを NSImageView に変更
(4)ビューコントローラのヘッダファイルにアウトレットを追加
 (IBOutlet) NSImageView * anImageView;
(5)Interface Builder上でこれとさっき配置したビューをコネクト
(6)ビューコントローラの .m ファイルの setAU に
 [anImageView setImage:....]
 でイメージを追加


From this topic I'm going to add English version of each issue, too.

I'm now building the custom view for my Magical 8bit Plug by Interface Builder, and what I want to do right now is
to put my UI parts on my custom background image.
It looks nice on Interface Builder, but compile and run it to have found the background image covers all other parts and nothing works.

I wonder why and google'd a bit to have found that
there's no concept of layering order between "sibling" subviews (subviews belong to the same parent view),
so you cannot tell the order of the layered subviews before running it.

I've got the hint to solve this problem from here:
http://stackoverflow.com/questions/2415561/apple-interface-builder-adding-subview-to-uiimageview

It's an iPhone issue, not Cocoa, but it worked as well.

(1)Put NSView, not NSImageView, for background image container. Do not put image here.
(2)On Object View Window move your UI parts under NSView to make them be children of NSView.
(3)Change the Class of NSView to NSImageView by Inspector.
(4)Add the declaration of the outlet on your ViewController's header file.
 (IBOutlet) NSImageView * anImageView;
(5)On Interface Builder connect this outlet to the view you put on (1).
(6)add your background image by invoking setImage in the setAU selector of your ViewController's .m file.
 [anImageView setImage:....]

スライダー画像のカスタマイズ

やっとツマミの方の画像をカスタマイズできたぞ!!!
NSSliderじゃなくてNSSliderCellの方をいじるわけですね。そして、単に setImage 的なものを呼ぶんじゃなくて drawKnob なるセレクタをオーバーライドしないといけない。さらに初心者にやさしくない bundle を絡めた画像指定。
・・・ハードル高杉!!!

/* MyGreatPlugin_CocoaView.h */

@interface MySliderCell : NSSliderCell
{
}
-(void)drawKnob:(NSRect)knobRect;

/* MyGreatPlugin_CocoaView.m */

@implementation MySliderCell

-(void) drawKnob:(NSRect)knobRect
{
NSBundle *bundle = [NSBundle bundleWithIdentifier : @"com.MyCompany.audiounit.MyGreatPlugin"];
NSString *path = [bundle pathForImageResource:@"MySliderKnobImage.png"];
NSImage* img = [[[NSImage alloc] initByReferencingFile:path] autorelease];
[[self controlView] lockFocus];
[img drawInRect:knobRect
fromRect:NSMakeRect(0,0,[img size].width,[img size].height)
operation:NSCompositeSourceOver
fraction:1.0];
[[self controlView] unlockFocus];
}

これを記述してセーブすると Interface Builder の方でスライダーセルのクラスとして MySliderCell が選択できるようになるので、それを選択するとやっとソースと.xibが結びつきます。

さて次は、knobRectの大きさの設定と、レールの方の画像設定だな・・・。

viewWithTag

カスタムUI の各種部品への参照は

NSTextField* aFileld = (NSTextField*)[self viewWithTag:tagNumber]

とかで取得できるのね。これは iPhone でさんざんやったのと同じだから分かりやすいわ;(なんか順番逆な気がするが;)

しかし、NSSlider のカスタムイメージの設定方法が未だにわからん!
Magical8bitPlug とかほとんどスライダーしかないからコレがカスタマイズできないとカスタムUIの意味が半減だわ;
なんで setImage: が depricated になってるんだろ???
代わりの手段が何か提供されてる???

プリセット

とりあえずAudioUnit的にはユーザープリセットはサポートしていないらしい・・・。現在の設定を .aupreset ファイルとして書き出す機能はデフォルトで搭載しているようだが。

プリセット一覧を要求されたときに都度 .aupreset ファイルが格納されているディレクトリをスキャンしたりできればいいのかな〜。
それにしても .aupreset を外部から読み込むのとかどうしたらいいのか分からんしな・・・

完全に独自仕様で実装しちゃってもいいかもな〜。
プリセットの切り替えを普通のプルダウンメニューで作って、新しいプリセットの作成もプルダウンメニューの末尾に「Create New」を付けて対応、とか。
そしたらプリセットの内容も独自形式で別ファイルに置いておけばいいしな〜。

うー・・・

とりあえずカスタムUIの件はメーリングリストに質問して回答待ちってことで、ひとまずもう一個懸案だったファクトリープリセット&ユーザープリセットに取りかかってみるが、こちらも情報少なすぎて泣きそう・・・。
アップルの公式サンプルコード、プリセットの内容全部 static const float kPrameterXXX = .... でベタ書きって何だよぉぉ!!
これじゃユーザープリセットとか一切できないじゃんかよぉぉ・・・

誰かAudioUnitの全貌を日本語でやさしく教えてくれー!!!

とりあえず、

ポップアップの中身の設定は、
- (void)setAU:(AudioUnit)inAU
の中で [popUp1 addItemWithTitle:@"..."];
とかすれば良いようだ。
あとは中に入れる内容だが・・・、getParametereValueStringsをどうやって呼べばいいんだ?
パラメータの値自体は AUParameterGet( ... ) で取れるようだけど、これに対応するポップアップアイテムの取得手段って何だ???

ページ移動