😇

【Max9】Max9におけるcollオブジェクトの用途

に公開

はじめに: Maxにおけるcollオブジェクトの概要


Max/MSP環境は、視覚的なプログラミングを通じてインタラクティブなメディアアプリケーションを構築するための強力なプラットフォームです。この環境の中心的な要素の一つが、データ管理に特化したcollオブジェクトです。collオブジェクトは、多様なメッセージを効率的に格納、整理、編集、および取得するための基盤を提供します。

公式のドキュメントやチュートリアルでは、collは「メッセージデータのための小さく高速なデータベース」として位置づけられており 3、入力データと出力データ間の複雑なマッピングを定義する手段を提供します。

collがMax環境における中核的なデータ管理プリミティブとして機能することは、その包括的な機能セットから明らかです。
メッセージの格納、整理、編集、取得といった一連の操作をサポートすることで、Maxパッチが動的で応答性の高いアプリケーションを構築するために不可欠な、持続的かつインデックス付きのデータストレージメカニズムを提供します。
このオブジェクトが基本的なチュートリアルで頻繁に取り上げられていることは 3、Max開発者にとってのその基礎的な重要性をさらに強調しています。

また、collが単なるデータストレージを超えて、入力と出力間のマッピングを定義する手段として機能するという事実は、その応用範囲が広いことを示唆しています。

これにより、ルックアップテーブル、ステートマシン、および複雑なアルゴリズムマッピングの実装に効果的に使用でき、静的なデータストレージをデータ変換と制御フローのためのアクティブなコンポーネントへと昇華させることが可能になります。

データコレクションとしてのcollの強み

collオブジェクトの主な強みは、そのデータタイプの柔軟性と効率的なインデックス付き検索能力にあります。collは、整数、浮動小数点数、リスト、シンボル、さらには一般的な「anything」メッセージといった幅広いデータタイプを格納することができます。

この多様性により、数値データから複雑なテキスト文字列やMIDIメッセージに至るまで、あらゆる種類の情報を一元的に管理することが可能です。

データタイプとインデックス付けにおけるこの柔軟性は、Cycling '74がMaxの設計において意図した原則を反映しています。数値インデックスとシンボルインデックスの両方をサポートすることで、

collは非常に適応性の高い汎用的なデータ処理オブジェクトとして機能します。これにより、単純な数値ルックアップから、記述的なラベルを用いた複雑な状態管理まで、多岐にわたる目的に対応できるため、多数の特殊なデータオブジェクトを必要とすることなくパッチ設計を簡素化できます。単一の数値や単語(シンボル)で複雑なメッセージを呼び出せるという機能は 1、

collのデータ検索における固有の効率性を強調しています。このメカニズムにより、複雑な解析や精巧な条件ロジックが不要になり、格納された情報への直接的かつ迅速なアクセスが可能になります。したがって、collをデータルックアップに利用することで、パッチのロジックを大幅に合理化し、特に多数のselectオブジェクトを用いた条件ルーティングのような、複雑化するにつれて扱いにくく非効率になる代替方法と比較して、パフォーマンスを向上させることが期待されます。

collのHelpパッチ

承知いたしました。Maxのcollオブジェクトのヘルプパッチにある、ご指定の各サンプルパッチについてご案内します。これらのパッチは、collのより高度な機能や連携方法を具体的に示しています。

1. AdvansedStorage (高度なストレージ)

このパッチは、collオブジェクトがデータをどのように保存し、管理するか、特にパッチャーファイルへの埋め込みと外部ファイルとの連携に焦点を当てています。

  • データ埋め込みの制御: collのデータは、デフォルトではパッチャーファイルと一緒に保存されません。このパッチでは、@embedアトリビュート(またはflags 1 0メッセージ)を使用して、collの内容をメインのパッチャーファイルに埋め込む方法が示されています [1, 2]。これにより、パッチを開いたときにデータがすぐに利用可能になります [3]。
  • 外部ファイルとの連携: 大規模なデータセットの場合、パッチャーファイルが肥大化するのを防ぐため、collのデータを外部テキストファイルに保存し、実行時に読み込むことが推奨されます [3]。このパッチでは、readメッセージで外部ファイルからデータをロードし、writeメッセージでcollの内容をファイルに保存する方法が実演されています [2]。
  • ファイルタイプの指定: filetypeメッセージを使用して、collが読み書きできるファイルタイプを設定する方法も示されています。これは、標準の4文字タイプコード(例: ffoo)で指定します [2]。

2. queries (クエリ)

このパッチは、collに格納されたデータに対して様々なクエリを実行し、情報を取得する方法に焦点を当てています。

  • データのダンプ: dumpメッセージを使用すると、collに格納されているすべてのアドレスとメッセージを順序通りに出力できます。すべてのデータが出力された後、第4アウトレットからbangメッセージが出力され、処理の完了を知らせます [2]。これは、collの内容全体を検査したり、他のオブジェクトに渡したりする際に便利です。
  • コレクションの長さ: lengthメッセージは、collに格納されているメッセージの総数をカウントし、その数を第1アウトレットに出力します [2]。これにより、コレクションのサイズを動的に把握できます。
  • 最小値と最大値: minおよびmaxメッセージは、collに格納されている単一の数値(リストやシンボルではない)の最小値/最大値を第1アウトレットに出力します [1, 2]。ただし、この機能はリスト内の特定の要素には直接作用しないため、より複雑なクエリにはzl.sortnthなどの他のオブジェクトとの組み合わせが必要になる場合があります [4]。
  • N番目の項目を取得: nthメッセージは、指定されたアドレスに格納されているメッセージからN番目の項目を取得し、第1アウトレットに出力します [2]。これは、リストとして格納されたデータから特定の要素を抽出する際に非常に便利です。

3. symbols (シンボル)

このパッチは、collオブジェクトにおけるシンボル(単語)の利用に特化しており、シンボルをインデックスとして使用したり、データに関連付けたりする方法を示しています。

  • シンボルインデックス: 数値の代わりにシンボルをインデックスとして使用することで、より記述的で人間が読みやすいデータマッピングを作成できます [3]。このパッチでは、シンボルをインデックスとしてデータを格納し、そのシンボルをcollに送信して対応する値を取得する方法が示されています。
  • シンボルの関連付け: assocメッセージは、シンボルを既存の数値アドレスに関連付けます。これにより、そのシンボルを参照することで、対応する数値アドレスのデータを取得できるようになります [2]。
  • シンボルの関連付け解除: deassocメッセージは、シンボルと数値アドレスの関連付けを解除します [2]。
  • シンボル名の変更: subsymメッセージは、データに関連付けられたシンボル名を変更します [2]。

