アトリビュートルーチン:
アトリビュート生成とフィルタ

アトリビュートはについては、すでに詳しく述べてきました。アトリビュートは、 class_addattr 関数を使ってクラスに追加することができます。ここで述べる関数はアトリビュートのフィルタプロパティを生成したり、修正したりする手段を提供します。

attribute_new

     
  新しいアトリビュートを生成するために、attribute_new 関数を使います。アトリビュートはメモリ割当てを行い、自分自身のデータを格納します。attribute_new を使って生成されたアトリビュートは、クラス(class_addattr 関数を使って)、またはオブジェクト(object_addattr 関数を使って)を設定することができます。
   
 

t_object *attribute_new(char *name, t_symbol *type,>long flags, method mget, method mset);

     
  name C文字列によるアトリビュートの名前
  type

有効なアトリビュート型を表す t_symbol * 。現在有効な型シンボルは次の通りです:
_sym_char (char)
_sym_long (long)
_sym_float32 (32ビット float)
_sym_float64 (64ビットfloat)
_sym_atom (Max の t_atom ポインタ)
_sym_symbol (Max のt_symbol ポインタ)
_sym_pointer (汎用のポインタ)
_sym_object (Max の t_objectポインタ)

  flags

ビットフィールドで表されるアトリビュートフラグ。アトリビュートフラグはアトリビュートの設定や、値の問い合わせのためのアクセスが可能かどうかを判定するものです。現在、のようなアクセサフラグが利用できます。

ATTR_GET_OPAQUE: CLASS_BOX オブジェクトの内部で使われる場合も、Cのコードからの場合も、Max メッセージによるアトリビュートの値の問い合わせはできません。

ATTR_SET_OPAQUE: CLASS_BOX オブジェクトの内部で使われる場合も、Cのコードからの場合も、Max メッセージによるアトリビュートの値の設定はできません。

ATTR_GET_OPAQUE_USER: CLASS_BOX オブジェクトの内部で使われる場合、Max によってアトリビュートの値の問い合わせはできませんが、Cのコードからは問い合わせ可能です。

ATTR_SET_OPAQUE_USER: CLASS_BOX オブジェクトの内部で使われる場合 Max メッセージによってアトリビュートの設定はできませんが、Cのコードからは設定が可能です。

  mget アトリビュートの get 機能のために使うメソッド、mget が NULLの場合、デフォルトのメソッドが用いられます。
  mset アトリビュートの set 機能のために使うメソッド、mset が NULLの場合、デフォルトのメソッドが用いられます。
     
 

このルーチンは、成功すると新しいアトリビュートのオブジェクトポインタを返し、失敗した場合は NULLを返します。

開発者が get 機能や set 機能のためにカスタムメソッドを定義したい場合は、次のようにプロトタイプ宣言を行う必要があります。

t_max_err myobject_myattr_get(t_myobject *x, void *attr, long *ac, t_atom **av);

t_max_err myobject_myattr_set(t_myobject *x, void *attr, long ac, t_atom *av);

当然ながら実装は様々でしょうが、次のような基本的なモデルに従う必要があります。あなたのオブジェクトのためのカスタムの getvalueof setvalueof と同様、Max 全体を通して、メモり割当てに getbytes が使われていることが前提になっている点に注意して下さい。開発者は、次のように行うことを強く要請されます。

