Chapter 1:
概要

この "Writing External Objects for Max" では、Max環境の内部を見ていくとともに、C言語によって共有ライブラリを開発することにより、この環境をどのようにして拡張していくかについて紹介します。このドキュメントは、ユーザの立場で Maxについてのある程度の知識があることを前提にしています。しかし、ここでは、単にユーザの立場からだけではなく、用意されているプログラミング構文と、それがユーザに対してどのように表現されるかについて、その関連を示してみたいと思います。

「Max のエクスターナルオブジェクトを書く」という場合、あなたの作業は、「主環境」から呼び出され、また、主環境にある有益なルーチンを呼び出すような共有ライブラリを書くことです。そのために、クラス、あるいはオブジェクトの動作のテンプレートを作ります。このクラスのインスタンスは、オブジェクトがメッセージを送られた際に、オブジェクトの「動作」を行ないます。あなたのエクスターナルオブジェクトは次のように定義されるでしょう。

  • クラス定義:クラスのデータ構造体、サイズ、インスタンスがどのように生成され、消滅するかについての定義。

  • 関数(メソッド)が様々なメッセージに応答してどのような動作をするかについての定義。

あなたが書くことができるコードリソースのタイプは数種類あります。ノーマルオブジェクトは、パッチャーウィンドウ上にあり、上下が2本の線で描かれている、新しい「オブジェクトボックス」の中に現れます。次のようなものです。

ユーザインターフェイスオブジェクトの書法はやや複雑ですが、パッチャーウィンドウ上でどのようなアピアランスや動作も可能です。この hslider のようなものです。

加えて、動作や編集が可能なタイムライン(Timeline)のためのエクスターナルオブジェクトを書くこともできます。

一般的に、Max をインターフェイスとして外部の世界と結びつけたり、何らかの計算を行なう場合には、ノーマルオブジェクトを書くことになります。ノーマルオブジェクトは、オブジェクト自身のウィンドウやダイアログボックスを開くこともできます。しかし、ノーマルオブジェクトはパッチャーウィンドウ自身の中での描画やイベントの取り扱いはできません。パッチャーウィンドウの中で、何らかの描画やユーザとのインタラクション(対話処理)を行なうためには、「ユーザインターフェイスオブジェクト」を作る必要があります。これには、多少の余分な作業が必要になります。

すでに述べたように、オブジェクト定義には2つのフェーズがあります。それは、クラスの初期化の際、およびオブジェクトが呼び出され動作する場合です。あなたの共有ライブラリ (Macintosh) あるいは ダイナミックリンクライブラリ (Windows XP) が Max の startup フォルダにある場合、(max-startup という名前であることがほとんどです)、には、Max の起動時にロードされます。そうでない場合には、Max がそのオブジェクトの最初のインスタンスを作ろうとするときにロードされます。このとき、オブジェクトの main関数が呼び出され、そのクラスの初期化を行ないます。main 関数は、オブジェクトが定義した唯一のエントリポイントです。クラスの初期化によって、main 関数はオブジェクト内で定義されている他の関数についての情報をMaxに与えます。このプロセスについては、Chapter 4 で詳しく説明します。クラスが初期化されると、Max はそのクラスのオブジェクト(インスタンス)を誰かが作ろうとするまでエクスターナルの関数を呼び出しません。これは次のような場合に起こります。

  • パッチャーファイルが読み込まれるとき

  • パッチャーウィンドウ内の新しいオブジェクトボックスで、そのオブジェクトの名前がタイプされたとき

  • 同じクラスの、既存のオブジェクトが複製されたとき

オブジェクトのインスタンス生成関数がこの時点で呼び出されます。このルーチンでは、そのクラスの新しいオブジェクトのためのメモリを割り当て、オブジェクト内の他のフィールドを新たに初期化します。

オブジェクトが作られると、メッセージを受け取ることができます。オブジェクトのインレットに数値が送られると、オブジェクトは int メッセージ(または、数値が浮動小数の場合はfloat メッセージ)を受け取ります。

オブジェクトにはこのメッセージに応答するメソッドを書く必要があります。加算をするオブジェクトの場合、オブジェクトの int メソッドは2つの数値を加算し、その結果をアウトレットから送り出すようなものになるでしょう。

あらかじめ定義されている、オブジェクトが受け取ることができるメッセージは数多くあります。また、独自のメッセージを定義することも可能です。メッセージを定義し、それらをメソッドと結びつける作業は、クラスのセットアップを行なう初期化の際に行なわれます。

最後に、オブジェクトが削除されると、オブジェクトの free 関数 が呼び出されます。オブジェクト内で特別なメモリの確保(オブジェクトのフィールドのいずれかへの割当て)を行なっていない場合、free 関数を用意しておく必要はありませんが、そうでなければ、この関数の中のフィールドによって使われているメモリの開放を行なわなければなりません。

このマニュアルについて

このマニュアルはMax ソフトウェアデベロップメントキット(SDK)で提供されるサンプルオブジェクトと共に使うようになっています。サンプルのコピーを基礎としてあなた自身のオブジェクトを作ることは、Max エクスターナル開発を始める際の良い手段になると思います。

記法について

「エクスターナルを書く」という仕事の中には、C言語での開発環境の選択という作業も含まれます。サンプルはMacintosh の場合は、MetroWorks CodeWarrior環境を想定しています。しかし、次の章では、CodeWarriorだけでなく、Macintosh上でのアップルのMPW環境や、Windows XP での他のコンパイラを使って開発を始める場合についても論じています。

 このマニュアルでは、Max メッセージの名前はこのように(message) 表示され、ほとんどの場合小文字になっています。既存の(組み込まれている)Maxオブジェクトの名前はこのように、(object ) 表示されています。他のMaxのプログラムに関する名前や構造体はこのような(wind_drag ) 表示になっています。Max ウィンドウで見ることができるメッセージは(Method not found ).このように表示されます。