4. File&refarence (ファイルと参照)

このパッチは、collオブジェクトのファイル操作機能と、複数のcollオブジェクト間でデータを共有する「参照」メカニズムに焦点を当てています。

  • ファイル読み書き: readメッセージとwriteメッセージを使用して、collの内容を外部ファイルとやり取りする方法が示されています [2]。これにより、パッチの起動時にデータをロードしたり、現在のデータを保存したりできます。
  • 名前付きcollによるデータ共有: collオブジェクトに名前を付ける(@nameアトリビュートまたはname引数)ことで、同じ名前を持つすべてのcollオブジェクトがその内容を共有します [1, 2, 5, 3]。このパッチでは、複数のcollインスタンスが同じデータセットにアクセスし、変更を共有する様子が示されています。これは、パッチ全体やサブパッチャー間でデータに簡単にアクセスできる強力な機能です [5]。
  • 自動ファイルロード: 名前付きcollがロードされる際、Maxは自動的にその名前と一致するファイルを検索し、もし見つかればその内容をcollにロードします [1, 2]。この自動ロード動作をno-search引数で防ぐことも可能です [1, 2]。
  • referメッセージ: referメッセージは、メッセージを受け取ったcollオブジェクトが、別の名前付きcollオブジェクトのデータを参照するように設定します [1, 2]。これにより、実行中にデータソースを動的に切り替えることが可能になります。

これらのサンプルパッチは、collオブジェクトがMax/MSP環境でいかに多用途で強力なデータ管理ツールであるかを理解するための実践的なガイドとなります。

基本的な使用方法

このセクションでは、collオブジェクトの基本的な操作、データの入力、参照、および編集方法について詳しく説明します。

collオブジェクトの作成とデータの入力

Max環境でcollオブジェクトを作成するには、新しいオブジェクトボックスに「coll」と入力し、Enterキーを押すか、ボックスの外をクリックします 7。Maxのオートコンプリート機能がオブジェクト名の入力を支援します。

データは通常、メッセージボックスを使用してcollにロードされます。データ入力の基本的なフォーマットは「インデックス, 値;」です。ここで、セミコロン(;)は各エントリの区切り文字として機能します 3。

  • 数値インデックスによるデータ格納: 最初の数値がインデックスとして機能し、それに続く値が格納されます。例えば、「0, 20;」と入力すると、インデックス0に値20が格納されます 3。
  • シンボルインデックスによるデータ格納: 数値の代わりにシンボル(単語)をインデックスとして使用することも可能です。例えば、「foo, bar;」と入力すると、シンボル「foo」に値「bar」が関連付けられます 3。

collがメッセージ(例: インデックス, 値;)を介してデータを受け入れ、数値インデックスとシンボルインデックスを自動的に区別するという方法は 3、暗黙的なデータ構造定義が採用されていることを示唆しています。ユーザーはデータタイプや構造を事前に宣言する必要がなく、

collは入力フォーマットからそれらを推測します。このことは、Maxでの迅速なプロトタイピングと反復開発を大幅に簡素化するユーザーフレンドリーな抽象化レイヤーが存在することを示唆しており、オブジェクトが厳密な事前設定を要求するのではなく、提供されたデータに適応することを意味します。また、各データエントリをセミコロン(;)で終了させるという一貫した構文は 3、

collの内部解析にとって不可欠な区切り文字です。この区切り文字は、値自体がリストである場合でも、collが個々のキーと値のペアを正確にセグメント化して格納するために重要であり、信頼性の高いデータ投入にはこの基本的な構文の理解が不可欠です。

データの参照と出力

格納されたデータを取得するには、対応するインデックス値(数値またはシンボル)をcollのインレットに送信します。格納されたメッセージは、collの第1アウトレットから出力されます 1。

出力されるメッセージが単一のシンボルである場合、その前に「symbol」という単語が付加されます。例えば、格納された値が「foo」であれば、「symbol foo」として出力されます 1。この動作は、メッセージのタイプを明確にする上で重要です。インデックス(アドレス)自体は、

collの第2アウトレットから出力されます 1。

格納されたメッセージ(第1アウトレットから)とその対応するアドレス/インデックス(第2アウトレットから)の両方を出力するという設計は 1、巧妙かつ強力な機能です。この二重出力は、要求されたデータだけでなく、どのエントリが取得されたかに関する重要なメタデータも提供します。これにより、パッチ内でより洗練されたフィードバックループとデータ駆動型ロジックが可能になり、出力のソースを確認したり、インデックスを後続の処理に使用したりできるため、より堅牢で柔軟なパッチ設計につながります。単一の単語出力に「symbol」という接頭辞を明示的につける

collの特定の動作は 1、重要な設計上の詳細です。これは、単一の単語が数値、リスト、または異なるメッセージタイプとして解釈される可能性がある場合の曖昧さを防ぎます。この利点は、

route symbolオブジェクトを使用することで、単一の単語出力を他のすべての出力と区別して検出できるという点で、ルーティングと解析ロジックに直接的な影響を与え、データタイプを明確に区別することで、より正確な制御フローを可能にし、予期せぬ動作を防ぎます。

bang, next, prevメッセージによるシーケンシャルアクセス

collは、内部ポインタを介して、格納されたデータを順番にステップ実行する機能を提供します。

  • startメッセージは、ポインタをコレクションの最初のインデックスに設定します 1。
  • nextメッセージは、現在のポインタが指すインデックスのメッセージを出力し、ポインタを次のインデックスに進めます。コレクションの最後に達すると、ポインタは自動的に最初のインデックスにラップアラウンドします 1。
  • prevメッセージはnextと同様に動作しますが、ポインタを前のインデックスに戻します。最初のインデックスに達すると、最後のインデックスにラップアラウンドします 1。
  • bangメッセージは、nextメッセージと同じ効果を持ちます 1。

start、next、prevメッセージの組み合わせと、コレクションの最初と最後での明示的なラップアラウンド動作 2 は、

collが内部状態(ポインタ)を維持していることを示しています。この機能は、collを単純なランダムアクセスデータストア以上のものに昇格させ、データセットの自己完結型シーケンサーまたはイテレータとして機能させることができます。これにより、外部のカウンターオブジェクトを必要とせずに、リズミカルなパターンを駆動したり、音楽のキューを順に再生したり、時間の経過とともにパラメータの自動変更を行ったりすることが可能になり、時間ベースのデータ管理を簡素化します。また、単純なbangメッセージがnextと同じ効果を持つという事実は 1、些細ながらも重要な利便性機能です。これは、