t_max_err myobject_myattr_get(t_myobject *x, void *attr, long *ac, t_atom **av) { if (*ac && *av) // 渡されるメモリ:これを使います else { *ac = 1; // size of attr data *av = (t_atom *)getbytes(sizeof(t_atom) *(*ac)); if (!(*av)) { *ac = 0; return MAX_ERR_OUT_OF_MEM; } } atom_setlong(*av, x->some_value); return MAX_ERR_NONE; } t_max_err myobject_myattr_set(t_myobject *x, void *attr, long ac, t_atom *av) { if (ac && av) { x->some_value = atom_getlong(av); } return MAX_ERR_NONE; }


attr_offset_new

     
 

新しいアトリビュートを作成するために、attr_offset_new 関数を使います。アトリビュートは、自分自身の外部に格納されている、あなたのオブジェクトのデータ構造体の中のメモリを参照します。attr_offset_new を使って作られたアトリビュートは、クラス(class_addattr関数を使います)またはオブジェクト(object_addattr関数を使います)に割当てることができます。

   
 

t_object *attr_offset_new(char *name, t_symbol *type, long flags,method mget, method mset, long offset);

     
  name C文字列によるアトリビュートの名前
  type

有効なアトリビュート型を表す t_symbol * 。現在有効な型シンボルは次の通りです:
_sym_char (char)
_sym_long (long)
_sym_float32 (32ビット float)
_sym_float64 (64ビットfloat)
_sym_atom (Max の t_atom ポインタ)
_sym_symbol (Max のt_symbol ポインタ)
_sym_pointer (汎用のポインタ)
_sym_object (Max の t_objectポインタ)

この型は offset引 数で指定されたバイトオフセットにおける、データの sizeof と一致するものでなければなりません。

  flags ビットフィールドで表されるアトリビュートフラグ。前述の attribute_new() のアトリビュートフラグに関する説明を参照して下さい。
  mget アトリビュートの get機能のために使うメソッド、mget が NULLの場合、デフォルトのメソッドが用いられます。より詳しい情報は、前述の attribute_newに関する説明を参照して下さい。
  mset アトリビュートの set機能のために使うメソッド、mset が NULLの場合、デフォルトのメソッドが用いられます。より詳しい情報は、前述の attribute_newに関する説明を参照して下さい。
  offset アトリビュートを「所有する」オブジェクトのクラスデータ構造体の中のバイトオフセット。オフセットはアトリビュートに参照されるデータを指していなければなりません。通常は、このオフセットを計算するために calcoffset マクロ(前述)が使われます。
     
 

このルーチンは、成功すると新しいアトリビュートのオブジェクトポインタを返し、失敗した場合は NULLを返します。

オブジェクトクラスのデータ構造体の中にある double 型の変数(val)の値を参照する新しいアトリビュートを作る例です。

t_object *attr = attr_offset_new("myattr", _sym_float64 /*マシンのデータサイズ*/, 0 /* フラグなし */, (method)0L, (method)0L, calcoffset(t_myobject, val));


attr_offset_array_new

     
  新しいアトリビュートを作成するために、attr_offset_array_new 関数を使います。アトリビュートは自分自身の外部に格納されている、あなたのオブジェクトのデータ構造体の中のメモリの配列を参照します。 attr_offset_array_new を使って作られたアトリビュートは、クラス(class_addattr関数を使います)またはオブジェクト(object_addattr関数を使います)に割当てることができます。
   
 

t_object *attr_offset_array_new(char *name,t_symbol *type, long size,long flags,method mget, method mset,long offsetcount,long offset);

     
  name C文字列によるアトリビュートの名前
  type

有効なアトリビュート型を表す t_symbol * 。現在有効な型シンボルは次の通りです:
_sym_char (char)
_sym_long (long)
_sym_float32 (32ビット float)
_sym_float64 (64ビットfloat)
_sym_atom (Max の t_atom ポインタ)
_sym_symbol (Max のt_symbol ポインタ)
_sym_pointer (汎用のポインタ)
_sym_object (Max の t_objectポインタ)

この型は offset 引数で指定されたバイトオフセットにおける、データの sizeof と一致するものでなければなりません。

  size データの配列が持つ要素の数の最大値
  flags ビットフィールドで表されるアトリビュートフラグ。前述の attribute_new() のアトリビュートフラグに関する説明を参照して下さい。
  mget アトリビュートの get 機能のために使うメソッド、mget が NULLの場合、デフォルトのメソッドが用いられます。より詳しい情報は、前述の attribute_new に関する説明を参照して下さい。
  mset アトリビュートの set 機能のために使うメソッド、mset が NULLの場合、デフォルトのメソッドが用いられます。より詳しい情報は、前述の attribute_new に関する説明を参照して下さい。
  offsetcount どれくらいの数の配列の要素(最大数)によるデータがアトリビュートによって参照されるかを示す long 変数の、あなたのオブジェクトクラスのデータ構造体の中でのバイトオフセット。通常は、このオフセットを計算するために calcoffsetマクロ(前述)が使用されます。
  offset アトリビュートを「所有する」オブジェクトのクラスデータ構造体の中のバイトオフセット。オフセットはアトリビュートに参照されるデータを指していなければなりません。通常は、このオフセットを計算するために calcoffset マクロ(前述)が使用されます。
     
 

このルーチンは、成功すると新しいアトリビュートのオブジェクトポインタを返し、失敗した場合は NULLを返します。

オブジェクトクラスのデータ構造体の中にある 10 個の t_atom(atm ; 配列の中で「アクティブ」なカレントの要素の数は変数 atmcount に保持されています)から成る配列を参照する新しいアトリビュートを作る例です。

t_object *attr = attr_offset_array_new("myattrarray", sym_atom /* データサイズと一致させます */, 10 /* 最大値 */, 0 /* フラグなし */, (method)0L, (method)0L, calcoffset(t_myobject, atmcount) /* カウント */ , calcoffset(t_myobject, atm) /* データ */);


attr_addfilter_clip

     
  アトリビュートにクリップフィルタを接続するために、attr_addfilter_clip 関数を使います。フィルタは、アトリビュートの set 機能や get 機能を使ってアトリビュートと送受信した値をクリップします。
   
 

t_max_err attr_addfilter_clip(void *x, double min, double max, long usemin, long usemax);

     
  x フィルタを適用されるアトリビュートへのポインタ
  min クリップフィルタの最小値
  max クリップフィルタの最大値
  usemin クリップの最小値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
  usemax クリップの最大値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
     
 

このルーチンは、成功するとエラーコード MAX_ERR_NONEを返し、失敗した場合には“ext_obex.h”で定義される他のエラーコードの1つを返します。


attr_addfilter_clip_scale

     
  アトリビュートにクリップ/スケール・フィルタを接続するために、 attr_addfilter_clip_scale 関数を使います。このフィルタは、アトリビュートの set 機能や get 機能を使ってアトリビュートと送受信した値をクリップ、およびスケールします。
   
  t_max_err attr_addfilter_clip_scale(void *x, double scale, double min, double max,long usemin, long usemax);
     
  x フィルタを適用されるアトリビュートへのポインタ
  scale スケール値。アトリビュートへ送信された値はこの量だけスケールされます。アトリビュートから取り出された値は、この逆数によってスケールされます。スケーリングはクリッピングの前に行われます。
  min クリップフィルタの最小値
  max クリップフィルタの最大値
  usemin クリップの最小値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
  usemax クリップの最大値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
     
 

このルーチンは、成功するとエラーコード MAX_ERR_NONE を返し、失敗した場合には“ext_obex.h”で定義される他のエラーコードの1つを返します。


attr_addfilterset_clip

     
  アトリビュートにクリップフィルタを接続するために、attr_addfilterset_clip 関数を使います。このフィルタは、アトリビュートの set 機能を使ってアトリビュートに送信された値だけをクリップします。
   
 

t_max_err attr_addfilterset_clip(void *x, double min, double max, long usemin, long usemax);

     
  x フィルタを適用されるアトリビュートへのポインタ
  min クリップフィルタの最小値
  max クリップフィルタの最大値
  usemin クリップの最小値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
  usemax クリップの最大値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
     
 

このルーチンは、成功するとエラーコード MAX_ERR_NONEを返し、失敗した場合には“ext_obex.h”で定義される他のエラーコードの1つを返します。


attr_addfilterset_clip_scale

     
 

アトリビュートにクリップ/スケール・フィルタを接続するために、 attr_addfilterset_clip_scale 関数を使います。このフィルタは、アトリビュートの set 機能を使ってアトリビュートに送信された値だけをクリップ、およびスケールします。

   
  t_max_err attr_addfilterset_clip_scale(void *x, double scale, double min, double max, long usemin, long usemax);
     
  x フィルタを適用されるアトリビュートへのポインタ
  scale スケール値。アトリビュートへ送信された値はこの量だけスケールされます。スケーリングはクリッピングの前に行われます。
  min クリップフィルタの最小値
  max クリップフィルタの最大値
  usemin クリップの最小値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
  usemax クリップの最大値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
     
 

このルーチンは、成功するとエラーコード MAX_ERR_NONE を返し、失敗した場合には“ext_obex.h”で定義される他のエラーコードの1つを返します。


attr_addfilterget_clip

     
 

アトリビュートにクリップフィルタを接続するために、attr_addfilterget_clip 関数を使います。フィルタは、アトリビュートの get 機能を使ってアトリビュートから取り出された値だけをクリップします。

   
  t_max_err attr_addfilterget_clip(void *x, double min, double max, long usemin,long usemax);
     
  x フィルタを適用されるアトリビュートへのポインタ
  min クリップフィルタの最小値
  max クリップフィルタの最大値
  usemin クリップの最小値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
  usemax クリップの最大値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
     
 

このルーチンは、成功するとエラーコード MAX_ERR_NONE を返し、失敗した場合には“ext_obex.h”で定義される他のエラーコードの1つを返します。


attr_addfilterget_clip_scale

     
  アトリビュートにクリップ/スケール・フィルタを接続するために、 attr_addfilterget_clip_scale 関数を使います。このフィルタは、アトリビュートの get 機能を使ってアトリビュートから取り出された値だけをクリップ、およびスケールします。
   
  t_max_err attr_addfilterget_clip_scale(void *x, double scale, double min, double max,long usemin, long usemax);
     
  x フィルタを適用されるアトリビュートへのポインタ
  scale スケール値。アトリビュートから取り出された値はこの量だけスケールされます。スケーリングはクリッピングの前に行われます。
  min クリップフィルタの最小値
  max クリップフィルタの最大値
  usemin クリップの最小値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
  usemax クリップの最大値が使用されない場合は、これを0に、そうでない場合は非0にセットします。
     
 

このルーチンは、成功するとエラーコード MAX_ERR_NONEを返し、失敗した場合には“ext_obex.h”で定義される他のエラーコードの1つを返します。


attr_addfilterset_proc

     
  あなたのアトリビュートにカスタムフィルタ・メソッドを接続するために、attr_addfilterset_proc 関数を使います。フィルタは、アトリビュートの set 機能を使ってアトリビュートに送信された値のためだけに呼び出されます。 (訳注:原文は、「アトリビュートから取り出された値」となっていますが、関数名から考えて、誤植ではないかと思われます。)
   
  t_max_err attr_addfilterset_proc(void *x, method proc);
     
  x フィルタを適用されるアトリビュートへのポインタ
  proc フィルタメソッド
     
 

このルーチンは、成功するとエラーコード MAX_ERR_NONEを返し、失敗した場合には“ext_obex.h”で定義される他のエラーコードの1つを返します。

フィルタメソッドは次のようにプロトタイプ宣言、および実装されなければなりません。

t_max_err myfiltermethod(void *parent, void *attr, long ac, t_atom *av);

t_max_err myfiltermethod(void *parent, void *attr, long ac, t_atom *av) { long i; float temp, // このフィルタは全ての値の端数を切り捨てます。 // データは float であると仮定しています。 for (i = 0; i < ac; i++) { temp = atom_getfloat(av + i); temp = (float)((long)(temp + 0.5)); atom_setfloat(av + i, temp); } return MAX_ERR_NONE; }


attr_addfilterget_proc

     
  あなたのアトリビュートにカスタムフィルタ・メソッドを接続するために、attr_addfilterget_proc 関数を使います。フィルタは、アトリビュートの get 機能を使ってアトリビュートから取り出された値のためだけに呼び出されます。
   
  t_max_err attr_addfilterget_proc(void *x,method proc);
     
  x フィルタを適用されるアトリビュートへのポインタ
  proc フィルタメソッド
     
 

このルーチンは、成功するとエラーコード MAX_ERR_NONEを返し、失敗した場合には“ext_obex.h”で定義される他のエラーコードの1つを返します。

フィルタメソッドは、上記の attr_addfilterset_proc 関数の場合と同様に、プロトタイプ宣言、および実装されなければなりません。