collがイベント駆動型またはリズミカルなパッチに簡単に統合できることを意味し、明示的な「next」メッセージボックスを必要とせずに、単純なトリガーでシーケンスを進行させることができます。これにより、パッチングが合理化され、視覚的な煩雑さが軽減され、シーケンサーとしてのcollとの直感的な対話が促進されます。

collエディタでの内容確認と編集

collオブジェクトをダブルクリックすると、その内容を直接表示および編集できる専用のテキストエディタウィンドウが開きます 1。このエディタでは、データの追加、変更、削除を視覚的に行うことができます。エディタで加えられた変更は、ウィンドウを閉じると自動的に

collオブジェクトに適用されます 9。

collがメッセージを介してプログラム的にデータを投入できる機能 3 と、専用のテキストエディタを介して直接手動で編集できる機能 1 を兼ね備えていることは、データ管理における強力なハイブリッドアプローチを示唆しています。これは、

collがパッチ実行中の動的なリアルタイムデータ操作と、迅速に設定および微調整できる静的な事前定義データセットの両方をサポートするように設計されていることを意味します。この柔軟性は、開発ワークフローにとって大きな利点であり、複雑なスクリプトや絶え間ないパッチの再構築なしに、データの迅速なプロトタイピングと反復的な改良を可能にします。


Table 1: インデックスタイプ比較

特性 / タイプ 数値インデックス (Integer/Float) シンボルインデックス (Symbol)
フォーマット int または float (格納時はint) symbol (単語)
格納順序 昇順にソートされて格納される 2 追加された順序で格納される(数値インデックスの後) 2
主な用途 シンプルなデータルックアップ、シーケンス、配列的なアクセス 3 記述的なラベル付け、状態名、設定の管理 3
利点 直接アクセスが容易、シーケンシャルアクセスに最適 人間が読みやすい、自己文書化、直感的なマッピング
欠点 意味が直感的でない場合がある、大規模な非シーケンシャルデータには不向き 厳密な数値順序付けがない、パフォーマンスがわずかに劣る可能性

主要なメッセージと機能

collオブジェクトは、その内容を操作、取得、および管理するための豊富なメッセージセットを提供します。これらのメッセージを理解することは、collを効果的に活用するために不可欠です。

データ操作: store, insert, delete, clear, merge, subsym, swap

collオブジェクトは、内部データの追加、変更、削除を可能にする様々なメッセージをサポートしています。

  • store: シンボルで名前付けされたアドレスにメッセージを格納します 2。これは、特定の識別子に関連付けられたデータを保存する際に便利です。
  • insert / insert2: 指定された数値アドレスにメッセージを挿入します。この際、必要に応じて、挿入されたアドレスと同じかそれより大きいすべての数値アドレスが1つずつ増分されます 1。これにより、既存のシーケンスに新しいエントリを挿入し、その順序を維持することができます。
  • delete / remove: 指定されたアドレスのデータを削除します。deleteメッセージは、指定されたアドレスが数値である場合、それより大きいすべての数値アドレスを1つずつ減分します 1。これは、数値インデックスの連続性を維持したい場合に特に重要です。一方、
    removeは再インデックスを行いません。
  • clear: collコレクションからすべての内容を消去します 1。これは、パッチの初期化やデータの完全なリセットに役立ちます。
  • merge: 指定されたアドレスに既に格納されているメッセージの末尾に、新しいメッセージを追加します。もしアドレスが存在しない場合は、新しく作成されます 1。これは、同じインデックスに複数の値(例えば、リストとして)を追加する際に特に重要です 9。ユーザーが同じインデックスで複数のエントリを格納しようとすると、
    collは既存のデータを上書きしてしまいます 9。
    mergeメッセージは、この一般的な問題に対する解決策として明示的に提供されており、単一のインデックスに複数の値を関連付けるための、collの設計における中核的な原則を明らかにしています。これは、キー(インデックス)は一意でなければならないが、キーに関連付けられた値はリストを含む複雑なものであり得る、というcollの動作を示唆しています。この区別を理解することは、データを正しく構築し、意図しないデータ損失を防ぐ上で不可欠です。
  • subsym: データに関連付けられたシンボルを変更します 1。これにより、シンボルインデックスの名称を動的に更新できます。
  • swap: 指定された2つのアドレス(シンボルまたは数値)に関連付けられたインデックスを交換します 1。これは、データセット内の要素の順序を再配置する際に役立ちます。

deleteとremoveメッセージはどちらもデータを削除しますが、deleteが指定されたアドレスが数値である場合に「それより大きいすべてのアドレスを1つずつ減分する」という重要な違いは、deleteが連続した数値インデックススキームを維持するように設計されていることを意味します。これは、数値順序とインデックスのシーケンスが重要なアプリケーション(例: シーケンシャル再生や配列のようなアクセス)にとって不可欠です。対照的に、removeはこの再インデックスを保証しません。この微妙な機能の違いは、ユーザーが動的な数値シーケンスを管理する方法に直接影響を与え、正確な制御のための重要な詳細となります。

データ出力と情報取得: dump, length, min, max, nth

collは、格納されたデータに関する情報を提供したり、その内容を様々な方法で出力したりするためのメッセージも提供します。

  • dump: collに格納されているすべてのアドレス(第2アウトレット)とメッセージ(第1アウトレット)を順序通りに出力します。すべてのデータが出力された後、第4アウトレットからbangメッセージが出力され、処理の完了を知らせます 1。このメッセージは、包括的なデータシリアライゼーションや検査のために設計されています。これにより、デバッグ、カスタムの保存/ロード形式の作成、または外部Maxオブジェクトやスクリプト環境で格納されたすべてのデータを順次処理するために、データセット全体を反復処理したり抽出したりすることが可能になります。
  • length: collに格納されているメッセージの総数をカウントし、その数を第1アウトレットに出力します 1。これは、コレクションのサイズを動的に把握するのに役立ちます。
  • min / max: collに格納されている単一の数値(リストやシンボルではない)の最小値/最大値を第1アウトレットに出力します 1。ただし、この機能には重要な制限があります。ドキュメントでは
    minとmaxメッセージが「単一の数値」のみをクエリすると明示されており 2、フォーラムの議論では、デフォルトで「すべてのインデックスの最初のスロット(要素)」に対して操作されることが強調されています。
    これは、collが複雑なクエリを複数の要素リストに対して実行できる完全なデータベースではないことを意味します。したがって、ユーザーが格納されたリスト内や最初の要素以外の特定の要素間で最小値/最大値を見つける必要がある場合、collをzl.sortやnthなどの他のリスト処理オブジェクトと組み合わせる必要があります。
    これは、min/maxの制限が、より複雑なパッチングを必要とするという因果関係を明らかにし、collのデータ内での統計分析のための一般的な高度なパッチングパターンを示しています。
  • nth: 指定されたアドレスに格納されているメッセージからN番目の項目を取得し、第1アウトレットに出力します 1。これは、リストとして格納されたデータから特定の要素を抽出する際に非常に便利です。

ファイル操作: read, write, filetype

collオブジェクトは、外部ファイルとの間でデータを読み書きする機能も備えています。

  • read: 外部ファイルからデータをcollにロードします。ファイル名を引数として直接指定することも、引数なしで標準のファイル選択ダイアログを開くこともできます 1。
  • write: collの内容をファイルに保存します。ファイル名を引数として指定することも、標準の「名前を付けて保存」ダイアログを開くこともできます 1。
  • filetype: collが読み書きできるファイルタイプを設定します。これは、標準の4文字タイプコードのシンボルで指定します 1。引数なしでfiletypeを送信すると、デフォルトのファイル動作に戻ります。

readおよびwriteメッセージ 1 の提供は、「大規模なデータセット」を管理し 4、「パッチャーファイルが過度に大きくなるのを防ぐ」ために不可欠です。
これは、動的または大量のデータの場合、組み込みよりも外部ファイルによる永続化が推奨されるという明確なベストプラクティスを示唆しています。また、外部ファイルはMaxパッチ自体とは独立してデータの更新、バージョン管理、共有を容易にするため、モジュール性と共同作業ワークフローを強化するという、より広範なプロジェクト管理上の意味合いも示唆しています。

フォーラムの議論では、Windowsのスタンドアロンアプリケーションでcollが.txtファイルを読み込めない可能性が指摘されており(回避策として「拡張子のないすべてのテキストファイル」が提案されています)、これは微妙ながらも重要なクロスプラットフォームおよびデプロイメント上の考慮事項を示しています。.txtが開発中に機能する可能性がある一方で、この問題はコンパイルされたアプリケーションにおける潜在的な不整合を示唆しています。したがって、開発者はこれらのプラットフォーム固有のニュアンスを認識し、ターゲットデプロイメント環境でファイル読み込みメカニズムを徹底的にテストする必要があり、互換性を最大化するために特定のファイル命名規則(例: 10 で言及されている*.collファイル)を推奨することにつながる可能性があります。

データ共有: 名前付きcollとrefer

collオブジェクトは、複数のインスタンス間でデータを共有する強力なメカニズムを提供します。

  • collオブジェクトに名前(name引数または@nameアトリビュート)を付けることで、同じ名前を持つすべてのcollオブジェクトがその内容を共有します 1。この機能により、パッチ全体やサブパッチャー内でデータに簡単にアクセスできるようになります 3。これは、グローバル変数や共有データバスに類似したパターンであり、集中管理されたデータに複雑なパッチのどの部分からでもアクセスし、変更することを可能にします。これにより、パッチ間の通信が簡素化され、共有データのための煩雑なパッチコードルーティングの必要性が大幅に削減され、よりクリーンでモジュール化され、最終的にはより保守しやすいMaxパッチにつながるという重要な因果関係を示唆しています。
  • 名前付きcollがロードされる際、Maxは自動的にその名前と一致するファイルを検索し、もし見つかればその内容をcollにロードします 1。これは、パッチの起動時にデータを自動的に初期化するのに役立ちます。オプションのno-search引数を2番目の引数として指定すると、この自動ファイル検索とロードを防ぐことができます。
  • referメッセージは、メッセージを受け取ったcollオブジェクトが、別の名前付きcollオブジェクトのデータを参照するように設定します 1。これは、静的なデータ共有を提供する名前付きcollとは異なり、動的な側面を導入します。これにより、collオブジェクトは実行中に参照する名前付きcollを変更することが可能になります。これは、ユーザー入力、アルゴリズムによる決定、または外部イベントに基づいてデータソースをその場で切り替えることができる、高度に適応可能で再構成可能なパッチ設計の可能性を示唆しています。この機能は、collの有用性を静的なデータリポジトリから柔軟で動的にリンク可能なデータプロバイダへと拡張し、より洗練された応答性の高いインタラクティブシステムを可能にします。

Table 2: collオブジェクト主要メッセージ一覧

メッセージ 引数 機能 第1アウトレットの出力 第2アウトレットの出力 第3/4アウトレットの出力
int index [int] 指定された数値インデックスのメッセージを取得 格納されたメッセージ インデックス なし
symbol index [symbol] 指定されたシンボルインデックスのメッセージを取得 symbolに続く格納されたメッセージ 1 インデックス なし
list index [int] data [list] 指定された数値インデックスにリストを格納 なし なし なし
bang なし nextメッセージと同じ効果(シーケンシャルアクセス) 現在のポインタのメッセージ 現在のポインタのインデックス なし
assoc address name [symbol] data index [int] シンボルを既存の数値アドレスに関連付ける なし なし なし
clear なし コレクションからすべてのデータを消去 なし なし なし
dump なし すべての格納されたアドレスとメッセージを順に出力 格納されたメッセージのシーケンス 格納されたアドレスのシーケンス 完了時にbang (第4アウトレット) 1
goto index [list] 内部ポインタを指定されたアドレスに設定(出力はトリガーしない) なし なし なし
next なし 現在のポインタのメッセージを出力し、ポインタを次に進める 現在のポインタのメッセージ 現在のポインタのインデックス なし
prev なし 現在のポインタのメッセージを出力し、ポインタを前に戻す 現在のポインタのメッセージ 現在のポインタのインデックス なし
length なし collに格納されているメッセージの数をカウント メッセージ数 なし なし
min なし 格納されている単一の数値の最小値を取得 最小値 なし なし
max なし 格納されている単一の数値の最大値を取得 最大値 なし なし
nth index [list] element-number [int] 指定されたアドレスのメッセージからN番目の項目を取得 N番目の項目 なし なし
read filename [symbol] (オプション) 外部ファイルからデータを読み込む なし なし ファイル読み込み完了時にbang (第3アウトレット) 1
write filename [symbol] (オプション) collの内容をファイルに保存する なし なし ファイル書き込み完了時にbang (第3アウトレット) 1
merge index and data [list] 指定されたアドレスの既存のメッセージの末尾にメッセージを追加 なし なし なし
delete index [list] 指定されたアドレスのデータを削除し、数値アドレスを再インデックスする なし なし なし
insert index and data [list] 指定された数値アドレスにメッセージを挿入し、後続のインデックスを増やす なし なし なし
subsym new name [symbol] old name [symbol] データに関連付けられたシンボル名を変更する なし なし なし
swap pair of indices [list] 2つの指定されたアドレスのインデックスを交換する なし なし なし
refer referenced coll-object name [symbol] 別の名前付きcollオブジェクトのデータを参照する なし なし なし

重要なアトリビュートと設定

collオブジェクトのアトリビュートは、その動作やデータの永続性を設定するために重要です。これらは、Maxのインスペクターウィンドウから設定するか、メッセージとしてcollオブジェクトに送信することで制御できます。

@embed (パッチャーへのデータ埋め込み)

@embedアトリビュート(またはcollオブジェクトのインスペクターにある「Save Data with Patcher」設定)は、collオブジェクトの内容をメインのパッチャーファイルに埋め込んで保存するかどうかを制御します 1。デフォルトでは、データはパッチと一緒に保存されません(@embed 0)。

この設定は、flags 1 0メッセージをcollオブジェクトに送信することで、プログラム的に有効にすることができます。

@embedアトリビュートは、利便性とスケーラビリティの間で明確な設計上のトレードオフを提示します。データを埋め込むことで、パッチの読み込み時にデータがすぐに利用可能になるため、小規模なデータセットにとっては利便性が向上します 3。しかし、「大規模なデータセット」の場合、明示的な推奨事項として、「collにデータを取り込み、外部テキストファイルに保存し、実行時にreadメッセージで読み込む」ことが挙げられています。
これは「パッチャーファイルが過度に大きくなるのを防ぐ」ためです 4。このことは、開発者にとって重要な決定点を示唆しています。つまり、小規模で静的なデータの配布の容易さと、大規模で動的なデータのパフォーマンスと管理可能なファイルサイズのための外部ファイル管理の必要性との間で選択を迫られるということです。この決定は、パッチの読み込み時間、メモリ使用量、およびプロジェクト全体の保守性に直接影響を与えます。

@name (データ共有のための命名)

collオブジェクトに名前(name引数または@nameアトリビュート)を割り当てることで、そのオブジェクトに名前付きコンテキストが与えられます 1。同じ名前を持つすべてのcollオブジェクトは、その内容を共有します。この機能により、パッチ全体やサブパッチャー内でデータに簡単にアクセスできるようになります。

名前付きcollがロードされる際、Maxは自動的にその名前と一致するファイルを検索し、もし見つかればその内容をロードします。
これは、パッチの起動時に外部ファイルからデータを自動的に初期化するのに非常に便利です。オプションの

no-search引数を2番目の引数として指定すると、この自動ファイル検索とロードを防ぐことができます。

@nameアトリビュートは、collをグローバルなデータストアへと効果的に変換し、その内容をパッチの異なる部分やサブパッチャー内からアクセス可能にします 3。パッチのロード時に同じ名前のファイルを自動的に読み込むという追加機能 1 は、外部から事前設定できる永続的で共有されたデータのための強力なメカニズムを示唆しています。これは、よりモジュール化され、相互接続されたMaxパッチへの広範な傾向を示唆しており、データは集中管理され、外部設定ファイルから初期化することも可能です。

no-search引数は、開発者がcollを純粋にプログラム的に、または異なるソースからデータ投入する意図がある場合に、このデフォルトの動作を上書きできる重要な制御点を提供します。


テキストを格納して変換する

Maxのcollオブジェクトをテキスト変換、特に文字列(シンボル)を入力として受け取り、対応する整数値を出力する用途で活用することは、非常に効果的な実装方法です。collは、シンボルをインデックスとして使用できるため、このようなマッピングに最適です [1, 2, 3]。

collによるテキストから整数への変換の基本

collオブジェクトは、「シンボルインデックス」という機能を提供しており、数値の代わりに単語(シンボル)をデータの「アドレス」として使用できます [2]。これにより、特定の文字列が入力されたときに、あらかじめ定義された整数値を出力するルックアップテーブルとして機能させることができます。

基本的な仕組み:

  1. データの格納: coll内に、"文字列, 整数値;"という形式でデータを格納します。例えば、"hello, 1;"と格納すると、「hello」という文字列が入力されたときに「1」が出力されるようになります。
  2. 文字列の入力: collの左インレットに文字列(シンボル)を送信します。
  3. 整数値の出力: collは、その文字列に対応する整数値を第1アウトレットから出力します 。

実装事例:テキストコマンドから数値IDへの変換

例えば、ユーザーが入力したコマンド(例: "play", "stop", "record")を、Maxパッチ内で処理しやすい数値ID(例: 0, 1, 2)に変換したい場合を考えます。

1. collへのデータ格納

collオブジェクトをパッチに作成し、ダブルクリックしてエディタを開きます。以下の形式でデータを入力します。

play, 0;
stop, 1;
record, 2;

各行の末尾にはセミコロン(;)が必要です [2]。エディタを閉じると、データがcollに保存されます。

2. 文字列の入力と数値の出力

Maxパッチでは、以下のようにオブジェクトを接続します。

  • texteditオブジェクト: ユーザーが文字列を入力するためのUI要素です。
  • messageオブジェクト: texteditから受け取った文字列をcollに渡すために使用できます。
  • collオブジェクト: 上記でデータを格納したcollです。
  • numberオブジェクト: collから出力される整数値を受け取り、表示します。

パッチの概念図:

[textedit]
|
| (文字列を出力)
    V
[coll]  <-- (ここに "play, 0;" などのデータが格納されている)
|
| (対応する整数値を出力)
    V
[number]

動作の解説:

  1. texteditオブジェクトに「play」と入力し、Enterキーを押します。
  2. 「play」というシンボルがcollのインレットに送信されます。
  3. collは内部のデータと照合し、「play」に対応する値「0」を第1アウトレットから出力します。
  4. numberオブジェクトが「0」を受け取り、表示します。

同様に、「stop」と入力すれば「1」が、「record」と入力すれば「2」が出力されます。

その他の考慮事項とベストプラクティス

  • データの永続性: collに格納したデータをパッチファイルと一緒に保存したい場合は、collオブジェクトのインスペクターで「Save Data With Patcher」アトリビュートを有効にするか、flags 1 0メッセージをcollに送信します [4, 1, 5, 2]。これにより、パッチを保存して再度開いたときに、データが自動的にロードされます。
  • 未知の文字列の処理: collに格納されていない文字列が入力された場合、collは何も出力しません。特定の動作をさせたい場合は、collの出力がなかった場合に反応するロジック(例: selオブジェクトやgateオブジェクトと組み合わせて、出力がなかった場合に別のメッセージをトリガーする)を追加する必要があります。
  • 大文字・小文字の区別: Maxのシンボルは通常、大文字・小文字を区別します。例えば、「Play」と「play」は異なるシンボルとして扱われます。入力される文字列の形式に注意してください。
  • 外部ファイルからの読み込み: 変換するテキストと数値のペアが大量にある場合、collのデータを外部テキストファイルに保存し、readメッセージで読み込むことが推奨されます [1, 2, 3]。これにより、パッチファイルが肥大化するのを防ぎ、データの管理が容易になります。
  • routeオブジェクトとの連携: collの第1アウトレットから出力されるメッセージが、単一の整数だけでなく、シンボルやリストなど多様な形式になる可能性がある場合、routeオブジェクトをcollの出力に接続することで、メッセージのタイプや内容に基づいて異なる処理パスにルーティングできます [5, 2]。例えば、collが単一のシンボルを出力する場合、その前に「symbol」という単語が付加されるため、route symbolオブジェクトでこれを捕捉できます。

collオブジェクトは、このように文字列と数値の間の柔軟なマッピングを実現するための強力で直感的なツールです。


その他の実装事例

collオブジェクトは、その柔軟性により、Max/MSPプロジェクトで様々な用途に活用できます。ここでは、いくつかの具体的な実装事例を紹介します。

事例1: シンプルなインデックス付きデータルックアップ

collの最も基本的で一般的な使用法は、シンプルなルックアップテーブルとして機能することです。数値インデックスを使用して値を格納し、そのインデックスをcollのインレットに送信することで、対応する値を取得できます。例えば、インデックス0に値20が格納されている場合、0を送信すると20が出力されます 3。この直接的なインデックス付き検索の単純さは、collが離散的な入力を特定の出力にマッピングするための効率的かつMaxネイティブな実装を提供することを強調しています。これにより、複雑なselectやifステートメントを必要とする条件ロジックを簡素化し、特定のタスクにおいてパッチをよりクリーンで高性能にすることができます。

事例2: シンボルを用いたデータマッピング

数値インデックスの代わりにシンボル(単語)をインデックスとして使用することで、より記述的で人間が読みやすいデータマッピングを作成できます 3。例えば、「

foo」というシンボルをインデックスとして使用し、それに対応する値を格納することで、パッチのロジックをより直感的に理解できるようになります。

数値インデックスが効率性を提供する一方で、シンボルインデックスはパッチの可読性と自己文書化の点で大きな利点をもたらします 3。例えば、インデックス0の意味を記憶する代わりに、「

start_sequence」のような記述的な単語をインデックスとして使用することで、パッチのロジックが、将来の自分を含め、誰が見てもすぐに明確になります。これは、複雑なプロジェクトや共同作業を行うプロジェクトにおけるベストプラクティスを示唆しています。つまり、人間による理解と長期的な保守性が重要である場合、たとえ数値インデックスと比較してパフォーマンスの差がMaxの一般的なアプリケーションでは無視できる程度であったとしても、シンボルインデックスを優先すべきです。これは、開発者体験とプロジェクトの寿命に直接影響を与える設計上の選択です。

事例3: シーケンスデータ(MIDIノート、オーディオキューポイント)の管理と再生

collは、シンボルのリスト(例えば、シェイクスピアの独白のような文字列)を格納するなど、シーケンスデータを保持するのに非常に適しています。

start、next、prevといったメッセージを使用することで、格納されたキューを順番にステップ実行し、MIDIノートやオーディオキューポイントの再生を制御することができます。
例えば、metroオブジェクトとcounterオブジェクトを組み合わせてMIDIノートのシーケンスを駆動したり、sfplay~やbuffer~のパラメータを格納してオーディオキューポイントを管理したりできます 8。

リスト形式のデータを格納する能力 3 と、組み込みのシーケンシャルアクセスメッセージ(start、next、prev)が組み合わさることで、collは強力な汎用シーケンサーとしての地位を確立します。MIDIノートやオーディオキューポイントの管理への直接的な適用可能性は、時間ベースのメディアやインタラクティブなマルチメディアの文脈におけるその有用性を強調しています。これは、collがアルゴリズム作曲、インタラクティブ再生システム、および同期マルチメディアイベントの中核エンジンとして機能し、単純なデータストレージを超えてMaxの様々なドメインに広範な波及効果をもたらすことを示唆しています。

事例4: 複雑な条件分岐の管理

多数のブール(0/1)状態を単一の整数にパックし、その整数をcollのインデックスとして使用することで、複雑な条件分岐や状態遷移を効率的に管理できます 8。この手法は、多数のif文やselectオブジェクトを置き換えることができ、パッチの簡潔性とパフォーマンスを向上させます。

複数のブール(0/1)状態を単一の整数にパックしてcollのインデックスとして使用するという革新的な手法 8 は、効率的なステートマシンや複雑な条件ロジックの実装という洗練された応用を明らかにします。入れ子になったifステートメントや多数のselectオブジェクトが広がるネットワークの代わりに、単一のcollルックアップによって、結合されたエンコード状態に基づいて動作を決定できます。これは、多くの可能な状態を持つ高度にインタラクティブなシステムにおいて、パッチの明確さ、簡潔さ、そして潜在的なパフォーマンスの大幅な改善を示唆しており、高度な制御フローとシステム設計におけるcollの役割を示しています。

事例5: リアルタイムデータ操作とソート

collは、実行時にデータを動的に操作および整理する機能も提供します。mergeメッセージを使用すると、同じインデックスに複数の値を追加(リストとして)でき、動的にデータを構築できます 9。これは、例えば、時間の経過とともにイベントのキューを構築するのに役立ちます。また、

sortメッセージは、インデックスやデータ項目に基づいてcollの内容を並べ替えることを可能にし、リアルタイムでのデータ整理に役立ちます 1。

mergeメッセージが既存のインデックスにデータを追加する能力 9 と、sortメッセージが様々な基準に基づいて内容を再編成する能力 1 が組み合わさることで、collが動的なデータ構造として機能することが示されます。これは、collが単なる静的なルックアップテーブルではなく、リアルタイムでその内容と編成を進化させることができることを意味します。この機能は、イベントキューの動的な構築、スコアのソート済みリストの維持、ライブ入力に基づく音楽パターンの適応などのアプリケーションを示唆しており、その有用性を単純な事前定義されたストレージを超えて押し広げます。

事例6: 複数リストのインターリーブ

collは、複数のリストを個別のインデックスに格納し、zl groupのようなzlオブジェクトと連携して、これらのリストをインターリーブ(交互に配置)するデータソースとして機能します 8。これは、2つ以上のリストをインターリーブする際に使用されるzl laceオブジェクトの代替として、より多くのリストを扱う場合に特に有効です。

collにリストを格納し、それをzl groupで処理して複数のリストをインターリーブする例 8 は、Maxにおける強力で一般的なアーキテクチャパターンを強調しています。それは、collが、Maxの堅牢なzl(リスト処理)オブジェクトによって後続的に操作されるデータの集中管理されたインデックス付きリポジトリとして機能することです。これは、collが構造化されたインデックス付きデータストレージと柔軟なアルゴリズム的リスト変換の間の重要な橋渡し役を果たすことを意味します。collが整理されたアクセス可能なデータを提供し、zlオブジェクトが洗練された処理能力を提供することで、単独では達成が困難な複雑なデータフローを可能にします。


ベストプラクティスとよくある落とし穴

collオブジェクトを効果的に使用するためには、いくつかのベストプラクティスと一般的な落とし穴を理解しておくことが重要です。

適切なインデックスタイプの選択

シンプルなデータルックアップやシーケンスには数値インデックスを使用し、より記述的なラベル付けや設定管理にはシンボルインデックスを使用することを検討してください 3。

数値インデックスとシンボルインデックスの選択は 3、パッチの明確さと人間による可読性(シンボルインデックスが有利)と、潜在的な、しばしば軽微なパフォーマンスの違い(数値インデックスは固有の順序のため、内部処理がわずかに速い可能性がある 2)とのバランスをとる設計上の決定を本質的に含みます。これは、ほとんどの実用的なMaxアプリケーションでは、シンボルインデックスを記述的な目的で使用することで可読性と保守性を優先することが健全なベストプラクティスであることを意味します。パフォーマンスの考慮事項は、高度に最適化された大規模なデータ処理シナリオでのみ最重要となり、厳格なルールではなく、微妙なアプローチを示唆しています。

重複インデックスの扱い(mergeの活用)

collは、同じインデックスを複数持つことはできません。同じインデックスで新しいエントリを書き込むと、既存のデータが上書きされます 9。この動作は、初心者が陥りやすい落とし穴です。同じインデックスに複数の値(リストとして)を追加したい場合は、mergeメッセージを使用してください 9。

「複数の同一インデックスを持つことはできない」という明確な記述は 9、

collの設計における基本的な制約です。これは、collが一意のキーと値のストアとして機能し、各インデックス(キー)が一意でなければならないことを明確にしています。そして、mergeメッセージ 9 は、単一のキーに複数の値をリストとして追加するための指定された方法となります。これは、ユーザーがデータを「キー -> [値1, 値2,...]」として概念化する必要があることを意味し、「キー1 -> 値1」と「キー1 -> 値2」のような別々のエントリを作成しようとすることを避けるべきです。これは、collを効果的に使用し、上書きによる意図しないデータ損失を防ぐための重要な思考モデルです。

大規模データセットにおけるパフォーマンス考慮

大量のデータを扱う場合、collの内容をパッチャーファイルに埋め込むのではなく、writeメッセージで外部テキストファイルに保存し、readメッセージで実行時に読み込むことを推奨します 4。これにより、パッチャーファイルのサイズが過度に大きくなるのを防ぎ、Maxの起動時間やパッチの応答性に影響を与えるのを避けることができます。

整数のみを格納する場合は、collよりもbag、table、funbuffなどのオブジェクトの方が、特にデータサイズが大きくなるにつれて効率的である可能性があります 11。これは、

collが汎用的なソリューションである一方で、特定のデータタイプや規模に特化した、より最適化されたオブジェクトが存在することを示唆しています。グラフィカルなオブジェクトやMaxウィンドウへの出力はCPU負荷が高い傾向があるため 11、パフォーマンスが重要なパッチでは、これらを最小限に抑えることも考慮すべきです。

大規模データセットに外部ファイルを使用するという推奨事項 4 は、パフォーマンスと配布にとって重要なメモリ使用量とパッチャーファイルサイズの懸念に直接対処します。11からの追加情報は、

bag、table、funbuffが特に整数を大規模に格納する場合にcollよりも効率的である可能性があると述べており、collが汎用的な多機能ソリューションである一方で、高度に最適化された数値配列処理には専門的なオブジェクトが存在することを示唆しています。これはMaxにおけるデータストレージへの階層的なアプローチを意味します。collは一般的なインデックス付きデータ(特にリストやシンボル)に適していますが、絶対的な数値パフォーマンスが要求されるシナリオでは他のオブジェクトが適しています。これは、ユーザーが特定のデータタイプと規模に対して適切なツールを選択するための重要なパフォーマンス最適化の考慮事項です。

データ保存方法(埋め込み vs. 外部ファイル)

collのデータを保存する方法には、主に二つの選択肢があります。

  • パッチャーへの埋め込み: 「Save Data With Patcher」アトリビュート(@embedまたはflags 1 0メッセージで設定)を使用すると、collのデータはパッチャーファイル自体に保存されます 3。これは、パッチと一緒に配布される小規模で静的なデータに便利です。
  • 外部ファイル: readおよびwriteメッセージを使用して、データを外部テキストファイルに保存および読み込みます 4。この方法は、パッチャーファイルが肥大化するのを防ぎ、データ管理を容易にします。名前付きcollは、ロード時にその名前と一致するファイルを自動的に検索してロードします 1。ただし、スタンドアロンアプリケーションとして配布する場合、ファイル拡張子の扱い(例えば、Windowsでは.txt拡張子なしで保存すると問題が解決する場合がある 10)に注意が必要です。

パッチャー内にデータを埋め込むか、外部ファイルを使用するかの選択 3 は、データのライフサイクルと配布に根本的に関連しています。埋め込みデータは、常に存在する静的なパッチ固有のコンテンツに適しています。外部ファイルは、パッチとは独立して更新される可能性のある動的、大規模、または共有データセットに適しています。名前付きcollの自動ファイル読み込み 1 は、名前付きインスタンスの外部永続性を前提とするデフォルトの動作を示唆しています。これは、デプロイメントに関するより広範な意味合いを示唆しており、ユーザーはパッチがどのように配布され(例: スタンドアロンアプリケーションとして)、外部データファイルがアプリケーションの検索パス内に正しくバンドルまたは配置されていることを確認する必要がある 10 ことを考慮する必要があります。

routeやzlオブジェクトとの連携

collは単独で使用されることは少なく、Maxの他の主要なオブジェクトと連携して、より複雑なデータフローを構築します。

  • routeオブジェクトとの連携: collは、routeオブジェクトと組み合わせて使用されることが多く、collからの出力メッセージを識別子に基づいて解析し、特定のオブジェクトにルーティングします 3。これは、
    collが出力する多様なメッセージを、パッチ内の適切な処理パスに振り分けるために不可欠なパターンです。
  • zlオブジェクトとの連携: collは、zl groupなどのzlオブジェクトと連携して、複数のリストをインターリーブするためのデータソースとして機能できます 8。また、
    min/maxメッセージが提供する機能が不十分な場合(例えば、リスト内の特定要素の最小値を検索する場合など)、zl.sortとnthを組み合わせて、より複雑なデータ検索(例: 最も近い値の検索)を行うことができます 9。

collがrouteやzlといった他のMaxの主要オブジェクトと頻繁に言及されることは、collが単独で使われることはほとんどなく、より大きなデータ処理チェーン内のコンポーネントとして機能することを示しています。これは、Maxにおけるより広範なアーキテクチャ原則を意味します。つまり、オブジェクトはモジュール式で構成可能に設計されているということです。collは構造化されたデータストレージを提供し、routeはインテリジェントなメッセージディスパッチを処理し、zlオブジェクトは洗練されたリスト変換を実行します。この相乗効果的な関係は、強力で柔軟かつスケーラブルなMaxパッチを構築するための鍵であり、単独のオブジェクトでは達成が困難な複雑なデータフローを可能にします。


Table 3: よくある落とし穴と解決策

落とし穴 説明 解決策 / ベストプラクティス
重複インデックスによる上書き 同じインデックスで新しいエントリを書き込むと、既存のデータが上書きされる 9。 同じインデックスに複数の値を追加したい場合は、mergeメッセージを使用する 9。
大規模データのパフォーマンス問題 大量のデータをパッチャーに埋め込むと、ファイルサイズが肥大化し、読み込み時間やパフォーマンスに影響する 4。 writeメッセージで外部テキストファイルに保存し、readメッセージで実行時に読み込む。整数データの場合はbag、table、funbuffも検討する 4。
min/maxメッセージの制限 min/maxは、格納されたリストの最初の数値要素にのみ作用し、複雑なクエリには不十分 9。 リスト内の特定要素やより複雑な条件で最小/最大値を検索するには、zl.sortやnthなどのzlオブジェクトと組み合わせる 9。
スタンドアロンでのファイル読み込み問題 Windowsのスタンドアロンアプリケーションで.txtファイルがcollに読み込めない場合がある 10。 外部テキストファイルには拡張子を付けないか、*.collのような特定の命名規則を使用することを検討し、ターゲット環境でテストする 10。
texteditオブジェクトでの表示遅延 collのインデックスをtexteditに接続すると、値の表示に1つ遅延が生じることがある 9。 この問題は、coll独自のテキストエディタを直接使用するか、collのコピーを作成してtexteditと連携させることで回避できる場合がある 9。

まとめ

Max9におけるcollオブジェクトは、その柔軟性と堅牢性により、Max/MSP環境におけるデータ管理の要となっています。これは単なるデータストレージオブジェクトではなく、メッセージデータのための高速なデータベースとして機能し 3、インデックス付きのデータコレクション、特定のメッセージの取得、およびシーケンシャルなデータ処理を可能にします。

collの多機能性は、数値およびシンボルインデックスの両方をサポートする能力 3、そしてmergeやsortといったメッセージによる動的なデータ操作 1 に現れています。これにより、シンプルなルックアップテーブルから、MIDIシーケンスの管理、複雑な条件分岐の効率化、さらにはzlオブジェクトとの連携による高度なリスト操作まで、幅広い実装事例に対応できます 8。

データ永続性に関しては、@embedアトリビュートによるパッチャーへのデータ埋め込みと、read/writeメッセージによる外部ファイル管理という選択肢が提供されています 3。大規模なデータセットの場合、パッチのパフォーマンスと管理性を維持するために、外部ファイルの使用が推奨されます 4。また、名前付きcollオブジェクトを介したデータ共有機能は、パッチ全体やサブパッチャー間でのデータアクセスを簡素化し、モジュール性と保守性を向上させます 3。

collは、Maxパッチが動的で応答性の高い、データ駆動型のインタラクティブなアプリケーションを構築するための基盤となる要素です。その汎用性により、単純なルックアップから複雑なアルゴリズムプロセスまで、あらゆるものを支えることができ、高度なMaxユーザーにとって不可欠なツールとなっています。しかし、その機能を最大限に活用し、一般的な落とし穴を回避するためには、インデックスの重複に関するmergeメッセージの適切な使用 9 や、min/maxメッセージの限界を補うための他のオブジェクトとの連携 9 など、その内部的な動作とベストプラクティスを深く理解することが重要です。

引用文献

  1. coll Object Reference - Max 7 Documentation https://docs.cycling74.com/legacy/max7/refpages/coll
  2. coll Reference - Max Documentation https://docs.cycling74.com/max5/refpages/max-ref/coll.html
  3. Max Basic Tutorial 18: Data Collections - Max 8 Documentation https://docs.cycling74.com/max8/tutorials/basicchapter18
  4. Max Basic Tutorial 18: Data Collections https://docs.cycling74.com/max5/tutorials/max-tut/basicchapter18.html
  5. Max Tutorial: coll Object (Part 1) - YouTube https://www.youtube.com/watch?v=UG56fS8SNGY
  6. Max/MSP - data types - YouTubehttps://www.youtube.com/watch?v=l2dwpgJ7yi4
  7. Objects - Max Documentation - Cycling '74 https://docs.cycling74.com/userguide/objects/
  8. coll | Max Cookbook - UCI Music Department https://music.arts.uci.edu/dobrian/maxcookbook/keywords/coll
  9. adding same entry index number to coll? - MaxMSP Forum | Cycling '74 https://cycling74.com/forums/adding-same-entry-index-number-to-coll
  10. Using a TXT file with coll instead of embedding in patcher? - MaxMSP Forum | Cycling '74 https://cycling74.com/forums/using-a-txt-file-with-coll-instead-of-embedding-in-patcher
  11. Optimization? What do you do? - MaxMSP Forum | Cycling '74 https://cycling74.com/forums/optimization-what-do-you-do
  12. Max/MSP Coll Data separation - MaxMSP Forum | Cycling '74 https://cycling74.com/forums/maxmsp-coll-data-separation

Discussion